bobe-dom 0.0.58 → 0.0.59

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.
@@ -2,22 +2,25 @@
2
2
 
3
3
  var bobe = require('bobe');
4
4
 
5
- const BOOLEAN_ATTRS = new Set(['disabled', 'readonly', 'checked', 'selected', 'hidden', 'multiple', 'required', 'autofocus', 'autoplay', 'controls', 'loop', 'muted', 'defer', 'async', 'reversed', 'open', 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default']);
5
+ const BOOLEAN_ATTRS$1 = new Set(['disabled', 'readonly', 'checked', 'selected', 'hidden', 'multiple', 'required', 'autofocus', 'autoplay', 'controls', 'loop', 'muted', 'defer', 'async', 'reversed', 'open', 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default']);
6
6
  const VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);
7
7
  const SVG_NS = 'http://www.w3.org/2000/svg';
8
8
  const MATH_NS = 'http://www.w3.org/1998/Math/MathML';
9
9
  const SVG_TAGS = new Set(['svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath', 'tspan', 'use', 'view']);
10
10
  const MATH_TAGS = new Set(['math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'semantics', 'annotation', 'annotation-xml']);
11
11
  const isNS = el => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;
12
- const createNode = name => {
12
+ const createNode$1 = name => {
13
13
  if (name === 'text') return document.createTextNode('');
14
14
  if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);
15
15
  if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);
16
16
  return document.createElement(name);
17
17
  };
18
- const setProp = (node, key, value) => {
18
+ const CONTENT_FLAG = Symbol('hasContent');
19
+ const setProp$1 = (node, key, value) => {
19
20
  const el = node;
20
21
  if (key === 'text') {
22
+ node[CONTENT_FLAG] = value != null;
23
+ if (value == null) return;
21
24
  node.textContent = value;
22
25
  return;
23
26
  }
@@ -57,10 +60,12 @@ const setProp = (node, key, value) => {
57
60
  return;
58
61
  }
59
62
  if (key === 'html') {
60
- node.innerHTML = value == null ? '' : String(value);
63
+ node[CONTENT_FLAG] = value != null;
64
+ if (value == null) return;
65
+ node.innerHTML = String(value);
61
66
  return;
62
67
  }
63
- if (BOOLEAN_ATTRS.has(key)) {
68
+ if (BOOLEAN_ATTRS$1.has(key)) {
64
69
  if (value === false || value === null || value === undefined) {
65
70
  el.removeAttribute(key);
66
71
  } else {
@@ -96,32 +101,407 @@ const setProp = (node, key, value) => {
96
101
  el.setAttribute(key, String(value));
97
102
  }
98
103
  };
99
- const insertAfter = (parent, node, prev) => {
104
+ const insertAfter$1 = (parent, node, prev) => {
100
105
  if (!prev) parent.insertBefore(node, parent.firstChild);else parent.insertBefore(node, prev.nextSibling);
101
106
  };
102
- const createAnchor = name => document.createComment(name);
103
- const remove = node => {
107
+ const createAnchor$1 = name => document.createComment(name);
108
+ const remove$1 = node => {
104
109
  node.remove();
105
110
  };
106
- const firstChild = node => node.firstChild;
107
- const nextSib = node => node.nextSibling;
111
+ const firstChild$1 = node => node.firstChild;
112
+ const nextSib$1 = node => node.nextSibling;
113
+ const beforeIndent$1 = node => {
114
+ if (node[CONTENT_FLAG]) {
115
+ const tag = node.tagName?.toLowerCase();
116
+ const hasText = node.textContent != null;
117
+ console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);
118
+ return false;
119
+ }
120
+ };
121
+ const leaveNode$1 = () => {};
122
+ const leaveLogicNode$1 = () => {};
108
123
  const render = bobe.customRender({
109
- createNode,
110
- setProp,
111
- insertAfter,
112
- createAnchor,
113
- remove,
114
- firstChild,
115
- nextSib
124
+ createNode: createNode$1,
125
+ setProp: setProp$1,
126
+ insertAfter: insertAfter$1,
127
+ createAnchor: createAnchor$1,
128
+ remove: remove$1,
129
+ firstChild: firstChild$1,
130
+ nextSib: nextSib$1,
131
+ beforeIndent: beforeIndent$1,
132
+ leaveNode: leaveNode$1,
133
+ leaveLogicNode: leaveLogicNode$1
134
+ });
135
+
136
+ let ctx = {
137
+ root: null,
138
+ current: null
139
+ };
140
+ const cleanCtx = () => Object.keys(ctx).forEach(key => {
141
+ ctx[key] = null;
116
142
  });
117
143
 
118
- exports.BOOLEAN_ATTRS = BOOLEAN_ATTRS;
119
- exports.createAnchor = createAnchor;
120
- exports.createNode = createNode;
121
- exports.firstChild = firstChild;
122
- exports.insertAfter = insertAfter;
123
- exports.nextSib = nextSib;
124
- exports.remove = remove;
144
+ class SSRNode {
145
+ parent = null;
146
+ firstChild = null;
147
+ lastChild = null;
148
+ nextSibling = null;
149
+ prevSibling = null;
150
+ closed = false;
151
+ startClosed = false;
152
+ _innerHtml = null;
153
+ }
154
+ let SSRNodeType = function (SSRNodeType) {
155
+ SSRNodeType[SSRNodeType["Element"] = 0] = "Element";
156
+ SSRNodeType[SSRNodeType["Text"] = 1] = "Text";
157
+ SSRNodeType[SSRNodeType["Anchor"] = 2] = "Anchor";
158
+ SSRNodeType[SSRNodeType["Root"] = 3] = "Root";
159
+ return SSRNodeType;
160
+ }({});
161
+ class Element extends SSRNode {
162
+ type = SSRNodeType.Element;
163
+ textContent = null;
164
+ attrs = {};
165
+ constructor(value, parent) {
166
+ super();
167
+ this.value = value;
168
+ this.parent = parent;
169
+ }
170
+ }
171
+ class Text extends SSRNode {
172
+ type = SSRNodeType.Text;
173
+ constructor(textContent, parent) {
174
+ super();
175
+ this.textContent = textContent;
176
+ this.parent = parent;
177
+ }
178
+ }
179
+ class Anchor extends SSRNode {
180
+ type = SSRNodeType.Anchor;
181
+ constructor(value, parent) {
182
+ super();
183
+ this.value = value;
184
+ this.parent = parent;
185
+ }
186
+ }
187
+ class Root extends SSRNode {
188
+ type = SSRNodeType.Root;
189
+ constructor(value, parent) {
190
+ super();
191
+ this.value = value;
192
+ this.parent = parent;
193
+ }
194
+ }
195
+
196
+ const VOID_TAGS = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);
197
+ const BOOLEAN_ATTRS = new Set(['disabled', 'readonly', 'checked', 'selected', 'hidden', 'multiple', 'required', 'autofocus', 'autoplay', 'controls', 'loop', 'muted', 'defer', 'async', 'reversed', 'open', 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default']);
198
+ const ATTR_RE = /[&"<>]/g;
199
+ const TEXT_RE = /[&<>]/g;
200
+ const ATTR_MAP = {
201
+ '&': '&amp;',
202
+ '"': '&quot;',
203
+ '<': '&lt;',
204
+ '>': '&gt;'
205
+ };
206
+ const TEXT_MAP = {
207
+ '&': '&amp;',
208
+ '<': '&lt;',
209
+ '>': '&gt;'
210
+ };
211
+ const escapeAttr = str => {
212
+ const s = String(str);
213
+ return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;
214
+ };
215
+ const escapeText = str => {
216
+ const s = String(str);
217
+ return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;
218
+ };
219
+ const createNode = name => {
220
+ if (name === 'text') {
221
+ return new Text('');
222
+ }
223
+ ctx.root.value += `<${name}`;
224
+ return new Element(name);
225
+ };
226
+ const setProp = (node, key, value) => {
227
+ if (node.startClosed) return;
228
+ if (key.startsWith('on') || key === 'ref') return;
229
+ if (key === 'text') {
230
+ if (value == null) return;
231
+ node.textContent = value;
232
+ return;
233
+ }
234
+ if (key === 'html') {
235
+ if (value == null) return;
236
+ node._innerHtml = String(value);
237
+ return;
238
+ }
239
+ if (key === 'class') {
240
+ if (value == null) return;
241
+ let classStr;
242
+ if (typeof value === 'object' && !Array.isArray(value)) {
243
+ classStr = Object.entries(value).filter(([, v]) => !!v).map(([k]) => k).join(' ');
244
+ } else {
245
+ classStr = typeof value === 'boolean' ? value ? 'true' : '' : String(value);
246
+ }
247
+ if (classStr) ctx.root.value += ` class="${escapeAttr(classStr)}"`;
248
+ return;
249
+ }
250
+ if (key === 'style') {
251
+ if (value == null) return;
252
+ ctx.root.value += ` style="${escapeAttr(String(value))}"`;
253
+ return;
254
+ }
255
+ if (BOOLEAN_ATTRS.has(key)) {
256
+ if (value !== false && value !== null && value !== undefined) {
257
+ ctx.root.value += ` ${key}`;
258
+ }
259
+ return;
260
+ }
261
+ if (key.startsWith('data-') || key.startsWith('aria-')) {
262
+ if (value == null) return;
263
+ ctx.root.value += ` ${key}="${escapeAttr(value)}"`;
264
+ return;
265
+ }
266
+ if (value == null) return;
267
+ ctx.root.value += ` ${key}="${escapeAttr(value)}"`;
268
+ };
269
+ const appendInnerContent = node => {
270
+ if (node._innerHtml != null) {
271
+ ctx.root.value += node._innerHtml;
272
+ return true;
273
+ }
274
+ if (node.textContent != null) {
275
+ ctx.root.value += escapeText(node.textContent);
276
+ return true;
277
+ }
278
+ return false;
279
+ };
280
+ const beforeIndent = node => {
281
+ if (node instanceof Text) return true;
282
+ const hasText = node.textContent != null;
283
+ const hasHtml = node._innerHtml != null;
284
+ if (VOID_TAGS.has(node.value)) {
285
+ ctx.root.value += `/>`;
286
+ console.warn(`<${node.value}> can't have children`);
287
+ node.startClosed = true;
288
+ node.closed = true;
289
+ return false;
290
+ }
291
+ if (hasText || hasHtml) {
292
+ console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);
293
+ ctx.root.value += `>`;
294
+ appendInnerContent(node);
295
+ ctx.root.value += `</${node.value}>`;
296
+ node.startClosed = true;
297
+ node.closed = true;
298
+ return false;
299
+ }
300
+ ctx.root.value += `>`;
301
+ node.startClosed = true;
302
+ return true;
303
+ };
304
+ const leaveLogicNode = node => {
305
+ const realAfter = node.realAfter;
306
+ ctx.root.value += `<!--${realAfter.value}-->`;
307
+ };
308
+ const leaveNode = (node, isDedent) => {
309
+ if (node.closed) return;
310
+ if (node instanceof Text) {
311
+ ctx.root.value += escapeText(node.textContent);
312
+ } else {
313
+ if (node.startClosed) {
314
+ if (VOID_TAGS.has(node.value)) ; else {
315
+ ctx.root.value += `</${node.value}>`;
316
+ }
317
+ } else {
318
+ if (VOID_TAGS.has(node.value)) {
319
+ ctx.root.value += ` />`;
320
+ } else {
321
+ ctx.root.value += `>`;
322
+ appendInnerContent(node);
323
+ ctx.root.value += `</${node.value}>`;
324
+ }
325
+ }
326
+ }
327
+ };
328
+ const insertAfter = (parent, node, prev) => {
329
+ const next = prev ? prev.nextSibling : parent.firstChild;
330
+ node.nextSibling = next;
331
+ node.prevSibling = prev;
332
+ if (prev) {
333
+ prev.nextSibling = node;
334
+ } else {
335
+ parent.firstChild = node;
336
+ }
337
+ if (next) {
338
+ next.prevSibling = node;
339
+ } else {
340
+ parent.lastChild = node;
341
+ }
342
+ node.parent = parent;
343
+ };
344
+ const createAnchor = (name, isBefore) => {
345
+ if (isBefore) {
346
+ ctx.root.value += `<!--${name}-->`;
347
+ }
348
+ return new Anchor(name);
349
+ };
350
+ const remove = node => {
351
+ const parent = node.parent,
352
+ prevSibling = node.prevSibling,
353
+ nextSibling = node.nextSibling;
354
+ if (prevSibling) {
355
+ prevSibling.nextSibling = nextSibling;
356
+ }
357
+ if (nextSibling) {
358
+ nextSibling.prevSibling = prevSibling;
359
+ }
360
+ if (parent) {
361
+ if (parent.firstChild === node) {
362
+ parent.firstChild = nextSibling;
363
+ }
364
+ if (parent.lastChild === node) {
365
+ parent.lastChild = prevSibling;
366
+ }
367
+ }
368
+ };
369
+ const firstChild = node => node.firstChild;
370
+ const nextSib = node => node.nextSibling;
371
+ const renderHtmlStr = ComponentClass => {
372
+ cleanCtx();
373
+ const root = new Root('');
374
+ ctx.root = ctx.current = root;
375
+ const render = bobe.customRender({
376
+ createNode,
377
+ setProp,
378
+ insertAfter,
379
+ createAnchor,
380
+ remove,
381
+ firstChild,
382
+ nextSib,
383
+ beforeIndent,
384
+ leaveNode,
385
+ leaveLogicNode,
386
+ noopEffect: true
387
+ });
388
+ render(ComponentClass, root);
389
+ return {
390
+ html: ctx.root.value
391
+ };
392
+ };
393
+
394
+ class TreeCursor {
395
+ claimed = new WeakSet();
396
+ constructor(container) {
397
+ this.parent = container;
398
+ }
399
+ enterChildren(node) {
400
+ this.parent = node;
401
+ }
402
+ leaveToParent(node) {
403
+ if (node === this.parent && this.parent.parentNode) {
404
+ this.parent = this.parent.parentNode;
405
+ }
406
+ }
407
+ findUnclaimed(predicate) {
408
+ let node = this.parent.firstChild;
409
+ while (node) {
410
+ if (!this.claimed.has(node) && predicate(node)) {
411
+ this.claimed.add(node);
412
+ return node;
413
+ }
414
+ node = node.nextSibling;
415
+ }
416
+ return null;
417
+ }
418
+ tryClaimElement(tagName) {
419
+ return this.findUnclaimed(node => node.nodeType === 1 && node.tagName.toLowerCase() === tagName);
420
+ }
421
+ tryClaimComment(name) {
422
+ return this.findUnclaimed(node => node.nodeType === 8 && node.data === name);
423
+ }
424
+ tryClaimText() {
425
+ return this.findUnclaimed(node => node.nodeType === 3 && !!node.textContent?.trim());
426
+ }
427
+ }
428
+ const hydrate = (ComponentClass, rootEl) => {
429
+ const container = rootEl.parentNode;
430
+ const cursor = new TreeCursor(container);
431
+ let isFirstRender = true;
432
+ const hydrateSetProp = (node, key, value) => {
433
+ if (isFirstRender && (key === 'text' || key === 'html')) {
434
+ node[CONTENT_FLAG] = value != null;
435
+ return;
436
+ }
437
+ return setProp$1(node, key, value);
438
+ };
439
+ const createNode = name => {
440
+ if (isFirstRender) {
441
+ const claimed = name === 'text' ? cursor.tryClaimText() : cursor.tryClaimElement(name);
442
+ if (claimed) return claimed;
443
+ }
444
+ return name === 'text' ? document.createTextNode('') : createNode$1(name);
445
+ };
446
+ const createAnchor = name => {
447
+ if (isFirstRender) {
448
+ const claimed = cursor.tryClaimComment(name);
449
+ if (claimed) return claimed;
450
+ }
451
+ return document.createComment(name);
452
+ };
453
+ const insertAfter = (parent, node, prev) => {
454
+ if (node === parent) return;
455
+ const expectedNext = prev ? prev.nextSibling : parent.firstChild;
456
+ if (node === expectedNext) return;
457
+ parent.insertBefore(node, expectedNext);
458
+ };
459
+ const beforeIndent = node => {
460
+ if (node[CONTENT_FLAG]) {
461
+ const tag = node.tagName?.toLowerCase();
462
+ const hasText = node.textContent != null;
463
+ console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);
464
+ return false;
465
+ }
466
+ if (isFirstRender) cursor.enterChildren(node);
467
+ };
468
+ const leaveNode = node => {
469
+ if (isFirstRender) cursor.leaveToParent(node);
470
+ };
471
+ const leaveLogicNode = node => {
472
+ if (isFirstRender) cursor.leaveToParent(node);
473
+ };
474
+ const render = bobe.customRender({
475
+ createNode,
476
+ setProp: hydrateSetProp,
477
+ insertAfter,
478
+ createAnchor,
479
+ remove: remove$1,
480
+ firstChild: firstChild$1,
481
+ nextSib: nextSib$1,
482
+ beforeIndent,
483
+ leaveNode,
484
+ leaveLogicNode,
485
+ onBeforeFlush: () => {
486
+ isFirstRender = false;
487
+ }
488
+ });
489
+ return render(ComponentClass, container);
490
+ };
491
+
492
+ exports.BOOLEAN_ATTRS = BOOLEAN_ATTRS$1;
493
+ exports.CONTENT_FLAG = CONTENT_FLAG;
494
+ exports.beforeIndent = beforeIndent$1;
495
+ exports.createAnchor = createAnchor$1;
496
+ exports.createNode = createNode$1;
497
+ exports.firstChild = firstChild$1;
498
+ exports.hydrate = hydrate;
499
+ exports.insertAfter = insertAfter$1;
500
+ exports.leaveLogicNode = leaveLogicNode$1;
501
+ exports.leaveNode = leaveNode$1;
502
+ exports.nextSib = nextSib$1;
503
+ exports.remove = remove$1;
125
504
  exports.render = render;
126
- exports.setProp = setProp;
505
+ exports.renderHtmlStr = renderHtmlStr;
506
+ exports.setProp = setProp$1;
127
507
  //# sourceMappingURL=bobe-dom.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-dom.cjs.js","sources":["../src/render.ts"],"sourcesContent":["import { customRender } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport const createNode = (name: string): Node => {\n if (name === 'text') return document.createTextNode('');\n if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);\n return document.createElement(name);\n};\n\nexport const setProp = (node: Node, key: string, value: any): (() => void) | undefined => {\n const el = node as HTMLElement;\n\n // 0. text\n if (key === 'text') {\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as Element).innerHTML = value == null ? '' : String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport const insertAfter = (parent: Node, node: Node, prev: Node | null) => {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport const createAnchor = (name: string) => document.createComment(name);\n\nexport const remove = (node: Node) => { (node as Element).remove(); };\n\nexport const firstChild = (node: Node) => node.firstChild;\n\nexport const nextSib = (node: Node) => node.nextSibling;\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib\n});\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","document","createTextNode","has","createElementNS","createElement","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","render","customRender"],"mappings":"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"}
1
+ {"version":3,"file":"bobe-dom.cjs.js","sources":["../src/render.ts","../src/global.ts","../src/type.ts","../src/render-html-str.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport const createNode = (name: string): Node => {\n if (name === 'text') return document.createTextNode('');\n if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);\n return document.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport const setProp = (node: Node, key: string, value: any): (() => void) | undefined => {\n const el = node as HTMLElement;\n\n // 0. text\n if (key === 'text') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n (node as Element).innerHTML = String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport const insertAfter = (parent: Node, node: Node, prev: Node | null) => {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport const createAnchor = (name: string) => document.createComment(name);\n\nexport const remove = (node: Node) => { (node as Element).remove(); };\n\nexport const firstChild = (node: Node) => node.firstChild;\n\nexport const nextSib = (node: Node) => node.nextSibling;\n\nexport const beforeIndent = (node: Node): boolean | void => {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);\n return false;\n }\n};\n\n// 浏览器渲染器中 leave 不需要额外操作(DOM 插入已由 insertAfter 完成)\nexport const leaveNode = () => {};\nexport const leaveLogicNode = () => {};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode\n});\n","import { SSRCtx } from './type';\nexport let ctx: SSRCtx = {\n root: null,\n current: null\n};\n\nexport const cleanCtx = () =>\n Object.keys(ctx).forEach(key => {\n ctx[key] = null;\n });\n","export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n","import { customRender, Store, LogicNode } from 'bobe';\nimport { cleanCtx, ctx } from './global';\nimport { Root, Element, Text, Anchor, SSRNode, SSRNodeType } from './type';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n if (name === 'text') {\n return new Text('');\n }\n ctx.root.value += `<${name}`;\n return new Element(name);\n};\n\nconst setProp = (node: Text | Element, key: string, value: any) => {\n if (node.startClosed) return;\n if (key.startsWith('on') || key === 'ref') return;\n\n // 0. text\n if (key === 'text') {\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. html\n if (key === 'html') {\n if (value == null) return;\n node._innerHtml = String(value);\n return;\n }\n\n // 2. class — 对齐 Browser:支持对象/字符串/null\n if (key === 'class') {\n if (value == null) return;\n let classStr: string;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n if (classStr) ctx.root.value += ` class=\"${escapeAttr(classStr)}\"`;\n return;\n }\n\n // 3. style — 对齐 Browser\n if (key === 'style') {\n if (value == null) return;\n ctx.root.value += ` style=\"${escapeAttr(String(value))}\"`;\n return;\n }\n\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n ctx.root.value += ` ${key}`;\n }\n return;\n }\n\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n return;\n }\n\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n};\n\nconst appendInnerContent = (node: Element) => {\n if (node._innerHtml != null) {\n ctx.root.value += node._innerHtml;\n return true;\n }\n if (node.textContent != null) {\n ctx.root.value += escapeText(node.textContent);\n return true;\n }\n return false;\n};\n\nconst beforeIndent = (node: Text | Element): boolean => {\n if (node instanceof Text) return true;\n\n const hasText = node.textContent != null;\n const hasHtml = node._innerHtml != null;\n\n // 不能包含内容的元素\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += `/>`;\n console.warn(`<${node.value}> can't have children`);\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n if (hasText || hasHtml) {\n console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);\n ctx.root.value += `>`;\n // 容器元素有 text/html 内容且检测到子节点冲突,立即闭合;与 leaveNode 叶元素路径互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n ctx.root.value += `>`;\n node.startClosed = true;\n return true;\n};\n\nconst leaveLogicNode = (node: LogicNode) => {\n const realAfter = node.realAfter as Anchor;\n ctx.root.value += `<!--${realAfter.value}-->`;\n};\nconst leaveNode = (node: Text | Element, isDedent: boolean) => {\n /**\n * indent 提前 closed 就退出,这两种都是有缩进的\n * 1. 元素属于 VOID_TAGS\n * 2. 元素 text/html 属性与 children 冲突,采用 text/html\n */\n if (node.closed) return;\n if (node instanceof Text) {\n ctx.root.value += escapeText(node.textContent);\n } else {\n // 如果现在是 \"<div>\" 状态,添加 />\n if (node.startClosed) {\n // 什么都不做,正常永远都不会进入,因为 beforeIndent 会直接加 /> 设置 closed = true\n if (VOID_TAGS.has(node.value)) {\n } else {\n ctx.root.value += `</${node.value}>`;\n }\n }\n // 无 startClosed, 叶子节点\n else {\n // 直接自闭合\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += ` />`;\n }\n // 先加入 '>' 再看有内容加内容,最后反 Tag 闭合\n else {\n ctx.root.value += `>`;\n // 叶元素,无子节点;与 beforeIndent 中的 appendInnerContent 互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n }\n }\n }\n};\n\nconst insertAfter = (parent: SSRNode, node: SSRNode, prev: SSRNode | null) => {\n const next = prev ? prev.nextSibling : parent.firstChild;\n node.nextSibling = next;\n node.prevSibling = prev;\n\n if (prev) {\n prev.nextSibling = node;\n } else {\n parent.firstChild = node;\n }\n if (next) {\n next.prevSibling = node;\n } else {\n parent.lastChild = node;\n }\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n if (isBefore) {\n ctx.root.value += `<!--${name}-->`;\n }\n return new Anchor(name);\n};\n\nconst remove = (node: SSRNode) => {\n const { parent, prevSibling, nextSibling } = node;\n if (prevSibling) {\n prevSibling.nextSibling = nextSibling;\n }\n if (nextSibling) {\n nextSibling.prevSibling = prevSibling;\n }\n if (parent) {\n if (parent.firstChild === node) {\n parent.firstChild = nextSibling;\n }\n if (parent.lastChild === node) {\n parent.lastChild = prevSibling;\n }\n }\n};\n\nconst firstChild = (node: SSRNode) => node.firstChild;\n\nconst nextSib = (node: SSRNode) => node.nextSibling;\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n cleanCtx();\n const root = new Root('');\n ctx.root = ctx.current = root;\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n noopEffect: true\n });\n render(ComponentClass, root);\n return {\n html: ctx.root.value\n };\n};\n","import { customRender, Store } from 'bobe';\nimport {\n setProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\nclass TreeCursor {\n private parent: Node;\n private claimed = new WeakSet<Node>();\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n enterChildren(node: Node) {\n this.parent = node;\n }\n\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n }\n }\n\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n let node = this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const container = rootEl.parentNode!;\n const cursor = new TreeCursor(container);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n const hydrateSetProp = (node: Node, key: string, value: any) => {\n if (isFirstRender && (key === 'text' || key === 'html')) {\n (node as any)[CONTENT_FLAG] = value != null;\n return;\n }\n return setProp(node, key, value);\n };\n\n const createNode = (name: string): Node => {\n if (isFirstRender) {\n const claimed = name === 'text'\n ? cursor.tryClaimText()\n : cursor.tryClaimElement(name);\n if (claimed) return claimed;\n }\n return name === 'text'\n ? document.createTextNode('')\n : browserCreateNode(name);\n };\n\n const createAnchor = (name: string): Comment => {\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return document.createComment(name);\n };\n\n const insertAfter = (parent: Node, node: Node, prev: Node | null) => {\n if (node === parent) return;\n const expectedNext = prev ? prev.nextSibling : parent.firstChild;\n if (node === expectedNext) return;\n parent.insertBefore(node, expectedNext);\n };\n\n const beforeIndent = (node: Node): boolean | void => {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(\n `<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`\n );\n return false;\n }\n if (isFirstRender) cursor.enterChildren(node);\n };\n\n const leaveNode = (node: Node) => {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const leaveLogicNode = (node: Node) => {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp: hydrateSetProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, container);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","leaveNode","leaveLogicNode","render","customRender","ctx","root","current","cleanCtx","keys","forEach","SSRNode","lastChild","prevSibling","closed","startClosed","_innerHtml","SSRNodeType","Element","type","attrs","constructor","Text","Anchor","Root","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","replace","m","escapeText","classStr","appendInnerContent","hasHtml","realAfter","isDedent","next","isBefore","renderHtmlStr","ComponentClass","noopEffect","html","TreeCursor","claimed","WeakSet","container","enterChildren","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","onBeforeFlush"],"mappings":";;;;AAEO,MAAMA,eAAa,GAAG,IAAIC,GAAG,CAAC,CACnC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EACvD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAC3D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EACrD,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAC1E;AAED,MAAMC,eAAe,GAAG,IAAID,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEhE,MAAME,MAAM,GAAG,4BAA4B;AAC3C,MAAMC,OAAO,GAAG,oCAAoC;AAEpD,MAAMC,QAAQ,GAAG,IAAIJ,GAAG,CAAC,CACvB,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAC3E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAC5E,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAC3E,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAC5E,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAChF,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,QAAQ,EACzE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EACjF,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAC/E,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EACvE,OAAO,EAAE,KAAK,EAAE,MAAM,CACvB,CAAC;AAEF,MAAMK,SAAS,GAAG,IAAIL,GAAG,CAAC,CACxB,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EACpE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAC7E,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAC9E,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAC5E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAC1E,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAC5C,CAAC;AAEF,MAAMM,IAAI,GAAIC,EAAW,IAAKA,EAAE,CAACC,YAAY,KAAKN,MAAM,IAAIK,EAAE,CAACC,YAAY,KAAKL,OAAO;AAIhF,MAAMM,YAAU,GAAIC,IAAY,IAAW;EAChD,IAAIA,IAAI,KAAK,MAAM,EAAE,OAAOC,QAAQ,CAACC,cAAc,CAAC,EAAE,CAAC;AACvD,EAAA,IAAIP,SAAS,CAACQ,GAAG,CAACH,IAAI,CAAC,EAAE,OAAOC,QAAQ,CAACG,eAAe,CAACX,OAAO,EAAEO,IAAI,CAAC;AACvE,EAAA,IAAIN,QAAQ,CAACS,GAAG,CAACH,IAAI,CAAC,EAAE,OAAOC,QAAQ,CAACG,eAAe,CAACZ,MAAM,EAAEQ,IAAI,CAAC;AACrE,EAAA,OAAOC,QAAQ,CAACI,aAAa,CAACL,IAAI,CAAC;AACrC;MAEaM,YAAY,GAAGC,MAAM,CAAC,YAAY;AAExC,MAAMC,SAAO,GAAGA,CAACC,IAAU,EAAEC,GAAW,EAAEC,KAAU,KAA+B;EACxF,MAAMd,EAAE,GAAGY,IAAmB;EAG9B,IAAIC,GAAG,KAAK,MAAM,EAAE;AACjBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;IAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;IACnBF,IAAI,CAACG,WAAW,GAAGD,KAAK;AACxB,IAAA;AACF,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,IAAI,CAAC,EAAE;AACxB,IAAA,MAAMC,OAAO,GAAGJ,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC;AAC5BN,IAAAA,IAAI,CAACO,gBAAgB,CAACF,OAAO,EAAEH,KAAK,CAAC;IACrC,OAAO,MAAMF,IAAI,CAACQ,mBAAmB,CAACH,OAAO,EAAEH,KAAK,CAAC;AACvD,EAAA;EAGA,IAAID,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;MACjBd,EAAE,CAACqB,SAAS,GAAG,EAAE;AACnB,IAAA,CAAC,MAAM,IAAI,OAAOP,KAAK,KAAK,QAAQ,IAAI,CAACQ,KAAK,CAACC,OAAO,CAACT,KAAK,CAAC,EAAE;AAC7D,MAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;AACZ,QAAA,MAAMwB,KAAK,GAAGC,MAAM,CAACC,OAAO,CAACZ,KAA4B,CAAC,CACvDa,MAAM,CAAC,CAAC,GAAGC,CAAC,CAAC,KAAK,CAAC,CAACA,CAAC,CAAC,CACtBC,GAAG,CAAC,CAAC,CAACC,CAAC,CAAC,KAAKA,CAAC,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;AACZ/B,QAAAA,EAAE,CAACgC,YAAY,CAAC,OAAO,EAAER,KAAK,CAAC;AACjC,MAAA,CAAC,MAAM;AACL,QAAA,KAAK,MAAMM,CAAC,IAAIhB,KAAK,EAAE;AACrBd,UAAAA,EAAE,CAACiC,SAAS,CAACC,MAAM,CAACJ,CAAC,EAAE,CAAC,CAAEhB,KAAK,CAAyBgB,CAAC,CAAC,CAAC;AAC7D,QAAA;AACF,MAAA;AACF,IAAA,CAAC,MAAM;AACL,MAAA,MAAMK,GAAG,GAAG,OAAOrB,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,MAAM,GAAG,EAAE,GAAIsB,MAAM,CAACtB,KAAK,CAAC;AAC9E,MAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;AACZA,QAAAA,EAAE,CAACgC,YAAY,CAAC,OAAO,EAAEG,GAAG,CAAC;AAC/B,MAAA,CAAC,MAAM;QACLnC,EAAE,CAACqB,SAAS,GAAGc,GAAG;AACpB,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAItB,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;AACjBd,MAAAA,EAAE,CAACqC,KAAK,CAACC,OAAO,GAAG,EAAE;AACvB,IAAA,CAAC,MAAM;MACLtC,EAAE,CAACqC,KAAK,CAACC,OAAO,GAAGF,MAAM,CAACtB,KAAK,CAAC;AAClC,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAID,GAAG,KAAK,MAAM,EAAE;AACjBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;IAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;AAClBF,IAAAA,IAAI,CAAa2B,SAAS,GAAGH,MAAM,CAACtB,KAAK,CAAC;AAC3C,IAAA;AACF,EAAA;AAGA,EAAA,IAAItB,eAAa,CAACc,GAAG,CAACO,GAAG,CAAC,EAAE;IAC1B,IAAIC,KAAK,KAAK,KAAK,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK0B,SAAS,EAAE;AAC5DxC,MAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;AACLb,MAAAA,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAE,EAAE,CAAC;AAC1B,IAAA;AACA,IAAA;AACF,EAAA;AAGA,EAAA,IAAI,CAACA,GAAG,KAAK,OAAO,IAAIA,GAAG,KAAK,SAAS,KAAKnB,eAAe,CAACY,GAAG,CAACN,EAAE,CAAC0C,OAAO,CAAC,EAAE;AAC5E1C,IAAAA,EAAE,CAASa,GAAG,CAAC,GAAGC,KAAK;AACxB,IAAA;AACF,EAAA;AAGA,EAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;IACZ,IAAIc,KAAK,IAAI,IAAI,EAAE;AACjBd,MAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;MACLb,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAEuB,MAAM,CAACtB,KAAK,CAAC,CAAC;AACrC,IAAA;AACA,IAAA;AACF,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,IAAIH,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,EAAE;IACtD,IAAIF,KAAK,IAAI,IAAI,EAAE;AACjBd,MAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;MACLb,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAEuB,MAAM,CAACtB,KAAK,CAAC,CAAC;AACrC,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAIA,KAAK,IAAI,IAAI,EAAE;AACjBd,IAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;AACzB,EAAA,CAAC,MAAM,IAAIA,GAAG,IAAIb,EAAE,EAAE;AACnBA,IAAAA,EAAE,CAASa,GAAG,CAAC,GAAGC,KAAK;AAC1B,EAAA,CAAC,MAAM;IACLd,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAEuB,MAAM,CAACtB,KAAK,CAAC,CAAC;AACrC,EAAA;AACF;AAEO,MAAM6B,aAAW,GAAGA,CAACC,MAAY,EAAEhC,IAAU,EAAEiC,IAAiB,KAAK;EAC1E,IAAI,CAACA,IAAI,EAAED,MAAM,CAACE,YAAY,CAAClC,IAAI,EAAEgC,MAAM,CAACG,UAAU,CAAC,CAAC,KACnDH,MAAM,CAACE,YAAY,CAAClC,IAAI,EAAEiC,IAAI,CAACG,WAAW,CAAC;AAClD;AAEO,MAAMC,cAAY,GAAI9C,IAAY,IAAKC,QAAQ,CAAC8C,aAAa,CAAC/C,IAAI;AAElE,MAAMgD,QAAM,GAAIvC,IAAU,IAAK;EAAGA,IAAI,CAAauC,MAAM,EAAE;AAAE;MAEvDJ,YAAU,GAAInC,IAAU,IAAKA,IAAI,CAACmC;MAElCK,SAAO,GAAIxC,IAAU,IAAKA,IAAI,CAACoC;AAErC,MAAMK,cAAY,GAAIzC,IAAU,IAAqB;AAC1D,EAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;IAC/B,MAAM6C,GAAG,GAAI1C,IAAI,CAAa8B,OAAO,EAAEa,WAAW,EAAE;AACpD,IAAA,MAAMC,OAAO,GAAI5C,IAAI,CAAiBG,WAAW,IAAI,IAAI;AACzD0C,IAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAAgD,CAAC;AACvG,IAAA,OAAO,KAAK;AACd,EAAA;AACF;MAGaG,WAAS,GAAGA,MAAM,CAAC;MACnBC,gBAAc,GAAGA,MAAM,CAAC;AAE9B,MAAMC,MAAM,GAAGC,iBAAY,CAAC;cACjC5D,YAAU;WACVS,SAAO;eACPgC,aAAW;gBACXM,cAAY;UACZE,QAAM;cACNJ,YAAU;WACVK,SAAO;gBACPC,cAAY;aACZM,WAAS;AACTC,kBAAAA;AACF,CAAC;;AClMM,IAAIG,GAAW,GAAG;AACvBC,EAAAA,IAAI,EAAE,IAAI;AACVC,EAAAA,OAAO,EAAE;AACX,CAAC;AAEM,MAAMC,QAAQ,GAAGA,MACtBzC,MAAM,CAAC0C,IAAI,CAACJ,GAAG,CAAC,CAACK,OAAO,CAACvD,GAAG,IAAI;AAC9BkD,EAAAA,GAAG,CAAClD,GAAG,CAAC,GAAG,IAAI;AACjB,CAAC,CAAC;;ACTG,MAAMwD,OAAO,CAAC;AAGnBzB,EAAAA,MAAM,GAAoB,IAAI;AAC9BG,EAAAA,UAAU,GAAmB,IAAI;AACjCuB,EAAAA,SAAS,GAAmB,IAAI;AAChCtB,EAAAA,WAAW,GAAmB,IAAI;AAClCuB,EAAAA,WAAW,GAAmB,IAAI;AAClCC,EAAAA,MAAM,GAAY,KAAK;AACvBC,EAAAA,WAAW,GAAY,KAAK;AAE5BC,EAAAA,UAAU,GAAkB,IAAI;AAClC;AAEA,IAAYC,WAAW,aAAXA,WAAW,EAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAA,EAAA,OAAXA,WAAW;AAAA,CAAA,CAAA,EAAA,CAAA;AAOhB,MAAMC,OAAO,SAASP,OAAO,CAAC;EACnCQ,IAAI,GAAGF,WAAW,CAACC,OAAO;AAC1B7D,EAAAA,WAAW,GAAkB,IAAI;EAEjC+D,KAAK,GAA2B,EAAE;AAClCC,EAAAA,WAAWA,CAEFjE,KAAa,EACb8B,MAAuB,EAC9B;AACA,IAAA,KAAK,EAAE;IAAC,IAAA,CAHD9B,KAAa,GAAbA,KAAa;IAAA,IAAA,CACb8B,MAAuB,GAAvBA,MAAuB;AAGhC,EAAA;AACF;AAEO,MAAMoC,IAAI,SAASX,OAAO,CAAC;EAChCQ,IAAI,GAAGF,WAAW,CAACK,IAAI;AACvBD,EAAAA,WAAWA,CAEFhE,WAAmB,EACnB6B,MAAuB,EAC9B;AACA,IAAA,KAAK,EAAE;IAAC,IAAA,CAHD7B,WAAmB,GAAnBA,WAAmB;IAAA,IAAA,CACnB6B,MAAuB,GAAvBA,MAAuB;AAGhC,EAAA;AACF;AAEO,MAAMqC,MAAM,SAASZ,OAAO,CAAC;EAClCQ,IAAI,GAAGF,WAAW,CAACM,MAAM;AACzBF,EAAAA,WAAWA,CAEFjE,KAAa,EACb8B,MAAuB,EAC9B;AACA,IAAA,KAAK,EAAE;IAAC,IAAA,CAHD9B,KAAa,GAAbA,KAAa;IAAA,IAAA,CACb8B,MAAuB,GAAvBA,MAAuB;AAGhC,EAAA;AACF;AACO,MAAMsC,IAAI,SAASb,OAAO,CAAC;EAChCQ,IAAI,GAAGF,WAAW,CAACO,IAAI;AACvBH,EAAAA,WAAWA,CAEFjE,KAAa,EACb8B,MAAuB,EAC9B;AACA,IAAA,KAAK,EAAE;IAAC,IAAA,CAHD9B,KAAa,GAAbA,KAAa;IAAA,IAAA,CACb8B,MAAuB,GAAvBA,MAAuB;AAGhC,EAAA;AACF;;AC7DA,MAAMuC,SAAS,GAAG,IAAI1F,GAAG,CAAC,CACxB,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,EACP,KAAK,CACN,CAAC;AAEF,MAAMD,aAAa,GAAG,IAAIC,GAAG,CAAC,CAC5B,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,CACV,CAAC;AAEF,MAAM2F,OAAO,GAAG,SAAS;AACzB,MAAMC,OAAO,GAAG,QAAQ;AACxB,MAAMC,QAAgC,GAAG;AACvC,EAAA,GAAG,EAAE,OAAO;AACZ,EAAA,GAAG,EAAE,QAAQ;AACb,EAAA,GAAG,EAAE,MAAM;AACX,EAAA,GAAG,EAAE;AACP,CAAC;AACD,MAAMC,QAAgC,GAAG;AACvC,EAAA,GAAG,EAAE,OAAO;AACZ,EAAA,GAAG,EAAE,MAAM;AACX,EAAA,GAAG,EAAE;AACP,CAAC;AAED,MAAMC,UAAU,GAAIrD,GAAW,IAAK;AAClC,EAAA,MAAMsD,CAAC,GAAGrD,MAAM,CAACD,GAAG,CAAC;EACrB,OAAOiD,OAAO,CAACM,IAAI,CAACD,CAAC,CAAC,GAAGA,CAAC,CAACE,OAAO,CAACP,OAAO,EAAEQ,CAAC,IAAIN,QAAQ,CAACM,CAAC,CAAC,CAAC,GAAGH,CAAC;AACnE,CAAC;AAED,MAAMI,UAAU,GAAI1D,GAAW,IAAK;AAClC,EAAA,MAAMsD,CAAC,GAAGrD,MAAM,CAACD,GAAG,CAAC;EACrB,OAAOkD,OAAO,CAACK,IAAI,CAACD,CAAC,CAAC,GAAGA,CAAC,CAACE,OAAO,CAACN,OAAO,EAAEO,CAAC,IAAIL,QAAQ,CAACK,CAAC,CAAC,CAAC,GAAGH,CAAC;AACnE,CAAC;AAED,MAAMvF,UAAU,GAAIC,IAAY,IAAK;EACnC,IAAIA,IAAI,KAAK,MAAM,EAAE;AACnB,IAAA,OAAO,IAAI6E,IAAI,CAAC,EAAE,CAAC;AACrB,EAAA;AACAjB,EAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAIX,IAAI,CAAA,CAAE;AAC5B,EAAA,OAAO,IAAIyE,OAAO,CAACzE,IAAI,CAAC;AAC1B,CAAC;AAED,MAAMQ,OAAO,GAAGA,CAACC,IAAoB,EAAEC,GAAW,EAAEC,KAAU,KAAK;EACjE,IAAIF,IAAI,CAAC6D,WAAW,EAAE;EACtB,IAAI5D,GAAG,CAACG,UAAU,CAAC,IAAI,CAAC,IAAIH,GAAG,KAAK,KAAK,EAAE;EAG3C,IAAIA,GAAG,KAAK,MAAM,EAAE;IAClB,IAAIC,KAAK,IAAI,IAAI,EAAE;IACnBF,IAAI,CAACG,WAAW,GAAGD,KAAK;AACxB,IAAA;AACF,EAAA;EAGA,IAAID,GAAG,KAAK,MAAM,EAAE;IAClB,IAAIC,KAAK,IAAI,IAAI,EAAE;AACnBF,IAAAA,IAAI,CAAC8D,UAAU,GAAGtC,MAAM,CAACtB,KAAK,CAAC;AAC/B,IAAA;AACF,EAAA;EAGA,IAAID,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;AACnB,IAAA,IAAIgF,QAAgB;AACpB,IAAA,IAAI,OAAOhF,KAAK,KAAK,QAAQ,IAAI,CAACQ,KAAK,CAACC,OAAO,CAACT,KAAK,CAAC,EAAE;AACtDgF,MAAAA,QAAQ,GAAGrE,MAAM,CAACC,OAAO,CAACZ,KAA4B,CAAC,CACpDa,MAAM,CAAC,CAAC,GAAGC,CAAC,CAAC,KAAK,CAAC,CAACA,CAAC,CAAC,CACtBC,GAAG,CAAC,CAAC,CAACC,CAAC,CAAC,KAAKA,CAAC,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;AACd,IAAA,CAAC,MAAM;AACL+D,MAAAA,QAAQ,GAAG,OAAOhF,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,MAAM,GAAG,EAAE,GAAIsB,MAAM,CAACtB,KAAK,CAAC;AAC/E,IAAA;AACA,IAAA,IAAIgF,QAAQ,EAAE/B,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,QAAA,EAAW0E,UAAU,CAACM,QAAQ,CAAC,CAAA,CAAA,CAAG;AAClE,IAAA;AACF,EAAA;EAGA,IAAIjF,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;AACnBiD,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,QAAA,EAAW0E,UAAU,CAACpD,MAAM,CAACtB,KAAK,CAAC,CAAC,CAAA,CAAA,CAAG;AACzD,IAAA;AACF,EAAA;AAGA,EAAA,IAAItB,aAAa,CAACc,GAAG,CAACO,GAAG,CAAC,EAAE;IAC1B,IAAIC,KAAK,KAAK,KAAK,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK0B,SAAS,EAAE;AAC5DuB,MAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAID,GAAG,CAAA,CAAE;AAC7B,IAAA;AACA,IAAA;AACF,EAAA;AAGA,EAAA,IAAIA,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,IAAIH,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,EAAE;IACtD,IAAIF,KAAK,IAAI,IAAI,EAAE;AACnBiD,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAID,GAAG,CAAA,EAAA,EAAK2E,UAAU,CAAC1E,KAAK,CAAC,CAAA,CAAA,CAAG;AAClD,IAAA;AACF,EAAA;EAGA,IAAIA,KAAK,IAAI,IAAI,EAAE;AACnBiD,EAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAID,GAAG,CAAA,EAAA,EAAK2E,UAAU,CAAC1E,KAAK,CAAC,CAAA,CAAA,CAAG;AACpD,CAAC;AAED,MAAMiF,kBAAkB,GAAInF,IAAa,IAAK;AAC5C,EAAA,IAAIA,IAAI,CAAC8D,UAAU,IAAI,IAAI,EAAE;AAC3BX,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAIF,IAAI,CAAC8D,UAAU;AACjC,IAAA,OAAO,IAAI;AACb,EAAA;AACA,EAAA,IAAI9D,IAAI,CAACG,WAAW,IAAI,IAAI,EAAE;IAC5BgD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI+E,UAAU,CAACjF,IAAI,CAACG,WAAW,CAAC;AAC9C,IAAA,OAAO,IAAI;AACb,EAAA;AACA,EAAA,OAAO,KAAK;AACd,CAAC;AAED,MAAMsC,YAAY,GAAIzC,IAAoB,IAAc;AACtD,EAAA,IAAIA,IAAI,YAAYoE,IAAI,EAAE,OAAO,IAAI;AAErC,EAAA,MAAMxB,OAAO,GAAG5C,IAAI,CAACG,WAAW,IAAI,IAAI;AACxC,EAAA,MAAMiF,OAAO,GAAGpF,IAAI,CAAC8D,UAAU,IAAI,IAAI;EAGvC,IAAIS,SAAS,CAAC7E,GAAG,CAACM,IAAI,CAACE,KAAK,CAAC,EAAE;AAC7BiD,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,CAAI;IACtB2C,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAI9C,IAAI,CAACE,KAAK,uBAAuB,CAAC;IACnDF,IAAI,CAAC6D,WAAW,GAAG,IAAI;IACvB7D,IAAI,CAAC4D,MAAM,GAAG,IAAI;AAClB,IAAA,OAAO,KAAK;AACd,EAAA;EAEA,IAAIhB,OAAO,IAAIwC,OAAO,EAAE;AACtBvC,IAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAI9C,IAAI,CAACE,KAAK,CAAA,MAAA,EAASkF,OAAO,GAAG,MAAM,GAAG,MAAM,gDAAgD,CAAC;AAC9GjC,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,CAAG;IAErBiF,kBAAkB,CAACnF,IAAI,CAAC;IACxBmD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,EAAKF,IAAI,CAACE,KAAK,CAAA,CAAA,CAAG;IACpCF,IAAI,CAAC6D,WAAW,GAAG,IAAI;IACvB7D,IAAI,CAAC4D,MAAM,GAAG,IAAI;AAClB,IAAA,OAAO,KAAK;AACd,EAAA;AAEAT,EAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,CAAG;EACrBF,IAAI,CAAC6D,WAAW,GAAG,IAAI;AACvB,EAAA,OAAO,IAAI;AACb,CAAC;AAED,MAAMb,cAAc,GAAIhD,IAAe,IAAK;AAC1C,EAAA,MAAMqF,SAAS,GAAGrF,IAAI,CAACqF,SAAmB;EAC1ClC,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,IAAA,EAAOmF,SAAS,CAACnF,KAAK,CAAA,GAAA,CAAK;AAC/C,CAAC;AACD,MAAM6C,SAAS,GAAGA,CAAC/C,IAAoB,EAAEsF,QAAiB,KAAK;EAM7D,IAAItF,IAAI,CAAC4D,MAAM,EAAE;EACjB,IAAI5D,IAAI,YAAYoE,IAAI,EAAE;IACxBjB,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI+E,UAAU,CAACjF,IAAI,CAACG,WAAW,CAAC;AAChD,EAAA,CAAC,MAAM;IAEL,IAAIH,IAAI,CAAC6D,WAAW,EAAE;MAEpB,IAAIU,SAAS,CAAC7E,GAAG,CAACM,IAAI,CAACE,KAAK,CAAC,EAAE,CAC9B,MAAM;QACLiD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,EAAKF,IAAI,CAACE,KAAK,CAAA,CAAA,CAAG;AACtC,MAAA;AACF,IAAA,CAAC,MAEI;MAEH,IAAIqE,SAAS,CAAC7E,GAAG,CAACM,IAAI,CAACE,KAAK,CAAC,EAAE;AAC7BiD,QAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,GAAA,CAAK;AACzB,MAAA,CAAC,MAEI;AACHiD,QAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,CAAG;QAErBiF,kBAAkB,CAACnF,IAAI,CAAC;QACxBmD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,EAAKF,IAAI,CAACE,KAAK,CAAA,CAAA,CAAG;AACtC,MAAA;AACF,IAAA;AACF,EAAA;AACF,CAAC;AAED,MAAM6B,WAAW,GAAGA,CAACC,MAAe,EAAEhC,IAAa,EAAEiC,IAAoB,KAAK;EAC5E,MAAMsD,IAAI,GAAGtD,IAAI,GAAGA,IAAI,CAACG,WAAW,GAAGJ,MAAM,CAACG,UAAU;EACxDnC,IAAI,CAACoC,WAAW,GAAGmD,IAAI;EACvBvF,IAAI,CAAC2D,WAAW,GAAG1B,IAAI;AAEvB,EAAA,IAAIA,IAAI,EAAE;IACRA,IAAI,CAACG,WAAW,GAAGpC,IAAI;AACzB,EAAA,CAAC,MAAM;IACLgC,MAAM,CAACG,UAAU,GAAGnC,IAAI;AAC1B,EAAA;AACA,EAAA,IAAIuF,IAAI,EAAE;IACRA,IAAI,CAAC5B,WAAW,GAAG3D,IAAI;AACzB,EAAA,CAAC,MAAM;IACLgC,MAAM,CAAC0B,SAAS,GAAG1D,IAAI;AACzB,EAAA;EACAA,IAAI,CAACgC,MAAM,GAAGA,MAAM;AACtB,CAAC;AAED,MAAMK,YAAY,GAAGA,CAAC9C,IAAY,EAAEiG,QAAkB,KAAK;AACzD,EAAA,IAAIA,QAAQ,EAAE;AACZrC,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,IAAA,EAAOX,IAAI,CAAA,GAAA,CAAK;AACpC,EAAA;AACA,EAAA,OAAO,IAAI8E,MAAM,CAAC9E,IAAI,CAAC;AACzB,CAAC;AAED,MAAMgD,MAAM,GAAIvC,IAAa,IAAK;AAChC,EAAA,MAAQgC,MAAM,GAA+BhC,IAAI,CAAzCgC,MAAM;IAAE2B,WAAW,GAAkB3D,IAAI,CAAjC2D,WAAW;IAAEvB,WAAW,GAAKpC,IAAI,CAApBoC,WAAW;AACxC,EAAA,IAAIuB,WAAW,EAAE;IACfA,WAAW,CAACvB,WAAW,GAAGA,WAAW;AACvC,EAAA;AACA,EAAA,IAAIA,WAAW,EAAE;IACfA,WAAW,CAACuB,WAAW,GAAGA,WAAW;AACvC,EAAA;AACA,EAAA,IAAI3B,MAAM,EAAE;AACV,IAAA,IAAIA,MAAM,CAACG,UAAU,KAAKnC,IAAI,EAAE;MAC9BgC,MAAM,CAACG,UAAU,GAAGC,WAAW;AACjC,IAAA;AACA,IAAA,IAAIJ,MAAM,CAAC0B,SAAS,KAAK1D,IAAI,EAAE;MAC7BgC,MAAM,CAAC0B,SAAS,GAAGC,WAAW;AAChC,IAAA;AACF,EAAA;AACF,CAAC;AAED,MAAMxB,UAAU,GAAInC,IAAa,IAAKA,IAAI,CAACmC,UAAU;AAErD,MAAMK,OAAO,GAAIxC,IAAa,IAAKA,IAAI,CAACoC,WAAW;AAE5C,MAAMqD,aAAa,GAAIC,cAA4B,IAAK;AAC7DpC,EAAAA,QAAQ,EAAE;AACV,EAAA,MAAMF,IAAI,GAAG,IAAIkB,IAAI,CAAC,EAAE,CAAC;AACzBnB,EAAAA,GAAG,CAACC,IAAI,GAAGD,GAAG,CAACE,OAAO,GAAGD,IAAI;EAC7B,MAAMH,MAAM,GAAGC,iBAAY,CAAC;IAC1B5D,UAAU;IACVS,OAAO;IACPgC,WAAW;IACXM,YAAY;IACZE,MAAM;IACNJ,UAAU;IACVK,OAAO;IACPC,YAAY;IACZM,SAAS;IACTC,cAAc;AACd2C,IAAAA,UAAU,EAAE;AACd,GAAC,CAAC;AACF1C,EAAAA,MAAM,CAACyC,cAAc,EAAEtC,IAAI,CAAC;EAC5B,OAAO;AACLwC,IAAAA,IAAI,EAAEzC,GAAG,CAACC,IAAI,CAAClD;GAChB;AACH;;ACtRA,MAAM2F,UAAU,CAAC;AAEPC,EAAAA,OAAO,GAAG,IAAIC,OAAO,EAAQ;EAErC5B,WAAWA,CAAC6B,SAAe,EAAE;IAC3B,IAAI,CAAChE,MAAM,GAAGgE,SAAS;AACzB,EAAA;EAEAC,aAAaA,CAACjG,IAAU,EAAE;IACxB,IAAI,CAACgC,MAAM,GAAGhC,IAAI;AACpB,EAAA;EAEAkG,aAAaA,CAAClG,IAAU,EAAE;IACxB,IAAIA,IAAI,KAAK,IAAI,CAACgC,MAAM,IAAI,IAAI,CAACA,MAAM,CAACmE,UAAU,EAAE;AAClD,MAAA,IAAI,CAACnE,MAAM,GAAG,IAAI,CAACA,MAAM,CAACmE,UAAU;AACtC,IAAA;AACF,EAAA;EAEQC,aAAaA,CAACC,SAAkC,EAAe;AACrE,IAAA,IAAIrG,IAAI,GAAG,IAAI,CAACgC,MAAM,CAACG,UAAU;AACjC,IAAA,OAAOnC,IAAI,EAAE;AACX,MAAA,IAAI,CAAC,IAAI,CAAC8F,OAAO,CAACpG,GAAG,CAACM,IAAI,CAAC,IAAIqG,SAAS,CAACrG,IAAI,CAAC,EAAE;AAC9C,QAAA,IAAI,CAAC8F,OAAO,CAACQ,GAAG,CAACtG,IAAI,CAAC;AACtB,QAAA,OAAOA,IAAI;AACb,MAAA;MACAA,IAAI,GAAGA,IAAI,CAACoC,WAAW;AACzB,IAAA;AACA,IAAA,OAAO,IAAI;AACb,EAAA;EAEAmE,eAAeA,CAACzE,OAAe,EAAkB;IAC/C,OAAO,IAAI,CAACsE,aAAa,CACtBpG,IAAI,IAAKA,IAAI,CAACwG,QAAQ,KAAK,CAAC,IAAKxG,IAAI,CAAa8B,OAAO,CAACa,WAAW,EAAE,KAAKb,OAC/E,CAAC;AACH,EAAA;EAEA2E,eAAeA,CAAClH,IAAY,EAAkB;AAC5C,IAAA,OAAO,IAAI,CAAC6G,aAAa,CACtBpG,IAAI,IAAKA,IAAI,CAACwG,QAAQ,KAAK,CAAC,IAAKxG,IAAI,CAAa0G,IAAI,KAAKnH,IAC9D,CAAC;AACH,EAAA;AAEAoH,EAAAA,YAAYA,GAAgB;IAC1B,OAAO,IAAI,CAACP,aAAa,CACtBpG,IAAI,IAAKA,IAAI,CAACwG,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAExG,IAAI,CAACG,WAAW,EAAEyG,IAAI,EAC5D,CAAC;AACH,EAAA;AACF;MAIaC,OAAO,GAAGA,CAACnB,cAA4B,EAAEoB,MAAe,KAAK;AACxE,EAAA,MAAMd,SAAS,GAAGc,MAAM,CAACX,UAAW;AACpC,EAAA,MAAMY,MAAM,GAAG,IAAIlB,UAAU,CAACG,SAAS,CAAC;EAGxC,IAAIgB,aAAa,GAAG,IAAI;EAIxB,MAAMC,cAAc,GAAGA,CAACjH,IAAU,EAAEC,GAAW,EAAEC,KAAU,KAAK;IAC9D,IAAI8G,aAAa,KAAK/G,GAAG,KAAK,MAAM,IAAIA,GAAG,KAAK,MAAM,CAAC,EAAE;AACtDD,MAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;AAC3C,MAAA;AACF,IAAA;AACA,IAAA,OAAOH,SAAO,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,CAAC;EAClC,CAAC;EAED,MAAMZ,UAAU,GAAIC,IAAY,IAAW;AACzC,IAAA,IAAIyH,aAAa,EAAE;AACjB,MAAA,MAAMlB,OAAO,GAAGvG,IAAI,KAAK,MAAM,GAC3BwH,MAAM,CAACJ,YAAY,EAAE,GACrBI,MAAM,CAACR,eAAe,CAAChH,IAAI,CAAC;MAChC,IAAIuG,OAAO,EAAE,OAAOA,OAAO;AAC7B,IAAA;AACA,IAAA,OAAOvG,IAAI,KAAK,MAAM,GAClBC,QAAQ,CAACC,cAAc,CAAC,EAAE,CAAC,GAC3ByH,YAAiB,CAAC3H,IAAI,CAAC;EAC7B,CAAC;EAED,MAAM8C,YAAY,GAAI9C,IAAY,IAAc;AAC9C,IAAA,IAAIyH,aAAa,EAAE;AACjB,MAAA,MAAMlB,OAAO,GAAGiB,MAAM,CAACN,eAAe,CAAClH,IAAI,CAAC;MAC5C,IAAIuG,OAAO,EAAE,OAAOA,OAAO;AAC7B,IAAA;AACA,IAAA,OAAOtG,QAAQ,CAAC8C,aAAa,CAAC/C,IAAI,CAAC;EACrC,CAAC;EAED,MAAMwC,WAAW,GAAGA,CAACC,MAAY,EAAEhC,IAAU,EAAEiC,IAAiB,KAAK;IACnE,IAAIjC,IAAI,KAAKgC,MAAM,EAAE;IACrB,MAAMmF,YAAY,GAAGlF,IAAI,GAAGA,IAAI,CAACG,WAAW,GAAGJ,MAAM,CAACG,UAAU;IAChE,IAAInC,IAAI,KAAKmH,YAAY,EAAE;AAC3BnF,IAAAA,MAAM,CAACE,YAAY,CAAClC,IAAI,EAAEmH,YAAY,CAAC;EACzC,CAAC;EAED,MAAM1E,YAAY,GAAIzC,IAAU,IAAqB;AACnD,IAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;MAC/B,MAAM6C,GAAG,GAAI1C,IAAI,CAAa8B,OAAO,EAAEa,WAAW,EAAE;AACpD,MAAA,MAAMC,OAAO,GAAI5C,IAAI,CAAiBG,WAAW,IAAI,IAAI;AACzD0C,MAAAA,OAAO,CAACC,IAAI,CACV,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAC3C,CAAC;AACD,MAAA,OAAO,KAAK;AACd,IAAA;AACA,IAAA,IAAIoE,aAAa,EAAED,MAAM,CAACd,aAAa,CAACjG,IAAI,CAAC;EAC/C,CAAC;EAED,MAAM+C,SAAS,GAAI/C,IAAU,IAAK;AAChC,IAAA,IAAIgH,aAAa,EAAED,MAAM,CAACb,aAAa,CAAClG,IAAI,CAAC;EAC/C,CAAC;EAED,MAAMgD,cAAc,GAAIhD,IAAU,IAAK;AACrC,IAAA,IAAIgH,aAAa,EAAED,MAAM,CAACb,aAAa,CAAClG,IAAI,CAAC;EAC/C,CAAC;EAED,MAAMiD,MAAM,GAAGC,iBAAY,CAAC;IAC1B5D,UAAU;AACVS,IAAAA,OAAO,EAAEkH,cAAc;IACvBlF,WAAW;IACXM,YAAY;YACZE,QAAM;gBACNJ,YAAU;aACVK,SAAO;IACPC,YAAY;IACZM,SAAS;IACTC,cAAc;IAGdoE,aAAa,EAAEA,MAAM;AACnBJ,MAAAA,aAAa,GAAG,KAAK;AACvB,IAAA;AACF,GAAC,CAAC;AAEF,EAAA,OAAO/D,MAAM,CAACyC,cAAc,EAAEM,SAAS,CAAC;AAC1C;;;;;;;;;;;;;;;;;;"}