tsgrid-ui 2.7.1 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +173 -0
- package/dist/base.d.ts +148 -0
- package/dist/base.es6.js +11 -0
- package/dist/base.es6.js.map +1 -0
- package/dist/chunks/chunk-26XP2XU3.js +1795 -0
- package/dist/chunks/chunk-26XP2XU3.js.map +1 -0
- package/dist/chunks/chunk-3NYH6545.js +2423 -0
- package/dist/chunks/chunk-3NYH6545.js.map +1 -0
- package/dist/chunks/chunk-BIB3X2TW.js +1638 -0
- package/dist/chunks/chunk-BIB3X2TW.js.map +1 -0
- package/dist/chunks/chunk-DXZJHS4M.js +1283 -0
- package/dist/chunks/chunk-DXZJHS4M.js.map +1 -0
- package/dist/chunks/chunk-EVZMMVXO.js +1212 -0
- package/dist/chunks/chunk-EVZMMVXO.js.map +1 -0
- package/dist/chunks/chunk-GJD5NFWQ.js +2305 -0
- package/dist/chunks/chunk-GJD5NFWQ.js.map +1 -0
- package/dist/chunks/chunk-IYF3Q7GX.js +127 -0
- package/dist/chunks/chunk-IYF3Q7GX.js.map +1 -0
- package/dist/chunks/chunk-OFASTA2A.js +2980 -0
- package/dist/chunks/chunk-OFASTA2A.js.map +1 -0
- package/dist/chunks/chunk-OMLGN735.js +677 -0
- package/dist/chunks/chunk-OMLGN735.js.map +1 -0
- package/dist/chunks/chunk-WKSLGUB3.js +1127 -0
- package/dist/chunks/chunk-WKSLGUB3.js.map +1 -0
- package/dist/chunks/chunk-YBY52G2U.js +849 -0
- package/dist/chunks/chunk-YBY52G2U.js.map +1 -0
- package/dist/field.d.ts +329 -0
- package/dist/field.es6.js +11 -0
- package/dist/field.es6.js.map +1 -0
- package/dist/form.d.ts +162 -0
- package/dist/form.es6.js +14 -0
- package/dist/form.es6.js.map +1 -0
- package/dist/layout.d.ts +108 -0
- package/dist/layout.es6.js +13 -0
- package/dist/layout.es6.js.map +1 -0
- package/dist/locale.d.ts +30 -0
- package/dist/locale.es6.js +7 -0
- package/dist/locale.es6.js.map +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/popup.d.ts +92 -0
- package/dist/popup.es6.js +18 -0
- package/dist/popup.es6.js.map +1 -0
- package/dist/query-CKGg5Ugv.d.ts +81 -0
- package/dist/sidebar.d.ts +138 -0
- package/dist/sidebar.es6.js +11 -0
- package/dist/sidebar.es6.js.map +1 -0
- package/dist/tabs.d.ts +63 -0
- package/dist/tabs.es6.js +11 -0
- package/dist/tabs.es6.js.map +1 -0
- package/dist/toolbar.d.ts +97 -0
- package/dist/toolbar.es6.js +11 -0
- package/dist/toolbar.es6.js.map +1 -0
- package/dist/tooltip.d.ts +322 -0
- package/dist/tooltip.es6.js +18 -0
- package/dist/tooltip.es6.js.map +1 -0
- package/dist/tsgrid-ui.css +2 -2
- package/dist/tsgrid-ui.d.ts +16 -2004
- package/dist/tsgrid-ui.es6.js +7750 -23830
- package/dist/tsgrid-ui.es6.js.map +1 -1
- package/dist/tsgrid-ui.es6.min.js +28 -28
- package/dist/tsgrid-ui.js +96 -17
- package/dist/tsgrid-ui.min.css +2 -2
- package/dist/tsgrid-ui.min.js +24 -24
- package/dist/tsutils-message-CogFtVtO.d.ts +82 -0
- package/dist/utils.d.ts +418 -0
- package/dist/utils.es6.js +14 -0
- package/dist/utils.es6.js.map +1 -0
- package/package.json +26 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tsutils-type-guards.ts","../../src/tsutils-data.ts","../../src/tsutils-registry.ts","../../src/query.ts","../../src/tsbase.ts"],"sourcesContent":["/**\n * TsUtils type-guard cluster — Phase 1 of v2.1 SDD\n *\n * Stateless pure functions extracted from src/tsutils.ts.\n * TsUtils delegates to these; do NOT import from tsbase.ts.\n * 4-space indent. Named exports only (no default export).\n */\n\nimport type { TsUISettings } from './tsutils.js'\n\nexport function isBin(val: unknown): boolean {\n const re = /^[0-1]+$/\n return re.test(String(val))\n}\n\nexport function isInt(val: unknown): boolean {\n const re = /^[-+]?[0-9]+$/\n return re.test(String(val))\n}\n\nexport function isFloat(val: unknown, settings: Pick<TsUISettings, 'groupSymbol' | 'decimalSymbol'>): boolean {\n if (typeof val === 'string') {\n val = val.replace(new RegExp(settings.groupSymbol, 'g'), '')\n .replace(settings.decimalSymbol, '.')\n }\n return (typeof val === 'number' || (typeof val === 'string' && val !== '')) && !isNaN(Number(val))\n}\n\nexport function isMoney(val: unknown, settings: Pick<TsUISettings, 'groupSymbol' | 'decimalSymbol' | 'currencyPrefix' | 'currencySuffix'>): boolean {\n if (typeof val === 'object' || val === '') return false\n if (isFloat(val, settings)) return true\n const se = settings\n const re = new RegExp('^'+ (se.currencyPrefix ? '\\\\' + se.currencyPrefix + '?' : '') +\n '[-+]?'+ (se.currencyPrefix ? '\\\\' + se.currencyPrefix + '?' : '') +\n '[0-9]*[\\\\'+ se.decimalSymbol +']?[0-9]+'+ (se.currencySuffix ? '\\\\' + se.currencySuffix + '?' : '') +'$', 'i')\n if (typeof val === 'string') {\n val = val.replace(new RegExp(se.groupSymbol, 'g'), '')\n }\n return re.test(String(val))\n}\n\nexport function isHex(val: unknown): boolean {\n const re = /^(0x)?[0-9a-fA-F]+$/\n return re.test(String(val))\n}\n\nexport function isAlphaNumeric(val: unknown): boolean {\n const re = /^[a-zA-Z0-9_-]+$/\n return re.test(String(val))\n}\n\nexport function isEmail(val: unknown): boolean {\n const email = /^[a-zA-Z0-9._%\\-+]+@[а-яА-Яa-zA-Z0-9.-]+\\.[а-яА-Яa-zA-Z]+$/\n return email.test(String(val))\n}\n\nexport function isIpAddress(val: unknown): boolean {\n const re = new RegExp('^' +\n '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}' +\n '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' +\n '$')\n return re.test(String(val))\n}\n\nexport function isPlainObject(value: unknown): boolean {\n if (value == null) { // null or undefined\n return false\n }\n if (Object.prototype.toString.call(value) !== '[object Object]') {\n return false\n }\n if ((value as Record<string, unknown>).constructor === undefined) {\n return true\n }\n const proto = Object.getPrototypeOf(value) as unknown\n return proto === null || proto === Object.prototype\n}\n","/**\n * TsUtils v2.1 — Data / Object helpers sub-module (Phase 3+4 of v2.1 SDD)\n *\n * Contains: TsCloneOptions, clone, extend,\n * naturalCompare, normMenu, getNested, encodeParams,\n * prepareParams, parseRoute, debounce, wait\n *\n * Rules:\n * - No default export\n * - No import from tsbase.ts (INV-4)\n * - No this.-dispatch inside function bodies (INV-8)\n * - 4-space indent\n */\n\nimport { isPlainObject } from './tsutils-type-guards.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Options for TsUtils.clone() */\nexport interface TsCloneOptions {\n functions?: boolean\n elements?: boolean\n events?: boolean\n exclude?: string[] | ((key: string, ctx: { obj: unknown; parent: string }) => boolean)\n parent?: string\n}\n\n// ---------------------------------------------------------------------------\n// clone\n// ---------------------------------------------------------------------------\n\n/**\n * Deep copy of an object or an array. Functions, events and HTML elements will\n * not be cloned by default; use options to override.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function clone(obj: unknown, options?: Partial<TsCloneOptions>): any {\n const opts: Required<TsCloneOptions> = Object.assign(\n { functions: true, elements: true, events: true, exclude: [] as TsCloneOptions['exclude'], parent: '' },\n options ?? {}\n ) as Required<TsCloneOptions>\n if (Array.isArray(obj)) {\n const arr: unknown[] = Array.from(obj)\n arr.forEach((value, ind) => {\n arr[ind] = clone(value, { functions: opts.functions, elements: opts.elements, events: opts.events, exclude: opts.exclude, parent: (opts.parent) + '[]' })\n })\n return arr\n } else if (isPlainObject(obj)) {\n const ret: Record<string, unknown> = {}\n Object.assign(ret, obj)\n // delete excluded keys\n if (Array.isArray(opts.exclude)) {\n opts.exclude.forEach((key: string) => { delete ret[key] })\n }\n Object.keys(ret).forEach(key => {\n if (typeof opts.exclude == 'function' && opts.exclude(key, { obj, parent: opts.parent })) {\n ret[key] = undefined\n } else {\n ret[key] = clone(ret[key], { functions: opts.functions, elements: opts.elements, events: opts.events, exclude: opts.exclude, parent: opts.parent + (opts.parent ? '.' : '') + key })\n }\n if (ret[key] === undefined) delete ret[key] // do not include undefined elements\n })\n return ret\n } else {\n if ((obj instanceof Function && !opts.functions)\n || (obj instanceof Node && !opts.elements)\n || (obj instanceof Event && !opts.events)\n ) {\n // do not include these objects, otherwise include them uncloned\n return undefined\n } else {\n // primitive variable or function, event, dom element, etc — not cloned\n return obj\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// extend\n// ---------------------------------------------------------------------------\n\n/**\n * Deep extend an object; if an array, it overwrites it, cloning objects in the\n * process. Signature: extend(target, source1, source2, ...)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extend(target: any, source: any, ...rest: unknown[]): any { // any: generic deep-extend; arbitrary object shapes at runtime\n if (Array.isArray(target)) {\n if (Array.isArray(source)) {\n target.splice(0, target.length) // empty array but keep the reference\n source.forEach(s => { target.push(clone(s)) })\n } else {\n throw new Error('Arrays can be extended with arrays only')\n }\n } else if (target instanceof Node || target instanceof Event) {\n throw new Error('HTML elmenents and events cannot be extended')\n } else if (target && typeof target == 'object' && source != null) {\n if (typeof source != 'object') {\n throw new Error('Object can be extended with other objects only.')\n }\n Object.keys(source).forEach(key => {\n if (target[key] != null && typeof target[key] == 'object'\n && source[key] != null && typeof source[key] == 'object') {\n const src = clone(source[key])\n // do not extend HTML elements and events, but overwrite them\n if (target[key] instanceof Node || target[key] instanceof Event) {\n target[key] = src\n } else {\n // if an array needs to be extended with an object, then convert it to empty object\n if (Array.isArray(target[key]) && isPlainObject(src)) {\n target[key] = {}\n }\n extend(target[key], src)\n }\n } else {\n target[key] = clone(source[key])\n }\n })\n } else if (source != null) {\n throw new Error('Object is not extendable, only {} or [] can be extended.')\n }\n // other arguments\n if (rest.length > 0) {\n for (let i = 0; i < rest.length; i++) {\n extend(target, rest[i])\n }\n }\n return target\n}\n\n// ---------------------------------------------------------------------------\n// Types — Phase 4\n// ---------------------------------------------------------------------------\n\n/** Options for TsUtils.normMenu() */\nexport interface TsNormMenuOptions {\n itemMap?: { id: string; text: string }\n [key: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// naturalCompare\n// ---------------------------------------------------------------------------\n\n/*\n * @author Lauri Rooden (https://github.com/litejs/natural-compare-lite)\n * @license MIT License\n */\nexport function naturalCompare(a: unknown, b: unknown): number {\n let i: number = 0, codeA: number = 0, codeB = 1, posA = 0, posB = 0\n // any: String.alphabet is an optional user-defined extension for custom sort order (non-standard)\n const alphabet = (String as unknown as Record<string, unknown>)['alphabet'] as string | undefined\n\n function getCode(str: string, pos: number, code?: number): number {\n if (code) {\n for (i = pos; (code = getCode(str, i)) , code < 76 && code > 65;) ++i\n return +str.slice(pos - 1, i)\n }\n let c: number = alphabet ? alphabet.indexOf(str.charAt(pos)) : -1\n return c > -1 ? c + 76 : ((c = str.charCodeAt(pos) || 0), c < 45 || c > 127) ? c\n : c < 46 ? 65 // -\n : c < 48 ? c - 1\n : c < 58 ? c + 18 // 0-9\n : c < 65 ? c - 11\n : c < 91 ? c + 11 // A-Z\n : c < 97 ? c - 37\n : c < 123 ? c + 5 // a-z\n : c - 63\n }\n\n const aStr = '' + a, bStr = '' + b\n if (aStr != bStr) for (;codeB;) {\n codeA = getCode(aStr, posA++)\n codeB = getCode(bStr, posB++)\n\n if (codeA < 76 && codeB < 76 && codeA > 66 && codeB > 66) {\n codeA = getCode(aStr, posA, posA)\n codeB = getCode(bStr, posB, posA = i)\n posB = i\n }\n\n if (codeA != codeB) return (codeA < codeB) ? -1 : 1\n }\n return 0\n}\n\n// ---------------------------------------------------------------------------\n// getNested\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getNested(obj: any, prop: any): unknown { // any: traverses arbitrary nested objects via dot-path string\n let val: unknown\n try { // need this to make sure no error in props\n val = obj\n const tmp = String(prop).split('.')\n for (let i = 0; i < tmp.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val = (val as any)[tmp[i] ?? ''] // any: dynamic property access on unknown nested object\n }\n } catch (event) {\n val = undefined\n }\n return val\n}\n\n// ---------------------------------------------------------------------------\n// normMenu\n// ---------------------------------------------------------------------------\n\n/**\n * Takes a menu (used in drop downs, context menu, field: list/combo/enum) and normalizes it to the common structure, which\n * is { id: ..., text: ... }. In options you can pass { itemMap: { id: 'id_field', text: 'text_field' }} that will be used\n * to find out id and text fields.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normMenu(menu: unknown, options: TsNormMenuOptions = {}): any[] | undefined {\n if (Array.isArray(menu)) {\n menu.forEach((it, m) => {\n if (typeof it === 'string' || typeof it === 'number') {\n menu[m] = { id: it, text: String(it) }\n } else if (it != null) {\n if (options.itemMap != null) {\n let val = getNested(it, options.itemMap.id)\n if (options.itemMap.id != null && val != null) {\n it.id = val\n }\n val = getNested(it, options.itemMap.text)\n if (options.itemMap.text != null && val) {\n it.text = val\n }\n }\n if (it.caption != null && it.text == null) it.text = it.caption\n if (it.text != null && it.id == null) it.id = it.text\n if (it.text == null && it.id != null) it.text = it.id\n } else {\n menu[m] = { id: null, text: 'null' }\n }\n })\n return menu\n } else if (typeof menu === 'function') {\n // N4 fix: was TsUtils.normMenu.call(this, newMenu, options) — drop .call(this, ...) chain\n const newMenu = menu(menu, options)\n return normMenu(newMenu, options)\n } else if (typeof menu === 'object' && menu !== null) {\n const menuObj = menu as Record<string, unknown>\n return Object.keys(menuObj).map(key => { return { id: key, text: String(menuObj[key] ?? '') } })\n }\n}\n\n// ---------------------------------------------------------------------------\n// encodeParams\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function encodeParams(obj: any, prefix = ''): string { // any: arbitrary nested object from user code\n let str = ''\n Object.keys(obj).forEach(key => {\n if (str != '') str += '&'\n if (typeof obj[key] == 'object') {\n str += encodeParams(obj[key], prefix + key + (prefix ? ']' : '') + '[')\n } else {\n str += `${prefix}${key}${prefix ? ']' : ''}=${obj[key]}`\n }\n })\n return str\n}\n\n// ---------------------------------------------------------------------------\n// prepareParams\n// ---------------------------------------------------------------------------\n\n/**\n * Takes Url object and fetchOptions and changes it in place applying selected user dataType. Since\n * dataType is in TsUtils. This method is used in grid, form and tooltip to prepare fetch parameters.\n * The `defaultDataType` parameter replaces TsUtils.settings.dataType (stateful trio pattern).\n */\nexport function prepareParams(url: URL, fetchOptions: Record<string, unknown>, options: Record<string, unknown>, defaultDataType: string): Record<string, unknown> {\n const dataType = (options?.['dataType'] as string | undefined) ?? defaultDataType\n let postParams = fetchOptions['body']\n fetchOptions['method'] = String(fetchOptions['method']).toUpperCase()\n switch (dataType) {\n /**\n * Will submit GET, POST, PUT, DELETE\n * - if GET - it will be in URL\n * - if POST, PUT, DELETE it will be JSON encoded\n */\n case 'RESTFULL':\n case 'RESTFULJSON': {\n if (['POST', 'PUT', 'DELETE'].includes(String(fetchOptions['method']))) {\n ;(fetchOptions['headers'] as Record<string, string>)['Content-Type'] = 'application/json'\n }\n if (String(fetchOptions['method']) == 'GET') {\n // any: cast-to-any for dynamic dispatch; TsUtils helper accepts heterogeneous runtime input\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((dataType as any) == 'RESTFULLJSON') { // note: pre-existing typo in original code (RESTFULLJSON vs RESTFULJSON)\n postParams = { request: postParams }\n }\n body2params()\n }\n break\n }\n /**\n * Will submit either GET or POST and\n * - if POST it will be JSON encoded\n * - if GET it will be in URL\n * - if HTTPJSON and GET then it will be JSON encoded\n */\n case 'HTTP':\n case 'HTTPJSON':\n case 'JSON': {\n if (String(fetchOptions['method']) == 'GET') {\n if (dataType == 'JSON' || dataType === 'HTTPJSON') {\n postParams = { request: postParams }\n }\n body2params()\n } else {\n ;(fetchOptions['headers'] as Record<string, string>)['Content-Type'] = 'application/json'\n fetchOptions['method'] = 'POST'\n }\n break\n }\n default: {\n if (typeof dataType == 'function') {\n // do nothing, it is custom function that will handle everything\n fetchOptions = (dataType as unknown as (u: URL, f: Record<string, unknown>, o: Record<string, unknown>) => Record<string, unknown>)(url, fetchOptions, options)\n } else {\n console.log(`ERROR: Unsupported dataType \"${dataType}\". Supported types are JSON (default), HTTP, RESTFULL. For backward compatibility HTTPJSON is same as JSON. RESTULFLJSON will encode GET request as JSON.`)\n }\n }\n }\n if (fetchOptions['body'] != null) {\n fetchOptions['body'] = typeof fetchOptions['body'] == 'string' ? fetchOptions['body'] : JSON.stringify(fetchOptions['body'])\n }\n return fetchOptions\n\n function body2params() {\n const pp = postParams as Record<string, unknown>\n Object.keys(pp).forEach(key => {\n let param: unknown = pp[key]\n if (typeof param == 'object') param = JSON.stringify(param)\n url.searchParams.append(key, String(param ?? ''))\n })\n delete fetchOptions['body']\n }\n}\n\n// ---------------------------------------------------------------------------\n// parseRoute\n// ---------------------------------------------------------------------------\n\nexport function parseRoute(route: string): { path: RegExp; keys: { name: string; optional: boolean }[] } {\n const keys: { name: string; optional: boolean }[] = []\n const path = route\n .replace(/\\/\\(/g, '(?:/')\n .replace(/\\+/g, '__plus__')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .replace(/(\\/)?(\\.)?:(\\w+)(?:(\\(.*?\\)))?(\\?)?/g, (_: any, slash: any, format: any, key: any, capture: any, optional: any) => { // any: regex replace callback; args are untyped capture groups\n keys.push({ name: key, optional: !! optional })\n slash = slash || ''\n return '' + (optional ? '' : slash) + '(?:' + (optional ? slash : '') + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' + (optional || '')\n })\n .replace(/([\\/.])/g, '\\\\$1')\n .replace(/__plus__/g, '(.+)')\n .replace(/\\*/g, '(.*)')\n return {\n path : new RegExp('^' + path + '$', 'i'),\n keys : keys\n }\n}\n\n// ---------------------------------------------------------------------------\n// debounce\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce(func: (...args: any[]) => void, wait = 250): (...args: any[]) => void { // any: debounce wraps arbitrary functions\n let timeout: ReturnType<typeof setTimeout> | undefined\n return (...args: unknown[]) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => { func(...args) }, wait)\n }\n}\n\n// ---------------------------------------------------------------------------\n// wait\n// ---------------------------------------------------------------------------\n\nexport async function wait(time = 0): Promise<void> {\n return new Promise<void>(resolve => {\n setTimeout(() => resolve(), time)\n })\n}\n","/**\n * TsUi registry + checkName — Phase 0 of v2.3 SDD.\n * DEPENDENCY-FREE: zero imports from tsutils/tsbase family.\n *\n * Hosts the mutable widget registry object (TsUi) and the name-validation\n * helper (checkName) that were previously coupled to tsbase.ts via tsutils.ts,\n * creating a tsbase ↔ tsutils import cycle. Moving them here breaks that cycle:\n *\n * tsbase.ts → tsutils-registry.ts → tsutils-type-guards.ts → (leaf)\n *\n * tsutils.ts re-exports TsUi from this module (does NOT re-declare it) to\n * preserve the single-object identity required by INV-12 (referential equality\n * across all import paths).\n *\n * Imports: only isAlphaNumeric from ./tsutils-type-guards.js\n * Exports: TsUi, checkName\n */\n\nimport { isAlphaNumeric } from './tsutils-type-guards.js'\n\n/** Widget registry — widgets register here when constructed with a `name`. */\nexport const TsUi: Record<string, unknown> = {}\n\n/**\n * Validates a widget name and ensures it is not already registered in TsUi.\n * Returns false (with console.log) on invalid or duplicate names.\n * Behavior is byte-identical to former TsUtils.checkName (tsutils.ts:1842-1856).\n */\nexport function checkName(name: string): boolean {\n if (name == null) {\n console.log('ERROR: Property \"name\" is required but not supplied.')\n return false\n }\n if (TsUi[name] != null) {\n console.log(`ERROR: Object named \"${name}\" is already registered as TsUi.${name}.`)\n return false\n }\n if (!isAlphaNumeric(name)) {\n console.log('ERROR: Property \"name\" has to be alpha-numeric (a-z, 0-9, dash and underscore).')\n return false\n }\n return true\n}\n","/* tsgrid-ui query 1.0.0 — DOM helper based on mQuery 0.7 by vitmalina@gmail.com (2014, MIT). */\n\ntype QuerySelector = string | Node | Window | Query | Array<Node | Element> | Iterable<Node | Element> | null | undefined\ntype QueryContext = Document | Element | ShadowRoot | DocumentFragment\n\ninterface EventRecord {\n event: string\n scope: string | undefined\n callback: EventListener\n options: AddEventListenerOptions | boolean | undefined\n}\n\ninterface MQueryData {\n events?: EventRecord[]\n prevDisplay?: string\n [key: string]: unknown\n}\n\n// Extend Node to hold _mQuery data bag\ndeclare global {\n interface Node {\n _mQuery?: MQueryData\n }\n}\n\nclass Query {\n static version: number = 0.8\n context: QueryContext\n nodes: Node[]\n length: number\n [index: number]: Node\n\n constructor(selector: QuerySelector, context?: QueryContext) {\n this.context = context ?? document\n let nodes: Node[] = []\n if (Array.isArray(selector)) {\n nodes = selector\n } else if (selector instanceof Node || selector instanceof Window) { // any html element or Window\n nodes = [selector as Node]\n } else if (selector instanceof Query) {\n nodes = selector.nodes\n } else if (typeof selector == 'string') {\n if (typeof (this.context as Element).querySelector != 'function') {\n throw new Error('Invalid context')\n }\n nodes = Array.from((this.context as Element).querySelectorAll(selector))\n } else if (selector == null) {\n nodes = []\n } else {\n // if selector is itterable, then try to create nodes from it, also supports jQuery\n const arr = Array.from(selector ?? [])\n if (typeof selector == 'object' && Array.isArray(arr)) {\n nodes = arr\n } else {\n throw new Error(`Invalid selector \"${selector}\"`)\n }\n }\n this.nodes = nodes\n this.length = nodes.length\n // map nodes to object properties\n this.each((node, ind) => {\n this[ind] = node\n })\n }\n\n static _fragment(html: string): DocumentFragment {\n const tmpl = document.createElement('template')\n tmpl.innerHTML = html\n tmpl.content.childNodes.forEach(node => {\n const newNode = Query._scriptConvert(node)\n if (newNode != node) {\n tmpl.content.replaceChild(newNode, node)\n }\n })\n return tmpl.content\n }\n\n // innerHTML, append, etc. script tags will not be executed unless they are proper script tags\n static _scriptConvert(node: Node): Node {\n const convert = (txtNode: HTMLScriptElement): HTMLScriptElement => {\n const doc = txtNode.ownerDocument\n const scNode = doc.createElement('script')\n scNode.text = txtNode.text\n const attrs = txtNode.attributes\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i]\n if (attr) scNode.setAttribute(attr.name, attr.value)\n }\n return scNode\n }\n if ((node as Element).tagName == 'SCRIPT') {\n node = convert(node as HTMLScriptElement)\n }\n if ((node as Element).querySelectorAll) {\n (node as Element).querySelectorAll('script').forEach(textNode => {\n textNode.parentNode!.replaceChild(convert(textNode as HTMLScriptElement), textNode)\n })\n }\n return node\n }\n\n static _fixProp(name: string): string {\n const fixes: Record<string, string> = {\n cellpadding: 'cellPadding',\n cellspacing: 'cellSpacing',\n class: 'className',\n colspan: 'colSpan',\n contenteditable: 'contentEditable',\n for: 'htmlFor',\n frameborder: 'frameBorder',\n maxlength: 'maxLength',\n readonly: 'readOnly',\n rowspan: 'rowSpan',\n tabindex: 'tabIndex',\n usemap: 'useMap'\n }\n return fixes[name] ? fixes[name] : name\n }\n\n _insert(method: string, html: string | Query | Node): Query {\n const nodes: Node[] = []\n const len = this.length\n if (len < 1) return this\n // TODO: need good unit test coverage for this function\n // any: callback parameter — caller signature varies; query DOM-traversal accepts arbitrary HTMLElement subclasses at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type AnyNodeMethod = Record<string, ((arg: any) => void) | undefined>\n if (typeof html == 'string') {\n this.each(node => {\n const clone = Query._fragment(html as string)\n nodes.push(...clone.childNodes)\n ;(node as unknown as AnyNodeMethod)[method]?.(clone)\n })\n } else if (html instanceof Query) {\n const single = (len == 1) // if inserting into a single container, then move it there\n html.each(el => {\n this.each(node => {\n // if insert before a single node, just move new one, else clone and move it\n const clone = (single ? el : el.cloneNode(true)) as Node\n nodes.push(clone)\n ;(node as unknown as AnyNodeMethod)[method]?.(clone)\n Query._scriptConvert(clone)\n })\n })\n if (!single) html.remove()\n } else if (html instanceof Node) { // any HTML element\n this.each(node => {\n // if insert before a single node, just move new one, else clone and move it\n const clone: Node | DocumentFragment = (len === 1 ? html : Query._fragment((html as Element).outerHTML))\n nodes.push(...(len === 1 ? [html as Node] : (clone as DocumentFragment).childNodes))\n ;(node as unknown as AnyNodeMethod)[method]?.(clone)\n })\n if (len > 1) (html as Element).remove()\n } else {\n throw new Error(`Incorrect argument for \"${method}(html)\". It expects one string argument.`)\n }\n if (method == 'replaceWith') {\n return new Query(nodes, this.context) // must return a new collection\n }\n return this\n }\n\n _save(node: Node, name: string, value: unknown): void {\n node._mQuery = node._mQuery ?? {}\n if (Array.isArray(value)) {\n (node._mQuery[name] as unknown[]) = (node._mQuery[name] as unknown[]) ?? []\n ;(node._mQuery[name] as unknown[]).push(...value)\n } else if (value != null) {\n node._mQuery[name] = value\n } else {\n delete node._mQuery[name]\n }\n }\n\n get(index?: number): Node | Node[] | null {\n if (index === undefined || index === null) return this.nodes\n if (index < 0) index = this.length + index\n const node = this[index]\n if (node) {\n return node\n }\n return null\n }\n\n eq(index: number): Query {\n if (index < 0) index = this.length + index\n const item = this[index]\n const nodes: Node[] = item != null ? [item] : []\n return new Query(nodes, this.context) // must return a new collection\n }\n\n then(fun: (q: Query) => Query | null | undefined): Query {\n const ret = fun(this)\n return ret != null ? ret : this\n }\n\n find(selector: string): Query {\n const nodes: Node[] = []\n this.each(node => {\n const nn = Array.from((node as Element).querySelectorAll(selector))\n if (nn.length > 0) {\n nodes.push(...nn)\n }\n })\n return new Query(nodes, this.context) // must return a new collection\n }\n\n filter(selector: string | Node | ((node: Node) => boolean)): Query {\n const nodes: Node[] = []\n this.each(node => {\n if (node === selector\n || (typeof selector == 'string' && (node as Element).matches && (node as Element).matches(selector))\n || (typeof selector == 'function' && selector(node))\n ) {\n nodes.push(node)\n }\n })\n return new Query(nodes, this.context) // must return a new collection\n }\n\n next(): Query {\n const nodes: Node[] = []\n this.each(node => {\n const nn = (node as Element).nextElementSibling\n if (nn) { nodes.push(nn) }\n })\n return new Query(nodes, this.context) // must return a new collection\n }\n\n prev(): Query {\n const nodes: Node[] = []\n this.each(node => {\n const nn = (node as Element).previousElementSibling\n if (nn) { nodes.push(nn)}\n })\n return new Query(nodes, this.context) // must return a new collection\n }\n\n shadow(selector?: string): Query {\n const nodes: Node[] = []\n this.each(node => {\n // select shadow root if available\n if ((node as Element).shadowRoot) nodes.push((node as Element).shadowRoot!)\n })\n const col = new Query(nodes, this.context)\n return selector ? col.find(selector) : col\n }\n\n closest(selector: string): Query {\n const nodes: Node[] = []\n this.each(node => {\n const nn = (node as Element).closest(selector)\n if (nn) {\n nodes.push(nn)\n }\n })\n return new Query(nodes, this.context) // must return a new collection\n }\n\n host(all?: boolean): Query {\n const nodes: Node[] = []\n // find shadow root or body\n const top = (node: Node): Node => {\n if (node.parentNode) {\n return top(node.parentNode)\n } else {\n return node\n }\n }\n const fun = (node: Node) => {\n const nn = top(node)\n nodes.push((nn as ShadowRoot).host ? (nn as ShadowRoot).host : nn)\n if ((nn as ShadowRoot).host && all) fun((nn as ShadowRoot).host)\n }\n this.each(node => {\n fun(node)\n })\n return new Query(nodes, this.context) // must return a new collection\n }\n\n parent(selector?: string): Query {\n return this.parents(selector, true)\n }\n\n parents(selector?: string, firstOnly?: boolean): Query {\n const nodes: Node[] = []\n const add = (node: Node) => {\n if (nodes.indexOf(node) == -1) {\n nodes.push(node)\n }\n if (!firstOnly && node.parentNode) {\n return add(node.parentNode)\n }\n }\n this.each(node => {\n if (node.parentNode) add(node.parentNode)\n })\n const col = new Query(nodes, this.context)\n return selector ? col.filter(selector) : col\n }\n\n add(more: Query | Node | Node[]): Query {\n const nodes = more instanceof Query ? more.nodes : (Array.isArray(more) ? more : [more])\n return new Query(this.nodes.concat(nodes), this.context) // must return a new collection\n }\n\n each(func: (node: Node, ind: number, col: Query) => void): Query {\n this.nodes.forEach((node, ind) => { func(node, ind, this) })\n return this\n }\n\n append(html: string | Query | Node): Query {\n return this._insert('append', html)\n }\n\n prepend(html: string | Query | Node): Query {\n return this._insert('prepend', html)\n }\n\n after(html: string | Query | Node): Query {\n return this._insert('after', html)\n }\n\n before(html: string | Query | Node): Query {\n return this._insert('before', html)\n }\n\n replace(html: string | Query | Node): Query {\n return this._insert('replaceWith', html)\n }\n\n remove(): Query {\n // remove from dom, but keep in current query\n this.each(node => { (node as Element).remove() })\n return this\n }\n\n css(key?: string | Record<string, string | number>, value?: string | number): string | Record<string, string> | undefined | Query {\n let css: Record<string, string | number> = typeof key === 'object' ? key : {}\n const len = arguments.length\n if (len === 0 || (len === 1 && typeof key == 'string')) {\n if (this[0]) {\n const st = (this[0] as HTMLElement).style\n // do not do computedStyleMap as it is not what on immediate element\n if (typeof key == 'string') {\n const pri = st.getPropertyPriority(key)\n return st.getPropertyValue(key) + (pri ? '!' + pri : '')\n } else {\n return Object.fromEntries(\n (this[0] as HTMLElement).style.cssText\n .split(';')\n .filter(a => !!a) // filter non-empty\n .map(a => {\n return a.split(':').map(a => a.trim()) // trim strings\n })\n )\n }\n } else {\n return undefined\n }\n } else {\n if (typeof key != 'object') {\n css = {}\n css[key as string] = value as string | number\n }\n this.each((el) => {\n Object.keys(css).forEach(key => {\n const imp = String(css[key]).toLowerCase().includes('!important') ? 'important' : ''\n ;(el as HTMLElement).style.setProperty(key, String(css[key]).replace(/\\!important/i, ''), imp)\n })\n })\n return this\n }\n }\n\n addClass(classes: string): Query {\n this.toggleClass(classes, true)\n return this\n }\n\n removeClass(classes: string | string[] | null): Query {\n this.toggleClass(classes, false)\n return this\n }\n\n toggleClass(classes: string | string[] | null, force?: boolean): Query {\n // split by comma or space\n if (typeof classes == 'string') classes = classes.split(/[,\\s]+/)\n this.each(node => {\n let classes2: string[] | null = classes as string[] | null\n // if not defined, remove all classes\n if (classes2 == null && force === false) classes2 = Array.from((node as Element).classList)\n if (classes2) {\n classes2.forEach(className => {\n if (className !== '') {\n let act: 'toggle' | 'add' | 'remove' = 'toggle'\n if (force != null) act = force ? 'add' : 'remove'\n ;(node as Element).classList[act](className)\n }\n })\n }\n })\n return this\n }\n\n hasClass(classes: string | string[] | null): boolean | string[] {\n // split by comma or space\n if (typeof classes == 'string') classes = classes.split(/[,\\s]+/)\n if (classes == null && this.length > 0) {\n return Array.from((this[0] as Element).classList)\n }\n let ret = false\n this.each(node => {\n ret = ret || (classes as string[]).every(className => {\n return Array.from((node as Element).classList ?? []).includes(className)\n })\n })\n return ret\n }\n\n on(events: string, options: AddEventListenerOptions | EventListener | { delegate?: string } | undefined, callback?: EventListener): Query\n on(events: string, callback: EventListener): Query\n on(events: string, optionsOrCallback: AddEventListenerOptions | EventListener | { delegate?: string } | undefined, callback?: EventListener): Query {\n let options: AddEventListenerOptions | boolean | undefined = undefined\n if (typeof optionsOrCallback == 'function') {\n callback = optionsOrCallback as EventListener\n options = undefined\n } else {\n options = optionsOrCallback as AddEventListenerOptions | undefined\n }\n let delegate: string | undefined\n if ((options as { delegate?: string })?.delegate) {\n delegate = (options as { delegate?: string }).delegate\n delete (options as { delegate?: string }).delegate // not to pass to addEventListener\n }\n const eventsStr = events.split(/[,\\s]+/) // separate by comma or space\n eventsStr.forEach(eventName => {\n const parts = String(eventName).toLowerCase().split('.')\n const event = parts[0] ?? ''\n const scope = parts[1]\n let cb = callback!\n if (delegate) {\n const fun = cb\n cb = (evt: Event) => {\n // event.target or any ancestors match delegate selector\n const parent = (query(evt.target as Element) as Query).parents(delegate)\n if (parent.length > 0) { (evt as unknown as Record<string, unknown>)['delegate'] = parent[0] } else { (evt as unknown as Record<string, unknown>)['delegate'] = evt.target }\n if ((evt.target as Element).matches(delegate!) || parent.length > 0) {\n fun(evt)\n }\n }\n }\n this.each(node => {\n this._save(node, 'events', [{ event, scope, callback: cb, options }])\n node.addEventListener(event, cb, options as AddEventListenerOptions)\n })\n })\n return this\n }\n\n off(events?: string, options?: AddEventListenerOptions | EventListener, callback?: EventListener): Query {\n if (typeof options == 'function') {\n callback = options as EventListener\n options = undefined\n }\n const eventsStr = (events ?? '').split(/[,\\s]+/) // separate by comma or space\n eventsStr.forEach(eventName => {\n const offParts = String(eventName).toLowerCase().split('.')\n const event = offParts[0] ?? ''\n const scope = offParts[1]\n this.each(node => {\n if (Array.isArray(node._mQuery?.events)) {\n for (let i = node._mQuery!.events!.length - 1; i >= 0; i--) {\n const evt = node._mQuery!.events![i]\n if (!evt) continue\n if (scope == null || scope === '') {\n // if no scope, has to be exact match\n if ((evt.event == event || event === '') && (evt.callback == callback || callback == null)) {\n node.removeEventListener(evt.event, evt.callback, evt.options as AddEventListenerOptions)\n node._mQuery!.events!.splice(i, 1)\n }\n } else {\n if ((evt.event == event || event === '') && evt.scope == scope) {\n node.removeEventListener(evt.event, evt.callback, evt.options as AddEventListenerOptions)\n node._mQuery!.events!.splice(i, 1)\n }\n }\n }\n }\n })\n })\n return this\n }\n\n trigger(name: string | Event | CustomEvent, options?: EventInit): Query {\n let event: Event\n const mevent = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove']\n const kevent = ['keydown', 'keyup', 'keypress']\n if (name instanceof Event) {\n // MouseEvent and KeyboardEvent are instances of Event, no need to explicitly add\n event = name\n } else if (mevent.includes(name)) {\n event = new MouseEvent(name, options as MouseEventInit)\n } else if (kevent.includes(name)) {\n event = new KeyboardEvent(name, options as KeyboardEventInit)\n } else {\n event = new Event(name, options)\n }\n this.each(node => { node.dispatchEvent(event) })\n return this\n }\n\n attr(name: string): string | undefined\n attr(name: string | Record<string, string>, value?: string): Query\n attr(name: string | Record<string, string>, value?: string): string | undefined | Query {\n if (value === undefined && typeof name == 'string') {\n return this[0] ? (this[0] as Element).getAttribute(name) ?? undefined : undefined\n } else {\n let obj: Record<string, string> = {}\n if (typeof name == 'object') obj = name; else obj[name] = value!\n this.each(node => {\n Object.entries(obj).forEach(([nm, val]) => { (node as Element).setAttribute(nm, val) })\n })\n return this\n }\n }\n\n removeAttr(...attrs: string[]): Query {\n this.each(node => {\n attrs.forEach(attr => {\n (node as Element).removeAttribute(attr)\n })\n })\n return this\n }\n\n prop(name: string): unknown\n prop(name: string | Record<string, unknown>, value?: unknown): Query\n prop(name: string | Record<string, unknown>, value?: unknown): unknown | Query {\n if (value === undefined && typeof name == 'string') {\n return this[0] ? (this[0] as unknown as Record<string, unknown>)[name] : undefined\n } else {\n let obj: Record<string, unknown> = {}\n if (typeof name == 'object') obj = name; else obj[name] = value\n this.each(node => {\n Object.entries(obj).forEach(([nm, val]) => {\n const prop = Query._fixProp(nm)\n ;(node as unknown as Record<string, unknown>)[prop] = val\n if (prop == 'innerHTML') {\n Query._scriptConvert(node)\n }\n })\n })\n return this\n }\n }\n\n removeProp(...props: string[]): Query {\n this.each(node => {\n props.forEach(prop => { delete (node as unknown as Record<string, unknown>)[Query._fixProp(prop)] })\n })\n return this\n }\n\n data(key?: string | Record<string, unknown>, value?: unknown): unknown | Query {\n if (key instanceof Object && !(typeof key === 'string')) {\n Object.entries(key as Record<string, unknown>).forEach(item => { this.data(item[0], item[1]) })\n return\n }\n if (key && typeof key === 'string' && key.indexOf('-') != -1) {\n console.error(`Key \"${key}\" contains \"-\" (dash). Dashes are not allowed in property names. Use camelCase instead.`)\n }\n if (arguments.length < 2) {\n if (this[0]) {\n const data: Record<string, unknown> = Object.assign({}, (this[0] as HTMLElement).dataset)\n Object.keys(data).forEach(k => {\n const v = data[k] as string\n if (v.startsWith('[') || v.startsWith('{')) {\n try { data[k] = JSON.parse(v) } catch (e) {}\n }\n })\n return key ? data[key as string] : data\n } else {\n return undefined\n }\n } else {\n this.each(node => {\n if (value != null) {\n (node as HTMLElement).dataset[key as string] = value instanceof Object ? JSON.stringify(value) : value as string\n } else {\n delete (node as HTMLElement).dataset[key as string]\n }\n })\n return this\n }\n }\n\n removeData(key: string | string[]): Query {\n if (typeof key == 'string') key = key.split(/[,\\s]+/)\n this.each(node => {\n (key as string[]).forEach(k => { delete (node as HTMLElement).dataset[k] })\n })\n return this\n }\n\n show(): Query {\n return this.toggle(true)\n }\n\n hide(): Query {\n return this.toggle(false)\n }\n\n toggle(force?: boolean): Query {\n return this.each(node => {\n const prev = (node as HTMLElement).style.display\n const dsp = getComputedStyle(node as Element).display\n const isHidden = (prev == 'none' || dsp == 'none')\n if (isHidden && (force == null || force === true)) { // show\n const def = node instanceof HTMLTableRowElement\n ? 'table-row'\n : node instanceof HTMLTableCellElement\n ? 'table-cell'\n : 'block'\n ;(node as HTMLElement).style.display = (node._mQuery?.prevDisplay as string) ?? (prev == dsp && dsp != 'none' ? '' : def)\n this._save(node, 'prevDisplay', null)\n }\n if (!isHidden && (force == null || force === false)) { // hide\n if (dsp != 'none') this._save(node, 'prevDisplay', dsp)\n ;(node as HTMLElement).style.setProperty('display', 'none')\n }\n })\n }\n\n empty(): Query {\n return this.html('') as Query\n }\n\n html(html?: string | HTMLElement): string | Query | undefined {\n if (html instanceof HTMLElement) {\n return (this.empty() as Query).append(html)\n } else {\n return this.prop('innerHTML', html) as Query\n }\n }\n\n text(text?: string): unknown | Query {\n return this.prop('textContent', text)\n }\n\n val(value?: string): unknown | Query {\n return this.prop('value', value) // must be prop\n }\n\n change(): Query {\n return this.trigger('change')\n }\n\n click(): Query {\n return this.trigger('click')\n }\n}\n\n// create a new object each time\nconst query = function (selector: QuerySelector | (() => void), context?: QueryContext): Query | void {\n // if a function, use as onload event\n if (typeof selector == 'function') {\n const fn = selector as () => void\n if (document.readyState == 'complete') {\n fn()\n } else {\n window.addEventListener('load', fn as EventListenerOrEventListenerObject)\n }\n } else {\n return new Query(selector, context)\n }\n}\n// str -> doc-fragment\nquery.html = (str: string): Query => { const frag = Query._fragment(str); return query(frag.children, frag) as Query }\nquery.version = Query.version\nexport { query as $, query as default, query, Query }\n","/**\n * Part of TsUi 2.0 library\n * - Dependencies: TsUtils\n * - on/off/trigger methods id not showing in help\n * - refactored with event object\n *\n * Chanes in 2.0.+\n * - added unmount that cleans up the box\n *\n */\n\nimport { extend } from './tsutils-data.js'\nimport { isPlainObject } from './tsutils-type-guards.js'\nimport { TsUi, checkName } from './tsutils-registry.js'\nimport { query as _query } from './query.js'\n// Cycle break — Phase 0 of v2.3 SDD message-cluster-extraction:\n// tsbase.ts no longer imports from tsutils.ts. The historical \"do NOT rebind TsUi\"\n// warning is preserved here for posterity but is no longer load-bearing — TsUi now\n// comes from tsutils-registry.ts, which is a true leaf module (only imports\n// isAlphaNumeric from tsutils-type-guards.ts). The tsbase ↔ tsutils import cycle\n// is fully severed per design §D.3.\nconst query = _query as (selector: unknown, context?: unknown) => import('./query.js').Query\n\n/**\n * Payload object passed to handlers registered via `.on(eventName, handler)`.\n *\n * IMPORTANT — circular references:\n * `event.owner` points back to the widget that triggered the event, and that\n * widget keeps `activeEvents: TsEvent[]` referencing this same payload.\n * Calling `JSON.stringify(event)` will throw \"Converting circular structure\n * to JSON\". Use `toSafeEvent(event)` from `tsgrid-ui` to extract a\n * serializable subset before storing in reactive state (Angular signals,\n * React state, Pinia/Redux stores, etc.).\n *\n * Note: the per-class declarations like `onSelect: (event: CustomEvent) => void`\n * in TsGrid/TsForm/etc. are historical noise — the runtime always passes a\n * `TsEventPayload`, never a DOM `CustomEvent`. This will be corrected in v2.0.\n */\nexport interface TsEventPayload<TDetail = unknown> {\n type: string | null\n phase: 'before' | 'after' | string\n detail: TDetail & TsEventData\n target: unknown\n object: unknown\n isStopped: boolean\n isCancelled: boolean\n /** Reference to the widget that triggered this event. CIRCULAR — do not serialize. */\n owner: unknown\n /** @internal — Promise resolved when listeners settle; do not depend on shape. */\n complete?: Promise<unknown>\n}\n\nexport interface TsEventData {\n type?: string | null\n target?: unknown\n phase?: string\n object?: unknown\n [key: string]: unknown\n}\n\ninterface TsEventListener {\n name: string\n edata: {\n type: string | null\n execute: string\n onComplete: null\n scope?: string\n handler?: unknown\n [key: string]: unknown\n }\n handler: Function // eslint-disable-line @typescript-eslint/ban-types\n}\n\nclass TsEvent {\n type!: string | null // assigned via Object.assign in constructor\n detail!: TsEventData // assigned via Object.assign in constructor\n owner!: TsBase // assigned via Object.assign in constructor\n target: unknown\n phase!: string // assigned via Object.assign in constructor\n object: unknown\n execute!: null // assigned via Object.assign in constructor\n isStopped!: boolean // assigned via Object.assign in constructor\n isCancelled!: boolean // assigned via Object.assign in constructor\n onComplete!: ((edata: TsEvent) => void) | null // assigned via Object.assign in constructor\n listeners!: Array<(edata: TsEvent) => void> // assigned via Object.assign in constructor\n complete: Promise<TsEvent>\n _resolve!: (value: TsEvent) => void\n _reject!: (reason?: unknown) => void\n\n constructor(owner: TsBase, edata: TsEventData) {\n Object.assign(this, {\n type: edata.type ?? null,\n detail: edata,\n owner,\n target: edata.target ?? null,\n phase: edata.phase ?? 'before',\n object: edata.object ?? null,\n execute: null,\n isStopped: false,\n isCancelled: false,\n onComplete: null,\n listeners: []\n })\n delete edata.type\n delete edata.target\n delete edata.object\n this.complete = new Promise((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n // needed empty catch function so that promise will not show error in the console\n this.complete.catch(() => {})\n }\n\n finish(detail?: Partial<TsEventData>): void {\n if (detail) {\n extend(this.detail, detail)\n }\n this.phase = 'after'\n this.owner.trigger.call(this.owner, this)\n }\n\n done(func: (edata: TsEvent) => void): void {\n this.listeners.push(func)\n }\n\n preventDefault(): void {\n this._reject()\n this.isCancelled = true\n }\n\n stopPropagation(): void {\n this.isStopped = true\n }\n}\n\n/**\n * Extract a JSON-serializable subset of a TsEvent payload, dropping the\n * circular `owner` and `complete` references. Use before storing in\n * Angular signals, React state, Pinia/Redux stores, or any DevTools that\n * snapshots state via JSON.\n *\n * @example\n * grid.on('select', (event) => {\n * this.lastSelection.set(toSafeEvent(event))\n * })\n */\nexport function toSafeEvent<TDetail = unknown>(event: unknown): {\n type: string | null\n phase: string\n detail: TDetail & TsEventData\n isStopped: boolean\n isCancelled: boolean\n} {\n if (typeof event !== 'object' || event === null) {\n return { type: null, phase: 'before', detail: {} as TDetail & TsEventData, isStopped: false, isCancelled: false }\n }\n const ev = event as Record<string, unknown>\n return {\n type: typeof ev['type'] === 'string' ? (ev['type'] as string) : null,\n phase: typeof ev['phase'] === 'string' ? (ev['phase'] as string) : 'before',\n detail: (ev['detail'] ?? {}) as TDetail & TsEventData,\n isStopped: ev['isStopped'] === true,\n isCancelled: ev['isCancelled'] === true,\n }\n}\n\nclass TsBase {\n activeEvents: TsEvent[] = []\n listeners: TsEventListener[] = []\n debug: boolean = false\n name?: string\n box?: HTMLElement | null\n [key: string]: unknown\n\n /**\n * Initializes base object for TsUi, registers it with TsUi object\n *\n * @param {string} name - name of the object\n * @returns\n */\n constructor(name?: string) {\n this.activeEvents = [] // events that are currently processing\n this.listeners = [] // event listeners\n // register globally\n if (typeof name !== 'undefined') {\n if (!checkName(name)) return\n ;(TsUi as Record<string, unknown>)[name] = this\n }\n this.debug = false // if true, will trigger all events\n }\n\n /**\n * Adds event listener, supports event phase and event scoping\n *\n * @param {*} edata - an object or string, if string \"eventName:phase.scope\"\n * @param {*} handler\n * @returns itself\n */\n // eslint-disable-next-line @typescript-eslint/ban-types\n on(events: string | TsEventData | Array<string | TsEventData>, handler: Function): this {\n if (typeof events == 'string') {\n events = events.split(/[,\\s]+/) // separate by comma or space\n } else {\n events = [events as string | TsEventData]\n }\n // any: callback parameter — caller signature varies; TsBase event payload is widget-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (events as Array<any>).forEach((edata: any) => {\n const name = typeof edata == 'string' ? edata : (edata.type + ':' + edata.execute + '.' + edata.scope)\n if (typeof edata == 'string') {\n const [eventName, scope] = edata.split('.')\n const [type, execute] = (eventName ?? '').replace(':complete', ':after').replace(':done', ':after').split(':')\n edata = { type, execute: execute ?? 'before', scope }\n }\n edata = extend({ type: null, execute: 'before', onComplete: null }, edata)\n // errors\n if (!edata.type) { console.log('ERROR: You must specify event type when calling .on() method of '+ this.name); return }\n if (!handler) { console.log('ERROR: You must specify event handler function when calling .on() method of '+ this.name); return }\n if (!Array.isArray(this.listeners)) this.listeners = []\n this.listeners.push({ name, edata, handler } as TsEventListener)\n if (this.debug) {\n console.log('TsBase: add event', { name, edata, handler })\n }\n })\n return this\n }\n\n /**\n * Removes event listener, supports event phase and event scoping\n *\n * @param {*} edata - an object or string, if string \"eventName:phase.scope\"\n * @param {*} handler\n * @returns itself\n */\n // eslint-disable-next-line @typescript-eslint/ban-types\n off(events: string | TsEventData | Array<string | TsEventData>, handler?: Function): this {\n if (typeof events == 'string') {\n events = events.split(/[,\\s]+/) // separate by comma or space\n } else {\n events = [events as string | TsEventData]\n }\n // any: callback parameter — caller signature varies; TsBase event payload is widget-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (events as Array<any>).forEach((edata: any) => {\n const name = typeof edata == 'string' ? edata : (edata.type + ':' + edata.execute + '.' + edata.scope)\n if (typeof edata == 'string') {\n const [eventName, scope] = edata.split('.')\n const [type, execute] = (eventName ?? '').replace(':complete', ':after').replace(':done', ':after').split(':')\n edata = { type: type || '*', execute: execute || '', scope: scope || '' }\n }\n edata = extend({ type: null, execute: null, onComplete: null }, edata)\n // errors\n if (!edata.type && !edata.scope) { console.log('ERROR: You must specify event type when calling .off() method of '+ this.name); return }\n if (!handler) { handler = undefined }\n let count = 0\n // remove listener\n this.listeners = this.listeners.filter(curr => {\n if ( (edata.type === '*' || edata.type === curr.edata.type)\n && (edata.execute === '' || edata.execute === curr.edata.execute)\n && (edata.scope === '' || edata.scope === curr.edata.scope)\n && (edata.handler == null || edata.handler === curr.edata.handler)\n ) {\n count++ // how many listeners removed\n return false\n } else {\n return true\n }\n })\n if (this.debug) {\n console.log(`TsBase: remove event (${count})`, { name, edata, handler })\n }\n })\n return this // needed for chaining\n }\n\n /**\n * Triggers even listeners for a specific event, loops through this.listeners\n *\n * @param {Object} edata - Object\n * @returns modified edata\n *\n * NOTE: `edata` is typed as `any` here intentionally. The method mutates the argument\n * from TsEventData into a TsEvent mid-execution. Runtime type mutation is inherent\n * to the event dispatch pattern. Phase 6 strict tighten will revisit this.\n */\n // any: targeted-any per typing_policy; TsBase event payload is widget-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trigger(eventName: string | TsEventData | TsEvent, edataIn?: TsEventData): TsEvent {\n // any: targeted-any per typing_policy; TsBase event payload is widget-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let edata: any\n if (arguments.length == 1) {\n if (typeof eventName == 'string') {\n edata = { type: eventName, target: this }\n } else {\n edata = eventName\n }\n } else {\n edata = edataIn\n edata.type = eventName\n edata.target = edata.target ?? this\n }\n if (isPlainObject(edata) && edata.phase == 'after') {\n // find event\n edata = this.activeEvents.find((event: TsEvent) => {\n if (event.type == edata.type && event.target == edata.target) {\n return true\n }\n return false\n })\n if (!edata) {\n console.log(`ERROR: Cannot find even handler for \"${edata?.type}\" on \"${edata?.target}\".`)\n return edata\n }\n console.log('NOTICE: This syntax \"edata.trigger({ phase: \\'after\\' })\" is outdated. Use edata.finish() instead.')\n } else if (!(edata instanceof TsEvent)) {\n edata = new TsEvent(this, edata)\n this.activeEvents.push(edata)\n }\n // eslint-disable-next-line @typescript-eslint/ban-types\n let args: string[], fun: Function | undefined, tmp: RegExpExecArray | null\n if (!Array.isArray(this.listeners)) this.listeners = []\n if (this.debug) {\n console.log(`TsBase: trigger \"${edata.type}:${edata.phase}\"`, edata)\n }\n // process events in REVERSE order\n for (let h = this.listeners.length-1; h >= 0; h--) {\n const item = this.listeners[h]\n if (item != null && (item.edata.type === edata.type || item.edata.type === '*') &&\n (item.edata['target'] === edata.target || item.edata['target'] == null) &&\n (item.edata.execute === edata.phase || item.edata.execute === '*' || item.edata['phase'] === '*'))\n {\n // add extra params if there\n Object.keys(item.edata).forEach(key => {\n if (edata[key] == null && item.edata[key] != null) {\n edata[key] = item.edata[key]\n }\n })\n // check handler arguments\n args = []\n tmp = new RegExp(/\\((.*?)\\)/).exec(String(item.handler).split('=>')[0] ?? '')\n if (tmp) args = (tmp[1] ?? '').split(/\\s*,\\s*/)\n if (args.length === 2) {\n item.handler.call(this, edata.target, edata) // old way for back compatibility\n if (this.debug) console.log(' - call (old)', item.handler)\n } else {\n item.handler.call(this, edata) // new way\n if (this.debug) console.log(' - call', item.handler)\n }\n if (edata.isStopped === true || edata.stop === true) return edata // back compatibility edata.stop === true\n }\n }\n // main object events\n const funName = 'on' + edata.type.substr(0,1).toUpperCase() + edata.type.substr(1)\n if (edata.phase === 'before' && typeof (this as Record<string, unknown>)[funName] === 'function') {\n fun = (this as Record<string, unknown>)[funName] as Function // eslint-disable-line @typescript-eslint/ban-types\n // check handler arguments\n args = []\n tmp = new RegExp(/\\((.*?)\\)/).exec(String(fun).split('=>')[0] ?? '')\n if (tmp) args = (tmp[1] ?? '').split(/\\s*,\\s*/)\n if (args.length === 2) {\n fun.call(this, edata.target, edata) // old way for back compatibility\n if (this.debug) console.log(' - call: on[Event] (old)', fun)\n } else {\n fun.call(this, edata) // new way\n if (this.debug) console.log(' - call: on[Event]', fun)\n }\n if (edata.isStopped === true || edata.stop === true) return edata // back compatibility edata.stop === true\n }\n // item object events\n if (edata.object != null && edata.phase === 'before' && typeof (edata.object as Record<string, unknown>)[funName] === 'function') {\n fun = (edata.object as Record<string, unknown>)[funName] as Function // eslint-disable-line @typescript-eslint/ban-types\n // check handler arguments\n args = []\n tmp = new RegExp(/\\((.*?)\\)/).exec(String(fun).split('=>')[0] ?? '')\n if (tmp) args = (tmp[1] ?? '').split(/\\s*,\\s*/)\n if (args.length === 2) {\n fun.call(this, edata.target, edata) // old way for back compatibility\n if (this.debug) console.log(' - call: edata.object (old)', fun)\n } else {\n fun.call(this, edata) // new way\n if (this.debug) console.log(' - call: edata.object', fun)\n }\n if (edata.isStopped === true || edata.stop === true) return edata\n }\n // execute onComplete\n if (edata.phase === 'after') {\n if (typeof edata.onComplete === 'function') edata.onComplete.call(this, edata)\n for (let i = 0; i < edata.listeners.length; i++) {\n if (typeof edata.listeners[i] === 'function') {\n edata.listeners[i].call(this, edata)\n if (this.debug) console.log(' - call: done', fun)\n }\n }\n edata._resolve(edata)\n if (this.debug) {\n console.log(`TsBase: trigger \"${edata.type}:${edata.phase}\"`, edata)\n }\n // clean up activeEvents\n const ind = this.activeEvents.indexOf(edata)\n if (ind !== -1) this.activeEvents.splice(ind, 1)\n }\n return edata\n }\n\n /**\n * This method renders component into the box. It is overwritten in descendents and in this base\n * component it is empty.\n */\n render(_box?: HTMLElement | string | null): void {\n // intentionally left blank\n }\n\n /**\n * Removes all classes that start with tsg-* and sets box to null. It is needed so that control will\n * release the box to be used for other widgets\n */\n unmount(): void {\n const edata = this.trigger('unmount', { target: this.name })\n if (edata.isCancelled) {\n return\n }\n const remove: string[] = []\n // find classes that start with \"tsg-*\"\n if (this.box instanceof HTMLElement) {\n this.box.classList.forEach(cl => {\n if (cl.startsWith('tsg-')) remove.push(cl)\n })\n }\n query(this.box)\n .off() // removes all events attached to this box previously\n .removeClass(remove)\n .removeAttr('name')\n .html('')\n this.box = null\n // event after\n edata.finish()\n }\n}\nexport { TsEvent, TsBase }\nexport type { TsEventListener }\n"],"mappings":";AAUO,SAAS,MAAM,KAAuB;AACzC,QAAM,KAAK;AACX,SAAO,GAAG,KAAK,OAAO,GAAG,CAAC;AAC9B;AAEO,SAAS,MAAM,KAAuB;AACzC,QAAM,KAAK;AACX,SAAO,GAAG,KAAK,OAAO,GAAG,CAAC;AAC9B;AAEO,SAAS,QAAQ,KAAc,UAAwE;AAC1G,MAAI,OAAO,QAAQ,UAAU;AACzB,UAAM,IAAI,QAAQ,IAAI,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,EACtD,QAAQ,SAAS,eAAe,GAAG;AAAA,EAC5C;AACA,UAAQ,OAAO,QAAQ,YAAa,OAAO,QAAQ,YAAY,QAAQ,OAAQ,CAAC,MAAM,OAAO,GAAG,CAAC;AACrG;AAEO,SAAS,QAAQ,KAAc,UAA8G;AAChJ,MAAI,OAAO,QAAQ,YAAY,QAAQ,GAAI,QAAO;AAClD,MAAI,QAAQ,KAAK,QAAQ,EAAG,QAAO;AACnC,QAAM,KAAK;AACX,QAAM,KAAK,IAAI,OAAO,OAAM,GAAG,iBAAiB,OAAO,GAAG,iBAAiB,MAAM,MAC7D,WAAU,GAAG,iBAAiB,OAAO,GAAG,iBAAiB,MAAM,MAC/D,cAAa,GAAG,gBAAe,cAAa,GAAG,iBAAiB,OAAO,GAAG,iBAAiB,MAAM,MAAK,KAAK,GAAG;AAClI,MAAI,OAAO,QAAQ,UAAU;AACzB,UAAM,IAAI,QAAQ,IAAI,OAAO,GAAG,aAAa,GAAG,GAAG,EAAE;AAAA,EACzD;AACA,SAAO,GAAG,KAAK,OAAO,GAAG,CAAC;AAC9B;AAEO,SAAS,MAAM,KAAuB;AACzC,QAAM,KAAK;AACX,SAAO,GAAG,KAAK,OAAO,GAAG,CAAC;AAC9B;AAEO,SAAS,eAAe,KAAuB;AAClD,QAAM,KAAK;AACX,SAAO,GAAG,KAAK,OAAO,GAAG,CAAC;AAC9B;AAEO,SAAS,QAAQ,KAAuB;AAC3C,QAAM,QAAQ;AACd,SAAO,MAAM,KAAK,OAAO,GAAG,CAAC;AACjC;AAEO,SAAS,YAAY,KAAuB;AAC/C,QAAM,KAAK,IAAI,OAAO,sFAGf;AACP,SAAO,GAAG,KAAK,OAAO,GAAG,CAAC;AAC9B;AAEO,SAAS,cAAc,OAAyB;AACnD,MAAI,SAAS,MAAM;AACf,WAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM,mBAAmB;AAC7D,WAAO;AAAA,EACX;AACA,MAAK,MAAkC,gBAAgB,QAAW;AAC9D,WAAO;AAAA,EACX;AACA,QAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,SAAO,UAAU,QAAQ,UAAU,OAAO;AAC9C;;;ACtCO,SAAS,MAAM,KAAc,SAAwC;AACxE,QAAM,OAAiC,OAAO;AAAA,IAC1C,EAAE,WAAW,MAAM,UAAU,MAAM,QAAQ,MAAM,SAAS,CAAC,GAAgC,QAAQ,GAAG;AAAA,IACtG,WAAW,CAAC;AAAA,EAChB;AACA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,UAAM,MAAiB,MAAM,KAAK,GAAG;AACrC,QAAI,QAAQ,CAAC,OAAO,QAAQ;AACxB,UAAI,GAAG,IAAI,MAAM,OAAO,EAAE,WAAW,KAAK,WAAW,UAAU,KAAK,UAAU,QAAQ,KAAK,QAAQ,SAAS,KAAK,SAAS,QAAS,KAAK,SAAU,KAAK,CAAC;AAAA,IAC5J,CAAC;AACD,WAAO;AAAA,EACX,WAAW,cAAc,GAAG,GAAG;AAC3B,UAAM,MAA+B,CAAC;AACtC,WAAO,OAAO,KAAK,GAAG;AAEtB,QAAI,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC7B,WAAK,QAAQ,QAAQ,CAAC,QAAgB;AAAE,eAAO,IAAI,GAAG;AAAA,MAAE,CAAC;AAAA,IAC7D;AACA,WAAO,KAAK,GAAG,EAAE,QAAQ,SAAO;AAC5B,UAAI,OAAO,KAAK,WAAW,cAAc,KAAK,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK,OAAO,CAAC,GAAG;AACtF,YAAI,GAAG,IAAI;AAAA,MACf,OAAO;AACH,YAAI,GAAG,IAAI,MAAM,IAAI,GAAG,GAAG,EAAE,WAAW,KAAK,WAAW,UAAU,KAAK,UAAU,QAAQ,KAAK,QAAQ,SAAS,KAAK,SAAS,QAAQ,KAAK,UAAU,KAAK,SAAS,MAAM,MAAM,IAAI,CAAC;AAAA,MACvL;AACA,UAAI,IAAI,GAAG,MAAM,OAAW,QAAO,IAAI,GAAG;AAAA,IAC9C,CAAC;AACD,WAAO;AAAA,EACX,OAAO;AACH,QAAK,eAAe,YAAY,CAAC,KAAK,aAC1B,eAAe,QAAQ,CAAC,KAAK,YAC7B,eAAe,SAAS,CAAC,KAAK,QACxC;AAEE,aAAO;AAAA,IACX,OAAO;AAEH,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;AAWO,SAAS,OAAO,QAAa,WAAgB,MAAsB;AACtE,MAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,aAAO,OAAO,GAAG,OAAO,MAAM;AAC9B,aAAO,QAAQ,OAAK;AAAE,eAAO,KAAK,MAAM,CAAC,CAAC;AAAA,MAAE,CAAC;AAAA,IACjD,OAAO;AACH,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D;AAAA,EACJ,WAAW,kBAAkB,QAAQ,kBAAkB,OAAO;AAC1D,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAClE,WAAW,UAAU,OAAO,UAAU,YAAY,UAAU,MAAM;AAC9D,QAAI,OAAO,UAAU,UAAU;AAC3B,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACrE;AACA,WAAO,KAAK,MAAM,EAAE,QAAQ,SAAO;AAC/B,UAAI,OAAO,GAAG,KAAK,QAAQ,OAAO,OAAO,GAAG,KAAK,YACtC,OAAO,GAAG,KAAK,QAAQ,OAAO,OAAO,GAAG,KAAK,UAAU;AAC9D,cAAM,MAAM,MAAM,OAAO,GAAG,CAAC;AAE7B,YAAI,OAAO,GAAG,aAAa,QAAQ,OAAO,GAAG,aAAa,OAAO;AAC7D,iBAAO,GAAG,IAAI;AAAA,QAClB,OAAO;AAEH,cAAI,MAAM,QAAQ,OAAO,GAAG,CAAC,KAAK,cAAc,GAAG,GAAG;AAClD,mBAAO,GAAG,IAAI,CAAC;AAAA,UACnB;AACA,iBAAO,OAAO,GAAG,GAAG,GAAG;AAAA,QAC3B;AAAA,MACJ,OAAO;AACH,eAAO,GAAG,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,MACnC;AAAA,IACJ,CAAC;AAAA,EACL,WAAW,UAAU,MAAM;AACvB,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC9E;AAEA,MAAI,KAAK,SAAS,GAAG;AACjB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,aAAO,QAAQ,KAAK,CAAC,CAAC;AAAA,IAC1B;AAAA,EACJ;AACA,SAAO;AACX;AAoBO,SAAS,eAAe,GAAY,GAAoB;AAC3D,MAAI,IAAY,GAAG,QAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO;AAElE,QAAM,WAAY,OAA8C,UAAU;AAE1E,WAAS,QAAQ,KAAa,KAAa,MAAuB;AAC9D,QAAI,MAAM;AACN,WAAK,IAAI,KAAM,OAAO,QAAQ,KAAK,CAAC,GAAK,OAAO,MAAM,OAAO,KAAK,GAAE;AACpE,aAAO,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC;AAAA,IAChC;AACA,QAAI,IAAY,WAAW,SAAS,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI;AAC/D,WAAO,IAAI,KAAK,IAAI,MAAO,IAAI,IAAI,WAAW,GAAG,KAAK,GAAI,IAAI,MAAM,IAAI,OAAO,IACzE,IAAI,KAAK,KACT,IAAI,KAAK,IAAI,IACb,IAAI,KAAK,IAAI,KACb,IAAI,KAAK,IAAI,KACb,IAAI,KAAK,IAAI,KACb,IAAI,KAAK,IAAI,KACb,IAAI,MAAM,IAAI,IACd,IAAI;AAAA,EACd;AAEA,QAAM,OAAO,KAAK,GAAG,OAAO,KAAK;AACjC,MAAI,QAAQ,KAAM,QAAM,SAAQ;AAC5B,YAAQ,QAAQ,MAAM,MAAM;AAC5B,YAAQ,QAAQ,MAAM,MAAM;AAE5B,QAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,IAAI;AACtD,cAAQ,QAAQ,MAAM,MAAM,IAAI;AAChC,cAAQ,QAAQ,MAAM,MAAM,OAAO,CAAC;AACpC,aAAQ;AAAA,IACZ;AAEA,QAAI,SAAS,MAAO,QAAQ,QAAQ,QAAS,KAAK;AAAA,EACtD;AACA,SAAO;AACX;AAOO,SAAS,UAAU,KAAU,MAAoB;AACpD,MAAI;AACJ,MAAI;AACA,UAAM;AACN,UAAM,MAAM,OAAO,IAAI,EAAE,MAAM,GAAG;AAClC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAEjC,YAAO,IAAY,IAAI,CAAC,KAAK,EAAE;AAAA,IACnC;AAAA,EACJ,SAAS,OAAO;AACZ,UAAM;AAAA,EACV;AACA,SAAO;AACX;AAYO,SAAS,SAAS,MAAe,UAA6B,CAAC,GAAsB;AACxF,MAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,SAAK,QAAQ,CAAC,IAAI,MAAM;AACpB,UAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UAAU;AAClD,aAAK,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,OAAO,EAAE,EAAE;AAAA,MACzC,WAAW,MAAM,MAAM;AACnB,YAAI,QAAQ,WAAW,MAAM;AACzB,cAAI,MAAM,UAAU,IAAI,QAAQ,QAAQ,EAAE;AAC1C,cAAI,QAAQ,QAAQ,MAAM,QAAQ,OAAO,MAAM;AAC3C,eAAG,KAAK;AAAA,UACZ;AACA,gBAAM,UAAU,IAAI,QAAQ,QAAQ,IAAI;AACxC,cAAI,QAAQ,QAAQ,QAAQ,QAAQ,KAAK;AACrC,eAAG,OAAO;AAAA,UACd;AAAA,QACJ;AACA,YAAI,GAAG,WAAW,QAAQ,GAAG,QAAQ,KAAM,IAAG,OAAO,GAAG;AACxD,YAAI,GAAG,QAAQ,QAAQ,GAAG,MAAM,KAAM,IAAG,KAAK,GAAG;AACjD,YAAI,GAAG,QAAQ,QAAQ,GAAG,MAAM,KAAM,IAAG,OAAO,GAAG;AAAA,MACvD,OAAO;AACH,aAAK,CAAC,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MACvC;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX,WAAW,OAAO,SAAS,YAAY;AAEnC,UAAM,UAAU,KAAK,MAAM,OAAO;AAClC,WAAO,SAAS,SAAS,OAAO;AAAA,EACpC,WAAW,OAAO,SAAS,YAAY,SAAS,MAAM;AAClD,UAAM,UAAU;AAChB,WAAO,OAAO,KAAK,OAAO,EAAE,IAAI,SAAO;AAAE,aAAO,EAAE,IAAI,KAAK,MAAM,OAAO,QAAQ,GAAG,KAAK,EAAE,EAAE;AAAA,IAAE,CAAC;AAAA,EACnG;AACJ;AAOO,SAAS,aAAa,KAAU,SAAS,IAAY;AACxD,MAAI,MAAM;AACV,SAAO,KAAK,GAAG,EAAE,QAAQ,SAAO;AAC5B,QAAI,OAAO,GAAI,QAAO;AACtB,QAAI,OAAO,IAAI,GAAG,KAAK,UAAU;AAC7B,aAAO,aAAa,IAAI,GAAG,GAAG,SAAS,OAAO,SAAS,MAAM,MAAM,GAAG;AAAA,IAC1E,OAAO;AACH,aAAO,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC;AAAA,IAC1D;AAAA,EACJ,CAAC;AACD,SAAO;AACX;AAWO,SAAS,cAAc,KAAU,cAAuC,SAAkC,iBAAkD;AAC/J,QAAM,WAAY,UAAU,UAAU,KAA4B;AAClE,MAAI,aAAa,aAAa,MAAM;AACpC,eAAa,QAAQ,IAAI,OAAO,aAAa,QAAQ,CAAC,EAAE,YAAY;AACpE,UAAQ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMd,KAAK;AAAA,IACL,KAAK,eAAe;AAChB,UAAI,CAAC,QAAQ,OAAO,QAAQ,EAAE,SAAS,OAAO,aAAa,QAAQ,CAAC,CAAC,GAAG;AACpE;AAAC,QAAC,aAAa,SAAS,EAA6B,cAAc,IAAI;AAAA,MAC3E;AACA,UAAI,OAAO,aAAa,QAAQ,CAAC,KAAK,OAAO;AAGzC,YAAK,YAAoB,gBAAgB;AACrC,uBAAa,EAAE,SAAS,WAAW;AAAA,QACvC;AACA,oBAAY;AAAA,MAChB;AACA;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,QAAQ;AACT,UAAI,OAAO,aAAa,QAAQ,CAAC,KAAK,OAAO;AACzC,YAAI,YAAY,UAAU,aAAa,YAAY;AAC/C,uBAAa,EAAE,SAAS,WAAW;AAAA,QACvC;AACA,oBAAY;AAAA,MAChB,OAAO;AACH;AAAC,QAAC,aAAa,SAAS,EAA6B,cAAc,IAAI;AACvE,qBAAa,QAAQ,IAAI;AAAA,MAC7B;AACA;AAAA,IACJ;AAAA,IACA,SAAS;AACL,UAAI,OAAO,YAAY,YAAY;AAE/B,uBAAgB,SAAoH,KAAK,cAAc,OAAO;AAAA,MAClK,OAAO;AACH,gBAAQ,IAAI,gCAAgC,QAAQ,2JAA2J;AAAA,MACnN;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,aAAa,MAAM,KAAK,MAAM;AAC9B,iBAAa,MAAM,IAAI,OAAO,aAAa,MAAM,KAAK,WAAW,aAAa,MAAM,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,EAC/H;AACA,SAAO;AAEP,WAAS,cAAc;AACnB,UAAM,KAAK;AACX,WAAO,KAAK,EAAE,EAAE,QAAQ,SAAO;AAC3B,UAAI,QAAiB,GAAG,GAAG;AAC3B,UAAI,OAAO,SAAS,SAAU,SAAQ,KAAK,UAAU,KAAK;AAC1D,UAAI,aAAa,OAAO,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,IACpD,CAAC;AACD,WAAO,aAAa,MAAM;AAAA,EAC9B;AACJ;AAMO,SAAS,WAAW,OAA8E;AACrG,QAAM,OAA8C,CAAC;AACrD,QAAM,OAAO,MACR,QAAQ,SAAS,MAAM,EACvB,QAAQ,OAAO,UAAU,EAEzB,QAAQ,wCAAwC,CAAC,GAAQ,OAAY,QAAa,KAAU,SAAc,aAAkB;AACzH,SAAK,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC,CAAE,SAAS,CAAC;AAC9C,YAAQ,SAAS;AACjB,WAAO,MAAM,WAAW,KAAK,SAAS,SAAS,WAAW,QAAQ,OAAO,UAAU,OAAO,YAAY,UAAU,eAAe,eAAe,OAAO,YAAY;AAAA,EACrK,CAAC,EACA,QAAQ,YAAY,MAAM,EAC1B,QAAQ,aAAa,MAAM,EAC3B,QAAQ,OAAO,MAAM;AAC1B,SAAO;AAAA,IACH,MAAQ,IAAI,OAAO,MAAM,OAAO,KAAK,GAAG;AAAA,IACxC;AAAA,EACJ;AACJ;AAOO,SAAS,SAAS,MAAgCA,QAAO,KAA+B;AAC3F,MAAI;AACJ,SAAO,IAAI,SAAoB;AAC3B,iBAAa,OAAO;AACpB,cAAU,WAAW,MAAM;AAAE,WAAK,GAAG,IAAI;AAAA,IAAE,GAAGA,KAAI;AAAA,EACtD;AACJ;AAMA,eAAsB,KAAK,OAAO,GAAkB;AAChD,SAAO,IAAI,QAAc,aAAW;AAChC,eAAW,MAAM,QAAQ,GAAG,IAAI;AAAA,EACpC,CAAC;AACL;;;ACrXO,IAAM,OAAgC,CAAC;AAOvC,SAAS,UAAU,MAAuB;AAC7C,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,sDAAsD;AAClE,WAAO;AAAA,EACX;AACA,MAAI,KAAK,IAAI,KAAK,MAAM;AACpB,YAAQ,IAAI,wBAAwB,IAAI,mCAAmC,IAAI,GAAG;AAClF,WAAO;AAAA,EACX;AACA,MAAI,CAAC,eAAe,IAAI,GAAG;AACvB,YAAQ,IAAI,iFAAiF;AAC7F,WAAO;AAAA,EACX;AACA,SAAO;AACX;;;ACjBA,IAAM,QAAN,MAAM,OAAM;AAAA,EACR,OAAO,UAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EAGA,YAAY,UAAyB,SAAwB;AACzD,SAAK,UAAU,WAAW;AAC1B,QAAI,QAAgB,CAAC;AACrB,QAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,cAAQ;AAAA,IACZ,WAAW,oBAAoB,QAAQ,oBAAoB,QAAQ;AAC/D,cAAQ,CAAC,QAAgB;AAAA,IAC7B,WAAW,oBAAoB,QAAO;AAClC,cAAQ,SAAS;AAAA,IACrB,WAAW,OAAO,YAAY,UAAU;AACpC,UAAI,OAAQ,KAAK,QAAoB,iBAAiB,YAAY;AAC9D,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACrC;AACA,cAAQ,MAAM,KAAM,KAAK,QAAoB,iBAAiB,QAAQ,CAAC;AAAA,IAC3E,WAAW,YAAY,MAAM;AACzB,cAAQ,CAAC;AAAA,IACb,OAAO;AAEH,YAAM,MAAM,MAAM,KAAK,YAAY,CAAC,CAAC;AACrC,UAAI,OAAO,YAAY,YAAY,MAAM,QAAQ,GAAG,GAAG;AACnD,gBAAQ;AAAA,MACZ,OAAO;AACH,cAAM,IAAI,MAAM,qBAAqB,QAAQ,GAAG;AAAA,MACpD;AAAA,IACJ;AACA,SAAK,QAAQ;AACb,SAAK,SAAS,MAAM;AAEpB,SAAK,KAAK,CAAC,MAAM,QAAQ;AACrB,WAAK,GAAG,IAAI;AAAA,IAChB,CAAC;AAAA,EACL;AAAA,EAEA,OAAO,UAAU,MAAgC;AAC7C,UAAM,OAAO,SAAS,cAAc,UAAU;AAC9C,SAAK,YAAY;AACjB,SAAK,QAAQ,WAAW,QAAQ,UAAQ;AACpC,YAAM,UAAU,OAAM,eAAe,IAAI;AACzC,UAAI,WAAW,MAAM;AACjB,aAAK,QAAQ,aAAa,SAAS,IAAI;AAAA,MAC3C;AAAA,IACJ,CAAC;AACD,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,OAAO,eAAe,MAAkB;AACpC,UAAM,UAAU,CAAC,YAAkD;AAC/D,YAAM,MAAM,QAAQ;AACpB,YAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,aAAO,OAAO,QAAQ;AACtB,YAAM,QAAQ,QAAQ;AACtB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,cAAM,OAAO,MAAM,CAAC;AACpB,YAAI,KAAM,QAAO,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,MACvD;AACA,aAAO;AAAA,IACX;AACA,QAAK,KAAiB,WAAW,UAAU;AACvC,aAAO,QAAQ,IAAyB;AAAA,IAC5C;AACA,QAAK,KAAiB,kBAAkB;AACpC,MAAC,KAAiB,iBAAiB,QAAQ,EAAE,QAAQ,cAAY;AAC7D,iBAAS,WAAY,aAAa,QAAQ,QAA6B,GAAG,QAAQ;AAAA,MACtF,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,SAAS,MAAsB;AAClC,UAAM,QAAgC;AAAA,MAClC,aAAa;AAAA,MACb,aAAa;AAAA,MACb,OAAO;AAAA,MACP,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,KAAK;AAAA,MACL,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,IACZ;AACA,WAAO,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,EACvC;AAAA,EAEA,QAAQ,QAAgB,MAAoC;AACxD,UAAM,QAAgB,CAAC;AACvB,UAAM,MAAO,KAAK;AAClB,QAAI,MAAM,EAAG,QAAO;AAKpB,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,KAAK,UAAQ;AACd,cAAMC,SAAQ,OAAM,UAAU,IAAc;AAC5C,cAAM,KAAK,GAAGA,OAAM,UAAU;AAC7B,QAAC,KAAkC,MAAM,IAAIA,MAAK;AAAA,MACvD,CAAC;AAAA,IACL,WAAW,gBAAgB,QAAO;AAC9B,YAAM,SAAU,OAAO;AACvB,WAAK,KAAK,QAAM;AACZ,aAAK,KAAK,UAAQ;AAEd,gBAAMA,SAAS,SAAS,KAAK,GAAG,UAAU,IAAI;AAC9C,gBAAM,KAAKA,MAAK;AACf,UAAC,KAAkC,MAAM,IAAIA,MAAK;AACnD,iBAAM,eAAeA,MAAK;AAAA,QAC9B,CAAC;AAAA,MACL,CAAC;AACD,UAAI,CAAC,OAAQ,MAAK,OAAO;AAAA,IAC7B,WAAW,gBAAgB,MAAM;AAC7B,WAAK,KAAK,UAAQ;AAEd,cAAMA,SAAkC,QAAQ,IAAI,OAAO,OAAM,UAAW,KAAiB,SAAS;AACtG,cAAM,KAAK,GAAI,QAAQ,IAAI,CAAC,IAAY,IAAKA,OAA2B,UAAW;AAClF,QAAC,KAAkC,MAAM,IAAIA,MAAK;AAAA,MACvD,CAAC;AACD,UAAI,MAAM,EAAG,CAAC,KAAiB,OAAO;AAAA,IAC1C,OAAO;AACH,YAAM,IAAI,MAAM,2BAA2B,MAAM,0CAA0C;AAAA,IAC/F;AACA,QAAI,UAAU,eAAe;AACzB,aAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,MAAY,MAAc,OAAsB;AAClD,SAAK,UAAU,KAAK,WAAW,CAAC;AAChC,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,MAAC,KAAK,QAAQ,IAAI,IAAmB,KAAK,QAAQ,IAAI,KAAmB,CAAC;AACzE,MAAC,KAAK,QAAQ,IAAI,EAAgB,KAAK,GAAG,KAAK;AAAA,IACpD,WAAW,SAAS,MAAM;AACtB,WAAK,QAAQ,IAAI,IAAI;AAAA,IACzB,OAAO;AACH,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC5B;AAAA,EACJ;AAAA,EAEA,IAAI,OAAsC;AACtC,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO,KAAK;AACvD,QAAI,QAAQ,EAAG,SAAQ,KAAK,SAAS;AACrC,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,MAAM;AACN,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEA,GAAG,OAAsB;AACrB,QAAI,QAAQ,EAAG,SAAQ,KAAK,SAAS;AACrC,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,QAAgB,QAAQ,OAAO,CAAC,IAAI,IAAI,CAAC;AAC/C,WAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,KAAK,KAAoD;AACrD,UAAM,MAAM,IAAI,IAAI;AACpB,WAAO,OAAO,OAAO,MAAM;AAAA,EAC/B;AAAA,EAEA,KAAK,UAAyB;AAC1B,UAAM,QAAgB,CAAC;AACvB,SAAK,KAAK,UAAQ;AACd,YAAM,KAAK,MAAM,KAAM,KAAiB,iBAAiB,QAAQ,CAAC;AAClE,UAAI,GAAG,SAAS,GAAG;AACf,cAAM,KAAK,GAAG,EAAE;AAAA,MACpB;AAAA,IACJ,CAAC;AACD,WAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,OAAO,UAA4D;AAC/D,UAAM,QAAgB,CAAC;AACvB,SAAK,KAAK,UAAQ;AACd,UAAI,SAAS,YACL,OAAO,YAAY,YAAa,KAAiB,WAAY,KAAiB,QAAQ,QAAQ,KAC9F,OAAO,YAAY,cAAc,SAAS,IAAI,GACpD;AACE,cAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACJ,CAAC;AACD,WAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,OAAc;AACV,UAAM,QAAgB,CAAC;AACvB,SAAK,KAAK,UAAQ;AACd,YAAM,KAAM,KAAiB;AAC7B,UAAI,IAAI;AAAE,cAAM,KAAK,EAAE;AAAA,MAAE;AAAA,IAC7B,CAAC;AACD,WAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,OAAc;AACV,UAAM,QAAgB,CAAC;AACvB,SAAK,KAAK,UAAQ;AACd,YAAM,KAAM,KAAiB;AAC7B,UAAI,IAAI;AAAE,cAAM,KAAK,EAAE;AAAA,MAAC;AAAA,IAC5B,CAAC;AACD,WAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,OAAO,UAA0B;AAC7B,UAAM,QAAgB,CAAC;AACvB,SAAK,KAAK,UAAQ;AAEd,UAAK,KAAiB,WAAY,OAAM,KAAM,KAAiB,UAAW;AAAA,IAC9E,CAAC;AACD,UAAM,MAAM,IAAI,OAAM,OAAO,KAAK,OAAO;AACzC,WAAO,WAAW,IAAI,KAAK,QAAQ,IAAI;AAAA,EAC3C;AAAA,EAEA,QAAQ,UAAyB;AAC7B,UAAM,QAAgB,CAAC;AACvB,SAAK,KAAK,UAAQ;AACd,YAAM,KAAM,KAAiB,QAAQ,QAAQ;AAC7C,UAAI,IAAI;AACJ,cAAM,KAAK,EAAE;AAAA,MACjB;AAAA,IACJ,CAAC;AACD,WAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,KAAK,KAAsB;AACvB,UAAM,QAAgB,CAAC;AAEvB,UAAM,MAAM,CAAC,SAAqB;AAC9B,UAAI,KAAK,YAAY;AACjB,eAAO,IAAI,KAAK,UAAU;AAAA,MAC9B,OAAO;AACH,eAAO;AAAA,MACX;AAAA,IACJ;AACA,UAAM,MAAM,CAAC,SAAe;AACxB,YAAM,KAAK,IAAI,IAAI;AACnB,YAAM,KAAM,GAAkB,OAAQ,GAAkB,OAAO,EAAE;AACjE,UAAK,GAAkB,QAAQ,IAAK,KAAK,GAAkB,IAAI;AAAA,IACnE;AACA,SAAK,KAAK,UAAQ;AACd,UAAI,IAAI;AAAA,IACZ,CAAC;AACD,WAAO,IAAI,OAAM,OAAO,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,OAAO,UAA0B;AAC7B,WAAO,KAAK,QAAQ,UAAU,IAAI;AAAA,EACtC;AAAA,EAEA,QAAQ,UAAmB,WAA4B;AACnD,UAAM,QAAgB,CAAC;AACvB,UAAM,MAAM,CAAC,SAAe;AACxB,UAAI,MAAM,QAAQ,IAAI,KAAK,IAAI;AAC3B,cAAM,KAAK,IAAI;AAAA,MACnB;AACA,UAAI,CAAC,aAAa,KAAK,YAAY;AAC/B,eAAO,IAAI,KAAK,UAAU;AAAA,MAC9B;AAAA,IACJ;AACA,SAAK,KAAK,UAAQ;AACd,UAAI,KAAK,WAAY,KAAI,KAAK,UAAU;AAAA,IAC5C,CAAC;AACD,UAAM,MAAM,IAAI,OAAM,OAAO,KAAK,OAAO;AACzC,WAAO,WAAW,IAAI,OAAO,QAAQ,IAAI;AAAA,EAC7C;AAAA,EAEA,IAAI,MAAoC;AACpC,UAAM,QAAQ,gBAAgB,SAAQ,KAAK,QAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACtF,WAAO,IAAI,OAAM,KAAK,MAAM,OAAO,KAAK,GAAG,KAAK,OAAO;AAAA,EAC3D;AAAA,EAEA,KAAK,MAA4D;AAC7D,SAAK,MAAM,QAAQ,CAAC,MAAM,QAAQ;AAAE,WAAK,MAAM,KAAK,IAAI;AAAA,IAAE,CAAC;AAC3D,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,MAAoC;AACvC,WAAO,KAAK,QAAQ,UAAU,IAAI;AAAA,EACtC;AAAA,EAEA,QAAQ,MAAoC;AACxC,WAAO,KAAK,QAAQ,WAAW,IAAI;AAAA,EACvC;AAAA,EAEA,MAAM,MAAoC;AACtC,WAAO,KAAK,QAAQ,SAAS,IAAI;AAAA,EACrC;AAAA,EAEA,OAAO,MAAoC;AACvC,WAAO,KAAK,QAAQ,UAAU,IAAI;AAAA,EACtC;AAAA,EAEA,QAAQ,MAAoC;AACxC,WAAO,KAAK,QAAQ,eAAe,IAAI;AAAA,EAC3C;AAAA,EAEA,SAAgB;AAEZ,SAAK,KAAK,UAAQ;AAAE,MAAC,KAAiB,OAAO;AAAA,IAAE,CAAC;AAChD,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,KAAgD,OAA8E;AAC9H,QAAI,MAAuC,OAAO,QAAQ,WAAW,MAAM,CAAC;AAC5E,UAAM,MAAM,UAAU;AACtB,QAAI,QAAQ,KAAM,QAAQ,KAAK,OAAO,OAAO,UAAW;AACpD,UAAI,KAAK,CAAC,GAAG;AACT,cAAM,KAAM,KAAK,CAAC,EAAkB;AAEpC,YAAI,OAAO,OAAO,UAAU;AACxB,gBAAM,MAAM,GAAG,oBAAoB,GAAG;AACtC,iBAAO,GAAG,iBAAiB,GAAG,KAAK,MAAM,MAAM,MAAM;AAAA,QACzD,OAAO;AACH,iBAAO,OAAO;AAAA,YACT,KAAK,CAAC,EAAkB,MAAM,QAC1B,MAAM,GAAG,EACT,OAAO,OAAK,CAAC,CAAC,CAAC,EACf,IAAI,OAAK;AACN,qBAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAAC,OAAKA,GAAE,KAAK,CAAC;AAAA,YACzC,CAAC;AAAA,UACT;AAAA,QACJ;AAAA,MACJ,OAAO;AACH,eAAO;AAAA,MACX;AAAA,IACJ,OAAO;AACH,UAAI,OAAO,OAAO,UAAU;AACxB,cAAM,CAAC;AACP,YAAI,GAAa,IAAI;AAAA,MACzB;AACA,WAAK,KAAK,CAAC,OAAO;AACd,eAAO,KAAK,GAAG,EAAE,QAAQ,CAAAC,SAAO;AAC5B,gBAAM,MAAM,OAAO,IAAIA,IAAG,CAAC,EAAE,YAAY,EAAE,SAAS,YAAY,IAAI,cAAc;AACjF,UAAC,GAAmB,MAAM,YAAYA,MAAK,OAAO,IAAIA,IAAG,CAAC,EAAE,QAAQ,gBAAgB,EAAE,GAAG,GAAG;AAAA,QACjG,CAAC;AAAA,MACL,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,SAAS,SAAwB;AAC7B,SAAK,YAAY,SAAS,IAAI;AAC9B,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,SAA0C;AAClD,SAAK,YAAY,SAAS,KAAK;AAC/B,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,SAAmC,OAAwB;AAEnE,QAAI,OAAO,WAAW,SAAU,WAAU,QAAQ,MAAM,QAAQ;AAChE,SAAK,KAAK,UAAQ;AACd,UAAI,WAA4B;AAEhC,UAAI,YAAY,QAAQ,UAAU,MAAO,YAAW,MAAM,KAAM,KAAiB,SAAS;AAC1F,UAAI,UAAU;AACV,iBAAS,QAAQ,eAAa;AAC1B,cAAI,cAAc,IAAI;AAClB,gBAAI,MAAmC;AACvC,gBAAI,SAAS,KAAM,OAAM,QAAQ,QAAQ;AACxC,YAAC,KAAiB,UAAU,GAAG,EAAE,SAAS;AAAA,UAC/C;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,SAAS,SAAuD;AAE5D,QAAI,OAAO,WAAW,SAAU,WAAU,QAAQ,MAAM,QAAQ;AAChE,QAAI,WAAW,QAAQ,KAAK,SAAS,GAAG;AACpC,aAAO,MAAM,KAAM,KAAK,CAAC,EAAc,SAAS;AAAA,IACpD;AACA,QAAI,MAAM;AACV,SAAK,KAAK,UAAQ;AACd,YAAM,OAAQ,QAAqB,MAAM,eAAa;AAClD,eAAO,MAAM,KAAM,KAAiB,aAAa,CAAC,CAAC,EAAE,SAAS,SAAS;AAAA,MAC3E,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAIA,GAAG,QAAgB,mBAAgG,UAAiC;AAChJ,QAAI,UAAyD;AAC7D,QAAI,OAAO,qBAAqB,YAAY;AACxC,iBAAW;AACX,gBAAU;AAAA,IACd,OAAO;AACH,gBAAU;AAAA,IACd;AACA,QAAI;AACJ,QAAK,SAAmC,UAAU;AAC9C,iBAAY,QAAkC;AAC9C,aAAQ,QAAkC;AAAA,IAC9C;AACA,UAAM,YAAY,OAAO,MAAM,QAAQ;AACvC,cAAU,QAAQ,eAAa;AAC3B,YAAM,QAAQ,OAAO,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG;AACvD,YAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,YAAM,QAAQ,MAAM,CAAC;AACrB,UAAI,KAAK;AACT,UAAI,UAAU;AACV,cAAM,MAAM;AACZ,aAAK,CAAC,QAAe;AAEjB,gBAAM,SAAU,MAAM,IAAI,MAAiB,EAAY,QAAQ,QAAQ;AACvE,cAAI,OAAO,SAAS,GAAG;AAAE,YAAC,IAA2C,UAAU,IAAI,OAAO,CAAC;AAAA,UAAE,OAAO;AAAE,YAAC,IAA2C,UAAU,IAAI,IAAI;AAAA,UAAO;AAC3K,cAAK,IAAI,OAAmB,QAAQ,QAAS,KAAK,OAAO,SAAS,GAAG;AACjE,gBAAI,GAAG;AAAA,UACX;AAAA,QACJ;AAAA,MACJ;AACA,WAAK,KAAK,UAAQ;AACd,aAAK,MAAM,MAAM,UAAU,CAAC,EAAE,OAAO,OAAO,UAAU,IAAI,QAAQ,CAAC,CAAC;AACpE,aAAK,iBAAiB,OAAO,IAAI,OAAkC;AAAA,MACvE,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAiB,SAAmD,UAAiC;AACrG,QAAI,OAAO,WAAW,YAAY;AAC9B,iBAAW;AACX,gBAAU;AAAA,IACd;AACA,UAAM,aAAa,UAAU,IAAI,MAAM,QAAQ;AAC/C,cAAU,QAAQ,eAAa;AAC3B,YAAM,WAAW,OAAO,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG;AAC1D,YAAM,QAAQ,SAAS,CAAC,KAAK;AAC7B,YAAM,QAAQ,SAAS,CAAC;AACxB,WAAK,KAAK,UAAQ;AACd,YAAI,MAAM,QAAQ,KAAK,SAAS,MAAM,GAAG;AACrC,mBAAS,IAAI,KAAK,QAAS,OAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AACxD,kBAAM,MAAM,KAAK,QAAS,OAAQ,CAAC;AACnC,gBAAI,CAAC,IAAK;AACV,gBAAI,SAAS,QAAQ,UAAU,IAAI;AAE/B,mBAAK,IAAI,SAAS,SAAS,UAAU,QAAQ,IAAI,YAAY,YAAY,YAAY,OAAO;AACxF,qBAAK,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,OAAkC;AACxF,qBAAK,QAAS,OAAQ,OAAO,GAAG,CAAC;AAAA,cACrC;AAAA,YACJ,OAAO;AACH,mBAAK,IAAI,SAAS,SAAS,UAAU,OAAO,IAAI,SAAS,OAAO;AAC5D,qBAAK,oBAAoB,IAAI,OAAO,IAAI,UAAU,IAAI,OAAkC;AACxF,qBAAK,QAAS,OAAQ,OAAO,GAAG,CAAC;AAAA,cACrC;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,MAAoC,SAA4B;AACpE,QAAI;AACJ,UAAM,SAAS,CAAC,SAAS,YAAY,aAAa,WAAW,WAAW;AACxE,UAAM,SAAS,CAAC,WAAW,SAAS,UAAU;AAC9C,QAAI,gBAAgB,OAAO;AAEvB,cAAQ;AAAA,IACZ,WAAW,OAAO,SAAS,IAAI,GAAG;AAC9B,cAAQ,IAAI,WAAW,MAAM,OAAyB;AAAA,IAC1D,WAAW,OAAO,SAAS,IAAI,GAAG;AAC9B,cAAQ,IAAI,cAAc,MAAM,OAA4B;AAAA,IAChE,OAAO;AACH,cAAQ,IAAI,MAAM,MAAM,OAAO;AAAA,IACnC;AACA,SAAK,KAAK,UAAQ;AAAE,WAAK,cAAc,KAAK;AAAA,IAAE,CAAC;AAC/C,WAAO;AAAA,EACX;AAAA,EAIA,KAAK,MAAuC,OAA4C;AACpF,QAAI,UAAU,UAAa,OAAO,QAAQ,UAAU;AAChD,aAAO,KAAK,CAAC,IAAK,KAAK,CAAC,EAAc,aAAa,IAAI,KAAK,SAAY;AAAA,IAC5E,OAAO;AACH,UAAI,MAA8B,CAAC;AACnC,UAAI,OAAO,QAAQ,SAAU,OAAM;AAAA,UAAW,KAAI,IAAI,IAAI;AAC1D,WAAK,KAAK,UAAQ;AACd,eAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,GAAG,MAAM;AAAE,UAAC,KAAiB,aAAa,IAAI,GAAG;AAAA,QAAE,CAAC;AAAA,MAC1F,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,cAAc,OAAwB;AAClC,SAAK,KAAK,UAAQ;AACd,YAAM,QAAQ,UAAQ;AAClB,QAAC,KAAiB,gBAAgB,IAAI;AAAA,MAC1C,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAIA,KAAK,MAAwC,OAAkC;AAC3E,QAAI,UAAU,UAAa,OAAO,QAAQ,UAAU;AAChD,aAAO,KAAK,CAAC,IAAK,KAAK,CAAC,EAAyC,IAAI,IAAI;AAAA,IAC7E,OAAO;AACH,UAAI,MAA+B,CAAC;AACpC,UAAI,OAAO,QAAQ,SAAU,OAAM;AAAA,UAAW,KAAI,IAAI,IAAI;AAC1D,WAAK,KAAK,UAAQ;AACd,eAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,GAAG,MAAM;AACvC,gBAAM,OAAO,OAAM,SAAS,EAAE;AAC7B,UAAC,KAA4C,IAAI,IAAI;AACtD,cAAI,QAAQ,aAAa;AACrB,mBAAM,eAAe,IAAI;AAAA,UAC7B;AAAA,QACJ,CAAC;AAAA,MACL,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,cAAc,OAAwB;AAClC,SAAK,KAAK,UAAQ;AACd,YAAM,QAAQ,UAAQ;AAAE,eAAQ,KAA4C,OAAM,SAAS,IAAI,CAAC;AAAA,MAAE,CAAC;AAAA,IACvG,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,KAAK,KAAwC,OAAkC;AAC3E,QAAI,eAAe,UAAU,EAAE,OAAO,QAAQ,WAAW;AACrD,aAAO,QAAQ,GAA8B,EAAE,QAAQ,UAAQ;AAAE,aAAK,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,MAAE,CAAC;AAC9F;AAAA,IACJ;AACA,QAAI,OAAO,OAAO,QAAQ,YAAY,IAAI,QAAQ,GAAG,KAAK,IAAI;AAC1D,cAAQ,MAAM,QAAQ,GAAG,yFAAyF;AAAA,IACtH;AACA,QAAI,UAAU,SAAS,GAAG;AACtB,UAAI,KAAK,CAAC,GAAG;AACT,cAAM,OAAgC,OAAO,OAAO,CAAC,GAAI,KAAK,CAAC,EAAkB,OAAO;AACxF,eAAO,KAAK,IAAI,EAAE,QAAQ,OAAK;AAC3B,gBAAM,IAAI,KAAK,CAAC;AAChB,cAAI,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,GAAG;AACxC,gBAAI;AAAE,mBAAK,CAAC,IAAI,KAAK,MAAM,CAAC;AAAA,YAAE,SAAS,GAAG;AAAA,YAAC;AAAA,UAC/C;AAAA,QACJ,CAAC;AACD,eAAO,MAAM,KAAK,GAAa,IAAI;AAAA,MACvC,OAAO;AACH,eAAO;AAAA,MACX;AAAA,IACJ,OAAO;AACH,WAAK,KAAK,UAAQ;AACd,YAAI,SAAS,MAAM;AACf,UAAC,KAAqB,QAAQ,GAAa,IAAI,iBAAiB,SAAS,KAAK,UAAU,KAAK,IAAI;AAAA,QACrG,OAAO;AACH,iBAAQ,KAAqB,QAAQ,GAAa;AAAA,QACtD;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,WAAW,KAA+B;AACtC,QAAI,OAAO,OAAO,SAAU,OAAM,IAAI,MAAM,QAAQ;AACpD,SAAK,KAAK,UAAQ;AACd,MAAC,IAAiB,QAAQ,OAAK;AAAE,eAAQ,KAAqB,QAAQ,CAAC;AAAA,MAAE,CAAC;AAAA,IAC9E,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,OAAc;AACV,WAAO,KAAK,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAc;AACV,WAAO,KAAK,OAAO,KAAK;AAAA,EAC5B;AAAA,EAEA,OAAO,OAAwB;AAC3B,WAAO,KAAK,KAAK,UAAQ;AACrB,YAAM,OAAQ,KAAqB,MAAM;AACzC,YAAM,MAAO,iBAAiB,IAAe,EAAE;AAC/C,YAAM,WAAY,QAAQ,UAAU,OAAO;AAC3C,UAAI,aAAa,SAAS,QAAQ,UAAU,OAAO;AAC/C,cAAM,MAAM,gBAAgB,sBACtB,cACA,gBAAgB,uBACZ,eACA;AACT,QAAC,KAAqB,MAAM,UAAW,KAAK,SAAS,gBAA2B,QAAQ,OAAO,OAAO,SAAS,KAAK;AACrH,aAAK,MAAM,MAAM,eAAe,IAAI;AAAA,MACxC;AACA,UAAI,CAAC,aAAa,SAAS,QAAQ,UAAU,QAAQ;AACjD,YAAI,OAAO,OAAQ,MAAK,MAAM,MAAM,eAAe,GAAG;AACrD,QAAC,KAAqB,MAAM,YAAY,WAAW,MAAM;AAAA,MAC9D;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,QAAe;AACX,WAAO,KAAK,KAAK,EAAE;AAAA,EACvB;AAAA,EAEA,KAAK,MAAyD;AAC1D,QAAI,gBAAgB,aAAa;AAC7B,aAAQ,KAAK,MAAM,EAAY,OAAO,IAAI;AAAA,IAC9C,OAAO;AACH,aAAO,KAAK,KAAK,aAAa,IAAI;AAAA,IACtC;AAAA,EACJ;AAAA,EAEA,KAAK,MAAgC;AACjC,WAAO,KAAK,KAAK,eAAe,IAAI;AAAA,EACxC;AAAA,EAEA,IAAI,OAAiC;AACjC,WAAO,KAAK,KAAK,SAAS,KAAK;AAAA,EACnC;AAAA,EAEA,SAAgB;AACZ,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAChC;AAAA,EAEA,QAAe;AACX,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC/B;AACJ;AAGA,IAAM,QAAQ,SAAU,UAAwC,SAAsC;AAElG,MAAI,OAAO,YAAY,YAAY;AAC/B,UAAM,KAAK;AACX,QAAI,SAAS,cAAc,YAAY;AACnC,SAAG;AAAA,IACP,OAAO;AACH,aAAO,iBAAiB,QAAQ,EAAwC;AAAA,IAC5E;AAAA,EACJ,OAAO;AACH,WAAO,IAAI,MAAM,UAAU,OAAO;AAAA,EACtC;AACJ;AAEA,MAAM,OAAO,CAAC,QAAuB;AAAE,QAAM,OAAO,MAAM,UAAU,GAAG;AAAG,SAAO,MAAM,KAAK,UAAU,IAAI;AAAW;AACrH,MAAM,UAAU,MAAM;;;AClpBtB,IAAMC,SAAQ;AAoDd,IAAM,UAAN,MAAc;AAAA,EACV;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,OAAe,OAAoB;AAC3C,WAAO,OAAO,MAAM;AAAA,MAChB,MAAM,MAAM,QAAQ;AAAA,MACpB,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,MAAM,UAAU;AAAA,MACxB,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,WAAW,CAAC;AAAA,IAChB,CAAC;AACD,WAAO,MAAM;AACb,WAAO,MAAM;AACb,WAAO,MAAM;AACb,SAAK,WAAW,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC7C,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACnB,CAAC;AAED,SAAK,SAAS,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChC;AAAA,EAEA,OAAO,QAAqC;AACxC,QAAI,QAAQ;AACR,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC9B;AACA,SAAK,QAAQ;AACb,SAAK,MAAM,QAAQ,KAAK,KAAK,OAAO,IAAI;AAAA,EAC5C;AAAA,EAEA,KAAK,MAAsC;AACvC,SAAK,UAAU,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,iBAAuB;AACnB,SAAK,QAAQ;AACb,SAAK,cAAc;AAAA,EACvB;AAAA,EAEA,kBAAwB;AACpB,SAAK,YAAY;AAAA,EACrB;AACJ;AAaO,SAAS,YAA+B,OAM7C;AACE,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,WAAO,EAAE,MAAM,MAAM,OAAO,UAAU,QAAQ,CAAC,GAA4B,WAAW,OAAO,aAAa,MAAM;AAAA,EACpH;AACA,QAAM,KAAK;AACX,SAAO;AAAA,IACH,MAAM,OAAO,GAAG,MAAM,MAAM,WAAY,GAAG,MAAM,IAAe;AAAA,IAChE,OAAO,OAAO,GAAG,OAAO,MAAM,WAAY,GAAG,OAAO,IAAe;AAAA,IACnE,QAAS,GAAG,QAAQ,KAAK,CAAC;AAAA,IAC1B,WAAW,GAAG,WAAW,MAAM;AAAA,IAC/B,aAAa,GAAG,aAAa,MAAM;AAAA,EACvC;AACJ;AAEA,IAAM,SAAN,MAAa;AAAA,EACT,eAA0B,CAAC;AAAA,EAC3B,YAA+B,CAAC;AAAA,EAChC,QAAiB;AAAA,EACjB;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,MAAe;AACvB,SAAK,eAAe,CAAC;AACrB,SAAK,YAAY,CAAC;AAElB,QAAI,OAAO,SAAS,aAAa;AAC7B,UAAI,CAAC,UAAU,IAAI,EAAG;AACrB,MAAC,KAAiC,IAAI,IAAI;AAAA,IAC/C;AACA,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,GAAG,QAA4D,SAAyB;AACpF,QAAI,OAAO,UAAU,UAAU;AAC3B,eAAS,OAAO,MAAM,QAAQ;AAAA,IAClC,OAAO;AACH,eAAS,CAAC,MAA8B;AAAA,IAC5C;AAGA,IAAC,OAAsB,QAAQ,CAAC,UAAe;AAC3C,YAAM,OAAO,OAAO,SAAS,WAAW,QAAS,MAAM,OAAO,MAAM,MAAM,UAAU,MAAM,MAAM;AAChG,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,CAAC,WAAW,KAAK,IAAI,MAAM,MAAM,GAAG;AAC1C,cAAM,CAAC,MAAM,OAAO,KAAK,aAAa,IAAI,QAAQ,aAAa,QAAQ,EAAE,QAAQ,SAAS,QAAQ,EAAE,MAAM,GAAG;AAC7G,gBAAQ,EAAE,MAAM,SAAS,WAAW,UAAU,MAAM;AAAA,MACxD;AACA,cAAQ,OAAO,EAAE,MAAM,MAAM,SAAS,UAAU,YAAY,KAAK,GAAG,KAAK;AAEzE,UAAI,CAAC,MAAM,MAAM;AAAE,gBAAQ,IAAI,qEAAoE,KAAK,IAAI;AAAG;AAAA,MAAO;AACtH,UAAI,CAAC,SAAS;AAAE,gBAAQ,IAAI,iFAAgF,KAAK,IAAI;AAAG;AAAA,MAAO;AAC/H,UAAI,CAAC,MAAM,QAAQ,KAAK,SAAS,EAAG,MAAK,YAAY,CAAC;AACtD,WAAK,UAAU,KAAK,EAAE,MAAM,OAAO,QAAQ,CAAoB;AAC/D,UAAI,KAAK,OAAO;AACZ,gBAAQ,IAAI,qBAAqB,EAAE,MAAM,OAAO,QAAQ,CAAC;AAAA,MAC7D;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,QAA4D,SAA0B;AACtF,QAAI,OAAO,UAAU,UAAU;AAC3B,eAAS,OAAO,MAAM,QAAQ;AAAA,IAClC,OAAO;AACH,eAAS,CAAC,MAA8B;AAAA,IAC5C;AAGA,IAAC,OAAsB,QAAQ,CAAC,UAAe;AAC3C,YAAM,OAAO,OAAO,SAAS,WAAW,QAAS,MAAM,OAAO,MAAM,MAAM,UAAU,MAAM,MAAM;AAChG,UAAI,OAAO,SAAS,UAAU;AAC1B,cAAM,CAAC,WAAW,KAAK,IAAI,MAAM,MAAM,GAAG;AAC1C,cAAM,CAAC,MAAM,OAAO,KAAK,aAAa,IAAI,QAAQ,aAAa,QAAQ,EAAE,QAAQ,SAAS,QAAQ,EAAE,MAAM,GAAG;AAC7G,gBAAQ,EAAE,MAAM,QAAQ,KAAK,SAAS,WAAW,IAAI,OAAO,SAAS,GAAG;AAAA,MAC5E;AACA,cAAQ,OAAO,EAAE,MAAM,MAAM,SAAS,MAAM,YAAY,KAAK,GAAG,KAAK;AAErE,UAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,OAAO;AAAE,gBAAQ,IAAI,sEAAqE,KAAK,IAAI;AAAG;AAAA,MAAO;AACvI,UAAI,CAAC,SAAS;AAAE,kBAAU;AAAA,MAAU;AACpC,UAAI,QAAQ;AAEZ,WAAK,YAAY,KAAK,UAAU,OAAO,UAAQ;AAC3C,aAAM,MAAM,SAAS,OAAO,MAAM,SAAS,KAAK,MAAM,UAC9C,MAAM,YAAY,MAAM,MAAM,YAAY,KAAK,MAAM,aACrD,MAAM,UAAU,MAAM,MAAM,UAAU,KAAK,MAAM,WACjD,MAAM,WAAW,QAAQ,MAAM,YAAY,KAAK,MAAM,UAC5D;AACE;AACA,iBAAO;AAAA,QACX,OAAO;AACH,iBAAO;AAAA,QACX;AAAA,MACJ,CAAC;AACD,UAAI,KAAK,OAAO;AACZ,gBAAQ,IAAI,yBAAyB,KAAK,KAAK,EAAE,MAAM,OAAO,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQ,WAA2C,SAAgC;AAG/E,QAAI;AACJ,QAAI,UAAU,UAAU,GAAG;AACvB,UAAI,OAAO,aAAa,UAAU;AAC9B,gBAAQ,EAAE,MAAM,WAAW,QAAQ,KAAK;AAAA,MAC5C,OAAO;AACH,gBAAQ;AAAA,MACZ;AAAA,IACJ,OAAO;AACH,cAAQ;AACR,YAAM,OAAO;AACb,YAAM,SAAS,MAAM,UAAU;AAAA,IACnC;AACA,QAAI,cAAc,KAAK,KAAK,MAAM,SAAS,SAAS;AAEhD,cAAQ,KAAK,aAAa,KAAK,CAAC,UAAmB;AAC/C,YAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,UAAU,MAAM,QAAQ;AAC1D,iBAAO;AAAA,QACX;AACA,eAAO;AAAA,MACX,CAAC;AACD,UAAI,CAAC,OAAO;AACR,gBAAQ,IAAI,wCAAwC,OAAO,IAAI,SAAS,OAAO,MAAM,IAAI;AACzF,eAAO;AAAA,MACX;AACA,cAAQ,IAAI,kGAAoG;AAAA,IACpH,WAAW,EAAE,iBAAiB,UAAU;AACpC,cAAQ,IAAI,QAAQ,MAAM,KAAK;AAC/B,WAAK,aAAa,KAAK,KAAK;AAAA,IAChC;AAEA,QAAI,MAAgB,KAA2B;AAC/C,QAAI,CAAC,MAAM,QAAQ,KAAK,SAAS,EAAG,MAAK,YAAY,CAAC;AACtD,QAAI,KAAK,OAAO;AACZ,cAAQ,IAAI,oBAAoB,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,KAAK;AAAA,IACvE;AAEA,aAAS,IAAI,KAAK,UAAU,SAAO,GAAG,KAAK,GAAG,KAAK;AAC/C,YAAM,OAAO,KAAK,UAAU,CAAC;AAC7B,UAAI,QAAQ,SAAS,KAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,SAAS,SACtE,KAAK,MAAM,QAAQ,MAAM,MAAM,UAAU,KAAK,MAAM,QAAQ,KAAK,UACjE,KAAK,MAAM,YAAY,MAAM,SAAS,KAAK,MAAM,YAAY,OAAO,KAAK,MAAM,OAAO,MAAM,MACjG;AAEI,eAAO,KAAK,KAAK,KAAK,EAAE,QAAQ,SAAO;AACnC,cAAI,MAAM,GAAG,KAAK,QAAQ,KAAK,MAAM,GAAG,KAAK,MAAM;AAC/C,kBAAM,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA,UAC/B;AAAA,QACJ,CAAC;AAED,eAAO,CAAC;AACR,cAAO,IAAI,OAAO,WAAW,EAAE,KAAK,OAAO,KAAK,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,KAAK,EAAE;AAC7E,YAAI,IAAK,SAAQ,IAAI,CAAC,KAAK,IAAI,MAAM,SAAS;AAC9C,YAAI,KAAK,WAAW,GAAG;AACnB,eAAK,QAAQ,KAAK,MAAM,MAAM,QAAQ,KAAK;AAC3C,cAAI,KAAK,MAAO,SAAQ,IAAI,iBAAiB,KAAK,OAAO;AAAA,QAC7D,OAAO;AACH,eAAK,QAAQ,KAAK,MAAM,KAAK;AAC7B,cAAI,KAAK,MAAO,SAAQ,IAAI,WAAW,KAAK,OAAO;AAAA,QACvD;AACA,YAAI,MAAM,cAAc,QAAQ,MAAM,SAAS,KAAM,QAAO;AAAA,MAChE;AAAA,IACJ;AAEA,UAAM,UAAU,OAAO,MAAM,KAAK,OAAO,GAAE,CAAC,EAAE,YAAY,IAAI,MAAM,KAAK,OAAO,CAAC;AACjF,QAAI,MAAM,UAAU,YAAY,OAAQ,KAAiC,OAAO,MAAM,YAAY;AAC9F,YAAO,KAAiC,OAAO;AAE/C,aAAO,CAAC;AACR,YAAO,IAAI,OAAO,WAAW,EAAE,KAAK,OAAO,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,KAAK,EAAE;AACpE,UAAI,IAAK,SAAQ,IAAI,CAAC,KAAK,IAAI,MAAM,SAAS;AAC9C,UAAI,KAAK,WAAW,GAAG;AACnB,YAAI,KAAK,MAAM,MAAM,QAAQ,KAAK;AAClC,YAAI,KAAK,MAAO,SAAQ,IAAI,4BAA4B,GAAG;AAAA,MAC/D,OAAO;AACH,YAAI,KAAK,MAAM,KAAK;AACpB,YAAI,KAAK,MAAO,SAAQ,IAAI,sBAAsB,GAAG;AAAA,MACzD;AACA,UAAI,MAAM,cAAc,QAAQ,MAAM,SAAS,KAAM,QAAO;AAAA,IAChE;AAEA,QAAI,MAAM,UAAU,QAAQ,MAAM,UAAU,YAAY,OAAQ,MAAM,OAAmC,OAAO,MAAM,YAAY;AAC9H,YAAO,MAAM,OAAmC,OAAO;AAEvD,aAAO,CAAC;AACR,YAAO,IAAI,OAAO,WAAW,EAAE,KAAK,OAAO,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,KAAK,EAAE;AACpE,UAAI,IAAK,SAAQ,IAAI,CAAC,KAAK,IAAI,MAAM,SAAS;AAC9C,UAAI,KAAK,WAAW,GAAG;AACnB,YAAI,KAAK,MAAM,MAAM,QAAQ,KAAK;AAClC,YAAI,KAAK,MAAO,SAAQ,IAAI,+BAA+B,GAAG;AAAA,MAClE,OAAO;AACH,YAAI,KAAK,MAAM,KAAK;AACpB,YAAI,KAAK,MAAO,SAAQ,IAAI,yBAAyB,GAAG;AAAA,MAC5D;AACA,UAAI,MAAM,cAAc,QAAQ,MAAM,SAAS,KAAM,QAAO;AAAA,IAChE;AAEA,QAAI,MAAM,UAAU,SAAS;AACzB,UAAI,OAAO,MAAM,eAAe,WAAY,OAAM,WAAW,KAAK,MAAM,KAAK;AAC7E,eAAS,IAAI,GAAG,IAAI,MAAM,UAAU,QAAQ,KAAK;AAC7C,YAAI,OAAO,MAAM,UAAU,CAAC,MAAM,YAAY;AAC1C,gBAAM,UAAU,CAAC,EAAE,KAAK,MAAM,KAAK;AACnC,cAAI,KAAK,MAAO,SAAQ,IAAI,iBAAiB,GAAG;AAAA,QACpD;AAAA,MACJ;AACA,YAAM,SAAS,KAAK;AACpB,UAAI,KAAK,OAAO;AACZ,gBAAQ,IAAI,oBAAoB,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,KAAK;AAAA,MACvE;AAEA,YAAM,MAAM,KAAK,aAAa,QAAQ,KAAK;AAC3C,UAAI,QAAQ,GAAI,MAAK,aAAa,OAAO,KAAK,CAAC;AAAA,IACnD;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,MAA0C;AAAA,EAEjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAgB;AACZ,UAAM,QAAQ,KAAK,QAAQ,WAAW,EAAE,QAAQ,KAAK,KAAK,CAAC;AAC3D,QAAI,MAAM,aAAa;AACnB;AAAA,IACJ;AACA,UAAM,SAAmB,CAAC;AAE1B,QAAI,KAAK,eAAe,aAAa;AACjC,WAAK,IAAI,UAAU,QAAQ,QAAM;AAC7B,YAAI,GAAG,WAAW,MAAM,EAAG,QAAO,KAAK,EAAE;AAAA,MAC7C,CAAC;AAAA,IACL;AACA,IAAAA,OAAM,KAAK,GAAG,EACT,IAAI,EACJ,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,KAAK,EAAE;AACZ,SAAK,MAAM;AAEX,UAAM,OAAO;AAAA,EACjB;AACJ;","names":["wait","clone","a","key","query"]}
|