@cyanheads/pixoo-mcp-server 1.2.0 → 1.2.2

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 (54) hide show
  1. package/AGENTS.md +10 -7
  2. package/CLAUDE.md +10 -7
  3. package/Dockerfile +30 -10
  4. package/README.md +65 -86
  5. package/changelog/1.2.x/1.2.1.md +35 -0
  6. package/changelog/1.2.x/1.2.2.md +40 -0
  7. package/dist/mcp-server/resources/definitions/pixoo-design-guide.resource.d.ts.map +1 -1
  8. package/dist/mcp-server/resources/definitions/pixoo-design-guide.resource.js +4 -1
  9. package/dist/mcp-server/resources/definitions/pixoo-design-guide.resource.js.map +1 -1
  10. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.d.ts +173 -13
  11. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.js +129 -28
  13. package/dist/mcp-server/tools/definitions/pixoo-compose-scene.tool.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/pixoo-design-brief.tool.d.ts.map +1 -1
  15. package/dist/mcp-server/tools/definitions/pixoo-design-brief.tool.js +15 -7
  16. package/dist/mcp-server/tools/definitions/pixoo-design-brief.tool.js.map +1 -1
  17. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.d.ts +2 -0
  18. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.d.ts.map +1 -1
  19. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.js +27 -12
  20. package/dist/mcp-server/tools/definitions/pixoo-display-text.tool.js.map +1 -1
  21. package/dist/mcp-server/tools/definitions/pixoo-push-image.tool.d.ts +30 -1
  22. package/dist/mcp-server/tools/definitions/pixoo-push-image.tool.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/pixoo-push-image.tool.js +105 -26
  24. package/dist/mcp-server/tools/definitions/pixoo-push-image.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/finish-schema.d.ts +28 -0
  26. package/dist/mcp-server/tools/finish-schema.d.ts.map +1 -0
  27. package/dist/mcp-server/tools/finish-schema.js +42 -0
  28. package/dist/mcp-server/tools/finish-schema.js.map +1 -0
  29. package/dist/renderer/finish.d.ts +34 -0
  30. package/dist/renderer/finish.d.ts.map +1 -0
  31. package/dist/renderer/finish.js +62 -0
  32. package/dist/renderer/finish.js.map +1 -0
  33. package/dist/renderer/icons.d.ts +14 -4
  34. package/dist/renderer/icons.d.ts.map +1 -1
  35. package/dist/renderer/icons.js +30 -22
  36. package/dist/renderer/icons.js.map +1 -1
  37. package/dist/renderer/keyframes.d.ts +40 -4
  38. package/dist/renderer/keyframes.d.ts.map +1 -1
  39. package/dist/renderer/keyframes.js +100 -53
  40. package/dist/renderer/keyframes.js.map +1 -1
  41. package/dist/renderer/remote-image.d.ts +13 -7
  42. package/dist/renderer/remote-image.d.ts.map +1 -1
  43. package/dist/renderer/remote-image.js +17 -21
  44. package/dist/renderer/remote-image.js.map +1 -1
  45. package/dist/renderer/scene-renderer.d.ts +45 -6
  46. package/dist/renderer/scene-renderer.d.ts.map +1 -1
  47. package/dist/renderer/scene-renderer.js +328 -159
  48. package/dist/renderer/scene-renderer.js.map +1 -1
  49. package/dist/renderer/text-engine.d.ts +24 -5
  50. package/dist/renderer/text-engine.d.ts.map +1 -1
  51. package/dist/renderer/text-engine.js +51 -28
  52. package/dist/renderer/text-engine.js.map +1 -1
  53. package/package.json +7 -6
  54. package/server.json +3 -3
