venice-video-harness 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +111 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/mini-drama/choices.d.ts +20 -0
  8. package/dist/mini-drama/choices.d.ts.map +1 -0
  9. package/dist/mini-drama/choices.js +14 -0
  10. package/dist/mini-drama/choices.js.map +1 -0
  11. package/dist/mini-drama/cli.js +288 -72
  12. package/dist/mini-drama/cli.js.map +1 -1
  13. package/dist/mini-drama/generation-planner.d.ts +5 -6
  14. package/dist/mini-drama/generation-planner.d.ts.map +1 -1
  15. package/dist/mini-drama/generation-planner.js +19 -18
  16. package/dist/mini-drama/generation-planner.js.map +1 -1
  17. package/dist/mini-drama/prompt-builder.d.ts.map +1 -1
  18. package/dist/mini-drama/prompt-builder.js +5 -3
  19. package/dist/mini-drama/prompt-builder.js.map +1 -1
  20. package/dist/mini-drama/video-generator.d.ts.map +1 -1
  21. package/dist/mini-drama/video-generator.js +4 -0
  22. package/dist/mini-drama/video-generator.js.map +1 -1
  23. package/dist/mini-drama/workshop.d.ts +50 -0
  24. package/dist/mini-drama/workshop.d.ts.map +1 -0
  25. package/dist/mini-drama/workshop.js +216 -0
  26. package/dist/mini-drama/workshop.js.map +1 -0
  27. package/dist/series/project-language.d.ts +23 -0
  28. package/dist/series/project-language.d.ts.map +1 -0
  29. package/dist/series/project-language.js +53 -0
  30. package/dist/series/project-language.js.map +1 -0
  31. package/dist/series/types.d.ts +27 -18
  32. package/dist/series/types.d.ts.map +1 -1
  33. package/dist/series/types.js +29 -8
  34. package/dist/series/types.js.map +1 -1
  35. package/dist/venice/models.d.ts.map +1 -1
  36. package/dist/venice/models.js +59 -0
  37. package/dist/venice/models.js.map +1 -1
  38. package/dist/venice/upscale.d.ts +55 -0
  39. package/dist/venice/upscale.d.ts.map +1 -0
  40. package/dist/venice/upscale.js +168 -0
  41. package/dist/venice/upscale.js.map +1 -0
  42. package/package.json +5 -3
  43. package/scripts/postinstall.mjs +24 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.5.0 — 2026-07-31
4
+
5
+ - Integrated the Topaz 2x/4x video-upscale engine into the standalone CLI.
6
+ - Added Standard vs 4K delivery selection to the complete project workshop.
7
+ - Added `venice-video finish`, which finds the assembled project master, estimates cost, requires confirmation, and writes a preserved 4K delivery master under `masters/`.
8
+ - Added advanced `venice-video upscale` for arbitrary finished video files.
9
+ - Large masters are split into upload-safe chunks, processed concurrently and resumably, concatenated without another video encode, and remuxed with the original audio.
10
+ - Registered `topaz-video-upscale` in the model catalog and added finishing/delivery regression tests.
11
+
12
+ ## 2.4.4 — 2026-07-31
13
+
14
+ - Added `venice-video workshop` as the project-level creative control center.
15
+ - The workshop develops objective, audience, runtime, logline, synopsis, themes, structure, aesthetic, cast, voices, locations, audio approach, production risks, open questions, and the complete shot script in one coherent process.
16
+ - Added structured revision feedback, status inspection, readable `WORKSHOP.md`, and explicit approval that materializes production state.
17
+ - Replaced unclear manual command-chain handoffs after `new` and `new-script` with the guided workshop.
18
+ - Kept low-level commands as advanced controls rather than the default onboarding experience.
19
+
20
+ ## 2.4.3 — 2026-07-31
21
+
22
+ - Film projects now use Film/Part terminology in script scaffolding and workshop output instead of Episode language.
23
+ - Added `new-script` and `workshop-script` commands while preserving `new-episode` and `workshop-episode` compatibility aliases.
24
+ - Film script prompts no longer force 60-second episode timing, one-location structure, cliffhangers, or mandatory episodic title cards.
25
+ - Film script templates default to five minutes when no requested duration exists; concepts can request any target duration.
26
+
27
+ ## 2.4.2 — 2026-07-31
28
+
29
+ - Native dialogue now remains on the selected R2V family and uses Seedance/HappyHorse voice-donor references when available.
30
+ - Wan 2.7 routing now requires the explicit Exact lip-sync strategy.
31
+ - Reworded the audio wizard to distinguish native voice-reference generation from exact audio-driven mouth movement.
32
+ - Reordered model families to Automatic, Seedance, MiniMax H3, HappyHorse, Grok Imagine, Kling O3.
33
+
34
+ ## 2.4.1 — 2026-07-31
35
+
36
+ - Added an install-time diagnostic that warns when npm's global executable directory is missing from `PATH` and prints the exact shell command to fix it.
37
+ - Added README troubleshooting for successful global installs where `venice-video` is not found.
38
+
3
39
  ## 2.4.0 — 2026-07-31
