@reportwright/viewer 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +55 -1
  2. package/README.md +27 -5
  3. package/dist/{chunk-KJTRZJHN.js → chunk-2BPBQMH2.js} +4 -3
  4. package/dist/chunk-2BPBQMH2.js.map +6 -0
  5. package/dist/{chunk-ODREGGKA.js → chunk-3D2KFKG2.js} +5 -4
  6. package/dist/chunk-3D2KFKG2.js.map +6 -0
  7. package/dist/chunk-6TPZ7G74.js +494 -0
  8. package/dist/chunk-6TPZ7G74.js.map +6 -0
  9. package/dist/chunk-BRB34AJ2.js +16 -0
  10. package/dist/{chunk-APRPSQOD.js → chunk-DPVJEFKP.js} +28 -9
  11. package/dist/chunk-DPVJEFKP.js.map +6 -0
  12. package/dist/{chunk-RYHJUQSV.js → chunk-DXHLIJEY.js} +2 -2
  13. package/dist/{chunk-SR2TQ2ZK.js → chunk-F6RMRXIN.js} +2 -2
  14. package/dist/chunk-F6RMRXIN.js.map +6 -0
  15. package/dist/{chunk-3D43XGIN.js → chunk-M6AYND5G.js} +8 -638
  16. package/dist/chunk-M6AYND5G.js.map +6 -0
  17. package/dist/{chunk-EOVGKHAS.js → chunk-NR2G4TMG.js} +59 -51
  18. package/dist/chunk-NR2G4TMG.js.map +6 -0
  19. package/dist/{chunk-5N6OFCHJ.js → chunk-PGP3QA6L.js} +22 -10
  20. package/dist/chunk-PGP3QA6L.js.map +6 -0
  21. package/dist/{chunk-FARG6X2U.js → chunk-Q6MMPKQA.js} +14 -9
  22. package/dist/chunk-Q6MMPKQA.js.map +6 -0
  23. package/dist/{chunk-SBD55ZES.js → chunk-S2IUUI6N.js} +76 -32
  24. package/dist/chunk-S2IUUI6N.js.map +6 -0
  25. package/dist/chunk-ULKEEARQ.js +553 -0
  26. package/dist/chunk-ULKEEARQ.js.map +6 -0
  27. package/dist/{chunk-M6GENFAH.js → chunk-VNOWPSE6.js} +527 -1461
  28. package/dist/chunk-VNOWPSE6.js.map +6 -0
  29. package/dist/chunk-Z7MKH66Z.js +642 -0
  30. package/dist/chunk-Z7MKH66Z.js.map +6 -0
  31. package/dist/designer.d.ts +10 -3
  32. package/dist/designer.js +41 -31
  33. package/dist/designer.js.map +2 -2
  34. package/dist/engine.worker.js +71 -0
  35. package/dist/engine.worker.js.map +6 -0
  36. package/dist/peer/chunk-2FZTYEDE.js +15 -0
  37. package/dist/peer/{chunk-NPYKZINU.js → chunk-6I2EAAVN.js} +39 -31
  38. package/dist/peer/chunk-6I2EAAVN.js.map +6 -0
  39. package/dist/peer/{chunk-IPU2YRL2.js → chunk-BMAXIBP2.js} +28 -9
  40. package/dist/peer/chunk-BMAXIBP2.js.map +6 -0
  41. package/dist/peer/chunk-BQFI3DHK.js +494 -0
  42. package/dist/peer/chunk-BQFI3DHK.js.map +6 -0
  43. package/dist/peer/{chunk-76ZABVTI.js → chunk-R4VX5UC7.js} +4 -3
  44. package/dist/peer/{chunk-KBT6ZGGO.js → chunk-TSC4RAH3.js} +22 -10
  45. package/dist/peer/chunk-TSC4RAH3.js.map +6 -0
  46. package/dist/peer/{chunk-M4AGFUWE.js → chunk-V42KN7HD.js} +2 -2
  47. package/dist/peer/{chunk-Y5CAHLXS.js → chunk-WQGENQZO.js} +5 -4
  48. package/dist/peer/{chunk-MCJPN2KL.js → chunk-WSNRD2AQ.js} +14 -9
  49. package/dist/peer/chunk-WSNRD2AQ.js.map +6 -0
  50. package/dist/peer/designer.js +41 -31
  51. package/dist/peer/designer.js.map +2 -2
  52. package/dist/peer/engine.worker.js +70 -0
  53. package/dist/peer/engine.worker.js.map +6 -0
  54. package/dist/peer/viewer.js +12 -5
  55. package/dist/peer/viewer.js.map +1 -1
  56. package/dist/viewer.d.ts +9 -1
  57. package/dist/viewer.js +12 -5
  58. package/dist/viewer.js.map +1 -1
  59. package/package.json +1 -1
  60. package/dist/chunk-3D43XGIN.js.map +0 -6
  61. package/dist/chunk-5N6OFCHJ.js.map +0 -6
  62. package/dist/chunk-AH47FS6Y.js +0 -13
  63. package/dist/chunk-APRPSQOD.js.map +0 -6
  64. package/dist/chunk-EOVGKHAS.js.map +0 -6
  65. package/dist/chunk-FARG6X2U.js.map +0 -6
  66. package/dist/chunk-M6GENFAH.js.map +0 -6
  67. package/dist/chunk-SBD55ZES.js.map +0 -6
  68. package/dist/chunk-SR2TQ2ZK.js.map +0 -6
  69. package/dist/peer/chunk-76ZABVTI.js.map +0 -6
  70. package/dist/peer/chunk-GBITRNHE.js +0 -14806
  71. package/dist/peer/chunk-GBITRNHE.js.map +0 -6
  72. package/dist/peer/chunk-IMQRHDR4.js +0 -12
  73. package/dist/peer/chunk-IPU2YRL2.js.map +0 -6
  74. package/dist/peer/chunk-KBT6ZGGO.js.map +0 -6
  75. package/dist/peer/chunk-MCJPN2KL.js.map +0 -6
  76. package/dist/peer/chunk-NPYKZINU.js.map +0 -6
  77. package/dist/peer/chunk-Y5CAHLXS.js.map +0 -6
  78. /package/dist/{chunk-AH47FS6Y.js.map → chunk-BRB34AJ2.js.map} +0 -0
  79. /package/dist/{chunk-RYHJUQSV.js.map → chunk-DXHLIJEY.js.map} +0 -0
  80. /package/dist/peer/{chunk-IMQRHDR4.js.map → chunk-2FZTYEDE.js.map} +0 -0
  81. /package/dist/{chunk-KJTRZJHN.js.map → peer/chunk-R4VX5UC7.js.map} +0 -0
  82. /package/dist/peer/{chunk-M4AGFUWE.js.map → chunk-V42KN7HD.js.map} +0 -0
  83. /package/dist/{chunk-ODREGGKA.js.map → peer/chunk-WQGENQZO.js.map} +0 -0
