@clipwright/core 0.33.0 → 0.34.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.
- package/CHANGELOG.md +144 -0
- package/dist/api-failure.js +2 -1
- package/dist/api-failure.js.map +1 -1
- package/dist/asset-identity.d.ts +6 -0
- package/dist/asset-identity.js +7 -0
- package/dist/asset-identity.js.map +1 -0
- package/dist/assets.d.ts +386 -7
- package/dist/assets.js +114 -21
- package/dist/assets.js.map +1 -1
- package/dist/caption-language.d.ts +2 -0
- package/dist/caption-language.js +17 -0
- package/dist/caption-language.js.map +1 -0
- package/dist/contract-dispositions.d.ts +1133 -8
- package/dist/contract-dispositions.js +51 -11
- package/dist/contract-dispositions.js.map +1 -1
- package/dist/contracts/v1/workflow-brief.d.ts +1670 -2
- package/dist/contracts/v1/workflow-catalog.d.ts +1670 -2
- package/dist/contracts/v1/workflow-client.d.ts +835 -1
- package/dist/contracts/v1/workflow-execution.d.ts +2 -0
- package/dist/contracts/v1/workflow-plan.d.ts +2533 -31
- package/dist/endpoints.js +2 -0
- package/dist/endpoints.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/generations.d.ts +32 -6
- package/dist/generations.js +83 -27
- package/dist/generations.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/public-endpoints.d.ts +2 -0
- package/dist/public-endpoints.js +2 -0
- package/dist/public-endpoints.js.map +1 -1
- package/dist/resolved-timeline.d.ts +153 -0
- package/dist/resolved-timeline.js +46 -0
- package/dist/resolved-timeline.js.map +1 -1
- package/dist/run-static-warnings.js +5 -2
- package/dist/run-static-warnings.js.map +1 -1
- package/dist/semantic-inserts.d.ts +7 -0
- package/dist/semantic-inserts.js +19 -9
- package/dist/semantic-inserts.js.map +1 -1
- package/dist/skills.d.ts +4112 -77
- package/dist/skills.js +261 -16
- package/dist/skills.js.map +1 -1
- package/dist/templates/callout.d.ts +34 -0
- package/dist/templates/callout.js +51 -0
- package/dist/templates/callout.js.map +1 -0
- package/dist/templates/checklist.d.ts +42 -0
- package/dist/templates/checklist.js +47 -0
- package/dist/templates/checklist.js.map +1 -0
- package/dist/templates/compare.d.ts +26 -0
- package/dist/templates/compare.js +35 -0
- package/dist/templates/compare.js.map +1 -0
- package/dist/templates/end-card.d.ts +16 -0
- package/dist/templates/end-card.js +25 -0
- package/dist/templates/end-card.js.map +1 -0
- package/dist/templates/index.d.ts +164 -0
- package/dist/templates/index.js +382 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/lower-third.d.ts +18 -0
- package/dist/templates/lower-third.js +26 -0
- package/dist/templates/lower-third.js.map +1 -0
- package/dist/templates/notification.d.ts +30 -0
- package/dist/templates/notification.js +32 -0
- package/dist/templates/notification.js.map +1 -0
- package/dist/templates/phone-call.d.ts +24 -0
- package/dist/templates/phone-call.js +36 -0
- package/dist/templates/phone-call.js.map +1 -0
- package/dist/templates/progress.d.ts +22 -0
- package/dist/templates/progress.js +42 -0
- package/dist/templates/progress.js.map +1 -0
- package/dist/templates/quote.d.ts +21 -0
- package/dist/templates/quote.js +29 -0
- package/dist/templates/quote.js.map +1 -0
- package/dist/templates/rating.d.ts +22 -0
- package/dist/templates/rating.js +29 -0
- package/dist/templates/rating.js.map +1 -0
- package/dist/templates/size.d.ts +13 -0
- package/dist/templates/size.js +10 -0
- package/dist/templates/size.js.map +1 -0
- package/dist/templates/slot.d.ts +10 -0
- package/dist/templates/slot.js +5 -0
- package/dist/templates/slot.js.map +1 -0
- package/dist/templates/sounds.d.ts +351 -0
- package/dist/templates/sounds.js +67 -0
- package/dist/templates/sounds.js.map +1 -0
- package/dist/templates/stat.d.ts +20 -0
- package/dist/templates/stat.js +33 -0
- package/dist/templates/stat.js.map +1 -0
- package/dist/templates/tag.d.ts +23 -0
- package/dist/templates/tag.js +31 -0
- package/dist/templates/tag.js.map +1 -0
- package/dist/templates/theme.d.ts +29 -0
- package/dist/templates/theme.js +47 -0
- package/dist/templates/theme.js.map +1 -0
- package/dist/templates/title-card.d.ts +21 -0
- package/dist/templates/title-card.js +30 -0
- package/dist/templates/title-card.js.map +1 -0
- package/dist/tts-backend.d.ts +9 -0
- package/dist/tts-backend.js +21 -0
- package/dist/tts-backend.js.map +1 -1
- package/dist/ugc-layers.d.ts +84 -0
- package/dist/ugc-layers.js +137 -0
- package/dist/ugc-layers.js.map +1 -0
- package/dist/ugc-video-media.d.ts +12 -0
- package/dist/ugc-video-media.js +39 -0
- package/dist/ugc-video-media.js.map +1 -0
- package/dist/voice-admission.d.ts +835 -1
- package/dist/workflows/methods/faceless-explainer.d.ts +329 -2
- package/dist/workflows/methods/kinetic-launch.d.ts +329 -2
- package/dist/workflows/methods/product-image-story.d.ts +329 -2
- package/dist/workflows/methods/shared.d.ts +329 -2
- package/dist/workflows/methods/ugc-faq-answer.d.ts +329 -2
- package/dist/workflows/methods/ugc-product-intro.d.ts +329 -2
- package/dist/workflows/methods/website-proof-demo.d.ts +329 -2
- package/dist/workflows/validate.js +14 -9
- package/dist/workflows/validate.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { captionLanguageOf } from "../caption-language.js";
|
|
3
|
+
import { lexicalTokens, quoteOccurrences } from "../semantic-inserts.js";
|
|
4
|
+
import { faceZone, frameCanvasOf, layerWordRange, MAX_OVERLAYS_AT_ONCE, overlayRect, rectsOverlap } from "../ugc-layers.js";
|
|
5
|
+
import { callout } from "./callout.js";
|
|
6
|
+
import { checklist } from "./checklist.js";
|
|
7
|
+
import { compare } from "./compare.js";
|
|
8
|
+
import { endCard } from "./end-card.js";
|
|
9
|
+
import { lowerThird } from "./lower-third.js";
|
|
10
|
+
import { notification } from "./notification.js";
|
|
11
|
+
import { phoneCall } from "./phone-call.js";
|
|
12
|
+
import { progress } from "./progress.js";
|
|
13
|
+
import { quote } from "./quote.js";
|
|
14
|
+
import { rating } from "./rating.js";
|
|
15
|
+
import { stat } from "./stat.js";
|
|
16
|
+
import { tag } from "./tag.js";
|
|
17
|
+
import { DEFAULT_TEMPLATE_PRESET, templateAccentRefusal } from "./theme.js";
|
|
18
|
+
import { titleCard } from "./title-card.js";
|
|
19
|
+
// The graphic template catalog of any `make_ugc` script run (#778 S3, #840): one entry per kind, from which both schemas and every refusal come.
|
|
20
|
+
export const TEMPLATE_PLACEMENTS = ["over", "full"];
|
|
21
|
+
export const MAX_TEMPLATES = 12;
|
|
22
|
+
export { contrastRatio, DEFAULT_TEMPLATE_PRESET, TEMPLATE_MIN_CONTRAST, TEMPLATE_PRESET_SURFACES, TEMPLATE_PRESETS, templateAccentRefusal, templateTheme } from "./theme.js";
|
|
23
|
+
export const TEMPLATE_KINDS = [tag, lowerThird, endCard, titleCard, quote, stat, callout, checklist, phoneCall, compare,
|
|
24
|
+
notification, progress, rating];
|
|
25
|
+
export const TEMPLATE_KIND_IDS = ["tag", "lower_third", "end_card", "title_card", "quote", "stat", "callout", "checklist", "phone_call", "compare",
|
|
26
|
+
"notification", "progress", "rating"];
|
|
27
|
+
/** Earlier versions of kinds a frozen timeline may still name, each with its own footprint (A8, #819); every kind is at its first version. */
|
|
28
|
+
export const TEMPLATE_KIND_HISTORY = [];
|
|
29
|
+
/** A kind as it was at `version`: the current entry or one from its history; a version neither holds has no footprint to draw. */
|
|
30
|
+
export function templateKindAt(kind, version, kinds = TEMPLATE_KINDS, history = TEMPLATE_KIND_HISTORY) {
|
|
31
|
+
const current = kinds.find(entry => entry.kind === kind);
|
|
32
|
+
if (!current)
|
|
33
|
+
throw new Error(`unknown template kind ${kind}`);
|
|
34
|
+
if (version === undefined || version === current.kindVersion)
|
|
35
|
+
return current;
|
|
36
|
+
const past = history.find(entry => entry.kind === kind && entry.kindVersion === version);
|
|
37
|
+
if (!past)
|
|
38
|
+
throw new Error(`template kind ${kind}@${version} has no footprint: the registry holds no such version`);
|
|
39
|
+
return past;
|
|
40
|
+
}
|
|
41
|
+
export { TEMPLATE_SIZES } from "./size.js";
|
|
42
|
+
export { DEFAULT_TEMPLATE_SOUNDS, listTemplateSounds, mcpTemplateSounds, TEMPLATE_KIND_SOUNDS, TEMPLATE_SOUND_BEATS, TEMPLATE_SOUNDS, TEMPLATE_SOUNDS_PATH, templateSoundBeats, templateSoundMap, templateSounds, templateSoundsList } from "./sounds.js";
|
|
43
|
+
export { TAG_RECT_EMS } from "./tag.js";
|
|
44
|
+
export { END_CARD_RECT_EMS } from "./end-card.js";
|
|
45
|
+
export { TITLE_CARD_RECT_EMS } from "./title-card.js";
|
|
46
|
+
export { QUOTE_RECT_EMS } from "./quote.js";
|
|
47
|
+
export { STAT_RECT_EMS } from "./stat.js";
|
|
48
|
+
export { CALLOUT_LABEL_EMS, calloutParts } from "./callout.js";
|
|
49
|
+
export { CHECKLIST_EMS } from "./checklist.js";
|
|
50
|
+
export { COMPARE_CARD_SHAPE } from "./compare.js";
|
|
51
|
+
export { NOTIFICATION_EMS } from "./notification.js";
|
|
52
|
+
export { PROGRESS_EMS } from "./progress.js";
|
|
53
|
+
export { RATING_EMS } from "./rating.js";
|
|
54
|
+
export { templateMedia } from "./slot.js";
|
|
55
|
+
/** Every value at a dotted path of a kind's data, one per element where the path crosses or ends in a list, with its own path; an absent last
|
|
56
|
+
* field is listed, a path through an absent object or list lists nothing. */
|
|
57
|
+
export function templateFieldValues(data, field) {
|
|
58
|
+
const walk = (value, keys, path) => {
|
|
59
|
+
if (Array.isArray(value))
|
|
60
|
+
return value.flatMap((entry, index) => walk(entry, keys, [...path, index]));
|
|
61
|
+
if (!keys.length)
|
|
62
|
+
return [{ path, value }];
|
|
63
|
+
if (value === null || typeof value !== "object")
|
|
64
|
+
return [];
|
|
65
|
+
const [key, ...rest] = keys;
|
|
66
|
+
return walk(value[key], rest, [...path, key]);
|
|
67
|
+
};
|
|
68
|
+
return walk(data, field.split("."), []);
|
|
69
|
+
}
|
|
70
|
+
/** The data with every value at a dotted path set to `value`, through lists and in each element of a list it ends in; a missing object on the
|
|
71
|
+
* way is created. */
|
|
72
|
+
export function withTemplateField(data, field, value) {
|
|
73
|
+
const set = (target, keys) => {
|
|
74
|
+
if (Array.isArray(target))
|
|
75
|
+
return target.map(entry => set(entry, keys));
|
|
76
|
+
if (!keys.length)
|
|
77
|
+
return value;
|
|
78
|
+
const [key, ...rest] = keys;
|
|
79
|
+
const object = (target ?? {});
|
|
80
|
+
return { ...object, [key]: set(object[key], rest) };
|
|
81
|
+
};
|
|
82
|
+
return set(data, field.split("."));
|
|
83
|
+
}
|
|
84
|
+
/** Frames a template takes to enter; a beat without a quote is spread evenly from there to 80% of its span (D6). */
|
|
85
|
+
export const TEMPLATE_ENTER_FRAMES = 8;
|
|
86
|
+
/** The word each beat of a template lands on: its quote's first word inside the item's words, after the beat before; none for a beat without
|
|
87
|
+
* a quote; or why it cannot land (D6, D10). */
|
|
88
|
+
export function templateMomentWords(kind, data, tokens, range) {
|
|
89
|
+
let after = range.startWord;
|
|
90
|
+
const quoted = (kind.quotes ?? []).flatMap(field => templateFieldValues(data, field));
|
|
91
|
+
const beats = kind.spreads && quoted.every(({ value }) => value === undefined) ? templateFieldValues(data, kind.spreads).map(({ path }) => ({ path, value: undefined }))
|
|
92
|
+
: quoted;
|
|
93
|
+
return beats.map(({ path, value }) => {
|
|
94
|
+
if (typeof value !== "string")
|
|
95
|
+
return { path };
|
|
96
|
+
const matches = quoteOccurrences(tokens, value), inside = matches.filter(match => match.startWord >= range.startWord && match.endWord <= range.coverWord);
|
|
97
|
+
const next = inside.find(match => match.startWord >= after);
|
|
98
|
+
if (!next) {
|
|
99
|
+
return { path, refusal: !matches.length ? `"${value}" does not occur in the script` : !inside.length
|
|
100
|
+
? `"${value}" lies outside the template's own words: an inner quote sits inside them`
|
|
101
|
+
: `"${value}" comes before the beat ahead of it: inner quotes follow the script's word order` };
|
|
102
|
+
}
|
|
103
|
+
after = next.startWord + 1;
|
|
104
|
+
return { path, word: next.startWord };
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/** Frames between a moved beat and the next, so a checklist's cursor still travels between two clicks. */
|
|
108
|
+
export const TEMPLATE_BEAT_GAP = 6;
|
|
109
|
+
/** Each beat's frame from the template's start, frozen in the timeline; the renderer reads frames only (D11). A beat spoken before the kind's
|
|
110
|
+
* `beatsFrom` moves there, the beats after it keep `TEMPLATE_BEAT_GAP`, and each move is a warning (rule 3, owner 23.10). */
|
|
111
|
+
export function templateMoments(kind, data, tokens, range, words, fps, span, id = "template") {
|
|
112
|
+
const lexical = words.filter(word => !/^\p{P}+$/u.test(word.word)), duration = span.endFrame - span.startFrame;
|
|
113
|
+
const beats = templateMomentWords(kind, data, tokens, range), from = kind.beatsFrom ?? TEMPLATE_ENTER_FRAMES + 1, warnings = [];
|
|
114
|
+
let before;
|
|
115
|
+
const moments = beats.map((beat, index) => {
|
|
116
|
+
if (beat.refusal)
|
|
117
|
+
throw new Error(`template beat ${beat.path.join(".")} ${beat.refusal}`);
|
|
118
|
+
const at = beat.word === undefined
|
|
119
|
+
? TEMPLATE_ENTER_FRAMES + Math.round(((0.8 * duration - TEMPLATE_ENTER_FRAMES) * (index + 1)) / beats.length)
|
|
120
|
+
: Math.round(lexical[beat.word].startSec * fps) - span.startFrame;
|
|
121
|
+
const early = at < from, crowded = before !== undefined && at < before + TEMPLATE_BEAT_GAP;
|
|
122
|
+
const moved = Math.min(duration - 1, Math.max(0, at, from, before === undefined ? 0 : before + TEMPLATE_BEAT_GAP));
|
|
123
|
+
before = early || crowded ? moved : undefined;
|
|
124
|
+
if (moved !== Math.min(duration - 1, Math.max(0, at))) {
|
|
125
|
+
const quote = templateFieldValues(data, beat.path.filter(part => typeof part === "string").join("."))
|
|
126
|
+
.find(entry => entry.path.join(".") === beat.path.join("."))?.value;
|
|
127
|
+
warnings.push(`template "${id}" ${beat.path.join(".")}${typeof quote === "string" ? ` "${quote}" is spoken` : " falls"} on frame ${Math.max(0, at)} of the ` +
|
|
128
|
+
`template, ${early ? `before its ${kind.kind} is on screen` : "too close after the beat before it moved"}: the beat plays on frame ${moved}`);
|
|
129
|
+
}
|
|
130
|
+
return moved;
|
|
131
|
+
});
|
|
132
|
+
return { moments, warnings };
|
|
133
|
+
}
|
|
134
|
+
/** The most pins a run's templates take: each template's slots. */
|
|
135
|
+
export const MAX_TEMPLATE_MEDIA = MAX_TEMPLATES * Math.max(...TEMPLATE_KINDS.map(kind => Object.keys(kind.slots).length));
|
|
136
|
+
/** Every way a kind draws: each placement with its sample, then each value of each enum field over the sample at its first placement;
|
|
137
|
+
* the composition declares motion phases for each, and the media test checks them. */
|
|
138
|
+
export function templateVariants(kind) {
|
|
139
|
+
const sample = kind.sample;
|
|
140
|
+
return [...kind.placements.map(placement => ({ key: `placement:${placement}`, placement, data: sample })),
|
|
141
|
+
...Object.entries(kind.data.shape).flatMap(([field, schema]) => {
|
|
142
|
+
const inner = schema.unwrap?.() ?? schema;
|
|
143
|
+
return (inner.options ?? [])
|
|
144
|
+
.map(option => ({ key: `${field}:${option}`, placement: kind.placements[0], data: { ...sample, [field]: option } }));
|
|
145
|
+
})];
|
|
146
|
+
}
|
|
147
|
+
/** Every media slot the templates fill, in item then slot order: what admission pins and every source walker reads (#778 S3a(ii)). */
|
|
148
|
+
export function templateMediaOf(templates) {
|
|
149
|
+
return (templates ?? []).flatMap((item, index) => Object.entries(TEMPLATE_KINDS.find(kind => kind.kind === item.kind)?.slots ?? {}).flatMap(([slot, takes]) => {
|
|
150
|
+
const media = item.data[slot];
|
|
151
|
+
return typeof media?.asset_id === "string" ? [{ index, id: item.id, slot, asset_id: media.asset_id, media_type: takes.type, cover: takes.cover }] : [];
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
const RANGES = (pairs) => pairs.flatMap((value, index) => (index % 2 ? [] : [[value, pairs[index + 1]]]));
|
|
155
|
+
/** Latin letters every face draws: ASCII, Latin-1 and Latin Extended-A/B; Vietnamese adds its own block. */
|
|
156
|
+
const LATIN = RANGES([0x41, 0x5a, 0x61, 0x7a, 0xc0, 0xd6, 0xd8, 0xf6, 0xf8, 0x24f]);
|
|
157
|
+
const COMMON = RANGES([0x20, 0x40, 0x5b, 0x60, 0x7b, 0x7e, 0xa0, 0xbf, 0xd7, 0xd7, 0xf7, 0xf7, 0x2010, 0x2027, 0x2030, 0x203a, 0x20ac, 0x20ac]);
|
|
158
|
+
const EXTRA = {
|
|
159
|
+
vi: RANGES([0x1e00, 0x1eff]), ar: RANGES([0x60c, 0x60c, 0x61b, 0x61b, 0x61f, 0x61f, 0x64b, 0x65f, 0x670, 0x670]), hi: RANGES([0x964, 0x965]),
|
|
160
|
+
...Object.fromEntries(["ja", "zh", "ko"].map(language => [language, RANGES([0x3000, 0x3003, 0x3008, 0x3017, 0x301c, 0x301c, 0x301e, 0x301e,
|
|
161
|
+
0x30fb, 0x30fc, 0xff01, 0xff5e])])),
|
|
162
|
+
};
|
|
163
|
+
const SCRIPTS = {
|
|
164
|
+
ru: ["Cyrillic", /\p{Script=Cyrillic}/u], el: ["Greek", /\p{Script=Greek}/u], ja: ["Japanese", /[\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Han}]/u],
|
|
165
|
+
zh: ["Chinese", /\p{Script=Han}/u], ko: ["Hangul", /\p{Script=Hangul}/u], ar: ["Arabic", /\p{Script=Arabic}/u],
|
|
166
|
+
hi: ["Devanagari", /\p{Script=Devanagari}/u], ta: ["Tamil", /\p{Script=Tamil}/u],
|
|
167
|
+
};
|
|
168
|
+
/** Code points template text may use besides the run script's letters, for a caption language; the glyph test reads this list. */
|
|
169
|
+
export function templateCharRanges(language) {
|
|
170
|
+
return [...LATIN, ...COMMON, ...(EXTRA[language] ?? [])];
|
|
171
|
+
}
|
|
172
|
+
const WIDE = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\u{3000}-\u{303f}\u{ff01}-\u{ff60}\u{ffe0}-\u{ffe6}]/u;
|
|
173
|
+
/** Units of a text: a wide CJK character takes the room of two. */
|
|
174
|
+
export const textUnits = (text) => Array.from(text).reduce((sum, char) => sum + (WIDE.test(char) ? 2 : 1), 0);
|
|
175
|
+
/** Why a template text cannot be drawn, or nothing; the language is the run's, as the caption fonts read it. */
|
|
176
|
+
export function templateTextRefusal(text, limit, language) {
|
|
177
|
+
if (!text.trim())
|
|
178
|
+
return "is blank";
|
|
179
|
+
if (/[\r\n\u{2028}\u{2029}]/u.test(text))
|
|
180
|
+
return "has a line break: template text is one line";
|
|
181
|
+
const emoji = /\p{Extended_Pictographic}/u.exec(text);
|
|
182
|
+
if (emoji)
|
|
183
|
+
return `has "${emoji[0]}": no emoji or pictographs, the renderer has no font for them`;
|
|
184
|
+
const units = textUnits(text);
|
|
185
|
+
if (units > limit)
|
|
186
|
+
return `is ${units} units long, over the ${limit} it takes (a wide character counts 2)`;
|
|
187
|
+
const [name, letters] = SCRIPTS[language] ?? ["", undefined];
|
|
188
|
+
const ranges = templateCharRanges(language);
|
|
189
|
+
const odd = Array.from(text).find(char => !letters?.test(char) && !ranges.some(([from, to]) => char.codePointAt(0) >= from && char.codePointAt(0) <= to));
|
|
190
|
+
if (odd)
|
|
191
|
+
return `has "${odd}", which the run's fonts cannot draw: use Latin${name ? ` or ${name}` : ""} letters, digits and common punctuation`;
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
/** Where a template draws and what it does to captions, at a format; a frozen `kindVersion` reads that version's geometry (#819). */
|
|
195
|
+
export function templateFootprint(item, aspectRatio, kinds = TEMPLATE_KINDS, history = TEMPLATE_KIND_HISTORY) {
|
|
196
|
+
const kind = templateKindAt(item.kind, item.kindVersion, kinds, history);
|
|
197
|
+
if (item.placement === "full") {
|
|
198
|
+
return { rect: { left: 0, top: 0, width: 1, height: 1 }, hidesCaptions: true, onInserts: false, content: kind.rect(item.data, aspectRatio, "full") };
|
|
199
|
+
}
|
|
200
|
+
return { rect: kind.rect(item.data, aspectRatio), hidesCaptions: kind.hidesCaptions(item.data), onInserts: kind.onInserts,
|
|
201
|
+
...(kind.parts ? { parts: kind.parts(item.data, aspectRatio) } : {}) };
|
|
202
|
+
}
|
|
203
|
+
/** Over-presenter templates whose footprint meets the face: drawn as asked, and named (rule 3); every kind's default stays off it. */
|
|
204
|
+
export function templateFaceWarnings(input) {
|
|
205
|
+
if (!Array.isArray(input.templates))
|
|
206
|
+
return [];
|
|
207
|
+
const aspect = typeof input.aspect_ratio === "string" ? input.aspect_ratio : "9:16";
|
|
208
|
+
return input.templates.flatMap(item => {
|
|
209
|
+
const kind = TEMPLATE_KINDS.find(entry => entry.kind === item.kind);
|
|
210
|
+
const placement = item.placement ?? kind?.placements[0];
|
|
211
|
+
if (!kind || placement !== "over" || !kind.data.safeParse(item.data).success)
|
|
212
|
+
return [];
|
|
213
|
+
const guarded = kind.faceRect ? kind.faceRect(item.data, aspect) : kind.rect(item.data, aspect, "over");
|
|
214
|
+
return guarded && rectsOverlap(guarded, faceZone(aspect))
|
|
215
|
+
? [`template "${String(item.id)}" is drawn over the presenter's face: its ${kind.kind}${kind.faceRect ? " label" : ""} sits there as asked; ` +
|
|
216
|
+
"move it or use the kind's default place to keep the face clear"]
|
|
217
|
+
: [];
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/** The `templates` description: the gate, the text rules and one catalog line per kind, all from the registry. */
|
|
221
|
+
export function templateCatalogText(kinds = TEMPLATE_KINDS) {
|
|
222
|
+
const field = (kind, key, schema, path = key) => {
|
|
223
|
+
const def = schema._zod.def;
|
|
224
|
+
if (def.type === "optional")
|
|
225
|
+
return `${field(kind, key, def.innerType, path)}?`.replace(/^(\S+)(.*)\?$/, "$1?$2");
|
|
226
|
+
const options = schema.options;
|
|
227
|
+
if (kind.slots[path])
|
|
228
|
+
return `${key} {asset_id} ${kind.slots[path].type}${kind.slots[path].cover ? " (cut to fill)" : ""}`;
|
|
229
|
+
if (def.type === "number")
|
|
230
|
+
return `${key} number`;
|
|
231
|
+
if (def.type === "boolean")
|
|
232
|
+
return `${key} true|false`;
|
|
233
|
+
if (def.type === "array") {
|
|
234
|
+
// zod 4.6 fills `_zod.bag` lazily, so the bounds come from the public JSON Schema export.
|
|
235
|
+
const { minItems, maxItems } = z.toJSONSchema(schema, { unrepresentable: "any" });
|
|
236
|
+
return `${key} ${minItems ?? 0}–${maxItems} of ${field(kind, "", def.element, path).trim()}`;
|
|
237
|
+
}
|
|
238
|
+
if (def.type === "object") {
|
|
239
|
+
const shape = Object.entries(schema.shape);
|
|
240
|
+
// An object holding text or a quote lists its fields; a plain one, such as a target, its keys.
|
|
241
|
+
const deep = [...Object.keys(kind.text), ...(kind.quotes ?? [])].some(name => name.startsWith(`${path}.`));
|
|
242
|
+
return `${key} {${deep ? shape.map(([name, inner]) => field(kind, name, inner, `${path}.${name}`)).join(", ") : shape.map(([name]) => name).join(",")}}`;
|
|
243
|
+
}
|
|
244
|
+
if (kind.quotes?.includes(path))
|
|
245
|
+
return `${key} inner quote`;
|
|
246
|
+
return options ? `${key} ${options.join("|")}` : `${key} ≤ ${kind.text[path]}`;
|
|
247
|
+
};
|
|
248
|
+
return "Graphic templates, each { id, kind, anchor, cover_words?, placement?, transition?, data }. On any script run. Templates never " +
|
|
249
|
+
"change the price: a plain run is billed per second of finished video (30/s); a run with inserts, overlays or layout_windows is billed " +
|
|
250
|
+
"long-form-v1, and a covered presenter there is still face time. Ids are unique across inserts, overlays, layout_windows " +
|
|
251
|
+
"and templates. Text is one line of Latin or the script's own letters, digits and common punctuation, with no emoji; a wide CJK glyph " +
|
|
252
|
+
"counts 2 toward a limit, and long text shrinks to fit the kind's width. size small|medium|large scales a kind; absent is medium. " +
|
|
253
|
+
"A media field takes { asset_id } of a ready asset of the kind it names. An inner quote names words inside the template's own words, after " +
|
|
254
|
+
"the one before it: its beat lands on their first word, and must not fall under an insert or full-frame template; a click or step without one " +
|
|
255
|
+
"is spread evenly. A beat spoken before its template has entered moves just after the enter, with a warning. A template that meets the caption band hides captions while it shows; one elsewhere, such as a small one at the top, " +
|
|
256
|
+
"leaves them. A full-frame template also hides the presenter, overlays " +
|
|
257
|
+
"and over-presenter templates while it shows, never meets a wipe or zoom insert, and the covered presenter is billed. " +
|
|
258
|
+
`At most ${MAX_OVERLAYS_AT_ONCE} overlays and over-presenter templates show at once, on footprints that do not ` +
|
|
259
|
+
"overlap. template_theme sets the look of them all. Kinds: " + kinds.map(kind => `${kind.kind} (${kind.placements.join("|")}): ${kind.description}; data ` +
|
|
260
|
+
Object.entries(kind.data.shape).map(([key, schema]) => field(kind, key, schema)).join(", ")).join(". ") + ".";
|
|
261
|
+
}
|
|
262
|
+
const overlaps = (a, b) => a.startWord < b.coverWord && b.startWord < a.coverWord;
|
|
263
|
+
const meets = (a, b) => a.coverWord === b.startWord || b.coverWord === a.startWord;
|
|
264
|
+
const coveredBy = (range, cover) => Array.from({ length: range.coverWord - range.startWord }, (_, offset) => range.startWord + offset).every(word => cover.some(other => word >= other.startWord && word < other.coverWord));
|
|
265
|
+
const MOVING = new Set(["wipe", "zoom"]);
|
|
266
|
+
/** Every refusal of `templates`, `template_theme` and `template_sounds` against the run, named by path; empty when they render (D4, D5, D6, D8, D10, A5, A6). */
|
|
267
|
+
export function templateRefusals(input, kinds = TEMPLATE_KINDS) {
|
|
268
|
+
if (input.templates === undefined) {
|
|
269
|
+
return [...(input.template_theme === undefined ? [] : [{ path: ["template_theme"], message: "template_theme styles templates: add templates or drop it" }]),
|
|
270
|
+
...(input.template_sounds === undefined ? [] : [{ path: ["template_sounds"], message: "template_sounds sounds templates: add templates or drop it" }])];
|
|
271
|
+
}
|
|
272
|
+
if (input.script === undefined || input.segments !== undefined) {
|
|
273
|
+
return [{ path: ["templates"], message: "templates require script and cannot be combined with segments" }];
|
|
274
|
+
}
|
|
275
|
+
const refusals = [];
|
|
276
|
+
const accent = input.template_theme?.accent;
|
|
277
|
+
const contrast = accent === undefined || !/^#[0-9A-Fa-f]{6}$/.test(accent) ? undefined : templateAccentRefusal(input.template_theme?.preset ?? DEFAULT_TEMPLATE_PRESET, accent);
|
|
278
|
+
if (contrast)
|
|
279
|
+
refusals.push({ path: ["template_theme", "accent"], message: `template_theme accent ${contrast}` });
|
|
280
|
+
const tokens = lexicalTokens(input.script);
|
|
281
|
+
const language = captionLanguageOf(input.script);
|
|
282
|
+
const aspect = input.aspect_ratio ?? "9:16";
|
|
283
|
+
const used = new Map(["inserts", "overlays", "layout_windows"].flatMap(field => (input[field] ?? []).map(item => [item.id, field])));
|
|
284
|
+
const ranged = (items) => (items ?? []).flatMap(item => { const range = layerWordRange(tokens, item); return typeof range === "string" ? [] : [{ item, range }]; });
|
|
285
|
+
const inserts = ranged(input.inserts), windows = ranged(input.layout_windows);
|
|
286
|
+
const overlays = ranged(input.overlays).map(entry => ({ ...entry, rect: overlayRect(entry.item.position, frameCanvasOf(aspect)) }));
|
|
287
|
+
const placed = [];
|
|
288
|
+
for (const [index, item] of input.templates.entries()) {
|
|
289
|
+
const at = (...rest) => ["templates", index, ...rest];
|
|
290
|
+
const owner = used.get(item.id);
|
|
291
|
+
if (owner !== undefined)
|
|
292
|
+
refusals.push({ path: at("id"), message: `id "${item.id}" is already used in ${owner}: ids are unique across inserts, overlays, layout_windows and templates` });
|
|
293
|
+
used.set(item.id, "templates");
|
|
294
|
+
const kind = kinds.find(entry => entry.kind === item.kind);
|
|
295
|
+
if (!kind) {
|
|
296
|
+
refusals.push({ path: at("kind"), message: `unknown template kind "${item.kind}": use one of ${kinds.map(entry => entry.kind).join(", ")}` });
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const parsed = kind.data.safeParse(item.data);
|
|
300
|
+
if (!parsed.success) {
|
|
301
|
+
for (const issue of parsed.error.issues)
|
|
302
|
+
refusals.push({ path: at("data", ...issue.path.map(String)), message: `${item.kind}: ${issue.message}` });
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const placement = item.placement ?? kind.placements[0];
|
|
306
|
+
if (!kind.placements.includes(placement))
|
|
307
|
+
refusals.push({ path: at("placement"), message: `${item.kind} takes placement ${kind.placements.join(" or ")}, not ${placement}` });
|
|
308
|
+
if (item.transition !== undefined && placement !== "full")
|
|
309
|
+
refusals.push({ path: at("transition"), message: "transition works on a full-frame template only" });
|
|
310
|
+
for (const [field, limit] of Object.entries(kind.text))
|
|
311
|
+
for (const { path, value } of templateFieldValues(parsed.data, field)) {
|
|
312
|
+
const why = typeof value === "string" ? templateTextRefusal(value, limit, language) : undefined;
|
|
313
|
+
if (why)
|
|
314
|
+
refusals.push({ path: at("data", ...path), message: `${item.kind} ${path.join(".")} ${why}` });
|
|
315
|
+
}
|
|
316
|
+
const range = layerWordRange(tokens, item);
|
|
317
|
+
if (typeof range === "string") {
|
|
318
|
+
refusals.push({ path: at("anchor"), message: `template "${item.id}": ${range}` });
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
const beats = templateMomentWords(kind, parsed.data, tokens, range);
|
|
322
|
+
for (const beat of beats)
|
|
323
|
+
if (beat.refusal)
|
|
324
|
+
refusals.push({ path: at("data", ...beat.path), message: `template "${item.id}" ${beat.path.join(".")} ${beat.refusal}` });
|
|
325
|
+
const { rect, onInserts } = templateFootprint({ kind: item.kind, placement, data: parsed.data }, aspect, kinds);
|
|
326
|
+
placed.push({ index, id: item.id, placement, transition: item.transition, range, rect, onInserts,
|
|
327
|
+
beats: beats.flatMap(beat => (beat.word === undefined ? [] : [{ path: beat.path, word: beat.word }])) });
|
|
328
|
+
}
|
|
329
|
+
const fulls = placed.filter(entry => entry.placement === "full"), overs = placed.filter(entry => entry.placement === "over");
|
|
330
|
+
for (const entry of placed) {
|
|
331
|
+
const refuse = (message) => refusals.push({ path: ["templates", entry.index], message: `template "${entry.id}" ${message}` });
|
|
332
|
+
const window = windows.find(other => overlaps(other.range, entry.range));
|
|
333
|
+
if (window)
|
|
334
|
+
refuse(`overlaps layout window "${window.item.id}": a window reframes the presenter, and a template does not share the frame with it`);
|
|
335
|
+
// A beat under an insert or another full frame would play unseen (D6).
|
|
336
|
+
const hiding = [...inserts.map(other => ({ id: other.item.id, range: other.range })), ...fulls.filter(other => other.index !== entry.index)];
|
|
337
|
+
for (const beat of entry.beats) {
|
|
338
|
+
const cover = hiding.find(other => beat.word >= other.range.startWord && beat.word < other.range.coverWord);
|
|
339
|
+
if (cover)
|
|
340
|
+
refusals.push({ path: ["templates", entry.index, "data", ...beat.path], message: `template "${entry.id}" ${beat.path.join(".")} lands on words ` +
|
|
341
|
+
`"${cover.id}" covers with a full frame: the beat would play unseen; quote words outside it` });
|
|
342
|
+
}
|
|
343
|
+
if (entry.placement === "full") {
|
|
344
|
+
const insert = inserts.find(other => overlaps(other.range, entry.range));
|
|
345
|
+
if (insert)
|
|
346
|
+
refuse(`overlaps insert "${insert.item.id}": both fill the frame`);
|
|
347
|
+
const earlier = fulls.find(other => other.index < entry.index && overlaps(other.range, entry.range));
|
|
348
|
+
if (earlier)
|
|
349
|
+
refuse(`overlaps full-frame template "${earlier.id}": both fill the frame`);
|
|
350
|
+
const moving = inserts.find(other => MOVING.has(other.item.transition ?? "") && meets(other.range, entry.range));
|
|
351
|
+
if (moving)
|
|
352
|
+
refuse(`meets insert "${moving.item.id}", whose ${moving.item.transition} would show a hidden presenter frame: use cut or flash on one of them`);
|
|
353
|
+
const next = MOVING.has(entry.transition ?? "") && [...inserts.map(other => ({ id: other.item.id, range: other.range })),
|
|
354
|
+
...fulls.filter(other => other.index !== entry.index)].find(other => meets(other.range, entry.range));
|
|
355
|
+
if (next)
|
|
356
|
+
refuse(`has a ${entry.transition} and meets "${next.id}": it would show the presenter between two full-frame visuals; use cut or flash`);
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
const covers = [...(entry.onInserts ? [] : inserts.map(other => other.range)), ...fulls.map(other => other.range)];
|
|
360
|
+
if (covers.some(other => overlaps(other, entry.range)) && coveredBy(entry.range, covers)) {
|
|
361
|
+
refuse("lies wholly under full-frame inserts or templates: it draws over the presenter, who is not on screen there");
|
|
362
|
+
}
|
|
363
|
+
const together = [...overlays.map(other => ({ id: other.item.id, range: other.range, rect: other.rect })),
|
|
364
|
+
...overs.filter(other => other.index < entry.index)].filter(other => overlaps(other.range, entry.range));
|
|
365
|
+
const clash = together.find(other => rectsOverlap(other.rect, entry.rect));
|
|
366
|
+
if (clash) {
|
|
367
|
+
refuse(`shares the screen with "${clash.id}" at the same time on an overlapping footprint: move one of them or its words`);
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
const crowd = together.flatMap((a, i) => together.slice(i + 1).filter(b => Math.max(a.range.startWord, b.range.startWord, entry.range.startWord) <
|
|
371
|
+
Math.min(a.range.coverWord, b.range.coverWord, entry.range.coverWord)).map(b => [a, b]))[0];
|
|
372
|
+
if (crowd)
|
|
373
|
+
refuse(`would be on screen together with "${crowd[0].id}" and "${crowd[1].id}": at most ${MAX_OVERLAYS_AT_ONCE} overlays and templates show at once`);
|
|
374
|
+
}
|
|
375
|
+
for (const overlay of overlays) {
|
|
376
|
+
if (fulls.some(other => overlaps(other.range, overlay.range)) && coveredBy(overlay.range, [...inserts, ...fulls].map(other => other.range))) {
|
|
377
|
+
refusals.push({ path: ["overlays", input.overlays.indexOf(overlay.item)], message: `overlay "${overlay.item.id}" lies wholly under full-frame inserts or templates` });
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return refusals;
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAqB,QAAQ,EAAE,aAAa,EAAqC,cAAc,EAAE,oBAAoB,EAAE,WAAW,EACjH,YAAY,EAAkB,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAuB,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,iJAAiJ;AAEjJ,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAC7G,MAAM,YAAY,CAAC;AAiC9D,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO;IAC9I,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAuC,CAAC;AACxE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS;IAChJ,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAU,CAAC;AACjD,8IAA8I;AAC9I,MAAM,CAAC,MAAM,qBAAqB,GAA4B,EAAE,CAAC;AAEjE,kIAAkI;AAClI,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAA2B,EAAE,KAAK,GAA4B,cAAc,EACvH,OAAO,GAA4B,qBAAqB;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IAC/D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,OAAO,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC;IACzF,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,OAAO,uDAAuD,CAAC,CAAC;IACpH,OAAO,IAAI,CAAC;AACd,CAAC;AACD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAC9L,cAAc,EAAE,kBAAkB,EAA+F,MAAM,aAAa,CAAC;AACvJ,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAqB,MAAM,WAAW,CAAC;AAE7D;6EAC6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,IAAa,EAAE,KAAa;IAC9D,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,IAAuB,EAAE,IAAyB,EAAmD,EAAE;QACnI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAA6B,CAAC;QACrD,OAAO,IAAI,CAAE,KAAiC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;qBACqB;AACrB,MAAM,UAAU,iBAAiB,CAAC,IAA6B,EAAE,KAAa,EAAE,KAAc;IAC5F,MAAM,GAAG,GAAG,CAAC,MAAe,EAAE,IAAuB,EAAW,EAAE;QAChE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAA6B,CAAC;QACrD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAA4B,CAAC;QACzD,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IACtD,CAAC,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAA4B,CAAC;AAChE,CAAC;AAED,oHAAoH;AACpH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC;+CAC+C;AAC/C,MAAM,UAAU,mBAAmB,CAAC,IAAkB,EAAE,IAAa,EAAE,MAAyB,EAAE,KAAgB;IAEhH,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;IAC5B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtK,CAAC,CAAC,MAAM,CAAC;IACX,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1J,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,gCAAgC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;oBAClG,CAAC,CAAC,IAAI,KAAK,0EAA0E;oBACrF,CAAC,CAAC,IAAI,KAAK,kFAAkF,EAAE,CAAC;QACpG,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0GAA0G;AAC1G,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;6HAC6H;AAC7H,MAAM,UAAU,eAAe,CAAC,IAAkB,EAAE,IAAa,EAAE,MAAyB,EAAE,KAAgB,EAC5G,KAAoD,EAAE,GAAW,EAAE,IAA8C,EAAE,EAAE,GAAG,UAAU;IAElI,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;IAC/G,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,qBAAqB,GAAG,CAAC,EAAE,QAAQ,GAAa,EAAE,CAAC;IAC1I,IAAI,MAA0B,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS;YAChC,CAAC,CAAC,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YAC7G,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QACrE,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,SAAS,IAAI,EAAE,GAAG,MAAM,GAAG,iBAAiB,CAAC;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC;QACnH,MAAM,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9C,IAAI,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;YACtE,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,aAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU;gBAC1J,aAAa,KAAK,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,0CAA0C,6BAA6B,KAAK,EAAE,CAAC,CAAC;QAClJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AACD,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE1H;sFACsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAiC,CAAC;IACtD,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACvG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAI,MAAgD,CAAC,MAAM,EAAE,EAAE,IAAI,MAAM,CAAC;YACrF,OAAO,CAAE,KAAyC,CAAC,OAAO,IAAI,EAAE,CAAC;iBAC9D,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1H,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AAED,sIAAsI;AACtI,MAAM,UAAU,eAAe,CAAC,SAA6F;IAE3H,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5J,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAuC,CAAC;QACpE,OAAO,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzJ,CAAC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAsB,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzI,4GAA4G;AAC5G,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACpF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAChJ,MAAM,KAAK,GAAuC;IAChD,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5I,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;YACxI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;CACtC,CAAC;AACF,MAAM,OAAO,GAAqC;IAChD,EAAE,EAAE,CAAC,UAAU,EAAE,sBAAsB,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,yDAAyD,CAAC;IACzJ,EAAE,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IAC9G,EAAE,EAAE,CAAC,YAAY,EAAE,wBAAwB,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACjF,CAAC;AAEF,kIAAkI;AAClI,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,IAAI,GAAG,6HAA6H,CAAC;AAC3I,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE9H,gHAAgH;AAChH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa,EAAE,QAAgB;IAC/E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,6CAA6C,CAAC;IAC/F,MAAM,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,KAAK;QAAE,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,+DAA+D,CAAC;IAClG,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,MAAM,KAAK,yBAAyB,KAAK,uCAAuC,CAAC;IAC3G,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5J,IAAI,GAAG;QAAE,OAAO,QAAQ,GAAG,kDAAkD,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,yCAAyC,CAAC;IAChJ,OAAO,SAAS,CAAC;AACnB,CAAC;AAKD,qIAAqI;AACrI,MAAM,UAAU,iBAAiB,CAAC,IAAqH,EACrJ,WAAmB,EAAE,KAAK,GAA4B,cAAc,EAAE,OAAO,GAA4B,qBAAqB;IAE9H,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzE,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;IACvJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS;QACvH,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,sIAAsI;AACtI,MAAM,UAAU,oBAAoB,CAAC,KAAsD;IACzF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;IACpF,OAAQ,KAAK,CAAC,SAAqF,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACjH,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1H,OAAO,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,6CAA6C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,wBAAwB;oBAC3I,gEAAgE,CAAC;YACnE,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,mBAAmB,CAAC,KAAK,GAA4B,cAAc;IACjF,MAAM,KAAK,GAAG,CAAC,IAAkB,EAAE,GAAW,EAAE,MAAiB,EAAE,IAAI,GAAG,GAAG,EAAU,EAAE;QACvF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAmE,CAAC;QAC5F,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,SAAU,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACnH,MAAM,OAAO,GAAI,MAAqD,CAAC,OAAO,CAAC;QAC/E,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,GAAG,eAAe,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3H,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,GAAG,GAAG,SAAS,CAAC;QAClD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,GAAG,GAAG,aAAa,CAAC;QACvD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,0FAA0F;YAC1F,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAA6C,CAAC;YAC9H,OAAO,GAAG,GAAG,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,OAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChG,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAE,MAAsB,CAAC,KAAK,CAAC,CAAC;YAC5D,+FAA+F;YAC/F,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YAC3G,OAAO,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAkB,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACxK,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,GAAG,cAAc,CAAC;QAC7D,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjF,CAAC,CAAC;IACF,OAAO,gIAAgI;QACrI,wIAAwI;QACxI,0HAA0H;QAC1H,uIAAuI;QACvI,mIAAmI;QACnI,4IAA4I;QAC5I,+IAA+I;QAC/I,mOAAmO;QACnO,wEAAwE;QACxE,uHAAuH;QACvH,WAAW,oBAAoB,iFAAiF;QAChH,4DAA4D,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,SAAS;QACxJ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,MAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;AACjI,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;AACxG,MAAM,KAAK,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,CAAC;AACzG,MAAM,SAAS,GAAG,CAAC,KAAgB,EAAE,KAA2B,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,EAC3H,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACjI,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAczC,iKAAiK;AACjK,MAAM,UAAU,gBAAgB,CAAC,KAAyB,EAAE,KAAK,GAA4B,cAAc;IACzG,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,2DAA2D,EAAE,CAAC,CAAC;YACzJ,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,4DAA4D,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5J,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,+DAA+D,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,IAAI,uBAAuB,EAAE,MAAM,CAAC,CAAC;IAChL,IAAI,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,yBAAyB,QAAQ,EAAE,EAAE,CAAC,CAAC;IAClH,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAkB,CAAC,SAAS,EAAE,UAAU,EAAE,gBAAgB,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC,CAAC;IACzK,MAAM,MAAM,GAAG,CAAyB,KAA+B,EAAE,EAAE,CACzE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5I,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpI,MAAM,MAAM,GACqE,EAAE,CAAC;IACpF,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,CAAC,GAAG,IAAyB,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,EAAE,wBAAwB,KAAK,yEAAyE,EAAE,CAAC,CAAC;QAC1L,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,0BAA0B,IAAI,CAAC,IAAI,iBAAiB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACvK,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnJ,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,oBAAoB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9K,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC;QAChK,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC9H,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChG,IAAI,GAAG;oBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAC1G,CAAC;QACD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,MAAM,KAAK,EAAE,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/H,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACpE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,IAAI,CAAC,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvK,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAA+B,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3I,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS;YAC9F,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;IAC7H,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,aAAa,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC;QACtI,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,IAAI,MAAM;YAAE,MAAM,CAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,EAAE,qFAAqF,CAAC,CAAC;QACnJ,uEAAuE;QACvE,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7I,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC5G,IAAI,KAAK;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB;wBACzJ,IAAI,KAAK,CAAC,EAAE,gFAAgF,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,IAAI,MAAM;gBAAE,MAAM,CAAC,oBAAoB,MAAM,CAAC,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACrG,IAAI,OAAO;gBAAE,MAAM,CAAC,iCAAiC,OAAO,CAAC,EAAE,wBAAwB,CAAC,CAAC;YACzF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACjH,IAAI,MAAM;gBAAE,MAAM,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,MAAM,CAAC,IAAI,CAAC,UAAU,uEAAuE,CAAC,CAAC;YAC7J,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBACtH,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACxG,IAAI,IAAI;gBAAE,MAAM,CAAC,SAAS,KAAK,CAAC,UAAU,eAAe,IAAI,CAAC,EAAE,iFAAiF,CAAC,CAAC;YACnJ,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACnH,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,4GAA4G,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACvG,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3G,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,IAAI,KAAK,EAAE,CAAC;YAAC,MAAM,CAAC,2BAA2B,KAAK,CAAC,EAAE,+EAA+E,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACpJ,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;YAC9I,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvG,IAAI,KAAK;YAAE,MAAM,CAAC,qCAAqC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,oBAAoB,sCAAsC,CAAC,CAAC;IACnK,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5I,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,QAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,OAAO,CAAC,IAAI,CAAC,EAAE,qDAAqD,EAAE,CAAC,CAAC;QAC1K,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { TemplateKind } from "./index.js";
|
|
3
|
+
declare const data: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
role: z.ZodOptional<z.ZodString>;
|
|
6
|
+
side: z.ZodEnum<{
|
|
7
|
+
left: "left";
|
|
8
|
+
right: "right";
|
|
9
|
+
}>;
|
|
10
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
large: "large";
|
|
12
|
+
medium: "medium";
|
|
13
|
+
small: "small";
|
|
14
|
+
}>>;
|
|
15
|
+
}, z.core.$strict>;
|
|
16
|
+
/** A name bar low in the frame, in the caption spot: captions step aside while it shows. */
|
|
17
|
+
export declare const lowerThird: TemplateKind<typeof data>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { frameCanvasOf } from "../ugc-layers.js";
|
|
3
|
+
import { sizedScale, templateSize } from "./size.js";
|
|
4
|
+
const data = z.object({ name: z.string().min(1).max(28), role: z.string().min(1).max(36).optional(), side: z.enum(["left", "right"]),
|
|
5
|
+
size: templateSize }).strict();
|
|
6
|
+
/** A name bar low in the frame, in the caption spot: captions step aside while it shows. */
|
|
7
|
+
export const lowerThird = {
|
|
8
|
+
kind: "lower_third",
|
|
9
|
+
kindVersion: 1,
|
|
10
|
+
description: "a name and role bar low in the frame; captions are hidden while it shows",
|
|
11
|
+
placements: ["over"],
|
|
12
|
+
data,
|
|
13
|
+
text: { name: 28, role: 36 },
|
|
14
|
+
slots: {},
|
|
15
|
+
hidesCaptions: () => true,
|
|
16
|
+
onInserts: false,
|
|
17
|
+
rect: (value, aspectRatio) => {
|
|
18
|
+
const canvas = frameCanvasOf(aspectRatio), { width: w, height: h } = canvas, margin = Math.round(0.04 * Math.min(w, h));
|
|
19
|
+
const scale = sizedScale(value.size, canvas);
|
|
20
|
+
const width = Math.round(Math.min(w - 2 * margin, 760 * scale)), height = Math.round(227 * scale);
|
|
21
|
+
const left = value.side === "left" ? margin : w - margin - width;
|
|
22
|
+
return { left: left / w, top: (Math.round(0.86 * h) - height) / h, width: width / w, height: height / h };
|
|
23
|
+
},
|
|
24
|
+
sample: { name: "Maya Chen", role: "Founder, Northwind Dental", side: "left" },
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=lower-third.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lower-third.js","sourceRoot":"","sources":["../../src/templates/lower-third.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClI,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEjC,4FAA4F;AAC5F,MAAM,CAAC,MAAM,UAAU,GAA8B;IACnD,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,0EAA0E;IACvF,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,IAAI;IACJ,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IAC5B,KAAK,EAAE,EAAE;IACT,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;IACzB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxH,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;QAClG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;QACjE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IAC5G,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,MAAM,EAAE;CAC/E,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { TemplateKind } from "./index.js";
|
|
3
|
+
/** The title's line at medium on a 1080 short side; the band above the face shrinks it in square and wide frames. */
|
|
4
|
+
export declare const NOTIFICATION_FONT_PX = 38;
|
|
5
|
+
/** Font sizes: the card's height (app, title and body lines with padding) and its widest. */
|
|
6
|
+
export declare const NOTIFICATION_EMS: {
|
|
7
|
+
readonly height: 3.6;
|
|
8
|
+
readonly width: 26;
|
|
9
|
+
};
|
|
10
|
+
declare const data: z.ZodObject<{
|
|
11
|
+
app: z.ZodString;
|
|
12
|
+
title: z.ZodString;
|
|
13
|
+
body: z.ZodString;
|
|
14
|
+
icon: z.ZodOptional<z.ZodEnum<{
|
|
15
|
+
briefcase: "briefcase";
|
|
16
|
+
chat: "chat";
|
|
17
|
+
clock: "clock";
|
|
18
|
+
phone: "phone";
|
|
19
|
+
star: "star";
|
|
20
|
+
user: "user";
|
|
21
|
+
}>>;
|
|
22
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
23
|
+
large: "large";
|
|
24
|
+
medium: "medium";
|
|
25
|
+
small: "small";
|
|
26
|
+
}>>;
|
|
27
|
+
}, z.core.$strict>;
|
|
28
|
+
/** A phone notification in the band above the face, centred at the top of every format. */
|
|
29
|
+
export declare const notification: TemplateKind<typeof data>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { faceZone, frameCanvasOf } from "../ugc-layers.js";
|
|
3
|
+
import { CHECKLIST_ICONS } from "./checklist.js";
|
|
4
|
+
import { sizedScale, templateSize } from "./size.js";
|
|
5
|
+
/** The title's line at medium on a 1080 short side; the band above the face shrinks it in square and wide frames. */
|
|
6
|
+
export const NOTIFICATION_FONT_PX = 38;
|
|
7
|
+
/** Font sizes: the card's height (app, title and body lines with padding) and its widest. */
|
|
8
|
+
export const NOTIFICATION_EMS = { height: 3.6, width: 26 };
|
|
9
|
+
const data = z.object({ app: z.string().min(1).max(20), title: z.string().min(1).max(32), body: z.string().min(1).max(80),
|
|
10
|
+
icon: z.enum(CHECKLIST_ICONS).optional(), size: templateSize }).strict();
|
|
11
|
+
/** A phone notification in the band above the face, centred at the top of every format. */
|
|
12
|
+
export const notification = {
|
|
13
|
+
kind: "notification",
|
|
14
|
+
kindVersion: 1,
|
|
15
|
+
description: "a phone notification at the top, above the face: an icon (else the app's initial), the app, a title and a body line; it " +
|
|
16
|
+
"drops in, holds at least 1.2 s, then leaves before its span ends",
|
|
17
|
+
placements: ["over"],
|
|
18
|
+
data,
|
|
19
|
+
text: { app: 20, title: 32, body: 80 },
|
|
20
|
+
slots: {},
|
|
21
|
+
hidesCaptions: () => false,
|
|
22
|
+
onInserts: false,
|
|
23
|
+
rect: (value, aspectRatio) => {
|
|
24
|
+
const canvas = frameCanvasOf(aspectRatio), { width: w, height: h } = canvas;
|
|
25
|
+
const top = Math.round(0.012 * h), room = Math.floor(faceZone(aspectRatio).top * h) - top;
|
|
26
|
+
const em = Math.min(NOTIFICATION_FONT_PX * sizedScale(value.size, canvas), room / NOTIFICATION_EMS.height);
|
|
27
|
+
const width = Math.round(Math.min(0.92 * w, NOTIFICATION_EMS.width * em)), height = Math.round(NOTIFICATION_EMS.height * em);
|
|
28
|
+
return { left: Math.round((w - width) / 2) / w, top: top / h, width: width / w, height: height / h };
|
|
29
|
+
},
|
|
30
|
+
sample: { app: "Front Desk", title: "New booking: Maya Chen", body: "Tomorrow at 10:30, teeth cleaning. Booked while you slept.", icon: "chat" },
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=notification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/templates/notification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { TemplateKind } from "./index.js";
|
|
3
|
+
/** The phone's width at medium on a 1080 short side; it is twice as high. */
|
|
4
|
+
export declare const PHONE_CALL_WIDTH_PX = 360;
|
|
5
|
+
declare const data: z.ZodObject<{
|
|
6
|
+
caller: z.ZodString;
|
|
7
|
+
subtitle: z.ZodOptional<z.ZodString>;
|
|
8
|
+
avatar: z.ZodOptional<z.ZodObject<{
|
|
9
|
+
asset_id: z.ZodString;
|
|
10
|
+
}, z.core.$strict>>;
|
|
11
|
+
answer_at: z.ZodString;
|
|
12
|
+
side: z.ZodOptional<z.ZodEnum<{
|
|
13
|
+
left: "left";
|
|
14
|
+
right: "right";
|
|
15
|
+
}>>;
|
|
16
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
17
|
+
large: "large";
|
|
18
|
+
medium: "medium";
|
|
19
|
+
small: "small";
|
|
20
|
+
}>>;
|
|
21
|
+
}, z.core.$strict>;
|
|
22
|
+
/** An incoming call on a neutral phone at the side of the frame, ringing until it is answered on a word (reference seconds 26–43). */
|
|
23
|
+
export declare const phoneCall: TemplateKind<typeof data>;
|
|
24
|
+
export {};
|