4
40
 
5
41
  First standalone CLI release.
package/README.md CHANGED
@@ -38,6 +38,7 @@ Live catalog as of **2026-05-20** (synced against `GET /api/v1/models?type=video
38
38
  | **Seedance 1.5 Pro** | i2v | t2v | 12s | Yes | Older Seedance line; kept for parity. |
39
39
  | **HappyHorse 1.1** | i2v, R2V (up to 9 refs) | t2v | 15s | Yes (joint single-pass, 7-lang phoneme lip-sync) | **#1 blind-preference T2V + I2V** (Alibaba 15B). 3-15s, 720p/1080p, nine aspect ratios. Best for talking characters + multilingual localization; SFW/commercial-leaning. The `happyhorse` video-family now routes here. |
40
40
  | **HappyHorse 1.0** | i2v, R2V | t2v | 15s | Yes | Prior line, kept for back-compat. Livelier hand-camera realism / cinematic grain vs Seedance. |
41
+ | **MiniMax H3** | i2v, R2V (up to 9 refs) | t2v | 15s (**5s floor**) | Yes (native stereo, not toggleable) | Open-weight omni-modal model — one net covers T2V/I2V/reference. **2K is the only resolution** (no draft tier) at ~1/3 the per-second cost of other families; 24fps, 2500-char prompts. The `minimax-h3` video-family routes here. Sub-5s durations are a hard 400. |
41
42
  | **Wan 2.7** | i2v, R2V, V2V, Spicy | t2v | 15s | Wan i2v has no audio; lip-syncs via `audio_url` input | **Lip-sync flagship.** Only Venice model with proper `audio_url`-driven mouth motion. R2V exposes per-element `audio_url` for multi-speaker. Spicy = uncensored i2v variant. |
42
43
  | **Wan 2.6** | Standard, Flash, R2V | Standard | 15s | Yes (i2v/t2v); R2V capped at 10s | Now has R2V variant with `audio_url` input. 1080p. |
43
44
  | **Wan 2.5 Preview** | i2v | t2v | 10s | Yes | `audio_url` input. |
@@ -156,12 +157,37 @@ The CLI works directly against the Venice API. Cursor, Claude Code, OpenCode,
156
157
  MCP, and other agent harnesses are optional integrations, not runtime requirements.
157
158
 
158
159
  ```bash
159
- npm install -g venice-video-harness
160
+ npm install -g venice-video-harness --foreground-scripts
160
161
  venice-video setup
161
162
  venice-video doctor
162
163
  venice-video new
163
164
  ```
164
165
 
166
+ The `--foreground-scripts` flag makes the package's PATH diagnostic visible;
167
+ modern npm otherwise suppresses successful post-install output. After installation,
168
+ verify that your shell can find the executable:
169
+
170
+ ```bash
171
+ command -v venice-video
172
+ venice-video --version
173
+ ```
174
+
175
+ If npm reports a successful install but `venice-video` is not found, npm's global
176
+ `bin` directory is not on your shell `PATH`. The install output prints the exact
177
+ directory and an `export PATH=...` command when it detects this condition. You can
178
+ also inspect the directory manually:
179
+
180
+ ```bash
181
+ NPM_BIN="$(npm prefix -g)/bin"
182
+ echo "$NPM_BIN"
183
+ export PATH="$NPM_BIN:$PATH"
184
+ ```
185
+
186
+ Add that `export` line to `~/.zshrc`, `~/.bashrc`, or the startup file for your
187
+ shell, then open a new terminal. Node version managers can create this mismatch
188
+ when the active `npm` installs globally somewhere different from the active
189
+ Node shim.
190
+
165
191
  `venice-video setup` prompts for the API key without echoing it, validates it,
166
192
  and stores it in the OS-appropriate user configuration directory with owner-only
167
193
  permissions. It also records a default project workspace. Environment variables
@@ -172,6 +198,61 @@ export VENICE_API_KEY=your_key
172
198
  export VENICE_VIDEO_WORKSPACE=~/VeniceVideos
173
199
  ```
174
200
 
201
+ After `new`, the CLI hands the project to one guided control center:
202
+
203
+ ```bash
204
+ venice-video workshop -p ~/VeniceVideos/my-film
205
+ ```
206
+
207
+ The workshop develops the complete project—not only a shot list:
208
+
209
+ - objective, audience, runtime, constraints, and references
210
+ - logline, synopsis, themes, acts/movements, and story beats
211
+ - visual aesthetic, palette, lighting, lens language, and texture
212
+ - characters, wardrobe, voices, and continuity anchors
213
+ - locations and environmental continuity
214
+ - dialogue/audio approach and exact-lip-sync decisions
215
+ - production-ready shot script, risks, and open questions
216
+
217
+ It writes `WORKSHOP.md` for human review and `workshop.json` as the structured
218
+ source. Iterate without losing project context:
219
+
220
+ ```bash
221
+ venice-video workshop -p ~/VeniceVideos/my-film --feedback "Make the middle more tense"
222
+ venice-video workshop -p ~/VeniceVideos/my-film --status
223
+ venice-video workshop -p ~/VeniceVideos/my-film --approve
224
+ ```
225
+
226
+ Approval materializes the accepted aesthetic, cast, locations, and script into
227
+ the existing production pipeline.
228
+
229
+ The workshop also asks for the final delivery target. Choose **4K master** to
230
+ keep generation/drafts economical and upscale only the approved assembled cut:
231
+
232
+ ```bash
233
+ venice-video finish -p ~/VeniceVideos/my-film
234
+ # Prints input, output, and cost estimate first; then:
235
+ venice-video finish -p ~/VeniceVideos/my-film --yes
236
+ ```
237
+
238
+ The finishing command finds the assembled master, chunks large videos into
239
+ upload-safe segments, upscales them through `topaz-video-upscale`, resumes
240
+ already-finished chunks after interruption, concatenates without another video
241
+ encode, and remuxes the original audio. The 4K master lands in `masters/` while
242
+ the original assembled master is preserved. Current rough estimate: about
243
+ $0.12 per input second; the CLI always shows the estimate before spending.
244
+
245
+ For a standalone file outside a project:
246
+
247
+ ```bash
248
+ venice-video upscale --input final-cut.mp4 --factor 4
249
+ venice-video upscale --input final-cut.mp4 --factor 4 --yes
250
+ ```
251
+
252
+ Individual commands such as
253
+ `explore-aesthetic`, `add-character`, and `storyboard-episode` remain available
254
+ for advanced manual control, but they are no longer the default onboarding path.
255
+
175
256
  The `new` wizard starts with these production types:
176
257
 
177
258
  1. **Film** — a film of any length; there is no short-duration assumption
@@ -180,6 +261,12 @@ The `new` wizard starts with these production types:
180
261
  4. Music video
181
262
  5. Screenplay
182
263
 
264
+ Film projects use `new-script` and `workshop-script` terminology. Internally,
265
+ legacy JSON keys and directories still use `episode` for compatibility, but the
266
+ CLI and scriptwriter prompt call the work a Film and Part. Film scripts do not
267
+ inherit the series workflow's 60-second duration, one-location structure, or
268
+ next-episode cliffhanger.
269
+
183
270
  A non-interactive Film can also be created explicitly:
184
271
 
185
272
  ```bash
@@ -270,6 +357,29 @@ Every shot renders in **pure reference mode** — no start image — from an ord
270
357
 
271
358
  These defaults are overridable per-project via `series.json` → `videoDefaults`. To target a non-Seedance family (e.g. for accounts that lack Seedance access, or projects that need a different look), set `videoDefaults` to `kling-o3-standard-reference-to-video` (character consistency) and `veo3.1-fast-image-to-video` (atmosphere). Image models default to `nano-banana-2` / `nano-banana-2-edit` for all panels regardless of video family.
272
359
 
360
+ ### Picking a family at project creation
361
+
362
+ `venice-video new` asks which family to use, and `venice-video new-series` asks too when it's run on a terminal without `--video-family`. Both write the answer to `series.json` → `videoDefaults.videoFamilyPreference` and swap the action / atmosphere / character-consistency models to match. The wizard orders the families as Automatic, Seedance, MiniMax H3, HappyHorse, Grok Imagine, then Kling O3.
363
+
364
+ ### Choosing dialogue audio
365
+
366
+ - **Native dialogue** keeps the shot on the selected video family. Seedance and HappyHorse attach each character's short voice-donor clip through `reference_audio_urls`, then generate the authored line in-frame with that voice identity.
367
+ - **Exact lip-sync** renders the exact line with Venice speech, creates a Seedance identity keyframe, and drives Wan 2.7 mouth movement from that speech file through `audio_url`.
368
+ - **Narrator voice-over** keeps spoken narration out of the video prompt and mixes Venice speech over the picture in post.
369
+
370
+ A voice-donor reference preserves timbre, accent, and pacing; it is not the exact dialogue recording. Wan 2.7 is used only when the project explicitly selects exact lip-sync.
371
+
372
+ | Family | Picks | Trade-off |
373
+ |--------|-------|-----------|
374
+ | `seedance` | Seedance 2.0 Enhanced R2V for all three lanes | The default. Strongest identity anchoring, 720p drafts, 4-15s. |
375
+ | `minimax-h3` | H3 i2v (action/atmosphere) + H3 R2V (identity) | 2K with native stereo audio at ~1/3 the per-second cost. But 2K is the only resolution, so there's no cheap draft pass, and the 5s floor means 3-4s beats have to be re-scripted. |
376
+ | `happyhorse` | HappyHorse 1.1 i2v + R2V | Best lip-sync (7 languages, phoneme-level), 3-15s, 720p/1080p. |
377
+ | `grok-imagine` | Grok Imagine i2v + R2V | Atmosphere-forward look; R2V durations stepped at 5s/8s/10s. |
378
+ | `kling-o3` | Kling O3 Standard i2v + R2V | Stylized and illustrated aesthetics; `elements` + `scene_image_urls`. |
379
+ | `auto` | Whatever the harness currently defaults to | Tracks the default as it moves; Seedance Enhanced today. |
380
+
381
+ Non-interactive callers (the MCP, CI) pass `--video-family` explicitly; when it's omitted without a TTY the harness defaults stay in place.
382
+
273
383
  ## Image / Video Family Pairing
274
384
 
275
385
  **Venice removed the Seedance seedream-only face restriction (2026-07).** Seedance 2.0 previously rejected face-bearing input images that weren't produced by `seedream-v5-lite` / `seedream-v5-lite-edit`; it now accepts face-bearing images from **any** image family. The harness therefore uses a single high-quality default for every panel — character-bearing or faceless, generation or multi-edit:
package/dist/index.d.ts CHANGED
@@ -3,4 +3,5 @@ export { generateVideo, quoteVideo } from './venice/video.js';
3
3
  export { listVideoModels, getVideoModel } from './venice/models.js';
4
4
  export { createSeries, loadSeries, saveSeries, listSeries } from './series/manager.js';
5
5
  export type { SeriesState, EpisodeScript, ShotScript } from './series/types.js';
6
+ export { upscaleVideo, estimateUpscaleCostUsd, TOPAZ_VIDEO_UPSCALE_MODEL } from './venice/upscale.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -2,4 +2,5 @@ export { VeniceClient, VeniceRequestError } from './venice/client.js';
2
2
  export { generateVideo, quoteVideo } from './venice/video.js';
3
3
  export { listVideoModels, getVideoModel } from './venice/models.js';
4
4
  export { createSeries, loadSeries, saveSeries, listSeries } from './series/manager.js';
5
+ export { upscaleVideo, estimateUpscaleCostUsd, TOPAZ_VIDEO_UPSCALE_MODEL } from './venice/upscale.js';
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { VideoFamilyPreference } from '../series/types.js';
2
+ export declare const VIDEO_FAMILY_CHOICES: ReadonlyArray<{
3
+ label: string;
4
+ value: VideoFamilyPreference;
5
+ description?: string;
6
+ }>;
7
+ export declare const AUDIO_STRATEGY_CHOICES: readonly [{
8
+ readonly label: "Native dialogue";
9
+ readonly value: "native";
10
+ readonly description: "The selected video model speaks in-frame; Seedance uses character voice references";
11
+ }, {
12
+ readonly label: "Exact lip-sync";
13
+ readonly value: "lip-sync";
14
+ readonly description: "Venice speech drives Wan 2.7 mouth movement";
15
+ }, {
16
+ readonly label: "Narrator voice-over";
17
+ readonly value: "narrator-vo";
18
+ readonly description: "Mute model narration and own the VO lane";
19
+ }];
20
+ //# sourceMappingURL=choices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choices.d.ts","sourceRoot":"","sources":["../../src/mini-drama/choices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC;IAC/C,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACnE,CAOA,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIzB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export const VIDEO_FAMILY_CHOICES = [
2
+ { label: 'Automatic', value: 'auto', description: 'Current reference-first Seedance Enhanced defaults' },
3
+ { label: 'Seedance 2.0', value: 'seedance', description: 'Reference-first identity anchoring, native dialogue, 720p drafts, 4-15s' },
4
+ { label: 'MiniMax H3', value: 'minimax-h3', description: 'Open-weight omni-modal, 2K native audio, 5-15s' },
5
+ { label: 'HappyHorse 1.1', value: 'happyhorse', description: 'Native multilingual lip-sync, 720p/1080p, 3-15s' },
6
+ { label: 'Grok Imagine', value: 'grok-imagine', description: 'Atmosphere-forward look; R2V durations stepped at 5s/8s/10s' },
7
+ { label: 'Kling O3', value: 'kling-o3', description: 'Stylized and illustrated aesthetics; structured character elements' },
8
+ ];
9
+ export const AUDIO_STRATEGY_CHOICES = [
10
+ { label: 'Native dialogue', value: 'native', description: 'The selected video model speaks in-frame; Seedance uses character voice references' },
11
+ { label: 'Exact lip-sync', value: 'lip-sync', description: 'Venice speech drives Wan 2.7 mouth movement' },
12
+ { label: 'Narrator voice-over', value: 'narrator-vo', description: 'Mute model narration and own the VO lane' },
13
+ ];
14
+ //# sourceMappingURL=choices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choices.js","sourceRoot":"","sources":["../../src/mini-drama/choices.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAE5B;IACH,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,oDAAoD,EAAE;IACxG,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,yEAAyE,EAAE;IACpI,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gDAAgD,EAAE;IAC3G,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,iDAAiD,EAAE;IAChH,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,6DAA6D,EAAE;IAC5H,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,oEAAoE,EAAE;CAC5H,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,oFAAoF,EAAE;IAChJ,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,6CAA6C,EAAE;IAC1G,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,0CAA0C,EAAE;CACvG,CAAC"}