@@ -0,0 +1,553 @@
1
+ import {
2
+ CORE_FONT_KEY,
3
+ DEFAULT_FAMILY,
4
+ SHAPER,
5
+ fallbackKey,
6
+ fontCss,
7
+ resolveFontKey
8
+ } from "./chunk-Z7MKH66Z.js";
9
+
10
+ // src/engine/text/measure.js
11
+ import bidiFactory from "bidi-js";
12
+ var bidi = bidiFactory();
13
+ function special(cp) {
14
+ if (cp < 1424) return false;
15
+ if (cp <= 7423) return true;
16
+ if (cp >= 8192 && cp <= 8303) return cp >= 8203 && cp <= 8207 || cp >= 8234 && cp <= 8238 || cp >= 8288;
17
+ return cp >= 11904 && cp <= 42191 || cp >= 43056 && cp <= 44031 || cp >= 44032 && cp <= 55215 || cp >= 63744 && cp <= 64255 || cp >= 64285 && cp <= 65023 || cp >= 65024 && cp <= 65039 || cp >= 65072 && cp <= 65103 || cp >= 65136 && cp <= 65278 || cp >= 65280 && cp <= 65519 || cp >= 65536;
18
+ }
19
+ var FORMAT_CHAR = /^\p{Cf}$/u;
20
+ var cjk = (cp) => cp >= 11904 && cp <= 40959 || cp >= 44032 && cp <= 55215 || cp >= 63744 && cp <= 64255 || cp >= 65280 && cp <= 65519 || cp >= 131072 && cp <= 262143;
21
+ var NO_START = new Set("、。,.・:;?!ー)」』】〕〉》〗〙〟’”}⦆ぁぃぅぇぉっゃゅょゎゕゖァィゥェォッャュョヮヵヶ々〻‐゠–〜~…‥,.!?:;)]}%ゝゞヽヾ゛゜ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ。」、・ー%]⦆");
22
+ var NO_END = new Set("(「『【〔〈《〖〘〝‘“{⦅([{[「$¥£");
23
+ var MAYBE = /[^\u0000-\u058f]/;
24
+ var RTL_OR_CONTROLS = /[֐-ࣿיִ-﷿ﹰ-﻾‎‏‪-‮⁦-⁩]|[\uD802\uD803\uD83A]/;
25
+ var SCRIPTS = [
26
+ "Latin",
27
+ "Greek",
28
+ "Cyrillic",
29
+ "Armenian",
30
+ "Hebrew",
31
+ "Arabic",
32
+ "Syriac",
33
+ "Thaana",
34
+ "Devanagari",
35
+ "Bengali",
36
+ "Gurmukhi",
37
+ "Gujarati",
38
+ "Oriya",
39
+ "Tamil",
40
+ "Telugu",
41
+ "Kannada",
42
+ "Malayalam",
43
+ "Sinhala",
44
+ "Thai",
45
+ "Lao",
46
+ "Tibetan",
47
+ "Myanmar",
48
+ "Georgian",
49
+ "Hangul",
50
+ "Ethiopic",
51
+ "Khmer",
52
+ "Mongolian",
53
+ "Han",
54
+ "Hiragana",
55
+ "Katakana",
56
+ "Bopomofo"
57
+ ].map((s) => (
58
+ /** @type {[string, RegExp]} */
59
+ [s, new RegExp(`\\p{Script=${s}}`, "u")]
60
+ ));
61
+ var SIMPLE = /* @__PURE__ */ new Set(["Latin", "Greek", "Cyrillic", "Armenian", "Georgian", "Hangul", "Han", "Hiragana", "Katakana", "Bopomofo", "Common"]);
62
+ var STICKY = /[\p{M}\p{Cf}]/u;
63
+ var SPACE = /\s/u;
64
+ var scriptCache = /* @__PURE__ */ new Map();
65
+ function scriptOf(cp) {
66
+ let s = scriptCache.get(cp);
67
+ if (s === void 0) {
68
+ const ch = String.fromCodePoint(cp);
69
+ s = "Common";
70
+ for (const [name, re] of SCRIPTS) if (re.test(ch)) {
71
+ s = name;
72
+ break;
73
+ }
74
+ if (scriptCache.size >= 2e4) scriptCache.clear();
75
+ scriptCache.set(cp, s);
76
+ }
77
+ return s;
78
+ }
79
+ var INTL = typeof Intl !== "undefined" && typeof Intl.Segmenter === "function";
80
+ var GRAPHEMES = INTL ? new Intl.Segmenter(void 0, { granularity: "grapheme" }) : null;
81
+ var JOINS = /[\p{M}\u200c\u200d\ufe00-\ufe0f]/u;
82
+ function clusters(s, intl = true) {
83
+ if (intl && GRAPHEMES) return [...GRAPHEMES.segment(s)].map((x) => x.segment);
84
+ const out = [];
85
+ for (const ch of s) {
86
+ if (out.length && (JOINS.test(ch) || out[out.length - 1].endsWith("‍"))) out[out.length - 1] += ch;
87
+ else out.push(ch);
88
+ }
89
+ return out;
90
+ }
91
+ var graphemes = (s) => clusters(s);
92
+ var SA = /[\u0e00-\u0eff\u1000-\u109f\u1780-\u17ff\u19e0-\u19ff\u1a20-\u1aaf\ua9e0-\ua9ff\uaa60-\uaadf]/;
93
+ var WORDS = INTL ? new Intl.Segmenter(void 0, { granularity: "word" }) : null;
94
+ function saBreaks(text, segmenter = WORDS) {
95
+ const out = /* @__PURE__ */ new Set();
96
+ if (!segmenter) return out;
97
+ for (const { index } of segmenter.segment(text)) {
98
+ if (index > 0 && (SA.test(text[index]) || SA.test(text[index - 1]))) out.add(index);
99
+ }
100
+ return out;
101
+ }
102
+ var TextMeasurer = class {
103
+ /** @param {import('./fonts.js').FontStore} store */
104
+ constructor(store) {
105
+ this.store = store;
106
+ this.faces = /* @__PURE__ */ new Map();
107
+ this.boxes = /* @__PURE__ */ new WeakMap();
108
+ this.boxCount = 0;
109
+ this.looks = /* @__PURE__ */ new WeakMap();
110
+ this.cover = /* @__PURE__ */ new Map();
111
+ this.cache = /* @__PURE__ */ new Map();
112
+ this.missing = /* @__PURE__ */ new Set();
113
+ this.noGlyph = /* @__PURE__ */ new Set();
114
+ }
115
+ /**
116
+ * The key to measure with: `key` when loaded; else (not loaded yet, or failed) the bundled face of the same weight
117
+ * and style when that is loaded, else the core regular face. A key not yet loaded is asked for in the next pass.
118
+ */
119
+ usable(key) {
120
+ if (this.store.has(key)) return key;
121
+ if (!this.store.failed.has(key)) this.missing.add(key);
122
+ const c = fontCss(key);
123
+ const same = resolveFontKey(DEFAULT_FAMILY, c.weight, c.style);
124
+ return this.store.has(same) ? same : CORE_FONT_KEY;
125
+ }
126
+ /**
127
+ * A loaded face's numbers, read once: fontkit's getters (unitsPerEm, ascent…) decode tables on every read.
128
+ * adv: advances per code point (-1 = not on the fast path); words: fast-path units per string (a table repeats them).
129
+ * @param {string} key a loaded key
130
+ */
131
+ face(key) {
132
+ let f = this.faces.get(key);
133
+ if (!f) {
134
+ const font = this.store.get(key);
135
+ f = { font, upm: font.unitsPerEm, ascent: font.ascent, descent: font.descent, adv: /* @__PURE__ */ new Map(), words: /* @__PURE__ */ new Map(), met: /* @__PURE__ */ new Map() };
136
+ this.faces.set(key, f);
137
+ }
138
+ return f;
139
+ }
140
+ /** Font units of `text` on the fast path, or -1 when it needs the complex path. */
141
+ fast(text, key) {
142
+ const f = this.face(key);
143
+ const hit = f.words.get(text);
144
+ if (hit !== void 0) return hit;
145
+ const m = f.adv, font = f.font;
146
+ let units = 0;
147
+ for (let i = 0; i < text.length; i++) {
148
+ let cp = text.charCodeAt(i);
149
+ if (cp >= 55296 && cp <= 56319) {
150
+ const lo = text.charCodeAt(i + 1);
151
+ if (lo >= 56320 && lo <= 57343) {
152
+ cp = (cp - 55296) * 1024 + lo - 56320 + 65536;
153
+ i++;
154
+ }
155
+ }
156
+ let a = m.get(cp);
157
+ if (a === void 0) {
158
+ a = special(cp) || cp >= 32 && !font.hasGlyphForCodePoint(cp) ? -1 : font.glyphForCodePoint(cp).advanceWidth || 0;
159
+ m.set(cp, a);
160
+ }
161
+ if (a < 0) {
162
+ units = -1;
163
+ break;
164
+ }
165
+ units += a;
166
+ }
167
+ if (text.length <= 256) {
168
+ if (f.words.size >= 5e4) f.words.clear();
169
+ f.words.set(text, units);
170
+ }
171
+ return units;
172
+ }
173
+ /**
174
+ * Advance width in points. @param {string} text @param {string} key @param {number} size
175
+ * @param {'ltr'|'rtl'} [dir] paragraph direction (default: from the first strong character)
176
+ */
177
+ width(text, key, size, dir) {
178
+ const k = this.store.has(key) ? key : this.usable(key);
179
+ const u = this.fast(text, k);
180
+ if (u >= 0) return u * size / this.face(k).upm;
181
+ return this.layout(text, k, dir).w * size;
182
+ }
183
+ /**
184
+ * Where underline and strike-through go, from the font's own tables (post and OS/2), in points:
185
+ * y offsets of the stroke centre from the baseline (positive = down, as on the page) and thicknesses.
186
+ * A font without the tables falls back to proportions of its descent and x-height.
187
+ * @param {string} key @param {number} size
188
+ */
189
+ decoration(key, size) {
190
+ const f = this.store.get(this.usable(key));
191
+ const u = f.unitsPerEm, os2 = f["OS/2"] || {};
192
+ const ut = f.underlineThickness > 0 ? f.underlineThickness : u / 14;
193
+ const up = f.underlinePosition < 0 ? f.underlinePosition : f.descent / 2;
194
+ const st = os2.yStrikeoutSize > 0 ? os2.yStrikeoutSize : ut;
195
+ const sp = os2.yStrikeoutPosition > 0 ? os2.yStrikeoutPosition : (f.xHeight > 0 ? f.xHeight : f.ascent * 0.5) / 2 + st / 2;
196
+ const k = size / u;
197
+ return { underlineY: -(up - ut / 2) * k, underlineWidth: ut * k, strikeY: -(sp - st / 2) * k, strikeWidth: st * k };
198
+ }
199
+ /**
200
+ * Superscript and subscript from the font's OS/2 table, in em: the size of the small text and how far its
201
+ * baseline moves (rise up for superscript, drop down for subscript). Fonts without the values get the
202
+ * proportions most fonts use.
203
+ * @param {string} key
204
+ */
205
+ script(key) {
206
+ const f = this.store.get(this.usable(key));
207
+ const u = f.unitsPerEm, o = f["OS/2"] || {};
208
+ const frac = (v, d) => v > 0 && v < u * 2 ? v / u : d;
209
+ return { supScale: frac(o.ySuperscriptYSize, 0.65), supRise: frac(o.ySuperscriptYOffset, 0.35), subScale: frac(o.ySubscriptYSize, 0.65), subDrop: frac(o.ySubscriptYOffset, 0.15) };
210
+ }
211
+ /** @param {string} key @param {number} size */
212
+ metrics(key, size) {
213
+ const f = this.face(this.usable(key));
214
+ let r = f.met.get(size);
215
+ if (!r) {
216
+ r = Object.freeze({ ascent: f.ascent * size / f.upm, descent: -f.descent * size / f.upm });
217
+ f.met.set(size, r);
218
+ }
219
+ return r;
220
+ }
221
+ /**
222
+ * The visually ordered runs of one line, or null when the line is simple (draw `text` as it is).
223
+ * @param {string} text @param {string} key @param {number} size @param {'ltr'|'rtl'} [dir]
224
+ * @returns {Run[]|null}
225
+ */
226
+ runs(text, key, size, dir) {
227
+ if (!dir && !MAYBE.test(text)) return null;
228
+ const k = this.usable(key);
229
+ if (this.fast(text, k) >= 0) return null;
230
+ return this.layout(text, k, dir).runs.map((r) => ({
231
+ ...r,
232
+ x: r.x * size,
233
+ w: r.w * size,
234
+ glyphs: r.glyphs.map((v, i) => i % 4 === 1 || i % 4 === 2 ? v * size : v)
235
+ }));
236
+ }
237
+ /** Paragraph direction of text that needs shaping, bidi or CJK breaks, else undefined. */
238
+ direction(text, key) {
239
+ if (!MAYBE.test(text)) return void 0;
240
+ const k = this.usable(key);
241
+ if (this.fast(text, k) >= 0) return void 0;
242
+ return this.layout(text, k, void 0).rtl ? "rtl" : "ltr";
243
+ }
244
+ /**
245
+ * Greedy line breaking. Simple paragraphs break at spaces (a word longer than the line breaks by
246
+ * character), exactly as before. Others also break between CJK characters (kinsoku applied), never
247
+ * inside a grapheme cluster (a conjunct, a letter and its marks), and remember their direction.
248
+ * @param {string} text @param {string} key @param {number} size @param {number} maxWidth
249
+ * @returns {{text: string, width: number, dir?: 'ltr'|'rtl'}[]}
250
+ */
251
+ wrap(text, key, size, maxWidth) {
252
+ const out = [];
253
+ const k = this.usable(key);
254
+ const sp = this.width(" ", k, size);
255
+ const str = String(text);
256
+ for (const para of str.includes("\n") ? str.split(/\r?\n/) : [str]) {
257
+ const dir = this.direction(para, k);
258
+ if (dir) {
259
+ this.wrapComplex(para, k, size, maxWidth, dir, sp, out);
260
+ continue;
261
+ }
262
+ if (!para.includes(" ")) {
263
+ const ww = this.width(para, k, size);
264
+ if (ww <= maxWidth || maxWidth <= 0) {
265
+ out.push({ text: para, width: ww, end: true });
266
+ continue;
267
+ }
268
+ }
269
+ const words = para.split(/ +/);
270
+ let line = "", lw = 0;
271
+ const push = () => {
272
+ out.push({ text: line, width: lw });
273
+ line = "";
274
+ lw = 0;
275
+ };
276
+ for (let wi = 0; wi < words.length; wi++) {
277
+ const w = words[wi];
278
+ if (w === "" && wi > 0) continue;
279
+ const ww = this.width(w, k, size);
280
+ if (line === "") {
281
+ if (ww <= maxWidth || maxWidth <= 0) {
282
+ line = w;
283
+ lw = ww;
284
+ continue;
285
+ }
286
+ } else if (lw + sp + ww <= maxWidth) {
287
+ line += " " + w;
288
+ lw += sp + ww;
289
+ continue;
290
+ } else {
291
+ push();
292
+ if (ww <= maxWidth) {
293
+ line = w;
294
+ lw = ww;
295
+ continue;
296
+ }
297
+ }
298
+ let after = -1;
299
+ for (const ch of w) {
300
+ const cw = this.width(ch, k, size);
301
+ if (lw + cw > maxWidth && line !== "") {
302
+ if (after > 0 && after < line.length) {
303
+ const rest = line.slice(after);
304
+ line = line.slice(0, after);
305
+ lw = this.width(line, k, size);
306
+ push();
307
+ line = rest;
308
+ lw = this.width(rest, k, size);
309
+ } else push();
310
+ after = -1;
311
+ }
312
+ line += ch;
313
+ lw += cw;
314
+ if ((ch === "/" || ch === "-") && line.length > 1) after = line.length;
315
+ }
316
+ }
317
+ push();
318
+ out[out.length - 1].end = true;
319
+ }
320
+ return out;
321
+ }
322
+ /** @param {string} para @param {string} key @param {number} size @param {number} maxWidth @param {'ltr'|'rtl'} dir @param {number} sp @param {any[]} out */
323
+ wrapComplex(para, key, size, maxWidth, dir, sp, out) {
324
+ const tokens = [];
325
+ const sa = SA.test(para) ? saBreaks(para) : null;
326
+ let cur = "", space = false, prev = "", at = 0;
327
+ for (const ch of para) {
328
+ const i = at;
329
+ at += ch.length;
330
+ if (ch === " ") {
331
+ if (cur) {
332
+ tokens.push({ text: cur, space });
333
+ cur = "";
334
+ }
335
+ space = tokens.length > 0;
336
+ prev = "";
337
+ continue;
338
+ }
339
+ const cp = (
340
+ /** @type {number} */
341
+ ch.codePointAt(0)
342
+ );
343
+ const pcp = prev ? (
344
+ /** @type {number} */
345
+ prev.codePointAt(0)
346
+ ) : 0;
347
+ if (cur && (sa?.has(i) || (cjk(cp) || cjk(pcp)) && !NO_START.has(ch) && !NO_END.has(prev) && !STICKY.test(ch))) {
348
+ tokens.push({ text: cur, space });
349
+ cur = "";
350
+ space = false;
351
+ }
352
+ cur += ch;
353
+ prev = ch;
354
+ }
355
+ if (cur) tokens.push({ text: cur, space });
356
+ let line = "", lw = 0;
357
+ const push = () => {
358
+ out.push({ text: line, width: this.width(line, key, size, dir), dir });
359
+ line = "";
360
+ lw = 0;
361
+ };
362
+ for (const t of tokens) {
363
+ const tw = this.width(t.text, key, size, dir);
364
+ const gap = line && t.space ? sp : 0;
365
+ if (line === "" ? tw <= maxWidth || maxWidth <= 0 : lw + gap + tw <= maxWidth) {
366
+ line += (line && t.space ? " " : "") + t.text;
367
+ lw += gap + tw;
368
+ continue;
369
+ }
370
+ if (line) push();
371
+ if (tw <= maxWidth) {
372
+ line = t.text;
373
+ lw = tw;
374
+ continue;
375
+ }
376
+ for (const g of graphemes(t.text)) {
377
+ const gw = this.width(g, key, size, dir);
378
+ if (lw + gw > maxWidth && line !== "") push();
379
+ line += g;
380
+ lw += gw;
381
+ }
382
+ }
383
+ push();
384
+ }
385
+ /** Cut a line so it fits, then add "…". */
386
+ ellipsize(text, key, size, maxWidth, dir) {
387
+ const ell = "…";
388
+ if (this.width(text, key, size, dir) <= maxWidth) return text;
389
+ const ew = this.width(ell, key, size);
390
+ if (this.direction(text, key)) {
391
+ const gs = graphemes(text);
392
+ while (gs.length && this.width(gs.join(""), key, size, dir) + ew > maxWidth) gs.pop();
393
+ return gs.join("").trimEnd() + ell;
394
+ }
395
+ let s = text;
396
+ while (s.length && this.width(s, key, size) + ew > maxWidth) s = s.slice(0, -1);
397
+ return s.trimEnd() + ell;
398
+ }
399
+ /** Does this font have a glyph for the character? */
400
+ has(key, cp) {
401
+ let m = this.cover.get(key);
402
+ if (!m) {
403
+ m = /* @__PURE__ */ new Map();
404
+ this.cover.set(key, m);
405
+ }
406
+ let h = m.get(cp);
407
+ if (h === void 0) {
408
+ h = !!this.store.get(key).hasGlyphForCodePoint(cp);
409
+ m.set(cp, h);
410
+ }
411
+ return h;
412
+ }
413
+ /** The font for one character: the chosen one, else the bundled fallback for its script, else the one before. */
414
+ pick(cp, key, prev) {
415
+ if (cp < 32 || this.has(key, cp) || FORMAT_CHAR.test(String.fromCodePoint(cp))) return key;
416
+ const fb = fallbackKey(cp, key);
417
+ if (fb && !this.store.failed.has(fb)) {
418
+ if (!this.store.has(fb)) {
419
+ this.missing.add(fb);
420
+ return key;
421
+ }
422
+ if (this.has(fb, cp)) return fb;
423
+ }
424
+ if (prev && prev !== key && this.has(prev, cp)) return prev;
425
+ if (!this.missing.size) this.noGlyph.add(String.fromCodePoint(cp));
426
+ return key;
427
+ }
428
+ /**
429
+ * Bidi levels, a font per character, runs (one font, level, script, and space or not), shaping,
430
+ * then visual order. Cached at size 1.
431
+ * @param {string} text @param {string} key a loaded key @param {'ltr'|'rtl'|undefined} dir
432
+ * @returns {{ w: number, rtl: boolean, runs: Run[] }}
433
+ */
434
+ layout(text, key, dir) {
435
+ const ck = `${key}${dir || ""}${text}`;
436
+ const hit = this.cache.get(ck);
437
+ if (hit) return hit;
438
+ let levels = null, rtl = dir === "rtl";
439
+ if (dir === "rtl" || RTL_OR_CONTROLS.test(text)) {
440
+ const e = bidi.getEmbeddingLevels(text, dir);
441
+ levels = e.levels;
442
+ rtl = ((e.paragraphs[0]?.level ?? 0) & 1) === 1;
443
+ }
444
+ const segs = [];
445
+ let cur = null, prevFont = "";
446
+ for (let i = 0; i < text.length; ) {
447
+ const cp = (
448
+ /** @type {number} */
449
+ text.codePointAt(i)
450
+ );
451
+ const n = cp > 65535 ? 2 : 1;
452
+ const ch = text.slice(i, i + n);
453
+ const font = STICKY.test(ch) && prevFont ? prevFont : this.pick(cp, key, prevFont);
454
+ const level = levels ? levels[i] : 0;
455
+ const ws = SPACE.test(ch);
456
+ const script = scriptOf(cp);
457
+ if (!cur || font !== cur.font || level !== cur.level || ws !== cur.ws || script !== "Common" && cur.script !== "Common" && script !== cur.script) {
458
+ cur = { start: i, end: i + n, font, level, script, ws };
459
+ segs.push(cur);
460
+ } else {
461
+ cur.end = i + n;
462
+ if (cur.script === "Common") cur.script = script;
463
+ }
464
+ prevFont = font;
465
+ i += n;
466
+ }
467
+ const runs = segs.map((s) => this.shapeRun(text.slice(s.start, s.end), s.font, (s.level & 1) === 1, s.script));
468
+ const order = runs.map((r, i) => ({ r, level: segs[i].level }));
469
+ let max = 0, minOdd = Infinity;
470
+ for (const o of order) {
471
+ max = Math.max(max, o.level);
472
+ if (o.level & 1) minOdd = Math.min(minOdd, o.level);
473
+ }
474
+ for (let l = max; l >= minOdd; l--) {
475
+ for (let i = 0; i < order.length; ) {
476
+ if (order[i].level < l) {
477
+ i++;
478
+ continue;
479
+ }
480
+ let j = i;
481
+ while (j < order.length && order[j].level >= l) j++;
482
+ const rev = order.slice(i, j).reverse();
483
+ order.splice(i, j - i, ...rev);
484
+ i = j;
485
+ }
486
+ }
487
+ let x = 0;
488
+ for (const o of order) {
489
+ o.r.x = x;
490
+ x += o.r.w;
491
+ }
492
+ const out = { w: x, rtl, runs: order.map((o) => o.r) };
493
+ if (this.cache.size > 2e4) this.cache.clear();
494
+ this.cache.set(ck, out);
495
+ return out;
496
+ }
497
+ /** One run at size 1: HarfBuzz for complex scripts and right-to-left text, else character-map glyphs. @returns {Run} */
498
+ shapeRun(text, key, rtl, script) {
499
+ const complex = !SIMPLE.has(script);
500
+ const store = this.store;
501
+ const glyphs = [];
502
+ let pen = 0;
503
+ if ((complex || rtl) && store.shaper) {
504
+ const hf = store.hbFont(key);
505
+ const g = store.shaper.shape(hf, text, rtl, !complex);
506
+ for (let i = 0; i < g.length; i += 5) {
507
+ glyphs.push(g[i], (pen + g[i + 2]) / hf.upem, g[i + 3] / hf.upem, g[i + 4]);
508
+ pen += g[i + 1];
509
+ }
510
+ return { font: key, x: 0, w: pen / hf.upem, text, ...rtl ? { rtl } : {}, ...complex ? { shaped: true } : {}, glyphs };
511
+ }
512
+ if ((complex || rtl) && !store.failed.has(SHAPER)) this.missing.add(SHAPER);
513
+ else if (complex || rtl) this.unshaped = true;
514
+ const f = store.get(key);
515
+ const list = [];
516
+ for (let i = 0; i < text.length; ) {
517
+ const cp = (
518
+ /** @type {number} */
519
+ text.codePointAt(i)
520
+ );
521
+ const g = f.glyphForCodePoint(cp);
522
+ list.push([g.id, g.advanceWidth || 0, i]);
523
+ i += cp > 65535 ? 2 : 1;
524
+ }
525
+ if (rtl) list.reverse();
526
+ for (const [id, a, c] of list) {
527
+ glyphs.push(id, pen / f.unitsPerEm, 0, c);
528
+ pen += a;
529
+ }
530
+ return { font: key, x: 0, w: pen / f.unitsPerEm, text, ...rtl ? { rtl } : {}, glyphs };
531
+ }
532
+ };
533
+ function finishText(items, m) {
534
+ for (const it of items) {
535
+ if (it.t === "field") {
536
+ finishText(it.draw, m);
537
+ continue;
538
+ }
539
+ if (it.t !== "text") continue;
540
+ it.font = m.usable(it.font);
541
+ for (const l of it.lines) {
542
+ const r = m.runs(l.text, it.font, it.size, l.dir);
543
+ if (r) l.runs = r;
544
+ }
545
+ }
546
+ }
547
+
548
+ export {
549
+ FORMAT_CHAR,
550
+ TextMeasurer,
551
+ finishText
552
+ };
553
+ //# sourceMappingURL=chunk-ULKEEARQ.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/engine/text/measure.js"],
4
+ "mappings": ";;;;;;;;;;AAaA,OAAO,iBAAiB;AAGxB,IAAM,OAAO,YAAY;AAGzB,SAAS,QAAQ,IAAI;AACnB,MAAI,KAAK,KAAQ,QAAO;AACxB,MAAI,MAAM,KAAQ,QAAO;AACzB,MAAI,MAAM,QAAU,MAAM,KAAQ,QAAQ,MAAM,QAAU,MAAM,QAAY,MAAM,QAAU,MAAM,QAAW,MAAM;AACnH,SAAQ,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SAC5F,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SAC1F,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SAAW,MAAM;AACnH;AAEO,IAAM,cAAc;AAE3B,IAAM,MAAM,CAAC,OAAQ,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SAAY,MAAM,SAAU,MAAM,SACzG,MAAM,SAAU,MAAM,SAAY,MAAM,UAAW,MAAM;AAE/D,IAAM,WAAW,IAAI,IAAI,mGAAmG;AAC5H,IAAM,SAAS,IAAI,IAAI,wBAAwB;AAE/C,IAAM,QAAQ;AACd,IAAM,kBAAkB;AAExB,IAAM,UAAU;AAAA,EAAC;AAAA,EAAS;AAAA,EAAS;AAAA,EAAY;AAAA,EAAY;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAc;AAAA,EAAW;AAAA,EAC1H;AAAA,EAAY;AAAA,EAAS;AAAA,EAAS;AAAA,EAAU;AAAA,EAAW;AAAA,EAAa;AAAA,EAAW;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAW;AAAA,EAAW;AAAA,EAAY;AAAA,EAC5H;AAAA,EAAY;AAAA,EAAS;AAAA,EAAa;AAAA,EAAO;AAAA,EAAY;AAAA,EAAY;AAAU,EAAE,IAAI;AAAA;AAAA,EAAsC,CAAC,GAAG,IAAI,OAAO,cAAc,CAAC,KAAK,GAAG,CAAC;AAAA,CAAE;AAElK,IAAM,SAAS,oBAAI,IAAI,CAAC,SAAS,SAAS,YAAY,YAAY,YAAY,UAAU,OAAO,YAAY,YAAY,YAAY,QAAQ,CAAC;AAC5I,IAAM,SAAS;AACf,IAAM,QAAQ;AAEd,IAAM,cAAc,oBAAI,IAAI;AAC5B,SAAS,SAAS,IAAI;AACpB,MAAI,IAAI,YAAY,IAAI,EAAE;AAC1B,MAAI,MAAM,QAAW;AACnB,UAAM,KAAK,OAAO,cAAc,EAAE;AAClC,QAAI;AACJ,eAAW,CAAC,MAAM,EAAE,KAAK,QAAS,KAAI,GAAG,KAAK,EAAE,GAAG;AAAE,UAAI;AAAM;AAAA,IAAO;AACtE,QAAI,YAAY,QAAQ,IAAO,aAAY,MAAM;AACjD,gBAAY,IAAI,IAAI,CAAC;AAAA,EACvB;AACA,SAAO;AACT;AACA,IAAM,OAAO,OAAO,SAAS,eAAe,OAAO,KAAK,cAAc;AACtE,IAAM,YAAY,OAAO,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,WAAW,CAAC,IAAI;AACtF,IAAM,QAAQ;AAMP,SAAS,SAAS,GAAG,OAAO,MAAM;AACvC,MAAI,QAAQ,UAAW,QAAO,CAAC,GAAG,UAAU,QAAQ,CAAC,CAAC,EAAE,IAAI,OAAK,EAAE,OAAO;AAE1E,QAAM,MAAM,CAAC;AACb,aAAW,MAAM,GAAG;AAClB,QAAI,IAAI,WAAW,MAAM,KAAK,EAAE,KAAK,IAAI,IAAI,SAAS,CAAC,EAAE,SAAS,GAAQ,GAAI,KAAI,IAAI,SAAS,CAAC,KAAK;AAAA,QAChG,KAAI,KAAK,EAAE;AAAA,EAClB;AACA,SAAO;AACT;AACA,IAAM,YAAY,CAAuB,MAAM,SAAS,CAAC;AAGzD,IAAM,KAAK;AACX,IAAM,QAAQ,OAAO,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,OAAO,CAAC,IAAI;AASvE,SAAS,SAAS,MAAM,YAAY,OAAO;AAChD,QAAM,MAAM,oBAAI,IAAI;AACpB,MAAI,CAAC,UAAW,QAAO;AACvB,aAAW,EAAE,MAAM,KAAK,UAAU,QAAQ,IAAI,GAAG;AAC/C,QAAI,QAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,GAAI,KAAI,IAAI,KAAK;AAAA,EACpF;AACA,SAAO;AACT;AAQO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAExB,YAAY,OAAO;AACjB,SAAK,QAAQ;AAEb,SAAK,QAAQ,oBAAI,IAAI;AAErB,SAAK,QAAQ,oBAAI,QAAQ;AACzB,SAAK,WAAW;AAEhB,SAAK,QAAQ,oBAAI,QAAQ;AAEzB,SAAK,QAAQ,oBAAI,IAAI;AAErB,SAAK,QAAQ,oBAAI,IAAI;AAErB,SAAK,UAAU,oBAAI,IAAI;AAEvB,SAAK,UAAU,oBAAI,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAAK;AACV,QAAI,KAAK,MAAM,IAAI,GAAG,EAAG,QAAO;AAChC,QAAI,CAAC,KAAK,MAAM,OAAO,IAAI,GAAG,EAAG,MAAK,QAAQ,IAAI,GAAG;AACrD,UAAM,IAAI,QAAQ,GAAG;AACrB,UAAM,OAAO,eAAe,gBAAgB,EAAE,QAAQ,EAAE,KAAK;AAC7D,WAAO,KAAK,MAAM,IAAI,IAAI,IAAI,OAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,KAAK;AACR,QAAI,IAAI,KAAK,MAAM,IAAI,GAAG;AAC1B,QAAI,CAAC,GAAG;AACN,YAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,UAAI,EAAE,MAAM,KAAK,KAAK,YAAY,QAAQ,KAAK,QAAQ,SAAS,KAAK,SAAS,KAAK,oBAAI,IAAI,GAAG,OAAO,oBAAI,IAAI,GAAG,KAAK,oBAAI,IAAI,EAAE;AAC/H,WAAK,MAAM,IAAI,KAAK,CAAC;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,MAAM,KAAK;AACd,UAAM,IAAI,KAAK,KAAK,GAAG;AACvB,UAAM,MAAM,EAAE,MAAM,IAAI,IAAI;AAC5B,QAAI,QAAQ,OAAW,QAAO;AAC9B,UAAM,IAAI,EAAE,KAAK,OAAO,EAAE;AAC1B,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAI,KAAK,KAAK,WAAW,CAAC;AAC1B,UAAI,MAAM,SAAU,MAAM,OAAQ;AAChC,cAAM,KAAK,KAAK,WAAW,IAAI,CAAC;AAChC,YAAI,MAAM,SAAU,MAAM,OAAQ;AAAE,gBAAM,KAAK,SAAU,OAAQ,KAAK,QAAS;AAAS;AAAA,QAAK;AAAA,MAC/F;AACA,UAAI,IAAI,EAAE,IAAI,EAAE;AAChB,UAAI,MAAM,QAAW;AACnB,YAAI,QAAQ,EAAE,KAAM,MAAM,MAAQ,CAAC,KAAK,qBAAqB,EAAE,IAAK,KAAK,KAAK,kBAAkB,EAAE,EAAE,gBAAgB;AACpH,UAAE,IAAI,IAAI,CAAC;AAAA,MACb;AACA,UAAI,IAAI,GAAG;AAAE,gBAAQ;AAAI;AAAA,MAAO;AAChC,eAAS;AAAA,IACX;AAEA,QAAI,KAAK,UAAU,KAAK;AACtB,UAAI,EAAE,MAAM,QAAQ,IAAO,GAAE,MAAM,MAAM;AACzC,QAAE,MAAM,IAAI,MAAM,KAAK;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,KAAK,MAAM,KAAK;AAC1B,UAAM,IAAI,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM,KAAK,OAAO,GAAG;AACrD,UAAM,IAAI,KAAK,KAAK,MAAM,CAAC;AAC3B,QAAI,KAAK,EAAG,QAAQ,IAAI,OAAQ,KAAK,KAAK,CAAC,EAAE;AAC7C,WAAO,KAAK,OAAO,MAAM,GAAG,GAAG,EAAE,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,KAAK,MAAM;AACpB,UAAM,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,GAAG,CAAC;AACzC,UAAM,IAAI,EAAE,YAAY,MAAM,EAAE,MAAM,KAAK,CAAC;AAC5C,UAAM,KAAK,EAAE,qBAAqB,IAAI,EAAE,qBAAqB,IAAI;AACjE,UAAM,KAAK,EAAE,oBAAoB,IAAI,EAAE,oBAAoB,EAAE,UAAU;AACvE,UAAM,KAAK,IAAI,iBAAiB,IAAI,IAAI,iBAAiB;AACzD,UAAM,KAAK,IAAI,qBAAqB,IAAI,IAAI,sBAAsB,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,SAAS,OAAO,IAAI,KAAK;AACzH,UAAM,IAAI,OAAO;AACjB,WAAO,EAAE,YAAY,EAAE,KAAK,KAAK,KAAK,GAAG,gBAAgB,KAAK,GAAG,SAAS,EAAE,KAAK,KAAK,KAAK,GAAG,aAAa,KAAK,EAAE;AAAA,EACpH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAAK;AACV,UAAM,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,GAAG,CAAC;AACzC,UAAM,IAAI,EAAE,YAAY,IAAI,EAAE,MAAM,KAAK,CAAC;AAC1C,UAAM,OAAO,CAAC,GAAG,MAAO,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI;AACrD,WAAO,EAAE,UAAU,KAAK,EAAE,mBAAmB,IAAI,GAAG,SAAS,KAAK,EAAE,qBAAqB,IAAI,GAAG,UAAU,KAAK,EAAE,iBAAiB,IAAI,GAAG,SAAS,KAAK,EAAE,mBAAmB,IAAI,EAAE;AAAA,EACpL;AAAA;AAAA,EAGA,QAAQ,KAAK,MAAM;AACjB,UAAM,IAAI,KAAK,KAAK,KAAK,OAAO,GAAG,CAAC;AACpC,QAAI,IAAI,EAAE,IAAI,IAAI,IAAI;AACtB,QAAI,CAAC,GAAG;AAAE,UAAI,OAAO,OAAO,EAAE,QAAS,EAAE,SAAS,OAAQ,EAAE,KAAK,SAAU,CAAC,EAAE,UAAU,OAAQ,EAAE,IAAI,CAAC;AAAG,QAAE,IAAI,IAAI,MAAM,CAAC;AAAA,IAAG;AAC9H,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,MAAM,KAAK,MAAM,KAAK;AACzB,QAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,EAAG,QAAO;AACtC,UAAM,IAAI,KAAK,OAAO,GAAG;AACzB,QAAI,KAAK,KAAK,MAAM,CAAC,KAAK,EAAG,QAAO;AACpC,WAAO,KAAK,OAAO,MAAM,GAAG,GAAG,EAAE,KAAK,IAAI,QAAM;AAAA,MAC9C,GAAG;AAAA,MAAG,GAAG,EAAE,IAAI;AAAA,MAAM,GAAG,EAAE,IAAI;AAAA,MAC9B,QAAQ,EAAE,OAAO,IAAI,CAAC,GAAG,MAAO,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,OAAO,CAAE;AAAA,IAC5E,EAAE;AAAA,EACJ;AAAA;AAAA,EAGA,UAAU,MAAM,KAAK;AACnB,QAAI,CAAC,MAAM,KAAK,IAAI,EAAG,QAAO;AAC9B,UAAM,IAAI,KAAK,OAAO,GAAG;AACzB,QAAI,KAAK,KAAK,MAAM,CAAC,KAAK,EAAG,QAAO;AACpC,WAAO,KAAK,OAAO,MAAM,GAAG,MAAS,EAAE,MAAM,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,MAAM,KAAK,MAAM,UAAU;AAC9B,UAAM,MAAM,CAAC;AACb,UAAM,IAAI,KAAK,OAAO,GAAG;AACzB,UAAM,KAAK,KAAK,MAAM,KAAK,GAAG,IAAI;AAClC,UAAM,MAAM,OAAO,IAAI;AACvB,eAAW,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,MAAM,OAAO,IAAI,CAAC,GAAG,GAAG;AAClE,YAAM,MAAM,KAAK,UAAU,MAAM,CAAC;AAClC,UAAI,KAAK;AAAE,aAAK,YAAY,MAAM,GAAG,MAAM,UAAU,KAAK,IAAI,GAAG;AAAG;AAAA,MAAU;AAC9E,UAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,cAAM,KAAK,KAAK,MAAM,MAAM,GAAG,IAAI;AACnC,YAAI,MAAM,YAAY,YAAY,GAAG;AAAE,cAAI,KAAK,EAAE,MAAM,MAAM,OAAO,IAAI,KAAK,KAAK,CAAC;AAAG;AAAA,QAAU;AAAA,MACnG;AACA,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAI,OAAO,IAAI,KAAK;AACpB,YAAM,OAAO,MAAM;AAAE,YAAI,KAAK,EAAE,MAAM,MAAM,OAAO,GAAG,CAAC;AAAG,eAAO;AAAI,aAAK;AAAA,MAAG;AAC7E,eAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM;AACxC,cAAM,IAAI,MAAM,EAAE;AAClB,YAAI,MAAM,MAAM,KAAK,EAAG;AACxB,cAAM,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI;AAChC,YAAI,SAAS,IAAI;AACf,cAAI,MAAM,YAAY,YAAY,GAAG;AAAE,mBAAO;AAAG,iBAAK;AAAI;AAAA,UAAU;AAAA,QACtE,WAAW,KAAK,KAAK,MAAM,UAAU;AAAE,kBAAQ,MAAM;AAAG,gBAAM,KAAK;AAAI;AAAA,QAAU,OAC5E;AACH,eAAK;AACL,cAAI,MAAM,UAAU;AAAE,mBAAO;AAAG,iBAAK;AAAI;AAAA,UAAU;AAAA,QACrD;AAGA,YAAI,QAAQ;AACZ,mBAAW,MAAM,GAAG;AAClB,gBAAM,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI;AACjC,cAAI,KAAK,KAAK,YAAY,SAAS,IAAI;AACrC,gBAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ;AACpC,oBAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,qBAAO,KAAK,MAAM,GAAG,KAAK;AAAG,mBAAK,KAAK,MAAM,MAAM,GAAG,IAAI;AAC1D,mBAAK;AACL,qBAAO;AAAM,mBAAK,KAAK,MAAM,MAAM,GAAG,IAAI;AAAA,YAC5C,MAAO,MAAK;AACZ,oBAAQ;AAAA,UACV;AACA,kBAAQ;AAAI,gBAAM;AAClB,eAAK,OAAO,OAAO,OAAO,QAAQ,KAAK,SAAS,EAAG,SAAQ,KAAK;AAAA,QAClE;AAAA,MACF;AACA,WAAK;AACL,UAAI,IAAI,SAAS,CAAC,EAAE,MAAM;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,YAAY,MAAM,KAAK,MAAM,UAAU,KAAK,IAAI,KAAK;AAInD,UAAM,SAAS,CAAC;AAChB,UAAM,KAAK,GAAG,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI;AAC5C,QAAI,MAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,KAAK;AAC7C,eAAW,MAAM,MAAM;AACrB,YAAM,IAAI;AACV,YAAM,GAAG;AACT,UAAI,OAAO,KAAK;AAAE,YAAI,KAAK;AAAE,iBAAO,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAAG,gBAAM;AAAA,QAAI;AAAE,gBAAQ,OAAO,SAAS;AAAG,eAAO;AAAI;AAAA,MAAU;AAC5H,YAAM;AAAA;AAAA,QAA4B,GAAG,YAAY,CAAC;AAAA;AAClD,YAAM,MAAM;AAAA;AAAA,QAA8B,KAAK,YAAY,CAAC;AAAA,UAAK;AACjE,UAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,IAAI;AAAE,eAAO,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAAG,cAAM;AAAI,gBAAQ;AAAA,MAAO;AAC9K,aAAO;AAAI,aAAO;AAAA,IACpB;AACA,QAAI,IAAK,QAAO,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AACzC,QAAI,OAAO,IAAI,KAAK;AACpB,UAAM,OAAO,MAAM;AAAE,UAAI,KAAK,EAAE,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,IAAI,CAAC;AAAG,aAAO;AAAI,WAAK;AAAA,IAAG;AAChH,eAAW,KAAK,QAAQ;AACtB,YAAM,KAAK,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG;AAC5C,YAAM,MAAM,QAAQ,EAAE,QAAQ,KAAK;AACnC,UAAI,SAAS,KAAK,MAAM,YAAY,YAAY,IAAI,KAAK,MAAM,MAAM,UAAU;AAC7E,iBAAS,QAAQ,EAAE,QAAQ,MAAM,MAAM,EAAE;AAAM,cAAM,MAAM;AAAI;AAAA,MACjE;AACA,UAAI,KAAM,MAAK;AACf,UAAI,MAAM,UAAU;AAAE,eAAO,EAAE;AAAM,aAAK;AAAI;AAAA,MAAU;AACxD,iBAAW,KAAK,UAAU,EAAE,IAAI,GAAG;AACjC,cAAM,KAAK,KAAK,MAAM,GAAG,KAAK,MAAM,GAAG;AACvC,YAAI,KAAK,KAAK,YAAY,SAAS,GAAI,MAAK;AAC5C,gBAAQ;AAAG,cAAM;AAAA,MACnB;AAAA,IACF;AACA,SAAK;AAAA,EACP;AAAA;AAAA,EAGA,UAAU,MAAM,KAAK,MAAM,UAAU,KAAK;AACxC,UAAM,MAAM;AACZ,QAAI,KAAK,MAAM,MAAM,KAAK,MAAM,GAAG,KAAK,SAAU,QAAO;AACzD,UAAM,KAAK,KAAK,MAAM,KAAK,KAAK,IAAI;AACpC,QAAI,KAAK,UAAU,MAAM,GAAG,GAAG;AAC7B,YAAM,KAAK,UAAU,IAAI;AACzB,aAAO,GAAG,UAAU,KAAK,MAAM,GAAG,KAAK,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,KAAK,SAAU,IAAG,IAAI;AACpF,aAAO,GAAG,KAAK,EAAE,EAAE,QAAQ,IAAI;AAAA,IACjC;AACA,QAAI,IAAI;AACR,WAAO,EAAE,UAAU,KAAK,MAAM,GAAG,KAAK,IAAI,IAAI,KAAK,SAAU,KAAI,EAAE,MAAM,GAAG,EAAE;AAC9E,WAAO,EAAE,QAAQ,IAAI;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,KAAK,IAAI;AACX,QAAI,IAAI,KAAK,MAAM,IAAI,GAAG;AAC1B,QAAI,CAAC,GAAG;AAAE,UAAI,oBAAI,IAAI;AAAG,WAAK,MAAM,IAAI,KAAK,CAAC;AAAA,IAAG;AACjD,QAAI,IAAI,EAAE,IAAI,EAAE;AAChB,QAAI,MAAM,QAAW;AAAE,UAAI,CAAC,CAAC,KAAK,MAAM,IAAI,GAAG,EAAE,qBAAqB,EAAE;AAAG,QAAE,IAAI,IAAI,CAAC;AAAA,IAAG;AACzF,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,IAAI,KAAK,MAAM;AAElB,QAAI,KAAK,MAAQ,KAAK,IAAI,KAAK,EAAE,KAAK,YAAY,KAAK,OAAO,cAAc,EAAE,CAAC,EAAG,QAAO;AACzF,UAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,QAAI,MAAM,CAAC,KAAK,MAAM,OAAO,IAAI,EAAE,GAAG;AACpC,UAAI,CAAC,KAAK,MAAM,IAAI,EAAE,GAAG;AAAE,aAAK,QAAQ,IAAI,EAAE;AAAG,eAAO;AAAA,MAAK;AAC7D,UAAI,KAAK,IAAI,IAAI,EAAE,EAAG,QAAO;AAAA,IAC/B;AACA,QAAI,QAAQ,SAAS,OAAO,KAAK,IAAI,MAAM,EAAE,EAAG,QAAO;AACvD,QAAI,CAAC,KAAK,QAAQ,KAAM,MAAK,QAAQ,IAAI,OAAO,cAAc,EAAE,CAAC;AACjE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAM,KAAK,KAAK;AACrB,UAAM,KAAK,GAAG,GAAG,IAAS,OAAO,EAAE,IAAS,IAAI;AAChD,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,QAAI,IAAK,QAAO;AAChB,QAAI,SAAS,MAAM,MAAM,QAAQ;AACjC,QAAI,QAAQ,SAAS,gBAAgB,KAAK,IAAI,GAAG;AAC/C,YAAM,IAAI,KAAK,mBAAmB,MAAM,GAAG;AAC3C,eAAS,EAAE;AACX,cAAQ,EAAE,WAAW,CAAC,GAAG,SAAS,KAAK,OAAO;AAAA,IAChD;AAEA,UAAM,OAAO,CAAC;AACd,QAAI,MAAM,MAAM,WAAW;AAC3B,aAAS,IAAI,GAAG,IAAI,KAAK,UAAS;AAChC,YAAM;AAAA;AAAA,QAA4B,KAAK,YAAY,CAAC;AAAA;AACpD,YAAM,IAAI,KAAK,QAAS,IAAI;AAC5B,YAAM,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC;AAC9B,YAAM,OAAO,OAAO,KAAK,EAAE,KAAK,WAAW,WAAW,KAAK,KAAK,IAAI,KAAK,QAAQ;AACjF,YAAM,QAAQ,SAAS,OAAO,CAAC,IAAI;AACnC,YAAM,KAAK,MAAM,KAAK,EAAE;AACxB,YAAM,SAAS,SAAS,EAAE;AAC1B,UAAI,CAAC,OAAO,SAAS,IAAI,QAAQ,UAAU,IAAI,SAAS,OAAO,IAAI,MAAO,WAAW,YAAY,IAAI,WAAW,YAAY,WAAW,IAAI,QAAS;AAClJ,cAAM,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,MAAM,OAAO,QAAQ,GAAG;AACtD,aAAK,KAAK,GAAG;AAAA,MACf,OAAO;AACL,YAAI,MAAM,IAAI;AACd,YAAI,IAAI,WAAW,SAAU,KAAI,SAAS;AAAA,MAC5C;AACA,iBAAW;AACX,WAAK;AAAA,IACP;AACA,UAAM,OAAO,KAAK,IAAI,OAAK,KAAK,SAAS,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,OAAO,GAAG,EAAE,MAAM,CAAC;AAE3G,UAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,KAAK,CAAC,EAAE,MAAM,EAAE;AAC9D,QAAI,MAAM,GAAG,SAAS;AACtB,eAAW,KAAK,OAAO;AAAE,YAAM,KAAK,IAAI,KAAK,EAAE,KAAK;AAAG,UAAI,EAAE,QAAQ,EAAG,UAAS,KAAK,IAAI,QAAQ,EAAE,KAAK;AAAA,IAAG;AAC5G,aAAS,IAAI,KAAK,KAAK,QAAQ,KAAK;AAClC,eAAS,IAAI,GAAG,IAAI,MAAM,UAAS;AACjC,YAAI,MAAM,CAAC,EAAE,QAAQ,GAAG;AAAE;AAAK;AAAA,QAAU;AACzC,YAAI,IAAI;AACR,eAAO,IAAI,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAG;AAChD,cAAM,MAAM,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ;AACtC,cAAM,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG;AAC7B,YAAI;AAAA,MACN;AAAA,IACF;AACA,QAAI,IAAI;AACR,eAAW,KAAK,OAAO;AAAE,QAAE,EAAE,IAAI;AAAG,WAAK,EAAE,EAAE;AAAA,IAAG;AAChD,UAAM,MAAM,EAAE,GAAG,GAAG,KAAK,MAAM,MAAM,IAAI,OAAK,EAAE,CAAC,EAAE;AACnD,QAAI,KAAK,MAAM,OAAO,IAAO,MAAK,MAAM,MAAM;AAC9C,SAAK,MAAM,IAAI,IAAI,GAAG;AACtB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAM,UAAU,CAAC,OAAO,IAAI,MAAM;AAClC,UAAM,QAAQ,KAAK;AAEnB,UAAM,SAAS,CAAC;AAChB,QAAI,MAAM;AACV,SAAK,WAAW,QAAQ,MAAM,QAAQ;AACpC,YAAM,KAAK,MAAM,OAAO,GAAG;AAC3B,YAAM,IAAI,MAAM,OAAO,MAAM,IAAI,MAAM,KAAK,CAAC,OAAO;AACpD,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AACpC,eAAO,KAAK,EAAE,CAAC,IAAI,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1E,eAAO,EAAE,IAAI,CAAC;AAAA,MAChB;AACA,aAAO,EAAE,MAAM,KAAK,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,MAAM,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC,GAAI,GAAI,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAI,OAAO;AAAA,IAC1H;AACA,SAAK,WAAW,QAAQ,CAAC,MAAM,OAAO,IAAI,MAAM,EAAG,MAAK,QAAQ,IAAI,MAAM;AAAA,aACjE,WAAW,IAAK,MAAK,WAAW;AACzC,UAAM,IAAI,MAAM,IAAI,GAAG;AACvB,UAAM,OAAO,CAAC;AACd,aAAS,IAAI,GAAG,IAAI,KAAK,UAAS;AAChC,YAAM;AAAA;AAAA,QAA4B,KAAK,YAAY,CAAC;AAAA;AACpD,YAAM,IAAI,EAAE,kBAAkB,EAAE;AAChC,WAAK,KAAK,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,CAAC,CAAC;AACxC,WAAK,KAAK,QAAS,IAAI;AAAA,IACzB;AACA,QAAI,IAAK,MAAK,QAAQ;AACtB,eAAW,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM;AAAE,aAAO,KAAK,IAAI,MAAM,EAAE,YAAY,GAAG,CAAC;AAAG,aAAO;AAAA,IAAG;AACtF,WAAO,EAAE,MAAM,KAAK,GAAG,GAAG,GAAG,MAAM,EAAE,YAAY,MAAM,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC,GAAI,OAAO;AAAA,EACzF;AACF;AAOO,SAAS,WAAW,OAAO,GAAG;AACnC,aAAW,MAAM,OAAO;AACtB,QAAI,GAAG,MAAM,SAAS;AAAE,iBAAW,GAAG,MAAM,CAAC;AAAG;AAAA,IAAU;AAC1D,QAAI,GAAG,MAAM,OAAQ;AACrB,OAAG,OAAO,EAAE,OAAO,GAAG,IAAI;AAC1B,eAAW,KAAK,GAAG,OAAO;AACxB,YAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG;AAChD,UAAI,EAAG,GAAE,OAAO;AAAA,IAClB;AAAA,EACF;AACF;",
5
+ "names": []
6
+ }