@@ -0,0 +1,40 @@
1
+ ---
2
+ summary: "Adopts @cyanheads/pixoo-toolkit 0.10.0: animated GIF and WebP push as animations, images take a palette finish, scene elements take blend modes and stroke widths, and text gains a numerals face. Undecodable images fail as invalid_image, and filled circles and JPEG/WebP images render differently."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 1.2.2 — 2026-09-26
8
+
9
+ ## Added
10
+
11
+ - **`finish` on `pixoo_push_image` and scene `image` elements** reduces the image to a palette: `colors` (2–256) or `palette` (1–256 colors), plus `dither` (`none`, `bayer4`, `floyd-steinberg`) ([#27](https://github.com/cyanheads/pixoo-mcp-server/issues/27)). An animation's `colors` palette is shared across frames; a bad palette entry fails as `invalid_color`.
12
+ - **`blend` on every `pixoo_compose_scene` element** — `normal` (default), `add`, `screen`, or `multiply` ([#29](https://github.com/cyanheads/pixoo-mcp-server/issues/29)).
13
+ - **`strokeWidth` and `antialias` on `line` and outline `circle`; `strokeWidth` on a `rect` border**, growing inward (#29). Either on a shape that draws no stroke fails `-32602` naming it; a wide or anti-aliased stroke's layout box covers every pixel drawn.
14
+ - **`font: "numerals"`** on `pixoo_display_text` and scene `text` — an 11×18 digit face drawing 0–9, space, and `: . - + / % ° ?`; any other character fails `-32602` naming it, and auto-fit never picks it ([#30](https://github.com/cyanheads/pixoo-mcp-server/issues/30)).
15
+ - **`pixoo_push_image` `speed` input and `frames`, `sourceFrames`, `speed` output fields** for animated sources ([#28](https://github.com/cyanheads/pixoo-mcp-server/issues/28)).
16
+ - **`pixoo_output_dir` and `pixoo_push_min_interval_ms` options in `manifest.json`**, so a Claude Desktop bundle install can set `PIXOO_OUTPUT_DIR` and `PIXOO_PUSH_MIN_INTERVAL_MS`.
17
+
18
+ ## Changed
19
+
20
+ - **An animated GIF or WebP given to `pixoo_push_image` pushes as an animation** instead of its first frame, whatever its file extension (#28). Up to 40 frames, sampled evenly from a longer source, play at the source's total duration over the pushed frame count.
21
+ - **Filled `circle` elements draw a rounder disc** (`dx² + dy² ≤ r² + r`, from the toolkit), so every filled circle's pixels change.
22
+ - **JPEG and WebP images decode at full resolution before resizing** (from the toolkit), so their pushed pixels change.
23
+ - **An image source that is read but does not decode fails as `-32602` `invalid_image`** naming the source and the decoder's reason, instead of an unclassified `-32603`, in `pixoo_push_image` and compose `image` and `sprite` elements ([#34](https://github.com/cyanheads/pixoo-mcp-server/issues/34)).
24
+ - **`asset_not_found` carries its tool's declared recovery hint, reworded, on both image tools**, and a sprite `path` given as a URL says sprite sheets take a local path ([#51](https://github.com/cyanheads/pixoo-mcp-server/issues/51)).
25
+ - **https image sources load from memory** — they render when the temp dir is unwritable, and an https SVG renders like the same local file instead of rasterizing at its intrinsic size ([#23](https://github.com/cyanheads/pixoo-mcp-server/issues/23)).
26
+ - **A partially transparent pixel under `opacity` below 100 fades at its own alpha × opacity**, so soft-edged images no longer brighten as they fade (#29).
27
+ - **`twinkle` renders the same frames for the same input**; its jitter comes from the frame index and element position ([#50](https://github.com/cyanheads/pixoo-mcp-server/issues/50)).
28
+ - **`pixoo_display_text` reports `fits: false` for text leaving the panel on any edge** ([#49](https://github.com/cyanheads/pixoo-mcp-server/issues/49)), and a scrolling line reports `box.x: 0`, where its frame draws it ([#55](https://github.com/cyanheads/pixoo-mcp-server/issues/55)).
29
+ - **`standard` and `compact` draw `° ← ↑ → ↓ ▲ ▼ ♥ · …` as glyphs** instead of `?` (#30).
30
+ - **`Object.prototype` names such as `constructor` fail as `invalid_color`** on every color input of `pixoo_compose_scene`, `pixoo_display_text`, and `pixoo_overlay_text`, which now rejects them before any device call ([#32](https://github.com/cyanheads/pixoo-mcp-server/issues/32)).
31
+ - **`pixoo_design_brief` and the design guide** describe dithering, anti-aliasing, the new glyphs and numerals face, a glow recipe, and the Pixoo-64's measured dark and mid-level response.
32
+
33
+ ## Fixed
34
+
35
+ - **`pixoo_compose_scene` loads each distinct asset once per call** — elements sharing a sprite sheet, or an image source and placement, share one decode, and a URL is fetched once ([#52](https://github.com/cyanheads/pixoo-mcp-server/issues/52)).
36
+ - **Standard text at scale 2 is 14 px tall** in the design brief and guide, which said 10 px.
37
+
38
+ ## Dependencies
39
+
40
+ - `@cyanheads/pixoo-toolkit` ^0.8.2 → ^0.10.0, exempt from the `bunfig.toml` release-age hold beside the framework
@@ -1 +1 @@
1
- {"version":3,"file":"pixoo-design-guide.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/pixoo-design-guide.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAwGrD,eAAO,MAAM,wBAAwB,2GAyBnC,CAAC"}
1
+ {"version":3,"file":"pixoo-design-guide.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/pixoo-design-guide.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AA2GrD,eAAO,MAAM,wBAAwB,2GAyBnC,CAAC"}
@@ -13,8 +13,10 @@ At typical viewing distance for a 64×64 LED display:
13
13
  - **Minimum eye size:** 1–2px across; 2×2 fills are more reliable than single pixels
14
14
  - **Minimum limb gap:** 2 rows between horizontal elements prevents blur
15
15
  - **Font choices:**
16
- - Standard (5×7): default for all text. Readable at 1× scale. Excellent at 2× (10px tall = chunky block letters)
16
+ - Standard (5×7): default for all text. Readable at 1× scale. Excellent at 2× (14px tall = chunky block letters)
17
17
  - Compact (3×5): secondary text, captions, labels when space is tight
18
+ - Standard and compact both draw printable ASCII plus \`° ← ↑ → ↓ ▲ ▼ ♥ · …\` for units, trends, and separators
19
+ - Numerals (11×18): clocks and hero readouts. Draws 0–9, space, and \`: . - + / % ° ?\` only, each digit on one 13px advance so a changing value keeps its width. Auto-fit never picks it; text holding any other character is rejected, so units and labels go in their own standard or compact text element
18
20
  - Scale ≥2: decorative or hero use only — verify fit before pushing
19
21
 
20
22
  ## Palette Discipline
@@ -103,6 +105,7 @@ At typical viewing distance for a 64×64 LED display:
103
105
  - **getConfig() omits SelectIndex** on current Pixoo-64 firmware — use getChannel() for reliable channel reads
104
106
  - **Text overlays (pixoo_overlay_text)** persist across channel switches until explicitly cleared
105
107
  - **Discovery requires internet** — Divoom cloud endpoint even for local device control
108
+ - **Dark and mid levels render darker than on a monitor** — on a Pixoo-64 at brightness 100, channel levels 0–4 stay dark, and mid-levels render darker than on an sRGB monitor, shifting muted warm colors toward red (\`#D97757\` reads red). Previews show the sRGB values pushed, not the panel's response.
106
109
  `;
107
110
  export const pixooDesignGuideResource = resource('pixoo://reference/design-guide', {
108
111
  name: 'design-guide',
@@ -1 +1 @@
1
- {"version":3,"file":"pixoo-design-guide.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/pixoo-design-guide.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoGpB,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC,gCAAgC,EAAE;IACjF,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EACT,uNAAuN;IACzN,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,qEAAqE;IACrE,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE;IAEtD,OAAO,CAAC,OAAO,EAAE,IAAI;QACnB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,gCAAgC;gBACrC,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,eAAe;gBACzB,WAAW,EACT,iFAAiF;aACpF;SACF;KACF,CAAC;CACH,CAAC,CAAC"}
1
+ {"version":3,"file":"pixoo-design-guide.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/pixoo-design-guide.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGpB,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC,gCAAgC,EAAE;IACjF,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EACT,uNAAuN;IACzN,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,qEAAqE;IACrE,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE;IAEtD,OAAO,CAAC,OAAO,EAAE,IAAI;QACnB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,gCAAgC;gBACrC,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,eAAe;gBACzB,WAAW,EACT,iFAAiF;aACpF;SACF;KACF,CAAC;CACH,CAAC,CAAC"}
@@ -29,6 +29,12 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
29
29
  elements: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
30
30
  visible: z.ZodOptional<z.ZodBoolean>;
31
31
  opacity: z.ZodOptional<z.ZodNumber>;
32
+ blend: z.ZodOptional<z.ZodEnum<{
33
+ add: "add";
34
+ multiply: "multiply";
35
+ normal: "normal";
36
+ screen: "screen";
37
+ }>>;
32
38
  dx: z.ZodOptional<z.ZodNumber>;
33
39
  dy: z.ZodOptional<z.ZodNumber>;
34
40
  effect: z.ZodOptional<z.ZodObject<{
@@ -47,7 +53,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
47
53
  period: z.ZodOptional<z.ZodNumber>;
48
54
  phase: z.ZodOptional<z.ZodNumber>;
49
55
  }, z.core.$strip>>;
50
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
56
+ animate: z.ZodOptional<z.ZodObject<{
57
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
58
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
59
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
60
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
61
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
62
+ }, z.core.$strip>>;
51
63
  type: z.ZodLiteral<"text">;
52
64
  text: z.ZodString;
53
65
  x: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodEnum<{
@@ -63,6 +75,7 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
63
75
  color: z.ZodOptional<z.ZodString>;
64
76
  font: z.ZodOptional<z.ZodEnum<{
65
77
  compact: "compact";
78
+ numerals: "numerals";
66
79
  standard: "standard";
67
80
  }>>;
68
81
  style: z.ZodOptional<z.ZodObject<{
@@ -86,6 +99,12 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
86
99
  }, z.core.$strip>, z.ZodObject<{
87
100
  visible: z.ZodOptional<z.ZodBoolean>;
88
101
  opacity: z.ZodOptional<z.ZodNumber>;
102
+ blend: z.ZodOptional<z.ZodEnum<{
103
+ add: "add";
104
+ multiply: "multiply";
105
+ normal: "normal";
106
+ screen: "screen";
107
+ }>>;
89
108
  dx: z.ZodOptional<z.ZodNumber>;
90
109
  dy: z.ZodOptional<z.ZodNumber>;
91
110
  effect: z.ZodOptional<z.ZodObject<{
@@ -104,7 +123,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
104
123
  period: z.ZodOptional<z.ZodNumber>;
105
124
  phase: z.ZodOptional<z.ZodNumber>;
106
125
  }, z.core.$strip>>;
107
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
126
+ animate: z.ZodOptional<z.ZodObject<{
127
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
128
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
129
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
130
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
131
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
132
+ }, z.core.$strip>>;
108
133
  type: z.ZodLiteral<"icon">;
109
134
  name: z.ZodOptional<z.ZodString>;
110
135
  d: z.ZodOptional<z.ZodString>;
@@ -134,6 +159,12 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
134
159
  }, z.core.$strip>, z.ZodObject<{
135
160
  visible: z.ZodOptional<z.ZodBoolean>;
136
161
  opacity: z.ZodOptional<z.ZodNumber>;
162
+ blend: z.ZodOptional<z.ZodEnum<{
163
+ add: "add";
164
+ multiply: "multiply";
165
+ normal: "normal";
166
+ screen: "screen";
167
+ }>>;
137
168
  dx: z.ZodOptional<z.ZodNumber>;
138
169
  dy: z.ZodOptional<z.ZodNumber>;
139
170
  effect: z.ZodOptional<z.ZodObject<{
@@ -152,7 +183,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
152
183
  period: z.ZodOptional<z.ZodNumber>;
153
184
  phase: z.ZodOptional<z.ZodNumber>;
154
185
  }, z.core.$strip>>;
155
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
186
+ animate: z.ZodOptional<z.ZodObject<{
187
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
188
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
189
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
190
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
191
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
192
+ }, z.core.$strip>>;
156
193
  type: z.ZodLiteral<"rect">;
157
194
  x: z.ZodNumber;
158
195
  y: z.ZodNumber;
@@ -168,9 +205,16 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
168
205
  to: z.ZodString;
169
206
  }, z.core.$strip>>;
170
207
  borderColor: z.ZodOptional<z.ZodString>;
208
+ strokeWidth: z.ZodOptional<z.ZodNumber>;
171
209
  }, z.core.$strip>, z.ZodObject<{
172
210
  visible: z.ZodOptional<z.ZodBoolean>;
173
211
  opacity: z.ZodOptional<z.ZodNumber>;
212
+ blend: z.ZodOptional<z.ZodEnum<{
213
+ add: "add";
214
+ multiply: "multiply";
215
+ normal: "normal";
216
+ screen: "screen";
217
+ }>>;
174
218
  dx: z.ZodOptional<z.ZodNumber>;
175
219
  dy: z.ZodOptional<z.ZodNumber>;
176
220
  effect: z.ZodOptional<z.ZodObject<{
@@ -189,16 +233,30 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
189
233
  period: z.ZodOptional<z.ZodNumber>;
190
234
  phase: z.ZodOptional<z.ZodNumber>;
191
235
  }, z.core.$strip>>;
192
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
236
+ animate: z.ZodOptional<z.ZodObject<{
237
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
238
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
239
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
240
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
241
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
242
+ }, z.core.$strip>>;
193
243
  type: z.ZodLiteral<"circle">;
194
244
  cx: z.ZodNumber;
195
245
  cy: z.ZodNumber;
196
246
  radius: z.ZodNumber;
197
247
  color: z.ZodOptional<z.ZodString>;
198
248
  fill: z.ZodOptional<z.ZodBoolean>;
249
+ strokeWidth: z.ZodOptional<z.ZodNumber>;
250
+ antialias: z.ZodOptional<z.ZodBoolean>;
199
251
  }, z.core.$strip>, z.ZodObject<{
200
252
  visible: z.ZodOptional<z.ZodBoolean>;
201
253
  opacity: z.ZodOptional<z.ZodNumber>;
254
+ blend: z.ZodOptional<z.ZodEnum<{
255
+ add: "add";
256
+ multiply: "multiply";
257
+ normal: "normal";
258
+ screen: "screen";
259
+ }>>;
202
260
  dx: z.ZodOptional<z.ZodNumber>;
203
261
  dy: z.ZodOptional<z.ZodNumber>;
204
262
  effect: z.ZodOptional<z.ZodObject<{
@@ -217,16 +275,30 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
217
275
  period: z.ZodOptional<z.ZodNumber>;
218
276
  phase: z.ZodOptional<z.ZodNumber>;
219
277
  }, z.core.$strip>>;
220
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
278
+ animate: z.ZodOptional<z.ZodObject<{
279
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
280
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
281
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
282
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
283
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
284
+ }, z.core.$strip>>;
221
285
  type: z.ZodLiteral<"line">;
222
286
  x0: z.ZodNumber;
223
287
  y0: z.ZodNumber;
224
288
  x1: z.ZodNumber;
225
289
  y1: z.ZodNumber;
226
290
  color: z.ZodOptional<z.ZodString>;
291
+ strokeWidth: z.ZodOptional<z.ZodNumber>;
292
+ antialias: z.ZodOptional<z.ZodBoolean>;
227
293
  }, z.core.$strip>, z.ZodObject<{
228
294
  visible: z.ZodOptional<z.ZodBoolean>;
229
295
  opacity: z.ZodOptional<z.ZodNumber>;
296
+ blend: z.ZodOptional<z.ZodEnum<{
297
+ add: "add";
298
+ multiply: "multiply";
299
+ normal: "normal";
300
+ screen: "screen";
301
+ }>>;
230
302
  dx: z.ZodOptional<z.ZodNumber>;
231
303
  dy: z.ZodOptional<z.ZodNumber>;
232
304
  effect: z.ZodOptional<z.ZodObject<{
@@ -245,7 +317,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
245
317
  period: z.ZodOptional<z.ZodNumber>;
246
318
  phase: z.ZodOptional<z.ZodNumber>;
247
319
  }, z.core.$strip>>;
248
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
320
+ animate: z.ZodOptional<z.ZodObject<{
321
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
322
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
323
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
324
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
325
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
326
+ }, z.core.$strip>>;
249
327
  type: z.ZodLiteral<"progress">;
250
328
  x: z.ZodNumber;
251
329
  y: z.ZodNumber;
@@ -267,6 +345,12 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
267
345
  }, z.core.$strip>, z.ZodObject<{
268
346
  visible: z.ZodOptional<z.ZodBoolean>;
269
347
  opacity: z.ZodOptional<z.ZodNumber>;
348
+ blend: z.ZodOptional<z.ZodEnum<{
349
+ add: "add";
350
+ multiply: "multiply";
351
+ normal: "normal";
352
+ screen: "screen";
353
+ }>>;
270
354
  dx: z.ZodOptional<z.ZodNumber>;
271
355
  dy: z.ZodOptional<z.ZodNumber>;
272
356
  effect: z.ZodOptional<z.ZodObject<{
@@ -285,7 +369,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
285
369
  period: z.ZodOptional<z.ZodNumber>;
286
370
  phase: z.ZodOptional<z.ZodNumber>;
287
371
  }, z.core.$strip>>;
288
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
372
+ animate: z.ZodOptional<z.ZodObject<{
373
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
374
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
375
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
376
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
377
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
378
+ }, z.core.$strip>>;
289
379
  type: z.ZodLiteral<"sparkline">;
290
380
  x: z.ZodNumber;
291
381
  y: z.ZodNumber;
@@ -300,6 +390,12 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
300
390
  }, z.core.$strip>, z.ZodObject<{
301
391
  visible: z.ZodOptional<z.ZodBoolean>;
302
392
  opacity: z.ZodOptional<z.ZodNumber>;
393
+ blend: z.ZodOptional<z.ZodEnum<{
394
+ add: "add";
395
+ multiply: "multiply";
396
+ normal: "normal";
397
+ screen: "screen";
398
+ }>>;
303
399
  dx: z.ZodOptional<z.ZodNumber>;
304
400
  dy: z.ZodOptional<z.ZodNumber>;
305
401
  effect: z.ZodOptional<z.ZodObject<{
@@ -318,7 +414,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
318
414
  period: z.ZodOptional<z.ZodNumber>;
319
415
  phase: z.ZodOptional<z.ZodNumber>;
320
416
  }, z.core.$strip>>;
321
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
417
+ animate: z.ZodOptional<z.ZodObject<{
418
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
419
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
420
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
421
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
422
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
423
+ }, z.core.$strip>>;
322
424
  type: z.ZodLiteral<"bitmap">;
323
425
  x: z.ZodNumber;
324
426
  y: z.ZodNumber;
@@ -327,6 +429,12 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
327
429
  }, z.core.$strip>, z.ZodObject<{
328
430
  visible: z.ZodOptional<z.ZodBoolean>;
329
431
  opacity: z.ZodOptional<z.ZodNumber>;
432
+ blend: z.ZodOptional<z.ZodEnum<{
433
+ add: "add";
434
+ multiply: "multiply";
435
+ normal: "normal";
436
+ screen: "screen";
437
+ }>>;
330
438
  dx: z.ZodOptional<z.ZodNumber>;
331
439
  dy: z.ZodOptional<z.ZodNumber>;
332
440
  effect: z.ZodOptional<z.ZodObject<{
@@ -345,7 +453,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
345
453
  period: z.ZodOptional<z.ZodNumber>;
346
454
  phase: z.ZodOptional<z.ZodNumber>;
347
455
  }, z.core.$strip>>;
348
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
456
+ animate: z.ZodOptional<z.ZodObject<{
457
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
458
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
459
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
460
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
461
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
462
+ }, z.core.$strip>>;
349
463
  type: z.ZodLiteral<"pixels">;
350
464
  data: z.ZodArray<z.ZodObject<{
351
465
  x: z.ZodNumber;
@@ -355,6 +469,12 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
355
469
  }, z.core.$strip>, z.ZodObject<{
356
470
  visible: z.ZodOptional<z.ZodBoolean>;
357
471
  opacity: z.ZodOptional<z.ZodNumber>;
472
+ blend: z.ZodOptional<z.ZodEnum<{
473
+ add: "add";
474
+ multiply: "multiply";
475
+ normal: "normal";
476
+ screen: "screen";
477
+ }>>;
358
478
  dx: z.ZodOptional<z.ZodNumber>;
359
479
  dy: z.ZodOptional<z.ZodNumber>;
360
480
  effect: z.ZodOptional<z.ZodObject<{
@@ -373,7 +493,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
373
493
  period: z.ZodOptional<z.ZodNumber>;
374
494
  phase: z.ZodOptional<z.ZodNumber>;
375
495
  }, z.core.$strip>>;
376
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
496
+ animate: z.ZodOptional<z.ZodObject<{
497
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
498
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
499
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
500
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
501
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
502
+ }, z.core.$strip>>;
377
503
  type: z.ZodLiteral<"image">;
378
504
  source: z.ZodString;
379
505
  x: z.ZodOptional<z.ZodNumber>;
@@ -390,9 +516,30 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
390
516
  mitchell: "mitchell";
391
517
  nearest: "nearest";
392
518
  }>>;
519
+ finish: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
520
+ colors: z.ZodNumber;
521
+ dither: z.ZodDefault<z.ZodEnum<{
522
+ bayer4: "bayer4";
523
+ "floyd-steinberg": "floyd-steinberg";
524
+ none: "none";
525
+ }>>;
526
+ }, z.core.$strict>, z.ZodObject<{
527
+ palette: z.ZodArray<z.ZodString>;
528
+ dither: z.ZodDefault<z.ZodEnum<{
529
+ bayer4: "bayer4";
530
+ "floyd-steinberg": "floyd-steinberg";
531
+ none: "none";
532
+ }>>;
533
+ }, z.core.$strict>]>>;
393
534
  }, z.core.$strip>, z.ZodObject<{
394
535
  visible: z.ZodOptional<z.ZodBoolean>;
395
536
  opacity: z.ZodOptional<z.ZodNumber>;
537
+ blend: z.ZodOptional<z.ZodEnum<{
538
+ add: "add";
539
+ multiply: "multiply";
540
+ normal: "normal";
541
+ screen: "screen";
542
+ }>>;
396
543
  dx: z.ZodOptional<z.ZodNumber>;
397
544
  dy: z.ZodOptional<z.ZodNumber>;
398
545
  effect: z.ZodOptional<z.ZodObject<{
@@ -411,7 +558,13 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
411
558
  period: z.ZodOptional<z.ZodNumber>;
412
559
  phase: z.ZodOptional<z.ZodNumber>;
413
560
  }, z.core.$strip>>;
414
- animate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>>;
561
+ animate: z.ZodOptional<z.ZodObject<{
562
+ dx: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
563
+ dy: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
564
+ opacity: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>>>;
565
+ visible: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodBoolean], null>>>;
566
+ color: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>], null>>>;
567
+ }, z.core.$strip>>;
415
568
  type: z.ZodLiteral<"sprite">;
416
569
  path: z.ZodString;
417
570
  cols: z.ZodNumber;
@@ -453,6 +606,7 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
453
606
  }>;
454
607
  font: z.ZodOptional<z.ZodEnum<{
455
608
  compact: "compact";
609
+ numerals: "numerals";
456
610
  standard: "standard";
457
611
  }>>;
458
612
  scale: z.ZodOptional<z.ZodNumber>;
@@ -493,8 +647,14 @@ export declare const pixooComposeScene: import("@cyanheads/mcp-ts-core").ToolDef
493
647
  }, {
494
648
  readonly reason: "asset_not_found";
495
649
  readonly code: JsonRpcErrorCode.NotFound;
496
- readonly when: "An image or sprite path could not be read.";
497
- readonly recovery: "Verify the file path exists and is readable, or check the URL is reachable.";
650
+ readonly when: "An image source or sprite path could not be read, a sprite path was a URL, or an image URL could not be fetched.";
651
+ readonly recovery: "Pass an absolute path to an existing, readable image file, or for an image source a reachable https URL serving 10 MiB or less; sprite sheets take an absolute local path.";
652
+ readonly thrownBy: "service";
653
+ }, {
654
+ readonly reason: "invalid_image";
655
+ readonly code: JsonRpcErrorCode.InvalidParams;
656
+ readonly when: "An image source or sprite path was read but did not decode as an image.";
657
+ readonly recovery: "Each image source and sprite path must be a complete PNG, JPEG, GIF, WebP, AVIF, TIFF, or SVG image; a text file, an HTML page, or a truncated download will not decode.";
498
658
  readonly thrownBy: "service";
499
659
  }, {
500
660
  readonly reason: "invalid_color";
@@ -1 +1 @@
1
- {"version":3,"file":"pixoo-compose-scene.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/pixoo-compose-scene.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AAqT3E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmT5B,CAAC"}
1
+ {"version":3,"file":"pixoo-compose-scene.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/pixoo-compose-scene.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AAwb3E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8T5B,CAAC"}