@extenshi/cli 0.5.4 → 0.7.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/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +3 -5
- package/dist/auto-update.js.map +1 -1
- package/dist/cli.js +29 -6
- package/dist/cli.js.map +1 -1
- package/dist/icon-preview.d.ts +60 -0
- package/dist/icon-preview.d.ts.map +1 -0
- package/dist/icon-preview.js +1094 -0
- package/dist/icon-preview.js.map +1 -0
- package/dist/icon.d.ts +39 -0
- package/dist/icon.d.ts.map +1 -0
- package/dist/icon.js +128 -0
- package/dist/icon.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-preview.js","sourceRoot":"","sources":["../src/icon-preview.ts"],"names":[],"mappings":"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"}
|
package/dist/icon.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `extenshi icon preview <icon>` — free, fully offline browser-panel preview.
|
|
3
|
+
*
|
|
4
|
+
* Reads an .svg or .png icon from disk, sanitizes it, and writes a
|
|
5
|
+
* self-contained HTML page (see icon-preview.ts) that mocks Chrome / Firefox /
|
|
6
|
+
* Edge toolbars with the icon pinned in place, switchable color palettes with
|
|
7
|
+
* automatic contrast warnings, and canvas-based PNG/ZIP export.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately requires NO API key and performs NO network requests: the icon
|
|
10
|
+
* itself is drawn by the developer (or their local coding agent) — this
|
|
11
|
+
* command only renders the verification page. The paid, server-side
|
|
12
|
+
* generation path lives in dojo and is metered separately.
|
|
13
|
+
*/
|
|
14
|
+
export interface IconPreviewCmdOptions {
|
|
15
|
+
/** Extension display name shown in the mockups (default: derived from the file name). */
|
|
16
|
+
name?: string;
|
|
17
|
+
/** Output path for the HTML page (default: <icon-base>-icon-preview.html in cwd). */
|
|
18
|
+
output?: string;
|
|
19
|
+
/** Open the page in the default browser after writing (default true; --no-open). */
|
|
20
|
+
open?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Strip scripting constructs from untrusted SVG source. The preview page only
|
|
24
|
+
* ever embeds the icon through <img src="data:..."> (where scripts never run),
|
|
25
|
+
* but the raw source is also shipped inside the export ZIP — so it must not
|
|
26
|
+
* carry executable payloads either. Regex-based because the CLI runs in Node
|
|
27
|
+
* (no DOMParser); patterns intentionally over-remove rather than under-remove.
|
|
28
|
+
*/
|
|
29
|
+
export declare function sanitizeSvgSource(svg: string): string;
|
|
30
|
+
/** Human-ish display name from a file name: "my-cool_icon.svg" → "My Cool Icon". */
|
|
31
|
+
export declare function displayNameFromFile(filePath: string): string;
|
|
32
|
+
/** Resolve the HTML destination: explicit --output wins, else auto-named in cwd. */
|
|
33
|
+
export declare function resolvePreviewPath(output: string | undefined, iconPath: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Command body. Exported for unit tests (call with `open: false`).
|
|
36
|
+
* Throws plain Errors — runCommand() in cli.ts turns them into exit-1 output.
|
|
37
|
+
*/
|
|
38
|
+
export declare function runIconPreview(iconPath: string, opts: IconPreviewCmdOptions, cliVersion: string): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../src/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,MAAM,WAAW,qBAAqB;IACrC,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oFAAoF;IACpF,IAAI,CAAC,EAAE,OAAO,CAAA;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIvF;AAmBD;;;GAGG;AACH,wBAAsB,cAAc,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,qBAAqB,EAC3B,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAkDf"}
|
package/dist/icon.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `extenshi icon preview <icon>` — free, fully offline browser-panel preview.
|
|
3
|
+
*
|
|
4
|
+
* Reads an .svg or .png icon from disk, sanitizes it, and writes a
|
|
5
|
+
* self-contained HTML page (see icon-preview.ts) that mocks Chrome / Firefox /
|
|
6
|
+
* Edge toolbars with the icon pinned in place, switchable color palettes with
|
|
7
|
+
* automatic contrast warnings, and canvas-based PNG/ZIP export.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately requires NO API key and performs NO network requests: the icon
|
|
10
|
+
* itself is drawn by the developer (or their local coding agent) — this
|
|
11
|
+
* command only renders the verification page. The paid, server-side
|
|
12
|
+
* generation path lives in dojo and is metered separately.
|
|
13
|
+
*/
|
|
14
|
+
import { spawn } from 'node:child_process';
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import { renderIconPreviewHtml } from './icon-preview.js';
|
|
18
|
+
const MAX_SVG_BYTES = 512 * 1024;
|
|
19
|
+
const MAX_PNG_BYTES = 2 * 1024 * 1024;
|
|
20
|
+
const PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
21
|
+
/**
|
|
22
|
+
* Strip scripting constructs from untrusted SVG source. The preview page only
|
|
23
|
+
* ever embeds the icon through <img src="data:..."> (where scripts never run),
|
|
24
|
+
* but the raw source is also shipped inside the export ZIP — so it must not
|
|
25
|
+
* carry executable payloads either. Regex-based because the CLI runs in Node
|
|
26
|
+
* (no DOMParser); patterns intentionally over-remove rather than under-remove.
|
|
27
|
+
*/
|
|
28
|
+
export function sanitizeSvgSource(svg) {
|
|
29
|
+
return (svg
|
|
30
|
+
// XML prolog junk that has no place in an icon
|
|
31
|
+
.replace(/<!DOCTYPE[\s\S]*?>/gi, '')
|
|
32
|
+
.replace(/<!ENTITY[\s\S]*?>/gi, '')
|
|
33
|
+
// executable containers, paired or self-closing
|
|
34
|
+
.replace(/<\s*(script|foreignObject|iframe|object|embed)\b[\s\S]*?<\s*\/\s*\1\s*>/gi, '')
|
|
35
|
+
.replace(/<\s*(script|foreignObject|iframe|object|embed)\b[^>]*\/?>/gi, '')
|
|
36
|
+
// inline event handlers: onload="..." / onclick='...' / onerror=x
|
|
37
|
+
.replace(/\son[a-z]+\s*=\s*"[^"]*"/gi, '')
|
|
38
|
+
.replace(/\son[a-z]+\s*=\s*'[^']*'/gi, '')
|
|
39
|
+
.replace(/\son[a-z]+\s*=\s*[^\s>]+/gi, '')
|
|
40
|
+
// javascript:/data: link targets
|
|
41
|
+
.replace(/\s(href|xlink:href)\s*=\s*"(\s*(javascript|data):)[^"]*"/gi, '')
|
|
42
|
+
.replace(/\s(href|xlink:href)\s*=\s*'(\s*(javascript|data):)[^']*'/gi, ''));
|
|
43
|
+
}
|
|
44
|
+
/** Human-ish display name from a file name: "my-cool_icon.svg" → "My Cool Icon". */
|
|
45
|
+
export function displayNameFromFile(filePath) {
|
|
46
|
+
const base = path.basename(filePath).replace(/\.(svg|png)$/i, '');
|
|
47
|
+
const words = base.split(/[-_\s.]+/).filter(Boolean);
|
|
48
|
+
if (words.length === 0)
|
|
49
|
+
return 'My Extension';
|
|
50
|
+
return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
|
|
51
|
+
}
|
|
52
|
+
/** Resolve the HTML destination: explicit --output wins, else auto-named in cwd. */
|
|
53
|
+
export function resolvePreviewPath(output, iconPath) {
|
|
54
|
+
if (output)
|
|
55
|
+
return path.resolve(process.cwd(), output);
|
|
56
|
+
const base = path.basename(iconPath).replace(/\.(svg|png)$/i, '');
|
|
57
|
+
return path.resolve(process.cwd(), `${base}-icon-preview.html`);
|
|
58
|
+
}
|
|
59
|
+
/** Same platform-native, fail-soft browser opener as scan.ts. */
|
|
60
|
+
function openInBrowser(target) {
|
|
61
|
+
try {
|
|
62
|
+
const [command, args] = process.platform === 'darwin'
|
|
63
|
+
? ['open', [target]]
|
|
64
|
+
: process.platform === 'win32'
|
|
65
|
+
? ['cmd', ['/c', 'start', '', target]]
|
|
66
|
+
: ['xdg-open', [target]];
|
|
67
|
+
const child = spawn(command, args, { detached: true, stdio: 'ignore' });
|
|
68
|
+
child.on('error', () => { });
|
|
69
|
+
child.unref();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Opener missing (headless/CI) — the path is already printed.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Command body. Exported for unit tests (call with `open: false`).
|
|
77
|
+
* Throws plain Errors — runCommand() in cli.ts turns them into exit-1 output.
|
|
78
|
+
*/
|
|
79
|
+
export async function runIconPreview(iconPath, opts, cliVersion) {
|
|
80
|
+
const resolved = path.resolve(process.cwd(), iconPath);
|
|
81
|
+
if (!fs.existsSync(resolved)) {
|
|
82
|
+
throw new Error(`Icon file not found: ${resolved}`);
|
|
83
|
+
}
|
|
84
|
+
const ext = path.extname(resolved).toLowerCase();
|
|
85
|
+
if (ext !== '.svg' && ext !== '.png') {
|
|
86
|
+
throw new Error(`Unsupported icon format "${ext || '(none)'}" — pass an .svg or .png file`);
|
|
87
|
+
}
|
|
88
|
+
const raw = fs.readFileSync(resolved);
|
|
89
|
+
let dataUrl;
|
|
90
|
+
let svgSource;
|
|
91
|
+
if (ext === '.svg') {
|
|
92
|
+
if (raw.length > MAX_SVG_BYTES) {
|
|
93
|
+
throw new Error('SVG is larger than 512 KB — extension icons should be tiny');
|
|
94
|
+
}
|
|
95
|
+
const text = raw.toString('utf8');
|
|
96
|
+
if (!text.includes('<svg')) {
|
|
97
|
+
throw new Error('File does not contain an <svg> element');
|
|
98
|
+
}
|
|
99
|
+
svgSource = sanitizeSvgSource(text);
|
|
100
|
+
dataUrl = `data:image/svg+xml;base64,${Buffer.from(svgSource, 'utf8').toString('base64')}`;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
if (raw.length > MAX_PNG_BYTES) {
|
|
104
|
+
throw new Error('PNG is larger than 2 MB — extension icons should be tiny');
|
|
105
|
+
}
|
|
106
|
+
if (!raw.subarray(0, 8).equals(PNG_SIGNATURE)) {
|
|
107
|
+
throw new Error('File does not look like a valid PNG (bad signature)');
|
|
108
|
+
}
|
|
109
|
+
dataUrl = `data:image/png;base64,${raw.toString('base64')}`;
|
|
110
|
+
}
|
|
111
|
+
const html = renderIconPreviewHtml({
|
|
112
|
+
name: opts.name?.trim() || displayNameFromFile(resolved),
|
|
113
|
+
fileName: path.basename(resolved),
|
|
114
|
+
dataUrl,
|
|
115
|
+
isSvg: ext === '.svg',
|
|
116
|
+
svgSource,
|
|
117
|
+
cliVersion,
|
|
118
|
+
generatedAt: new Date(),
|
|
119
|
+
});
|
|
120
|
+
const outPath = resolvePreviewPath(opts.output, resolved);
|
|
121
|
+
fs.writeFileSync(outPath, html, 'utf8');
|
|
122
|
+
process.stderr.write(`Icon preview written to ${outPath}\n`);
|
|
123
|
+
if (opts.open !== false) {
|
|
124
|
+
process.stderr.write('Opening in your default browser…\n');
|
|
125
|
+
openInBrowser(outPath);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=icon.js.map
|
package/dist/icon.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../src/icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAA;AAChC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AACrC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAWnF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC5C,OAAO,CACN,GAAG;QACF,+CAA+C;SAC9C,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;SACnC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACnC,gDAAgD;SAC/C,OAAO,CAAC,2EAA2E,EAAE,EAAE,CAAC;SACxF,OAAO,CAAC,6DAA6D,EAAE,EAAE,CAAC;QAC3E,kEAAkE;SACjE,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;SACzC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;SACzC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;QAC1C,iCAAiC;SAChC,OAAO,CAAC,4DAA4D,EAAE,EAAE,CAAC;SACzE,OAAO,CAAC,4DAA4D,EAAE,EAAE,CAAC,CAC3E,CAAA;AACF,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAA;IAC7C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1E,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,MAA0B,EAAE,QAAgB;IAC9E,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAA;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;IACjE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,oBAAoB,CAAC,CAAA;AAChE,CAAC;AAED,iEAAiE;AACjE,SAAS,aAAa,CAAC,MAAc;IACpC,IAAI,CAAC;QACJ,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GACpB,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC5B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC7B,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAiB,EAAE,IAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC7F,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC3B,KAAK,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAAC,MAAM,CAAC;QACR,8DAA8D;IAC/D,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,QAAgB,EAChB,IAA2B,EAC3B,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IAChD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,IAAI,QAAQ,+BAA+B,CAAC,CAAA;IAC5F,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IACrC,IAAI,OAAe,CAAA;IACnB,IAAI,SAA6B,CAAA;IACjC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,GAAG,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;QAC9E,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QAC1D,CAAC;QACD,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACnC,OAAO,GAAG,6BAA6B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC3F,CAAC;SAAM,CAAC;QACP,IAAI,GAAG,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;QAC5E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QACvE,CAAC;QACD,OAAO,GAAG,yBAAyB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC5D,CAAC;IAED,MAAM,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC,QAAQ,CAAC;QACxD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjC,OAAO;QACP,KAAK,EAAE,GAAG,KAAK,MAAM;QACrB,SAAS;QACT,UAAU;QACV,WAAW,EAAE,IAAI,IAAI,EAAE;KACvB,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACzD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,IAAI,CAAC,CAAA;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAA;QAC1D,aAAa,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACF,CAAC"}
|