@aivorynet/slaide 1.0.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 +26 -0
- package/LICENSE +201 -0
- package/README.md +87 -0
- package/bin/slaide.js +25 -0
- package/dist/assets.d.ts +10 -0
- package/dist/assets.js +54 -0
- package/dist/assets.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +433 -0
- package/dist/cli.js.map +1 -0
- package/dist/compare/index.d.ts +24 -0
- package/dist/compare/index.js +246 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/compare/ssim.d.ts +2 -0
- package/dist/compare/ssim.js +46 -0
- package/dist/compare/ssim.js.map +1 -0
- package/dist/compiler/chrome.d.ts +7 -0
- package/dist/compiler/chrome.js +94 -0
- package/dist/compiler/chrome.js.map +1 -0
- package/dist/compiler/compile.d.ts +2 -0
- package/dist/compiler/compile.js +432 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/markdown.d.ts +26 -0
- package/dist/compiler/markdown.js +439 -0
- package/dist/compiler/markdown.js.map +1 -0
- package/dist/compiler/tokens.d.ts +13 -0
- package/dist/compiler/tokens.js +127 -0
- package/dist/compiler/tokens.js.map +1 -0
- package/dist/container.d.ts +47 -0
- package/dist/container.js +309 -0
- package/dist/container.js.map +1 -0
- package/dist/engine-entry.d.ts +1 -0
- package/dist/engine-entry.js +71 -0
- package/dist/engine-entry.js.map +1 -0
- package/dist/export-keynote/keynote.d.ts +10 -0
- package/dist/export-keynote/keynote.js +58 -0
- package/dist/export-keynote/keynote.js.map +1 -0
- package/dist/export-pptx/embed-fonts.d.ts +5 -0
- package/dist/export-pptx/embed-fonts.js +159 -0
- package/dist/export-pptx/embed-fonts.js.map +1 -0
- package/dist/export-pptx/inject-anim.d.ts +28 -0
- package/dist/export-pptx/inject-anim.js +150 -0
- package/dist/export-pptx/inject-anim.js.map +1 -0
- package/dist/export-pptx/pptx.d.ts +10 -0
- package/dist/export-pptx/pptx.js +425 -0
- package/dist/export-pptx/pptx.js.map +1 -0
- package/dist/export-pptx/transitions.d.ts +16 -0
- package/dist/export-pptx/transitions.js +82 -0
- package/dist/export-pptx/transitions.js.map +1 -0
- package/dist/import/emit.d.ts +5 -0
- package/dist/import/emit.js +274 -0
- package/dist/import/emit.js.map +1 -0
- package/dist/import/index.d.ts +21 -0
- package/dist/import/index.js +192 -0
- package/dist/import/index.js.map +1 -0
- package/dist/import/pptx.d.ts +117 -0
- package/dist/import/pptx.js +1043 -0
- package/dist/import/pptx.js.map +1 -0
- package/dist/import/raster-com.d.ts +27 -0
- package/dist/import/raster-com.js +113 -0
- package/dist/import/raster-com.js.map +1 -0
- package/dist/import/raster-extension.d.ts +35 -0
- package/dist/import/raster-extension.js +27 -0
- package/dist/import/raster-extension.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +174 -0
- package/dist/index.js.map +1 -0
- package/dist/install/detect.d.ts +17 -0
- package/dist/install/detect.js +82 -0
- package/dist/install/detect.js.map +1 -0
- package/dist/install/index.d.ts +20 -0
- package/dist/install/index.js +126 -0
- package/dist/install/index.js.map +1 -0
- package/dist/install/registry.d.ts +33 -0
- package/dist/install/registry.js +169 -0
- package/dist/install/registry.js.map +1 -0
- package/dist/install/skills.d.ts +17 -0
- package/dist/install/skills.js +72 -0
- package/dist/install/skills.js.map +1 -0
- package/dist/master-io.d.ts +7 -0
- package/dist/master-io.js +55 -0
- package/dist/master-io.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.js +114 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/optimize/export-optimize.d.ts +21 -0
- package/dist/optimize/export-optimize.js +167 -0
- package/dist/optimize/export-optimize.js.map +1 -0
- package/dist/parser/frontmatter.d.ts +8 -0
- package/dist/parser/frontmatter.js +45 -0
- package/dist/parser/frontmatter.js.map +1 -0
- package/dist/parser/parse.d.ts +2 -0
- package/dist/parser/parse.js +184 -0
- package/dist/parser/parse.js.map +1 -0
- package/dist/render/anim.d.ts +50 -0
- package/dist/render/anim.js +213 -0
- package/dist/render/anim.js.map +1 -0
- package/dist/render/charts.d.ts +3 -0
- package/dist/render/charts.js +171 -0
- package/dist/render/charts.js.map +1 -0
- package/dist/render/css.d.ts +3 -0
- package/dist/render/css.js +183 -0
- package/dist/render/css.js.map +1 -0
- package/dist/render/echarts-lib.generated.d.ts +1 -0
- package/dist/render/echarts-lib.generated.js +7 -0
- package/dist/render/echarts-lib.generated.js.map +1 -0
- package/dist/render/html.d.ts +5 -0
- package/dist/render/html.js +186 -0
- package/dist/render/html.js.map +1 -0
- package/dist/render/inject.d.ts +12 -0
- package/dist/render/inject.js +19 -0
- package/dist/render/inject.js.map +1 -0
- package/dist/render/mermaid-lib.generated.d.ts +1 -0
- package/dist/render/mermaid-lib.generated.js +7 -0
- package/dist/render/mermaid-lib.generated.js.map +1 -0
- package/dist/render/runtime.d.ts +1 -0
- package/dist/render/runtime.js +393 -0
- package/dist/render/runtime.js.map +1 -0
- package/dist/render-pdf/pdf.d.ts +9 -0
- package/dist/render-pdf/pdf.js +53 -0
- package/dist/render-pdf/pdf.js.map +1 -0
- package/dist/render-png/montage.d.ts +14 -0
- package/dist/render-png/montage.js +75 -0
- package/dist/render-png/montage.js.map +1 -0
- package/dist/render-png/shoot.d.ts +25 -0
- package/dist/render-png/shoot.js +79 -0
- package/dist/render-png/shoot.js.map +1 -0
- package/dist/scaffold.d.ts +9 -0
- package/dist/scaffold.js +36 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/types.d.ts +212 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +6 -0
- package/dist/util.js +28 -0
- package/dist/util.js.map +1 -0
- package/package.json +66 -0
- package/skills/slaide/SKILL.md +64 -0
- package/skills/slaide/agents/openai.yaml +12 -0
- package/skills/slaide/examples/branded-deck.slaide +198 -0
- package/skills/slaide/examples/branded-theme.slaide.yaml +187 -0
- package/skills/slaide/examples/sample.slaide +98 -0
- package/skills/slaide/reference.md +177 -0
- package/skills/slaide/themes.md +171 -0
- package/themes/aurora.slaide.yaml +136 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"echarts-lib.generated.js","sourceRoot":"","sources":["../../src/render/echarts-lib.generated.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,mEAAmE;AACnE,wDAAwD;AACxD,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GACzB,8w8zCAA8w8zC,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { BASE_CSS, tokenCss } from './css.js';
|
|
2
|
+
import { RUNTIME_JS } from './runtime.js';
|
|
3
|
+
import { CHARTS_BOOT_JS, MERMAID_LIB_B64, ECHART_LIB_B64 } from './charts.js';
|
|
4
|
+
import { extraHeadCss, extraBodyScript } from './inject.js';
|
|
5
|
+
import { escapeHtml as esc, serializeStyle } from '../util.js';
|
|
6
|
+
function backgroundCss(bg) {
|
|
7
|
+
if (!bg)
|
|
8
|
+
return '';
|
|
9
|
+
if (bg.type === 'solid')
|
|
10
|
+
return `background:${bg.color};`;
|
|
11
|
+
if (bg.type === 'gradient') {
|
|
12
|
+
const angle = bg.angle ?? 135;
|
|
13
|
+
return `background:linear-gradient(${angle}deg, ${bg.stops.join(', ')});`;
|
|
14
|
+
}
|
|
15
|
+
if (bg.type === 'image') {
|
|
16
|
+
const fit = bg.fit ?? 'cover';
|
|
17
|
+
const dim = bg.dim ? `background-color:rgba(0,0,0,${bg.dim});background-blend-mode:multiply;` : '';
|
|
18
|
+
return `background-image:url('${bg.src}');background-size:${fit};background-position:center;${dim}`;
|
|
19
|
+
}
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
function styleAttr(style) {
|
|
23
|
+
const s = serializeStyle(style);
|
|
24
|
+
return s ? `;${s}` : '';
|
|
25
|
+
}
|
|
26
|
+
function renderLayers(slide, shown) {
|
|
27
|
+
const bg = `<div class="sl-layer-bg" style="${backgroundCss(slide.background)}"></div>`;
|
|
28
|
+
const align = slide.grid.align;
|
|
29
|
+
const alignItems = align === 'center' ? 'center' : 'stretch';
|
|
30
|
+
const contentStyle = `grid-template-areas:${slide.grid.areas};` +
|
|
31
|
+
`grid-template-rows:${slide.grid.rows};` +
|
|
32
|
+
`grid-template-columns:${slide.grid.cols};` +
|
|
33
|
+
`padding:${slide.grid.padding};gap:${slide.grid.gap};align-content:${align};align-items:${alignItems};`;
|
|
34
|
+
// The `free` region is a full-slide absolute layer for placed shapes/boxes; it
|
|
35
|
+
// lives outside the content grid (between content and chrome).
|
|
36
|
+
const freeRegion = slide.regions.find((r) => r.name === 'free');
|
|
37
|
+
const regions = slide.regions
|
|
38
|
+
.filter((r) => r.name !== 'free')
|
|
39
|
+
.map((r) => `<div class="sl-region sl-slot-${r.slotType}" data-region="${esc(r.name)}" data-source-region="${esc(r.source)}" style="grid-area:${r.name}${styleAttr(r.style)}">${r.html}</div>`)
|
|
40
|
+
.join('\n');
|
|
41
|
+
const content = `<div class="sl-layer-content" style="${contentStyle}">${regions}</div>`;
|
|
42
|
+
const free = freeRegion ? `<div class="sl-region sl-layer-free" data-region="free">${freeRegion.html}</div>` : '';
|
|
43
|
+
const chrome = renderChrome(slide.chrome);
|
|
44
|
+
// In print/shown mode, pre-mark builds as shown.
|
|
45
|
+
const body = bg + content + free + chrome;
|
|
46
|
+
return shown ? body.replace(/class="([^"]*\bsl-build\b[^"]*)"/g, 'class="$1 sl-shown"') : body;
|
|
47
|
+
}
|
|
48
|
+
function band(b, kind) {
|
|
49
|
+
if (!b)
|
|
50
|
+
return '';
|
|
51
|
+
return (`<div class="sl-${kind}">` +
|
|
52
|
+
`<div class="sl-band-l">${b.left}</div>` +
|
|
53
|
+
`<div class="sl-band-c">${b.center}</div>` +
|
|
54
|
+
`<div class="sl-band-r">${b.right}</div>` +
|
|
55
|
+
`</div>`);
|
|
56
|
+
}
|
|
57
|
+
function renderChrome(chrome) {
|
|
58
|
+
if (!chrome)
|
|
59
|
+
return '';
|
|
60
|
+
const logo = chrome.logo ? `<div class="sl-logo sl-logo-${chrome.logoPos}">${chrome.logo}</div>` : '';
|
|
61
|
+
return `<div class="sl-layer-chrome">${logo}${band(chrome.header, 'header')}${band(chrome.footer, 'footer')}</div>`;
|
|
62
|
+
}
|
|
63
|
+
function renderSlideWeb(slide) {
|
|
64
|
+
const morph = slide.morph ? ` data-morph-slide="${esc(slide.morph)}"` : '';
|
|
65
|
+
// Master-defined names, surfaced for the editor's slide-properties panel (harmless otherwise).
|
|
66
|
+
const dataBg = slide.bgName ? ` data-bg="${esc(slide.bgName)}"` : '';
|
|
67
|
+
const dataVar = slide.variantName ? ` data-variant="${esc(slide.variantName)}"` : '';
|
|
68
|
+
let body = renderLayers(slide, false);
|
|
69
|
+
// The first slide is on screen at first paint — load its images eagerly so it
|
|
70
|
+
// isn't blank while offscreen slides defer (see markdown.ts loading="lazy").
|
|
71
|
+
if (slide.index === 0)
|
|
72
|
+
body = body.replace(/loading="lazy"/g, 'loading="eager"');
|
|
73
|
+
return (`<section class="sl-slide" data-index="${slide.index}" data-transition="${esc(slide.transition)}" ` +
|
|
74
|
+
`data-layout="${esc(slide.layout)}"${dataBg}${dataVar} ` +
|
|
75
|
+
`data-builds="${slide.buildCount}"${morph} style="${cssVars(slide.vars)}">` +
|
|
76
|
+
body +
|
|
77
|
+
`</section>`);
|
|
78
|
+
}
|
|
79
|
+
function renderSlidePrint(slide) {
|
|
80
|
+
return `<div class="sl-page sl-slide" style="${cssVars(slide.vars)}">${renderLayers(slide, true)}</div>`;
|
|
81
|
+
}
|
|
82
|
+
function cssVars(vars) {
|
|
83
|
+
return serializeStyle(vars);
|
|
84
|
+
}
|
|
85
|
+
function head(ir, extraCss) {
|
|
86
|
+
const title = ir.meta.title ? esc(ir.meta.title) : 'slaide';
|
|
87
|
+
const fonts = ir.fontImports.map((u) => `<link rel="stylesheet" href="${u}">`).join('\n');
|
|
88
|
+
return `<!doctype html>
|
|
89
|
+
<html lang="en">
|
|
90
|
+
<head>
|
|
91
|
+
<meta charset="utf-8">
|
|
92
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
93
|
+
<!-- The deck manages its own light/dark colours per slide. Declaring color-scheme opts
|
|
94
|
+
out of Chromium "auto dark mode", which otherwise darkens light text in embedded
|
|
95
|
+
webviews (e.g. the WebView2 native viewer) and forced-colors environments. -->
|
|
96
|
+
<meta name="color-scheme" content="light dark">
|
|
97
|
+
<title>${title}</title>
|
|
98
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
99
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
100
|
+
${fonts}
|
|
101
|
+
<style>
|
|
102
|
+
:root{color-scheme:light dark;}
|
|
103
|
+
${tokenCss(ir)}
|
|
104
|
+
${BASE_CSS}
|
|
105
|
+
${extraCss}
|
|
106
|
+
</style>
|
|
107
|
+
</head>`;
|
|
108
|
+
}
|
|
109
|
+
const PRINT_CSS = (w, h) => `
|
|
110
|
+
@page{size:${w}px ${h}px;margin:0;}
|
|
111
|
+
html,body{background:#fff;overflow:visible;height:auto;}
|
|
112
|
+
.sl-print-root{display:block;}
|
|
113
|
+
.sl-page{position:relative;width:${w}px;height:${h}px;overflow:hidden;break-after:page;page-break-after:always;}
|
|
114
|
+
.sl-page:last-child{break-after:auto;}
|
|
115
|
+
.sl-slide.sl-page{visibility:visible;opacity:1;}
|
|
116
|
+
.sl-layer-content{position:absolute;}
|
|
117
|
+
`;
|
|
118
|
+
// Inline the chart engines + lazy boot loader — but ONLY the engine(s) the deck actually
|
|
119
|
+
// uses, and only if it has charts at all. The bundles ride in inert `text/plain` tags
|
|
120
|
+
// (not parsed on load); the boot loader decodes + evals one the first time a chart of
|
|
121
|
+
// that kind renders. The boot script must precede RUNTIME_JS so its slaide:change
|
|
122
|
+
// listener is attached before the runtime fires its first navigation event.
|
|
123
|
+
function chartBlock(renderedHtml) {
|
|
124
|
+
const hasMermaid = renderedHtml.includes('sl-mermaid');
|
|
125
|
+
const hasEchart = renderedHtml.includes('sl-echart');
|
|
126
|
+
if (!hasMermaid && !hasEchart)
|
|
127
|
+
return '';
|
|
128
|
+
const libs = (hasMermaid ? `<script type="text/plain" id="sl-mermaid-lib">${MERMAID_LIB_B64}</script>\n` : '') +
|
|
129
|
+
(hasEchart ? `<script type="text/plain" id="sl-echart-lib">${ECHART_LIB_B64}</script>\n` : '');
|
|
130
|
+
return `${libs}<script>${CHARTS_BOOT_JS}</script>\n`;
|
|
131
|
+
}
|
|
132
|
+
export function renderHtml(ir, opts = {}) {
|
|
133
|
+
const mode = opts.mode ?? 'web';
|
|
134
|
+
const { width: w, height: h } = ir.canvas;
|
|
135
|
+
if (mode === 'print') {
|
|
136
|
+
const pages = ir.slides.map(renderSlidePrint).join('\n');
|
|
137
|
+
return `${head(ir, PRINT_CSS(w, h))}
|
|
138
|
+
<body class="sl-print">
|
|
139
|
+
<div class="sl-print-root">
|
|
140
|
+
${pages}
|
|
141
|
+
</div>
|
|
142
|
+
${chartBlock(pages)}</body>
|
|
143
|
+
</html>`;
|
|
144
|
+
}
|
|
145
|
+
const slides = ir.slides.map(renderSlideWeb).join('\n');
|
|
146
|
+
const extraCss = (ir.animCss ? ir.animCss : '') + extraHeadCss(ir);
|
|
147
|
+
const notes = JSON.stringify(ir.slides.map((s) => (s.notes ? mdToInline(s.notes) : null)));
|
|
148
|
+
// The position indicator (progress bar + counter chip) is gated by the master/headmatter
|
|
149
|
+
// `ui.progress` toggle; the floating counter is additionally suppressed when a themed
|
|
150
|
+
// footer already shows page numbers.
|
|
151
|
+
const hasFooter = ir.slides.some((s) => s.chrome?.footer);
|
|
152
|
+
const progressEl = ir.ui.progress ? '<div class="sl-progress"></div>' : '';
|
|
153
|
+
const counter = ir.ui.progress && !hasFooter ? '<div class="sl-counter"></div>' : '';
|
|
154
|
+
// A registered host extension may append a trailing script; empty by default.
|
|
155
|
+
const hostScript = extraBodyScript(ir);
|
|
156
|
+
const extScriptTag = hostScript ? `\n<script>${hostScript}</script>` : '';
|
|
157
|
+
return `${head(ir, extraCss)}
|
|
158
|
+
<body>
|
|
159
|
+
<div class="sl-viewport">
|
|
160
|
+
<div class="sl-stage" data-w="${w}" data-h="${h}">
|
|
161
|
+
${slides}
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
${progressEl}
|
|
165
|
+
${counter}
|
|
166
|
+
<button class="sl-present-toggle" title="Present (fullscreen)" aria-label="Present">⤢</button>
|
|
167
|
+
<div class="sl-notes"></div>
|
|
168
|
+
<div class="sl-help"><div>
|
|
169
|
+
<strong>slaide</strong><br>
|
|
170
|
+
<kbd>→</kbd>/<kbd>Space</kbd> next <kbd>←</kbd> back <kbd>Home</kbd>/<kbd>End</kbd> jump<br>
|
|
171
|
+
<kbd>n</kbd> notes <kbd>f</kbd> fullscreen <kbd>?</kbd> help
|
|
172
|
+
</div></div>
|
|
173
|
+
<script>window.__SLAIDE_NOTES__=${notes};</script>
|
|
174
|
+
${chartBlock(slides)}<script>${RUNTIME_JS}</script>${extScriptTag}
|
|
175
|
+
</body>
|
|
176
|
+
</html>`;
|
|
177
|
+
}
|
|
178
|
+
// Lightweight inline markdown for notes (bold/italic/code/linebreaks).
|
|
179
|
+
function mdToInline(s) {
|
|
180
|
+
return esc(s)
|
|
181
|
+
.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
|
|
182
|
+
.replace(/\*(.+?)\*/g, '<em>$1</em>')
|
|
183
|
+
.replace(/`(.+?)`/g, '<code>$1</code>')
|
|
184
|
+
.replace(/\n/g, '<br>');
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DeckIR } from '../types.js';
|
|
2
|
+
export type RenderExtension = (ir: DeckIR) => string;
|
|
3
|
+
/** Register host-provided render extensions. Call once at process start, before
|
|
4
|
+
* rendering. Re-registering replaces the previous extension. */
|
|
5
|
+
export declare function registerRenderExtensions(ext: {
|
|
6
|
+
headCss?: RenderExtension;
|
|
7
|
+
bodyScript?: RenderExtension;
|
|
8
|
+
}): void;
|
|
9
|
+
/** Extra CSS appended to the document <head> (empty unless a host registered it). */
|
|
10
|
+
export declare function extraHeadCss(ir: DeckIR): string;
|
|
11
|
+
/** Extra script appended at the end of <body> (empty unless a host registered it). */
|
|
12
|
+
export declare function extraBodyScript(ir: DeckIR): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
let headCss = () => '';
|
|
2
|
+
let bodyScript = () => '';
|
|
3
|
+
/** Register host-provided render extensions. Call once at process start, before
|
|
4
|
+
* rendering. Re-registering replaces the previous extension. */
|
|
5
|
+
export function registerRenderExtensions(ext) {
|
|
6
|
+
if (ext.headCss)
|
|
7
|
+
headCss = ext.headCss;
|
|
8
|
+
if (ext.bodyScript)
|
|
9
|
+
bodyScript = ext.bodyScript;
|
|
10
|
+
}
|
|
11
|
+
/** Extra CSS appended to the document <head> (empty unless a host registered it). */
|
|
12
|
+
export function extraHeadCss(ir) {
|
|
13
|
+
return headCss(ir);
|
|
14
|
+
}
|
|
15
|
+
/** Extra script appended at the end of <body> (empty unless a host registered it). */
|
|
16
|
+
export function extraBodyScript(ir) {
|
|
17
|
+
return bodyScript(ir);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/render/inject.ts"],"names":[],"mappings":"AAWA,IAAI,OAAO,GAAoB,GAAG,EAAE,CAAC,EAAE,CAAC;AACxC,IAAI,UAAU,GAAoB,GAAG,EAAE,CAAC,EAAE,CAAC;AAE3C;iEACiE;AACjE,MAAM,UAAU,wBAAwB,CAAC,GAAgE;IACvG,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACvC,IAAI,GAAG,CAAC,UAAU;QAAE,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;AAClD,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
|