@pixerate/editor 0.24.0 → 0.26.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/README.md +101 -1
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/dist/agent/index.cjs +175 -11
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +18 -4
- package/dist/agent/index.d.ts +18 -4
- package/dist/agent/index.js +168 -4
- package/dist/agent/index.js.map +1 -1
- package/dist/{arrangeShortcuts-B8O3f8-P.d.cts → arrange-BICutYPk.d.cts} +243 -29
- package/dist/{arrangeShortcuts-sLlD2rSX.d.ts → arrange-BICutYPk.d.ts} +243 -29
- package/dist/builtins-CdPcLwwF.d.cts +176 -0
- package/dist/builtins-Chj6zv_O.d.ts +176 -0
- package/dist/canvas/index.cjs +8588 -1857
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +1847 -9
- package/dist/canvas/index.d.ts +1847 -9
- package/dist/canvas/index.js +8577 -1846
- package/dist/canvas/index.js.map +1 -1
- package/dist/chunk-3CC7OPUQ.cjs +831 -0
- package/dist/chunk-3CC7OPUQ.cjs.map +1 -0
- package/dist/chunk-4BVP64JJ.cjs +1406 -0
- package/dist/chunk-4BVP64JJ.cjs.map +1 -0
- package/dist/chunk-BVP3TSLH.cjs +69 -0
- package/dist/chunk-BVP3TSLH.cjs.map +1 -0
- package/dist/{chunk-OLZJXL4R.cjs → chunk-CS6NZWWA.cjs} +59 -25
- package/dist/chunk-CS6NZWWA.cjs.map +1 -0
- package/dist/{chunk-MCSJFWAO.cjs → chunk-EWCOFSCQ.cjs} +685 -100
- package/dist/chunk-EWCOFSCQ.cjs.map +1 -0
- package/dist/chunk-HDYMLS3X.cjs +409 -0
- package/dist/chunk-HDYMLS3X.cjs.map +1 -0
- package/dist/chunk-HRMEDT2L.js +1406 -0
- package/dist/chunk-HRMEDT2L.js.map +1 -0
- package/dist/{chunk-D27YFC46.cjs → chunk-IFHKKVXH.cjs} +382 -63
- package/dist/chunk-IFHKKVXH.cjs.map +1 -0
- package/dist/{chunk-PGNZKFQS.js → chunk-JOIREKL7.js} +137 -58
- package/dist/chunk-JOIREKL7.js.map +1 -0
- package/dist/chunk-KRGXUQ2Y.js +1696 -0
- package/dist/chunk-KRGXUQ2Y.js.map +1 -0
- package/dist/{chunk-3LV6RRPH.js → chunk-MHEPLBFB.js} +2 -2
- package/dist/chunk-MR2764X2.js +831 -0
- package/dist/chunk-MR2764X2.js.map +1 -0
- package/dist/{chunk-XNORY7M6.cjs → chunk-NFVBT3UZ.cjs} +166 -87
- package/dist/chunk-NFVBT3UZ.cjs.map +1 -0
- package/dist/chunk-NQF32I6Z.cjs +6478 -0
- package/dist/chunk-NQF32I6Z.cjs.map +1 -0
- package/dist/chunk-O5RYH2PG.js +69 -0
- package/dist/chunk-O5RYH2PG.js.map +1 -0
- package/dist/{chunk-ITBSKI26.js → chunk-Q2OHWD2A.js} +1064 -360
- package/dist/chunk-Q2OHWD2A.js.map +1 -0
- package/dist/{chunk-FODNLX5N.js → chunk-QJSOZFCZ.js} +38 -4
- package/dist/chunk-QJSOZFCZ.js.map +1 -0
- package/dist/{chunk-SML64VJG.cjs → chunk-RRREAOVM.cjs} +4 -4
- package/dist/{chunk-SML64VJG.cjs.map → chunk-RRREAOVM.cjs.map} +1 -1
- package/dist/{chunk-5S3Z4PPF.js → chunk-SWE3NPOU.js} +347 -28
- package/dist/chunk-SWE3NPOU.js.map +1 -0
- package/dist/chunk-TXXNBDQX.cjs +1696 -0
- package/dist/chunk-TXXNBDQX.cjs.map +1 -0
- package/dist/chunk-UBCFIABU.js +409 -0
- package/dist/chunk-UBCFIABU.js.map +1 -0
- package/dist/chunk-X7HXL2SB.js +6478 -0
- package/dist/chunk-X7HXL2SB.js.map +1 -0
- package/dist/{chunk-SBCZ6RN5.cjs → chunk-YOMYSFJU.cjs} +1163 -459
- package/dist/chunk-YOMYSFJU.cjs.map +1 -0
- package/dist/{chunk-3CN2WD3X.js → chunk-ZRNHGAQT.js} +661 -76
- package/dist/chunk-ZRNHGAQT.js.map +1 -0
- package/dist/commands/index.cjs +425 -4
- package/dist/commands/index.cjs.map +1 -1
- package/dist/commands/index.d.cts +39 -77
- package/dist/commands/index.d.ts +39 -77
- package/dist/commands/index.js +424 -3
- package/dist/commands/index.js.map +1 -1
- package/dist/compare/index.cjs +3 -3
- package/dist/compare/index.d.cts +1 -1
- package/dist/compare/index.d.ts +1 -1
- package/dist/compare/index.js +2 -2
- package/dist/controller-CxXGOEmy.d.cts +2038 -0
- package/dist/controller-CxXGOEmy.d.ts +2038 -0
- package/dist/{documents-BQjzJNe2.d.ts → documents-CHT1U5Vs.d.ts} +10 -0
- package/dist/{documents-KRTPhvst.d.cts → documents-Gp7wb0Me.d.cts} +10 -0
- package/dist/export/index.cjs +36 -0
- package/dist/export/index.cjs.map +1 -0
- package/dist/export/index.d.cts +243 -0
- package/dist/export/index.d.ts +243 -0
- package/dist/export/index.js +36 -0
- package/dist/export/index.js.map +1 -0
- package/dist/extensions/index.cjs +101 -6
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +18 -5
- package/dist/extensions/index.d.ts +18 -5
- package/dist/extensions/index.js +101 -6
- package/dist/generation/index.cjs +1013 -69
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.d.cts +474 -13
- package/dist/generation/index.d.ts +474 -13
- package/dist/generation/index.js +976 -32
- package/dist/generation/index.js.map +1 -1
- package/dist/image-editor/index.cjs +3385 -1275
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +693 -128
- package/dist/image-editor/index.d.ts +693 -128
- package/dist/image-editor/index.js +3325 -1215
- package/dist/image-editor/index.js.map +1 -1
- package/dist/{index-fJrlkJCd.d.ts → index-B273Zllk.d.ts} +500 -7
- package/dist/{index-BhJBSm2d.d.cts → index-jcJwmBYt.d.cts} +500 -7
- package/dist/index.cjs +1603 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +154 -27
- package/dist/index.d.ts +154 -27
- package/dist/index.js +1584 -26
- package/dist/index.js.map +1 -1
- package/dist/mention-text-CDnCFd3c.d.cts +53 -0
- package/dist/mention-text-CDnCFd3c.d.ts +53 -0
- package/dist/model-C1zApQM8.d.cts +219 -0
- package/dist/model-C1zApQM8.d.ts +219 -0
- package/dist/persistence/index.d.cts +3 -120
- package/dist/persistence/index.d.ts +3 -120
- package/dist/registry-CED5C0lA.d.cts +204 -0
- package/dist/registry-CED5C0lA.d.ts +204 -0
- package/dist/{registry-GJI4gToU.d.cts → registry-CEgwXED1.d.cts} +12 -1
- package/dist/{registry-GJI4gToU.d.ts → registry-CEgwXED1.d.ts} +12 -1
- package/dist/{registry-D32LpIc4.d.cts → registry-D0GADKc7.d.cts} +1 -1
- package/dist/{registry-evKTP4ls.d.ts → registry-DhVUZioj.d.ts} +1 -1
- package/dist/serializers/index.cjs +12 -4
- package/dist/serializers/index.cjs.map +1 -1
- package/dist/serializers/index.d.cts +41 -13
- package/dist/serializers/index.d.ts +41 -13
- package/dist/serializers/index.js +12 -4
- package/dist/spreadsheet/index.cjs +157 -3
- package/dist/spreadsheet/index.cjs.map +1 -1
- package/dist/spreadsheet/index.d.cts +534 -11
- package/dist/spreadsheet/index.d.ts +534 -11
- package/dist/spreadsheet/index.js +157 -3
- package/dist/storage-BpFfspHm.d.cts +120 -0
- package/dist/storage-BpFfspHm.d.ts +120 -0
- package/dist/tokens/index.cjs +115 -0
- package/dist/tokens/index.cjs.map +1 -0
- package/dist/tokens/index.d.cts +212 -0
- package/dist/tokens/index.d.ts +212 -0
- package/dist/tokens/index.js +115 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/{track-changes-BK5sVf4_.d.cts → track-changes-D_VAPELi.d.cts} +95 -11
- package/dist/{track-changes-CDjCrwKe.d.ts → track-changes-Db_fGEvx.d.ts} +95 -11
- package/package.json +15 -1
- package/dist/chunk-3CN2WD3X.js.map +0 -1
- package/dist/chunk-5S3Z4PPF.js.map +0 -1
- package/dist/chunk-D27YFC46.cjs.map +0 -1
- package/dist/chunk-FODNLX5N.js.map +0 -1
- package/dist/chunk-ITBSKI26.js.map +0 -1
- package/dist/chunk-MA2F5KHF.cjs +0 -3223
- package/dist/chunk-MA2F5KHF.cjs.map +0 -1
- package/dist/chunk-MCSJFWAO.cjs.map +0 -1
- package/dist/chunk-OLZJXL4R.cjs.map +0 -1
- package/dist/chunk-PGNZKFQS.js.map +0 -1
- package/dist/chunk-SBCZ6RN5.cjs.map +0 -1
- package/dist/chunk-U5KWZU4X.js +0 -3223
- package/dist/chunk-U5KWZU4X.js.map +0 -1
- package/dist/chunk-XNORY7M6.cjs.map +0 -1
- package/dist/controller-BhLLAoi8.d.cts +0 -1000
- package/dist/controller-BhLLAoi8.d.ts +0 -1000
- package/dist/types-DX4Mh4SL.d.cts +0 -217
- package/dist/types-DX4Mh4SL.d.ts +0 -217
- /package/dist/{chunk-3LV6RRPH.js.map → chunk-MHEPLBFB.js.map} +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// src/serializers/mention-text.ts
|
|
2
|
+
var MENTION_REGEX = /(?:^|[\s>(*_"';\\/[\]{}~`:]|"|>|<|&)@(?:"([^"]+)"|"([^&]+)"|([a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*))/g;
|
|
3
|
+
var NODE_ROLE_MARK = "";
|
|
4
|
+
var ROLE_SUFFIX_REGEX = /[:\u0001]([A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?)(?![A-Za-z0-9])/y;
|
|
5
|
+
var PLAIN_HANDLE_REGEX = /^[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*$/;
|
|
6
|
+
function readRoleSuffix(text, index, roles) {
|
|
7
|
+
const first = text.charAt(index);
|
|
8
|
+
if (first !== ":" && first !== NODE_ROLE_MARK) return null;
|
|
9
|
+
if (first === ":" && !roles) return null;
|
|
10
|
+
ROLE_SUFFIX_REGEX.lastIndex = index;
|
|
11
|
+
const match = ROLE_SUFFIX_REGEX.exec(text);
|
|
12
|
+
if (!match) return null;
|
|
13
|
+
let role = match[1];
|
|
14
|
+
if (first === ":" && roles !== true) {
|
|
15
|
+
const lower = role.toLowerCase();
|
|
16
|
+
const listed = roles.find((r) => r.toLowerCase() === lower);
|
|
17
|
+
if (listed === void 0) return null;
|
|
18
|
+
role = listed;
|
|
19
|
+
}
|
|
20
|
+
return { role, end: index + match[0].length };
|
|
21
|
+
}
|
|
22
|
+
function formatMentionHandle(label) {
|
|
23
|
+
return PLAIN_HANDLE_REGEX.test(label) || label.includes('"') ? `@${label}` : `@"${label}"`;
|
|
24
|
+
}
|
|
25
|
+
function formatMentionText(handle, role) {
|
|
26
|
+
return role ? `${formatMentionHandle(handle)}:${role}` : formatMentionHandle(handle);
|
|
27
|
+
}
|
|
28
|
+
function findTextMentions(text, options = {}) {
|
|
29
|
+
if (!text || typeof text !== "string") return [];
|
|
30
|
+
const roles = options.roles === false ? void 0 : options.roles ?? true;
|
|
31
|
+
const result = [];
|
|
32
|
+
const regex = new RegExp(MENTION_REGEX.source, "g");
|
|
33
|
+
let match;
|
|
34
|
+
while ((match = regex.exec(text)) !== null) {
|
|
35
|
+
const handle = match[1] ?? match[2] ?? match[3] ?? "";
|
|
36
|
+
const start = match.index + match[0].indexOf("@");
|
|
37
|
+
const handleEnd = regex.lastIndex;
|
|
38
|
+
const suffix = text.charAt(handleEnd) === ":" ? readRoleSuffix(text, handleEnd, roles) : null;
|
|
39
|
+
if (suffix) regex.lastIndex = suffix.end;
|
|
40
|
+
result.push({
|
|
41
|
+
handle,
|
|
42
|
+
...suffix ? { role: suffix.role } : {},
|
|
43
|
+
start,
|
|
44
|
+
end: suffix ? suffix.end : handleEnd,
|
|
45
|
+
handleEnd
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
function setMentionRoleInText(text, start, role, options = {}) {
|
|
51
|
+
const mention = findTextMentions(text, { roles: options.roles ?? true }).find((m) => m.start === start);
|
|
52
|
+
if (!mention) return text;
|
|
53
|
+
if (role !== null && !/^[A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$/.test(role)) {
|
|
54
|
+
throw new Error(`Invalid mention role "${role}".`);
|
|
55
|
+
}
|
|
56
|
+
const suffix = role ? `:${role}` : "";
|
|
57
|
+
return text.slice(0, mention.handleEnd) + suffix + text.slice(mention.end);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
MENTION_REGEX,
|
|
62
|
+
NODE_ROLE_MARK,
|
|
63
|
+
readRoleSuffix,
|
|
64
|
+
formatMentionHandle,
|
|
65
|
+
formatMentionText,
|
|
66
|
+
findTextMentions,
|
|
67
|
+
setMentionRoleInText
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=chunk-O5RYH2PG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/serializers/mention-text.ts"],"sourcesContent":["/**\n * Dependency-free mention text helpers: the `@handle` pattern, the opt-in\n * `@handle:role` suffix used by asset mentions, and offset-based editing of\n * mentions in plain prompt text. Kept apart from `mentions.ts` (which pulls in\n * the HTML serializers) so `@pixerate/editor/generation` can re-export them.\n */\n\n/**\n * Canonical regex pattern for matching @mentions in plain text or markdown.\n * Supports:\n * - Standard unquoted handles: @username, @user.name, @team_alpha, @sa-1\n * - Quoted handles: @\"John Doe\", "Jane Doe"\n * Unquoted handles exclude trailing punctuation (e.g. @violet. matches \"violet\" without the dot).\n */\nexport const MENTION_REGEX =\n /(?:^|[\\s>(*_\"';\\\\/[\\]{}~`:]|"|>|<|&)@(?:\"([^\"]+)\"|"([^&]+)"|([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*))/g;\n\n/**\n * Which `@handle:role` suffixes are read as a mention role: `true` for any\n * role name, or a list of accepted roles (matched case-insensitively and\n * returned as listed). Off by default, so `@john:` text is unchanged.\n */\nexport type MentionRoleSyntax = true | readonly string[];\n\n/** Marks a role taken from a mention node's `data-role` while extracting (never in output). */\nexport const NODE_ROLE_MARK = \"\\u0001\";\nconst ROLE_SUFFIX_REGEX = /[:\\u0001]([A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?)(?![A-Za-z0-9])/y;\nconst PLAIN_HANDLE_REGEX = /^[a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*$/;\n\n/**\n * Reads a `:role` suffix at `index`. Returns the role (as listed in `roles`)\n * and the index after it, or `null`. A suffix taken from a mention node\n * (`NODE_ROLE_MARK`) is accepted whatever `roles` says.\n */\nexport function readRoleSuffix(\n text: string,\n index: number,\n roles: MentionRoleSyntax | undefined,\n): { role: string; end: number } | null {\n const first = text.charAt(index);\n if (first !== \":\" && first !== NODE_ROLE_MARK) return null;\n if (first === \":\" && !roles) return null;\n ROLE_SUFFIX_REGEX.lastIndex = index;\n const match = ROLE_SUFFIX_REGEX.exec(text);\n if (!match) return null;\n let role = match[1];\n if (first === \":\" && roles !== true) {\n const lower = role.toLowerCase();\n const listed = (roles as readonly string[]).find((r) => r.toLowerCase() === lower);\n if (listed === undefined) return null;\n role = listed;\n }\n return { role, end: index + match[0].length };\n}\n\n/** `@label`, quoted when the label is not a plain handle (and has no `\"`). */\nexport function formatMentionHandle(label: string): string {\n return PLAIN_HANDLE_REGEX.test(label) || label.includes('\"') ? `@${label}` : `@\"${label}\"`;\n}\n\n/**\n * Formats a mention as text: `@handle` or `@handle:role` (quoted as\n * `@\"Two words\":role` when the handle is not a plain handle).\n */\nexport function formatMentionText(handle: string, role?: string | null): string {\n return role ? `${formatMentionHandle(handle)}:${role}` : formatMentionHandle(handle);\n}\n\n/** A mention found in plain text, with offsets into that text. */\nexport interface TextMention {\n handle: string;\n role?: string;\n /** Offset of the `@`. */\n start: number;\n /** Offset just past the handle (and role, when present). */\n end: number;\n /** Offset just past the handle (where a `:role` suffix starts). */\n handleEnd: number;\n}\n\n/**\n * Every mention in plain text (prompt text), in order, with offsets and\n * `@handle:role` roles (`roles` defaults to `true` here). Unlike\n * {@link extractMentions} it does not skip code or URLs and keeps duplicates.\n */\nexport function findTextMentions(text: string, options: { roles?: MentionRoleSyntax | false } = {}): TextMention[] {\n if (!text || typeof text !== \"string\") return [];\n const roles = options.roles === false ? undefined : (options.roles ?? true);\n const result: TextMention[] = [];\n const regex = new RegExp(MENTION_REGEX.source, \"g\");\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n const handle = match[1] ?? match[2] ?? match[3] ?? \"\";\n const start = match.index + match[0].indexOf(\"@\");\n const handleEnd = regex.lastIndex;\n const suffix = text.charAt(handleEnd) === \":\" ? readRoleSuffix(text, handleEnd, roles) : null;\n if (suffix) regex.lastIndex = suffix.end;\n result.push({\n handle,\n ...(suffix ? { role: suffix.role } : {}),\n start,\n end: suffix ? suffix.end : handleEnd,\n handleEnd,\n });\n }\n return result;\n}\n\n/**\n * Sets (or with `null` removes) the `:role` of the text mention starting at\n * offset `start` (its `@`). Returns the text unchanged when no mention starts there.\n */\nexport function setMentionRoleInText(\n text: string,\n start: number,\n role: string | null,\n options: { roles?: MentionRoleSyntax } = {},\n): string {\n const mention = findTextMentions(text, { roles: options.roles ?? true }).find((m) => m.start === start);\n if (!mention) return text;\n if (role !== null && !/^[A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$/.test(role)) {\n throw new Error(`Invalid mention role \"${role}\".`);\n }\n const suffix = role ? `:${role}` : \"\";\n return text.slice(0, mention.handleEnd) + suffix + text.slice(mention.end);\n}\n\n"],"mappings":";AAcO,IAAM,gBACX;AAUK,IAAM,iBAAiB;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAOpB,SAAS,eACd,MACA,OACA,OACsC;AACtC,QAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,MAAI,UAAU,OAAO,UAAU,eAAgB,QAAO;AACtD,MAAI,UAAU,OAAO,CAAC,MAAO,QAAO;AACpC,oBAAkB,YAAY;AAC9B,QAAM,QAAQ,kBAAkB,KAAK,IAAI;AACzC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,OAAO,MAAM,CAAC;AAClB,MAAI,UAAU,OAAO,UAAU,MAAM;AACnC,UAAM,QAAQ,KAAK,YAAY;AAC/B,UAAM,SAAU,MAA4B,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,KAAK;AACjF,QAAI,WAAW,OAAW,QAAO;AACjC,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,KAAK,QAAQ,MAAM,CAAC,EAAE,OAAO;AAC9C;AAGO,SAAS,oBAAoB,OAAuB;AACzD,SAAO,mBAAmB,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK;AACzF;AAMO,SAAS,kBAAkB,QAAgB,MAA8B;AAC9E,SAAO,OAAO,GAAG,oBAAoB,MAAM,CAAC,IAAI,IAAI,KAAK,oBAAoB,MAAM;AACrF;AAmBO,SAAS,iBAAiB,MAAc,UAAiD,CAAC,GAAkB;AACjH,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO,CAAC;AAC/C,QAAM,QAAQ,QAAQ,UAAU,QAAQ,SAAa,QAAQ,SAAS;AACtE,QAAM,SAAwB,CAAC;AAC/B,QAAM,QAAQ,IAAI,OAAO,cAAc,QAAQ,GAAG;AAClD,MAAI;AACJ,UAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAC1C,UAAM,SAAS,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AACnD,UAAM,QAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,GAAG;AAChD,UAAM,YAAY,MAAM;AACxB,UAAM,SAAS,KAAK,OAAO,SAAS,MAAM,MAAM,eAAe,MAAM,WAAW,KAAK,IAAI;AACzF,QAAI,OAAQ,OAAM,YAAY,OAAO;AACrC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAI,SAAS,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,MACtC;AAAA,MACA,KAAK,SAAS,OAAO,MAAM;AAAA,MAC3B;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAMO,SAAS,qBACd,MACA,OACA,MACA,UAAyC,CAAC,GAClC;AACR,QAAM,UAAU,iBAAiB,MAAM,EAAE,OAAO,QAAQ,SAAS,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AACtG,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,SAAS,QAAQ,CAAC,2CAA2C,KAAK,IAAI,GAAG;AAC3E,UAAM,IAAI,MAAM,yBAAyB,IAAI,IAAI;AAAA,EACnD;AACA,QAAM,SAAS,OAAO,IAAI,IAAI,KAAK;AACnC,SAAO,KAAK,MAAM,GAAG,QAAQ,SAAS,IAAI,SAAS,KAAK,MAAM,QAAQ,GAAG;AAC3E;","names":[]}
|