@sylwellsoftware/fray 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -13
- package/dist/Components/Placeholder.d.ts +1 -1
- package/dist/Components/Placeholder.d.ts.map +1 -1
- package/dist/Components/component.d.ts +5 -0
- package/dist/Components/component.d.ts.map +1 -1
- package/dist/Components/controlUtils.d.ts.map +1 -1
- package/dist/Components/data/filterState.d.ts +38 -0
- package/dist/Components/data/filterState.d.ts.map +1 -0
- package/dist/Components/data/listview/listview.d.ts +16 -5
- package/dist/Components/data/listview/listview.d.ts.map +1 -1
- package/dist/Components/data/selectionhandler.d.ts +24 -5
- package/dist/Components/data/selectionhandler.d.ts.map +1 -1
- package/dist/Components/data/table/DataTable.d.ts +36 -30
- package/dist/Components/data/table/DataTable.d.ts.map +1 -1
- package/dist/Components/data/table/FilterPanel.d.ts +8 -1
- package/dist/Components/data/table/FilterPanel.d.ts.map +1 -1
- package/dist/Components/data/table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Components/data/table/tableDataSource.d.ts +49 -0
- package/dist/Components/data/table/tableDataSource.d.ts.map +1 -0
- package/dist/Components/data/table/tableQuery.d.ts +6 -2
- package/dist/Components/data/table/tableQuery.d.ts.map +1 -1
- package/dist/Components/data/treeview/treeModel.d.ts +23 -0
- package/dist/Components/data/treeview/treeModel.d.ts.map +1 -0
- package/dist/Components/data/treeview/treeview.d.ts +1 -1
- package/dist/Components/data/treeview/treeview.d.ts.map +1 -1
- package/dist/Components/dialog/dialog.d.ts +1 -1
- package/dist/Components/dialog/dialog.d.ts.map +1 -1
- package/dist/Components/lineinputs/checkbox/Checkbox.d.ts +1 -1
- package/dist/Components/lineinputs/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/Components/lineinputs/checkbox/QuadCheckbox.d.ts +2 -2
- package/dist/Components/lineinputs/checkbox/QuadCheckbox.d.ts.map +1 -1
- package/dist/Components/lineinputs/checkbox/TriCheckbox.d.ts +2 -2
- package/dist/Components/lineinputs/checkbox/TriCheckbox.d.ts.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2680 -726
- package/dist/index.js.map +1 -1
- package/dist/{jsx-dev-runtime-DukiDpV9.js → jsx-dev-runtime-pzseD2Sz.js} +527 -414
- package/dist/jsx-dev-runtime-pzseD2Sz.js.map +1 -0
- package/dist/jsx-dev-runtime.js +3 -3
- package/dist/jsx-runtime.js +2 -2
- package/dist/runtime.d.ts +4 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/services.d.ts +45 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/util/filterMode.d.ts +6 -4
- package/dist/util/filterMode.d.ts.map +1 -1
- package/package.json +4 -9
- package/styles/structural.css +9 -3
- package/themes/README.md +1 -1
- package/themes/minimal/theme.css +1 -1
- package/EXPERIMENTAL.md +0 -75
- package/dist/button-CqDGmkBt.js +0 -212
- package/dist/button-CqDGmkBt.js.map +0 -1
- package/dist/experimental.d.ts +0 -16
- package/dist/experimental.d.ts.map +0 -1
- package/dist/experimental.js +0 -1399
- package/dist/experimental.js.map +0 -1
- package/dist/jsx-dev-runtime-DukiDpV9.js.map +0 -1
package/dist/experimental.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"experimental.js","sources":["../src/Components/Placeholder.tsx","../src/Components/data/selectionhandler.ts","../src/Components/data/listview/listview.tsx","../src/Components/data/table/FilterPanel.tsx","../src/Components/data/table/TableHeaderCell.tsx","../src/Components/data/table/TableHeader.tsx","../src/Components/data/table/tableQuery.ts","../src/Components/data/table/DataTable.tsx","../src/Components/data/treeview/treeitem.tsx","../src/Components/data/treeview/treeview.tsx","../src/Components/dialog/dialog.tsx"],"sourcesContent":["import {Component, css} from './component.js'\nimport type {ComponentProps} from './component.js'\n\nexport interface PlaceholderProps extends ComponentProps {\n width?: number | string\n}\n\n/** Deterministic loading placeholder for experimental data components. */\nexport class Placeholder extends Component<PlaceholderProps> {\n render() {\n const width = normalizeWidth(this.props.width ?? 65)\n const Host = this.Host\n return <Host style={{width: `${width}%`}} aria-hidden=\"true\" />\n }\n\n static override hostName = 'placeholder'\n static override standaloneHostName = 'loading-placeholder'\n\n static baseStyles = [\n ['&::after', ['after', 'working']],\n ]\n\n static css = css`\n & {\n display: block;\n min-width: 3rem;\n height: 1em;\n overflow: hidden;\n background: currentColor;\n border-radius: var(--ui-border-radius);\n opacity: 0.18;\n position: relative;\n }\n\n @keyframes fray-placeholder-progress {\n from { background-position: 0 0; }\n to { background-position: 2rem 0; }\n }\n `\n}\n\nfunction normalizeWidth(width: number | string): number {\n const numeric = Number(width)\n if (!Number.isFinite(numeric)) throw new TypeError('Placeholder width must be numeric')\n return Math.min(100, Math.max(10, numeric))\n}\n","import {Emitter} from '@sylwellsoftware/glue'\n\nimport type {ValueEmitter} from '../controlUtils.js'\n\nexport type ItemKeyGetter<TItem> = (item: TItem, index: number) => unknown\n\nexport interface SelectionHandlerConfig<TItem> {\n getItems: () => readonly TItem[]\n getKey?: ItemKeyGetter<TItem>\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n owner?: unknown\n multiSelect?: boolean\n}\n\ntype SelectionEvent = MouseEvent | KeyboardEvent\n\n/**\n * DOM selection behavior backed by an explicit row-data provider.\n *\n * Construction is side-effect free. Row listeners are installed by\n * `rowsUpdated()` and are always released before the next row set is wired.\n */\nexport class BaseSelectionHandler<TItem = unknown> {\n readonly getItems: () => readonly TItem[]\n readonly getKey: ItemKeyGetter<TItem>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly ownsSelectedItemsEmitter: boolean\n protected rows: HTMLElement[] = []\n private readonly rowCleanups: Array<() => void> = []\n protected activeIndex = 0\n protected anchorIndex: number | null = null\n private dragStartIndex: number | null = null\n private dragOriginEvent: MouseEvent | null = null\n private dragMoved = false\n private dragCleanup: (() => void) | null = null\n private suppressNextClick = false\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null\n private destroyed = false\n private readonly ownedSelectedItemsEmitter: Emitter<TItem[]> | null\n\n constructor({\n getItems,\n getKey = defaultItemKey,\n selectedItemsEmitter,\n owner = null,\n }: SelectionHandlerConfig<TItem>) {\n if (typeof getItems !== 'function') {\n throw new TypeError('Selection handler getItems must be a function')\n }\n if (typeof getKey !== 'function') {\n throw new TypeError('Selection handler getKey must be a function')\n }\n this.getItems = getItems\n this.getKey = getKey\n this.ownedSelectedItemsEmitter = selectedItemsEmitter == null\n ? new Emitter<TItem[]>([], {owner, purpose: 'selected items'})\n : null\n this.selectedItemsEmitter = selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectedItems$ = this.selectedItemsEmitter\n this.ownsSelectedItemsEmitter = this.ownedSelectedItemsEmitter != null\n }\n\n rowsUpdated(rows: Iterable<HTMLElement> | ArrayLike<HTMLElement> | null): void {\n if (this.destroyed) return\n this.releaseRows()\n this.rows = Array.from(rows ?? [])\n this.rows.forEach((row, index) => this.wireRow(row, index))\n this.activeIndex = clampIndex(this.activeIndex, this.rows.length)\n this.reconcileSelectedItems()\n this.syncRows()\n }\n\n private wireRow(row: HTMLElement, index: number): void {\n const onClick = (event: MouseEvent): void => this.handleClick(index, event)\n const onKeyDown = (event: KeyboardEvent): void => this.handleKeyDown(index, event)\n const onMouseDown = (event: MouseEvent): void => this.handleMouseDown(index, event, row)\n const onMouseEnter = (event: MouseEvent): void => this.handleMouseEnter(index, event)\n row.addEventListener('click', onClick)\n row.addEventListener('keydown', onKeyDown)\n row.addEventListener('mousedown', onMouseDown)\n row.addEventListener('mouseenter', onMouseEnter)\n this.rowCleanups.push(() => {\n row.removeEventListener('click', onClick)\n row.removeEventListener('keydown', onKeyDown)\n row.removeEventListener('mousedown', onMouseDown)\n row.removeEventListener('mouseenter', onMouseEnter)\n })\n }\n\n private handleClick(index: number, event: MouseEvent): void {\n event.preventDefault()\n if (this.suppressNextClick) {\n this.clearClickSuppression()\n return\n }\n this.activeIndex = index\n this.selectIndex(index, event)\n this.rows[index]?.focus()\n }\n\n private handleMouseDown(index: number, event: MouseEvent, row: HTMLElement): void {\n if (event.button !== 0 || !this.supportsDragSelection()) return\n this.finishDrag(false)\n this.clearClickSuppression()\n this.dragStartIndex = index\n this.dragOriginEvent = event\n this.dragMoved = false\n const ownerDocument = row.ownerDocument\n const onMouseUp = (): void => this.finishDrag(this.dragMoved)\n ownerDocument.addEventListener('mouseup', onMouseUp)\n this.dragCleanup = () => ownerDocument.removeEventListener('mouseup', onMouseUp)\n }\n\n private handleMouseEnter(index: number, event: MouseEvent): void {\n if (this.dragStartIndex == null) return\n if (index === this.dragStartIndex && !this.dragMoved) return\n if (index === this.activeIndex && this.dragMoved) return\n event.preventDefault()\n this.dragMoved = true\n this.activeIndex = index\n this.selectDragRange(this.dragStartIndex, index, this.dragOriginEvent ?? event)\n this.rows[index]?.focus()\n }\n\n private handleKeyDown(index: number, event: KeyboardEvent): void {\n const lastIndex = this.rows.length - 1\n let nextIndex: number\n if (event.key === 'ArrowDown') nextIndex = Math.min(index + 1, lastIndex)\n else if (event.key === 'ArrowUp') nextIndex = Math.max(index - 1, 0)\n else if (event.key === 'Home') nextIndex = 0\n else if (event.key === 'End') nextIndex = lastIndex\n else if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n this.activeIndex = index\n this.selectIndex(index, event)\n return\n } else return\n\n event.preventDefault()\n this.activeIndex = nextIndex\n this.onKeyboardMove(nextIndex, event)\n this.syncRows()\n this.rows[nextIndex]?.focus()\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return false\n }\n\n protected selectDragRange(\n _startIndex: number,\n _endIndex: number,\n _event: MouseEvent,\n ): void {}\n\n protected selectIndex(_index: number, _event: SelectionEvent): void {}\n\n protected setSelectedItems(items: TItem[], cause = 'selection changed'): void {\n this.selectedItemsEmitter.set(items, cause)\n this.syncRows()\n }\n\n getSelectedItems(): TItem[] {\n return this.selectedItemsEmitter.get() ?? []\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n private reconcileSelectedItems(): void {\n const selected = this.getSelectedItems()\n if (selected.length === 0) return\n const selectedKeys = new Set(selected.map((item, index) => this.getKey(item, index)))\n const current = this.getItems().filter((item, index) =>\n selectedKeys.has(this.getKey(item, index)))\n if (current.length !== selected.length\n || current.some((item, index) => !Object.is(item, selected[index]))) {\n this.selectedItemsEmitter.set([...current], 'selection reconciled with rows')\n }\n }\n\n private syncRows(): void {\n const selectedKeys = new Set(this.getSelectedItems().map((item, index) =>\n this.getKey(item, index)))\n const items = this.getItems()\n this.rows.forEach((row, index) => {\n const item = items[index]\n const selected = item !== undefined\n && selectedKeys.has(this.getKey(item, index))\n row.classList.toggle('selected', selected)\n row.setAttribute('aria-selected', String(selected))\n row.tabIndex = index === this.activeIndex ? 0 : -1\n })\n }\n\n private releaseRows(): void {\n for (const cleanup of this.rowCleanups.splice(0)) cleanup()\n this.rows = []\n }\n\n private finishDrag(suppressClick: boolean): void {\n this.dragCleanup?.()\n this.dragCleanup = null\n this.dragStartIndex = null\n this.dragOriginEvent = null\n this.dragMoved = false\n if (!suppressClick) return\n this.suppressNextClick = true\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = setTimeout(() => this.clearClickSuppression(), 0)\n }\n\n private clearClickSuppression(): void {\n this.suppressNextClick = false\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = null\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.finishDrag(false)\n this.clearClickSuppression()\n this.releaseRows()\n this.ownedSelectedItemsEmitter?.dispose()\n }\n}\n\nexport class SingleSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n protected selectIndex(index: number): void {\n const item = this.getItems()[index]\n if (item === undefined) return\n this.anchorIndex = index\n this.setSelectedItems([item], 'single selection changed')\n }\n}\n\nexport class MultiSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n protected selectIndex(index: number, event: SelectionEvent): void {\n const items = this.getItems()\n const item = items[index]\n if (item === undefined) return\n\n if (event.shiftKey && this.anchorIndex != null) {\n const first = Math.min(this.anchorIndex, index)\n const last = Math.max(this.anchorIndex, index)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.setSelectedItems(next, 'range selection changed')\n return\n }\n\n if (isCommandPressed(event) || ('key' in event && event.key === ' ')) {\n const selected = this.getSelectedItems()\n const key = this.getKey(item, index)\n const exists = selected.some((candidate, candidateIndex) =>\n Object.is(this.getKey(candidate, candidateIndex), key))\n const next = exists\n ? selected.filter((candidate, candidateIndex) =>\n !Object.is(this.getKey(candidate, candidateIndex), key))\n : [...selected, item]\n this.anchorIndex = index\n this.setSelectedItems(next, 'multi selection toggled')\n return\n }\n\n this.anchorIndex = index\n this.setSelectedItems([item], 'multi selection changed')\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n if (event.shiftKey) this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return true\n }\n\n protected selectDragRange(\n startIndex: number,\n endIndex: number,\n event: MouseEvent,\n ): void {\n const items = this.getItems()\n const first = Math.min(startIndex, endIndex)\n const last = Math.max(startIndex, endIndex)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.anchorIndex = startIndex\n this.setSelectedItems(next, 'drag selection changed')\n }\n}\n\nexport function createSelectionHandler<TItem>(\n config: SelectionHandlerConfig<TItem>,\n): BaseSelectionHandler<TItem> {\n return config.multiSelect\n ? new MultiSelectionHandler(config)\n : new SingleSelectionHandler(config)\n}\n\nexport function defaultItemKey<TItem>(item: TItem, index: number): unknown {\n if (item != null && typeof item === 'object') {\n const id = Reflect.get(item, 'id')\n if (id != null) return id\n }\n if (typeof item === 'string' || typeof item === 'number') return item\n throw new TypeError(\n `Selection item at index ${index} needs an id or an explicit itemKey/rowKey`,\n )\n}\n\nfunction isCommandPressed(event: MouseEvent | KeyboardEvent): boolean {\n return Boolean(event.ctrlKey || event.metaKey)\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) return 0\n return Math.min(Math.max(index, 0), length - 1)\n}\n\nfunction mergeByKey<TItem>(\n left: readonly TItem[],\n right: readonly TItem[],\n getKey: ItemKeyGetter<TItem>,\n): TItem[] {\n const result = [...left]\n const keys = new Set(left.map((item, index) => getKey(item, index)))\n for (const item of right) {\n const key = getKey(item, result.length)\n if (!keys.has(key)) {\n keys.add(key)\n result.push(item)\n }\n }\n return result\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\n\nexport interface ListViewProps<TItem = unknown> extends ComponentProps {\n items?: readonly TItem[] | ReadableEmitter<readonly TItem[], unknown>\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n itemKey?: string | ItemKeyGetter<TItem>\n multiSelect?: boolean\n label?: string\n placeholderCount?: number\n renderItem?: (item: TItem, index: number) => FrayChild\n}\n\n/** Experimental accessible listbox with stable-key selection. */\nexport class ListView<TItem = unknown> extends Component<ListViewProps<TItem>> {\n readonly itemsEmitter: ReadableEmitter<readonly TItem[], unknown>\n readonly items$: ReadableEmitter<readonly TItem[], unknown>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly getItemKey: ItemKeyGetter<TItem>\n readonly selectionHandler: BaseSelectionHandler<TItem>\n private readonly ownedItemsEmitter: Emitter<readonly TItem[]> | null\n private readonly ownedSelectedItemsEmitter: Emitter<TItem[]> | null\n\n constructor(props: ListViewProps<TItem> = {}) {\n super(props)\n if (isReadableEmitter<readonly TItem[]>(props.items)) {\n this.itemsEmitter = props.items\n this.ownedItemsEmitter = null\n } else {\n this.ownedItemsEmitter = new Emitter<readonly TItem[]>(props.items ?? [], {\n owner: this,\n purpose: 'list items',\n })\n this.itemsEmitter = this.ownedItemsEmitter\n }\n this.items$ = this.itemsEmitter\n this.ownedSelectedItemsEmitter = props.selectedItemsEmitter == null\n ? new Emitter<TItem[]>([], {owner: this, purpose: 'selected list items'})\n : null\n this.selectedItemsEmitter = props.selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectedItems$ = this.selectedItemsEmitter\n this.getItemKey = normalizeKeyGetter(props.itemKey)\n this.selectionHandler = createSelectionHandler({\n owner: this,\n multiSelect: props.multiSelect ?? false,\n selectedItemsEmitter: this.selectedItemsEmitter,\n getItems: () => this.itemsEmitter.get(),\n getKey: this.getItemKey,\n })\n }\n\n initialize(): void {\n this.watch(this.itemsEmitter, this.selectedItemsEmitter)\n }\n\n render(): FrayChild {\n const rows = this.itemsEmitter.get()\n if (!Array.isArray(rows)) throw new TypeError('ListView items must be an array')\n const status = this.itemsEmitter.getFetchState()\n const error = this.itemsEmitter.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(this.selectedItemsEmitter.get()\n .map((item, index) => this.getItemKey(item, index)))\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n >\n {status === FetchState.Error\n ? <p role=\"alert\" data-part=\"error\">\n {errorMessage(error, 'Unable to load items')}\n </p>\n : null}\n {isLoading && rows.length === 0\n ? <div role=\"status\" data-part=\"loading\">\n <span>Loading items…</span>\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) =>\n <div key={`placeholder-${index}`} data-part=\"placeholder-row\">\n <Placeholder width={45 + index * 7} />\n </div>)}\n </div>\n : null}\n {status === FetchState.Ready && rows.length === 0\n ? <p role=\"status\" data-part=\"empty\">No items</p>\n : null}\n {rows.length > 0\n ? <div\n role=\"listbox\"\n data-part=\"list\"\n aria-label={this.props.label ?? 'Items'}\n aria-busy={isLoading ? 'true' : null}\n aria-multiselectable={this.props.multiSelect ? 'true' : null}\n >{rows.map((item, index) => {\n const key = this.getItemKey(item, index)\n const selected = selectedKeys.has(key)\n const content = this.props.renderItem\n ? this.props.renderItem(item, index)\n : defaultItemLabel(item)\n return <div\n key={String(key)}\n role=\"option\"\n data-part=\"row\"\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >{content}</div>\n })}</div>\n : null}\n </Host>\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('[data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedItems(): TItem[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n this.ownedItemsEmitter?.dispose()\n this.ownedSelectedItemsEmitter?.dispose()\n }\n\n static dependencies = [Placeholder]\n\n static override hostName = 'list-view'\n static override standaloneHostName = 'list-view'\n\n static baseStyles = [\n ['&', 'inputlike'],\n ['& > [data-part=\"list\"] > [data-part=\"row\"]', 'inputline'],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n min-height: 0;\n }\n\n & > [data-part=\"list\"],\n & > [data-part=\"loading\"] {\n display: flex;\n flex-direction: column;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"] {\n cursor: default;\n user-select: none;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"]:hover,\n & > [data-part=\"list\"] > [data-part=\"row\"]:focus-visible {\n background: var(--button-background-hover);\n outline: 2px solid var(--ui-accent-color);\n outline-offset: -2px;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"][aria-selected=\"true\"] {\n color: var(--toggle-selected-text);\n background: var(--toggle-selected-bg);\n }\n\n & > [data-part=\"empty\"],\n & > [data-part=\"error\"] {\n margin: 0;\n padding: var(--ui-padding);\n }\n\n & > [data-part=\"error\"] {\n color: var(--error-color);\n }\n `\n}\n\nfunction normalizeKeyGetter<TItem>(\n itemKey: ListViewProps<TItem>['itemKey'],\n): ItemKeyGetter<TItem> {\n if (itemKey == null) return defaultItemKey\n if (typeof itemKey === 'function') return itemKey\n if (typeof itemKey === 'string' && itemKey.length > 0) {\n return (item, index) => {\n if (item == null || (typeof item !== 'object' && typeof item !== 'function')) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n const key = Reflect.get(item, itemKey)\n if (key == null) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n return key\n }\n }\n throw new TypeError('ListView itemKey must be a function or property name')\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction defaultItemLabel(item: unknown): FrayChild {\n if (item != null && (typeof item === 'object' || typeof item === 'function')) {\n const label = Reflect.get(item, 'label')\n if (isRenderablePrimitive(label)) return label\n }\n return String(item)\n}\n\nfunction isRenderablePrimitive(value: unknown): value is string | number | null | undefined {\n return value == null || typeof value === 'string' || typeof value === 'number'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css} from '../../component.js'\nimport type {ComponentConstructor, ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport {Checkbox} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {\n CheckboxProps,\n CheckboxSymbol,\n} from '../../lineinputs/checkbox/Checkbox.js'\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport type FilterValue = string | number\n\nexport interface FilterOption {\n value: FilterValue\n label?: FrayChild\n}\n\nexport type FilterOptionInput = FilterValue | FilterOption\nexport type FilterOptions = readonly FilterOptionInput[]\nexport type FilterOptionsSource = FilterOptions | ReadableEmitter<FilterOptions, unknown>\nexport type FilterSelection = ReadonlyMap<FilterValue, FilterModeValue>\n\nexport interface FilterPanelProps extends ComponentProps {\n options?: FilterOptionsSource\n filters?: FilterSelection | readonly (readonly [FilterValue, FilterModeValue])[]\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n label?: string\n onChange?: (filters: Map<FilterValue, FilterModeValue>, event: Event | null) => void\n}\n\n/** Experimental filter choices. Option data is always supplied by the caller. */\nexport class FilterPanel extends Component<FilterPanelProps> {\n readonly optionsEmitter: ReadableEmitter<FilterOptions, unknown> | null\n\n constructor(props: FilterPanelProps = {}) {\n super(props)\n this.optionsEmitter = isEmitterLike<FilterOptions>(props.options) ? props.options : null\n }\n\n initialize(): void {\n if (this.optionsEmitter) this.watch(this.optionsEmitter)\n }\n\n render(): FrayChild {\n const values = this.optionsEmitter?.get()\n ?? (Array.isArray(this.props.options) ? this.props.options : [])\n if (!Array.isArray(values)) {\n throw new TypeError('FilterPanel options must be an array or emitter of arrays')\n }\n const fetchState = this.optionsEmitter?.getFetchState() ?? FetchState.Ready\n const error = this.optionsEmitter?.getError()\n const filters = normalizeFilters(this.props.filters)\n const filterModes = this.props.filterModes ?? Checkbox.symbols\n const defaultSemanticState = this.props.defaultSemanticState ?? FilterMode.Neutral\n const Host = this.Host\n\n if (fetchState === FetchState.Error) {\n return <Host\n className={componentClass(this.props) || null}\n role=\"alert\"\n data-state=\"error\"\n >{errorMessage(error, 'Unable to load filter options')}</Host>\n }\n if ((fetchState === FetchState.Initial || fetchState === FetchState.Loading)\n && values.length === 0) {\n return <Host\n className={componentClass(this.props) || null}\n role=\"status\"\n data-state=\"loading\"\n >Loading filter options…</Host>\n }\n\n return <Host\n className={componentClass(this.props) || null}\n role=\"group\"\n aria-label={this.props.label ?? 'Filter options'}\n >\n {values.length === 0\n ? <span>No filter options</span>\n : values.map((option) => {\n const value = optionValue(option)\n const label = optionLabel(option)\n const state = filters.get(value) ?? defaultSemanticState\n return <FilterModeCheckbox\n key={`${String(value)}:${String(state)}`}\n label={label}\n defaultValue={state}\n symbols={filterModes}\n onChange={(nextState, event) => {\n event?.stopPropagation()\n const next = new Map(filters)\n if (nextState === FilterMode.Neutral) next.delete(value)\n else next.set(value, nextState)\n this.props.onChange?.(next, event)\n }}\n />\n })}\n </Host>\n }\n\n static dependencies = [Checkbox]\n\n static override hostName = 'filter-panel'\n static override standaloneHostName = 'filter-panel'\n\n static css = css`\n & {\n position: absolute;\n z-index: 1000;\n inset-block-start: 100%;\n inset-inline-end: 0;\n display: flex;\n min-width: 12rem;\n padding: var(--ui-padding);\n flex-flow: column nowrap;\n align-items: stretch;\n color: var(--panel-color);\n background: var(--panel-bg);\n border: var(--panel-border);\n border-radius: var(--panel-radius);\n box-shadow: var(--panel-shadow);\n }\n `\n}\n\n// Passing a generic class as a runtime vnode erases its state parameter. The\n// concrete props below restore the FilterMode relationship checked by tsc.\nconst FilterModeCheckbox = Checkbox as unknown as ComponentConstructor<\n CheckboxProps<FilterModeValue>\n>\n\nfunction normalizeFilters(\n filters: FilterPanelProps['filters'],\n): Map<FilterValue, FilterModeValue> {\n if (filters == null) return new Map<FilterValue, FilterModeValue>()\n if (filters instanceof Map) return new Map(filters)\n if (Array.isArray(filters)) return new Map(filters)\n throw new TypeError('FilterPanel filters must be a Map or tuple array')\n}\n\nfunction optionValue(option: FilterOptionInput): FilterValue {\n if (typeof option === 'string' || typeof option === 'number') return option\n if (option != null && typeof option === 'object') {\n const value = Reflect.get(option, 'value')\n if (typeof value === 'string' || typeof value === 'number') return value\n }\n throw new TypeError('Filter options must be strings, numbers, or value/label objects')\n}\n\nfunction optionLabel(option: FilterOptionInput): FrayChild {\n if (option != null && typeof option === 'object') {\n const label = Reflect.get(option, 'label')\n if (label != null) return isFrayLabel(label) ? label : String(label)\n }\n return String(optionValue(option))\n}\n\nfunction isFrayLabel(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isEmitterLike<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {FilterPanel} from './FilterPanel.js'\nimport type {\n FilterOptionsSource,\n FilterSelection,\n FilterValue,\n} from './FilterPanel.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableRow = Record<string, unknown>\n\nexport interface TableColumnBase {\n field: string\n label?: FrayChild\n sortable?: boolean\n filterOptions?: FilterOptionsSource\n}\n\nexport interface TableColumn<TRow extends TableRow = TableRow> extends TableColumnBase {\n field: Extract<keyof TRow, string>\n render?: (row: TRow, index: number) => FrayChild\n}\n\nexport interface TableHeaderCellProps extends ComponentProps, TableColumnBase {\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeaderCell extends Component<TableHeaderCellProps> {\n private filterVisible = false\n\n initialize(): void {\n this.watch(this.props.sortEmitter, this.props.filtersEmitter)\n if (this.props.filterOptions != null) {\n this.listen<MouseEvent>(document, 'click', this.onGlobalClick)\n }\n }\n\n toggleSort(): void {\n if (!this.props.sortable) return\n const current = this.props.sortEmitter.get()\n let next: TableSort | null\n if (current?.field !== this.props.field) {\n next = {field: this.props.field, direction: 'asc'}\n } else if (current.direction === 'asc') {\n next = {field: this.props.field, direction: 'desc'}\n } else next = null\n this.props.sortEmitter.set(next, 'table sort changed')\n }\n\n toggleFilterPanel(event: MouseEvent): void {\n event.stopPropagation()\n this.filterVisible = !this.filterVisible\n this.update()\n }\n\n updateFilters(next: FilterSelection, event: Event | null): void {\n const filters: TableFilters = {...this.props.filtersEmitter.get()}\n if (next.size === 0) delete filters[this.props.field]\n else filters[this.props.field] = [...next.entries()]\n this.props.filtersEmitter.set(filters, 'table filters changed')\n this.props.onFilterChange?.(filters, event)\n }\n\n render(): FrayChild {\n const currentSort = this.props.sortEmitter.get()\n const direction = currentSort?.field === this.props.field\n ? currentSort.direction\n : null\n const filters = new Map<FilterValue, FilterModeValue>(\n (this.props.filtersEmitter.get()[this.props.field] ?? [])\n .filter(isFilterSelectionEntry),\n )\n const label = this.props.label ?? String(this.props.field)\n const filterLabel = `Filter ${String(label)}`\n\n let panel: FrayChild = null\n if (this.filterVisible && this.props.filterOptions != null) {\n panel = <FilterPanel\n key=\"filter-panel\"\n label={filterLabel}\n options={this.props.filterOptions}\n filters={filters}\n onChange={(next, event) => this.updateFilters(next, event)}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n />\n }\n\n return <th\n scope=\"col\"\n data-fray-component=\"table-header-cell\"\n aria-sort={direction === 'asc'\n ? 'ascending'\n : direction === 'desc' ? 'descending' : 'none'}\n >\n {this.props.sortable\n ? <button\n type=\"button\"\n data-part=\"sort\"\n onClick={() => this.toggleSort()}\n >\n {label}\n {direction === 'asc' ? ' ▲' : direction === 'desc' ? ' ▼' : ''}\n </button>\n : <span data-part=\"label\">{label}</span>}\n {this.props.filterOptions == null\n ? null\n : <button\n type=\"button\"\n data-part=\"filter-toggle\"\n aria-label={filterLabel}\n aria-expanded={String(this.filterVisible)}\n onClick={(event: MouseEvent) => this.toggleFilterPanel(event)}\n >Filter</button>}\n {panel}\n </th>\n }\n\n private readonly onGlobalClick = (event: MouseEvent): void => {\n if (this.filterVisible\n && this.dom instanceof Node\n && event.target instanceof Node\n && !this.dom.contains(event.target)) {\n this.filterVisible = false\n this.update()\n }\n }\n\n static dependencies = [FilterPanel]\n\n static baseStyles = [\n ['th[data-fray-component=\"table-header-cell\"]', 'noselect'],\n ['th[data-fray-component=\"table-header-cell\"] > [data-part=\"sort\"]', ['uiline', 'button']],\n ['th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n th[data-fray-component=\"table-header-cell\"] {\n position: relative;\n text-align: start;\n color: var(\n --fray-table-header-color,\n var(--fray-section-header-color, var(--fray-header-color))\n );\n background: var(\n --fray-table-header-background,\n var(--fray-section-header-background, var(--fray-header-background))\n );\n border-block-end: var(--fray-section-header-border, var(--fray-header-border));\n box-shadow: var(--fray-section-header-shadow, var(--fray-header-shadow));\n }\n\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"sort\"],\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"] {\n width: auto;\n font-family: inherit;\n color: inherit;\n background: var(\n --fray-table-header-button-background,\n var(--fray-button-background)\n );\n }\n\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"] {\n margin-inline-start: var(--ui-padding-h);\n font-size: 0.75em;\n }\n `\n}\n\nfunction isFilterSelectionEntry(\n entry: readonly [unknown, FilterModeValue],\n): entry is readonly [FilterValue, FilterModeValue] {\n return typeof entry[0] === 'string' || typeof entry[0] === 'number'\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {TableHeaderCell} from './TableHeaderCell.js'\nimport type {\n TableColumn,\n TableRow,\n} from './TableHeaderCell.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport interface TableHeaderProps<TRow extends TableRow = TableRow> extends ComponentProps {\n columns: readonly TableColumn<TRow>[]\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeader<TRow extends TableRow = TableRow>\n extends Component<TableHeaderProps<TRow>> {\n render(): FrayChild {\n return <thead data-fray-component=\"table-header\">\n <tr>\n {this.props.columns.map((column) => <TableHeaderCell\n key={String(column.field)}\n field={column.field}\n sortEmitter={this.props.sortEmitter}\n filtersEmitter={this.props.filtersEmitter}\n {...(column.label == null ? {} : {label: column.label})}\n {...(column.sortable == null ? {} : {sortable: column.sortable})}\n {...(column.filterOptions == null\n ? {}\n : {filterOptions: column.filterOptions})}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />)}\n </tr>\n </thead>\n }\n\n static dependencies = [TableHeaderCell]\n}\n","import type {UrlLike} from '@sylwellsoftware/glue'\n\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport interface TableSort {\n field: string\n direction: 'asc' | 'desc'\n}\n\nexport type TableFilterEntry<TValue = unknown> = readonly [\n value: TValue,\n mode: FilterModeValue,\n]\n\nexport type TableFilters = Record<string, readonly TableFilterEntry[]>\n\nexport interface TableQueryState {\n sort?: TableSort | null\n filters?: TableFilters\n}\n\n/**\n * Serialize Fray's experimental remote-table wire format.\n *\n * - `sort=field:asc|desc`\n * - repeated `filter=field:mode:JSON(value)` entries\n */\nexport function serializeTableQuery<TUrl extends UrlLike>(\n url: TUrl,\n {sort = null, filters = {}}: TableQueryState = {},\n): TUrl {\n assertUrlLike(url)\n if (sort != null) {\n assertSort(sort)\n url.searchParams.set('sort', `${sort.field}:${sort.direction}`)\n }\n for (const [field, entries] of Object.entries(filters)) {\n for (const [value, mode] of entries) {\n if (!isFilterMode(mode)) {\n throw new TypeError(`Unknown filter mode for ${field}: ${String(mode)}`)\n }\n url.searchParams.append(\n 'filter',\n `${field}:${mode}:${JSON.stringify(value)}`,\n )\n }\n }\n return url\n}\n\nexport function applyLocalTableState<TRow>(\n rows: readonly TRow[],\n sort: TableSort | null,\n filters: TableFilters,\n): TRow[] {\n if (!Array.isArray(rows)) throw new TypeError('Local table data must be an array')\n const filtered = rows.filter((row) => matchesFilters(row, filters))\n if (sort == null) return filtered\n assertSort(sort)\n const direction = sort.direction === 'asc' ? 1 : -1\n return [...filtered].sort((left, right) =>\n compareValues(readField(left, sort.field), readField(right, sort.field)) * direction)\n}\n\nfunction matchesFilters<TRow>(row: TRow, filters: TableFilters): boolean {\n for (const [field, entries] of Object.entries(filters)) {\n const value = readField(row, field)\n const denied = entries.filter(([, mode]) => mode === FilterMode.Deny)\n if (denied.some(([candidate]) => Object.is(candidate, value))) return false\n\n const required = entries.filter(([, mode]) => mode === FilterMode.Require)\n if (required.length > 0\n && !required.some(([candidate]) => Object.is(candidate, value))) return false\n\n const preferred = entries.filter(([, mode]) => mode === FilterMode.Prefer)\n if (preferred.length > 0\n && !preferred.some(([candidate]) => Object.is(candidate, value))) return false\n }\n return true\n}\n\nexport function assertSort(sort: unknown): asserts sort is TableSort {\n if (sort == null\n || typeof sort !== 'object'\n || typeof Reflect.get(sort, 'field') !== 'string'\n || !isSortDirection(Reflect.get(sort, 'direction'))) {\n throw new TypeError('Table sort must contain a field and asc/desc direction')\n }\n}\n\nfunction isSortDirection(value: unknown): value is TableSort['direction'] {\n return value === 'asc' || value === 'desc'\n}\n\nfunction isFilterMode(value: unknown): value is FilterModeValue {\n return Object.values(FilterMode).some((mode) => mode === value)\n}\n\nfunction compareValues(left: unknown, right: unknown): number {\n if (Object.is(left, right)) return 0\n if (left == null) return -1\n if (right == null) return 1\n if (typeof left === 'number' && typeof right === 'number') return left - right\n return String(left).localeCompare(String(right))\n}\n\nfunction readField(value: unknown, field: string): unknown {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {\n return undefined\n }\n return Reflect.get(value, field)\n}\n\nfunction assertUrlLike(value: unknown): asserts value is UrlLike {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'toString') !== 'function') {\n throw new TypeError('Table serializer requires a URL')\n }\n const searchParams = Reflect.get(value, 'searchParams')\n if (searchParams == null\n || typeof Reflect.get(searchParams, 'set') !== 'function'\n || typeof Reflect.get(searchParams, 'append') !== 'function') {\n throw new TypeError('Table serializer requires URL search parameters')\n }\n}\n","import {\n DerivedEmitter,\n Emitter,\n FetchState,\n LiveQuery,\n QueryArg,\n RestQueryHandler,\n} from '@sylwellsoftware/glue'\nimport type {\n FetchLike,\n QueryHandlerLike,\n QuerySerializer,\n ReadableEmitter,\n} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\nimport {TableHeader} from './TableHeader.js'\nimport type {TableColumn, TableRow} from './TableHeaderCell.js'\nimport {applyLocalTableState, serializeTableQuery} from './tableQuery.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableQueryArguments = {\n sort: TableSort | null\n filters: TableFilters\n}\n\nexport type TableQueryInput<TRow extends TableRow = TableRow> = ReadableEmitter<\n readonly TRow[] | undefined,\n unknown\n> & {\n retry?: (cause?: unknown) => unknown\n dispose?: () => void\n}\n\nexport interface DataTableProps<TRow extends TableRow = TableRow> extends ComponentProps {\n mode: 'local' | 'remote'\n columns: readonly TableColumn<TRow>[]\n data?: readonly TRow[] | ReadableEmitter<readonly TRow[], unknown>\n query?: TableQueryInput<TRow>\n queryHandler?: QueryHandlerLike<TableQueryArguments, readonly TRow[]>\n queryUrl?: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serializeQuery?: QuerySerializer<TableQueryArguments>\n selectedItemsEmitter?: ValueEmitter<TRow[]>\n rowKey?: Extract<keyof TRow, string> | ItemKeyGetter<TRow>\n multiSelect?: boolean\n caption?: FrayChild\n emptyMessage?: FrayChild\n placeholderCount?: number\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\n/** Experimental table with explicit local and remote data modes. */\nexport class DataTable<TRow extends TableRow = TableRow>\n extends Component<DataTableProps<TRow>> {\n readonly columns: readonly TableColumn<TRow>[]\n readonly rowKey: ItemKeyGetter<TRow>\n readonly sortEmitter: Emitter<TableSort | null>\n readonly filtersEmitter: Emitter<TableFilters>\n readonly selectedItemsEmitter: ValueEmitter<TRow[]>\n readonly selectionHandler: BaseSelectionHandler<TRow>\n query: TableQueryInput<TRow> | null = null\n private dataSource: ReadableEmitter<readonly TRow[], unknown> | null = null\n private readonly ownedSelectedItemsEmitter: Emitter<TRow[]> | null\n private ownedDataSource: Emitter<readonly TRow[]> | null = null\n private ownsQuery = false\n private readonly queryArgs: Array<QueryArg<TableSort | null> | QueryArg<TableFilters>> = []\n\n constructor(props: DataTableProps<TRow>) {\n super(props)\n if (props.mode !== 'local' && props.mode !== 'remote') {\n throw new TypeError('DataTable mode must be local or remote')\n }\n this.columns = normalizeColumns(props.columns)\n this.rowKey = normalizeRowKey(props.rowKey)\n this.sortEmitter = new Emitter<TableSort | null>(null, {\n owner: this,\n purpose: 'table sort',\n })\n this.filtersEmitter = new Emitter<TableFilters>({}, {\n owner: this,\n purpose: 'table filters',\n })\n this.ownedSelectedItemsEmitter = props.selectedItemsEmitter == null\n ? new Emitter<TRow[]>([], {owner: this, purpose: 'selected table rows'})\n : null\n this.selectedItemsEmitter = props.selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectionHandler = createSelectionHandler({\n owner: this,\n multiSelect: props.multiSelect ?? false,\n selectedItemsEmitter: this.selectedItemsEmitter,\n getItems: () => this.query?.get() ?? [],\n getKey: this.rowKey,\n })\n }\n\n initialize(): void {\n this.query = this.props.mode === 'local'\n ? this.createLocalQuery()\n : this.createRemoteQuery()\n this.watch(this.query, this.selectedItemsEmitter)\n }\n\n private createLocalQuery(): TableQueryInput<TRow> {\n const suppliedData = this.props.data ?? []\n let source: ReadableEmitter<readonly TRow[], unknown>\n if (isReadableEmitter<readonly TRow[]>(suppliedData)) {\n source = suppliedData\n } else {\n this.ownedDataSource = new Emitter<readonly TRow[]>(suppliedData, {\n owner: this,\n purpose: 'local table data',\n })\n source = this.ownedDataSource\n }\n this.dataSource = source\n this.ownsQuery = true\n return new DerivedEmitter(\n [source, this.sortEmitter, this.filtersEmitter] as const,\n ([rows, sort, filters]) => applyLocalTableState(rows, sort, filters),\n {owner: this, purpose: 'local table view'},\n )\n }\n\n private createRemoteQuery(): TableQueryInput<TRow> {\n if (this.props.query != null) {\n assertTableQuery(this.props.query)\n return this.props.query\n }\n\n const handler = this.props.queryHandler ?? this.createRestHandler()\n if (handler == null || typeof handler.fetch !== 'function') {\n throw new TypeError('Remote DataTable requires query, queryHandler, or queryUrl')\n }\n const sort = new QueryArg<TableSort | null>('sort', this.sortEmitter, {\n owner: this,\n purpose: 'remote table sort argument',\n })\n const filters = new QueryArg<TableFilters>('filters', this.filtersEmitter, {\n owner: this,\n purpose: 'remote table filters argument',\n })\n this.queryArgs.push(sort, filters)\n this.ownsQuery = true\n const args = {sort, filters}\n return new LiveQuery<readonly TRow[], typeof args>({\n handler,\n args,\n owner: this,\n purpose: 'remote table query',\n keepPreviousValue: true,\n })\n }\n\n private createRestHandler(): RestQueryHandler<\n TableQueryArguments,\n readonly TRow[]\n > | null {\n if (this.props.queryUrl == null) return null\n const options: {\n url: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serialize: QuerySerializer<TableQueryArguments>\n } = {\n url: this.props.queryUrl,\n serialize: this.props.serializeQuery ?? serializeTableQuery,\n }\n if (this.props.baseUrl != null) options.baseUrl = this.props.baseUrl\n if (this.props.fetch != null) options.fetch = this.props.fetch\n return new RestQueryHandler<TableQueryArguments, readonly TRow[]>(options)\n }\n\n render(): FrayChild {\n const rows = this.query?.get() ?? []\n if (!Array.isArray(rows)) throw new TypeError('DataTable query value must be an array')\n const status = this.query?.getFetchState() ?? FetchState.Initial\n const error = this.query?.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(\n this.selectedItemsEmitter.get().map((item, index) => this.rowKey(item, index)),\n )\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-loading={isLoading ? '' : null}\n data-error={status === FetchState.Error ? '' : null}\n >\n {isLoading ? <p role=\"status\" data-part=\"status\">Loading rows…</p> : null}\n {status === FetchState.Error ? <div data-part=\"error\" role=\"alert\">\n <span>{errorMessage(error, 'Unable to load rows')}</span>\n {typeof this.query?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.query?.retry?.('table retry')}\n >Retry</button>\n : null}\n </div> : null}\n <table data-part=\"table\" aria-busy={isLoading ? 'true' : null}>\n {this.props.caption == null ? null : <caption>{this.props.caption}</caption>}\n <TableHeader\n key=\"header\"\n columns={this.columns}\n sortEmitter={this.sortEmitter}\n filtersEmitter={this.filtersEmitter}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />\n <tbody>\n {rows.length > 0\n ? rows.map((row, index) =>\n this.renderRow(row, index, selectedKeys))\n : isLoading\n ? this.renderPlaceholders()\n : status === FetchState.Error\n ? null\n : <tr key=\"empty\">\n <td colSpan={this.columns.length}>\n {this.props.emptyMessage ?? 'No rows'}\n </td>\n </tr>}\n </tbody>\n </table>\n </Host>\n }\n\n private renderRow(\n row: TRow,\n index: number,\n selectedKeys: ReadonlySet<unknown>,\n ): FrayChild {\n const key = this.rowKey(row, index)\n const selected = selectedKeys.has(key)\n return <tr\n key={String(key)}\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >\n {this.columns.map((column) => <td key={String(column.field)}>\n {column.render\n ? column.render(row, index)\n : renderCellValue(row[column.field])}\n </td>)}\n </tr>\n }\n\n private renderPlaceholders(): FrayChild[] {\n const count = this.props.placeholderCount ?? 5\n return Array.from({length: count}, (_, rowIndex) =>\n <tr key={`placeholder-${rowIndex}`}>\n {this.columns.map((column, columnIndex) =>\n <td key={String(column.field)}>\n <Placeholder\n width={45 + ((rowIndex + columnIndex) % 6) * 8}\n />\n </td>)}\n </tr>)\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('tbody [data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedRows(): TRow[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedRowsEmitter(): ValueEmitter<TRow[]> {\n return this.selectedItemsEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n if (this.ownsQuery) this.query?.dispose?.()\n for (const argument of this.queryArgs) argument.dispose()\n this.ownedDataSource?.dispose()\n this.ownedSelectedItemsEmitter?.dispose()\n this.sortEmitter.dispose()\n this.filtersEmitter.dispose()\n }\n\n static dependencies = [Placeholder, TableHeader]\n\n static override hostName = 'data-table'\n static override standaloneHostName = 'data-table'\n\n static css = css`\n & {\n overflow: auto;\n color: var(--ui-text-color);\n }\n\n & > table {\n width: 100%;\n border-collapse: collapse;\n }\n\n & th,\n & td {\n padding: var(--ui-padding-v) var(--ui-padding-h);\n text-align: start;\n }\n\n & tbody tr[data-fray-selectable-row] {\n cursor: default;\n user-select: none;\n }\n\n & tbody tr:nth-child(odd) {\n background: var(--fray-table-row-background, transparent);\n }\n\n & tbody tr:nth-child(even) {\n background: var(--fray-table-row-alt-background, transparent);\n }\n\n & tbody tr[data-fray-selectable-row]:hover {\n background: var(--fray-row-hover-background, var(--button-background-hover));\n }\n\n & tbody tr[data-fray-selectable-row]:focus-visible {\n outline: 2px solid var(--fray-color-focus, var(--ui-accent-color));\n outline-offset: -2px;\n }\n\n & tbody tr[data-fray-selectable-row][aria-selected=\"true\"] {\n color: var(--fray-selection-color, var(--toggle-selected-text));\n background: var(--fray-selection-background, var(--toggle-selected-bg));\n }\n\n & > [data-part=\"error\"] {\n color: var(--error-color);\n }\n `\n}\n\nfunction normalizeColumns<TRow extends TableRow>(\n columns: unknown,\n): readonly TableColumn<TRow>[] {\n if (!Array.isArray(columns) || columns.length === 0) {\n throw new TypeError('DataTable columns must be a non-empty array')\n }\n const fields = new Set<string>()\n return columns.map((column: unknown) => {\n if (column == null || typeof column !== 'object') {\n throw new TypeError('Every DataTable column requires a field')\n }\n const field = Reflect.get(column, 'field')\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError('Every DataTable column requires a field')\n }\n if (fields.has(field)) throw new Error(`Duplicate DataTable column: ${field}`)\n fields.add(field)\n const render = Reflect.get(column, 'render')\n if (render != null && typeof render !== 'function') {\n throw new TypeError(`DataTable column ${field} render must be a function`)\n }\n // Runtime validation above proves the structural column boundary; the\n // row-specific callback relationship is checked at the public API.\n return column as TableColumn<TRow>\n })\n}\n\nfunction normalizeRowKey<TRow extends TableRow>(\n rowKey: DataTableProps<TRow>['rowKey'],\n): ItemKeyGetter<TRow> {\n if (rowKey == null) return defaultItemKey\n if (typeof rowKey === 'function') return rowKey\n if (typeof rowKey === 'string' && rowKey.length > 0) {\n return (row, index) => {\n const key = row[rowKey]\n if (key == null) {\n throw new TypeError(`DataTable row at index ${index} lacks ${rowKey}`)\n }\n return key\n }\n }\n throw new TypeError('DataTable rowKey must be a function or property name')\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === 'function'\n}\n\nfunction assertTableQuery<TRow extends TableRow>(\n value: unknown,\n): asserts value is TableQueryInput<TRow> {\n if (!isReadableEmitter<readonly TRow[] | undefined>(value)) {\n throw new TypeError('DataTable query must be an emitter')\n }\n}\n\nfunction renderCellValue(value: unknown): FrayChild {\n if (value == null || typeof value === 'string' || typeof value === 'number') return value\n return String(value)\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\n\nexport interface TreeNode<TValue = unknown> {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n children?: readonly TreeNode<TValue>[]\n}\n\nexport interface TreeItemProps<TValue = unknown> extends ComponentProps {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n}\n\n/** Declarative tree-node marker consumed by TreeView. */\nexport class TreeItem<TValue = unknown> extends Component<TreeItemProps<TValue>> {\n render(): FrayChild {\n return this.props.children ?? []\n }\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {componentClass, invoke} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {TreeItem} from './treeitem.js'\nimport type {TreeItemProps, TreeNode} from './treeitem.js'\n\nexport interface TreeViewProps<TValue = unknown> extends ComponentProps {\n nodes?: readonly TreeNode<TValue>[] | ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n label: string\n selectedKeyEmitter?: ValueEmitter<Key | null>\n expandedKeysEmitter?: ValueEmitter<Key[]>\n renderItem?: (node: TreeNode<TValue>, depth: number) => FrayChild\n onSelect?: (node: TreeNode<TValue>, event: Event) => void\n}\n\ninterface VisibleNode<TValue> {\n node: TreeNode<TValue>\n depth: number\n parentId: Key | null\n position: number\n setSize: number\n}\n\n/** Experimental single-select ARIA tree with controlled expansion and selection. */\nexport class TreeView<TValue = unknown> extends Component<TreeViewProps<TValue>> {\n readonly nodesEmitter: ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n readonly selectedKeyEmitter: ValueEmitter<Key | null>\n readonly expandedKeysEmitter: ValueEmitter<Key[]>\n private readonly ownedNodesEmitter: Emitter<readonly TreeNode<TValue>[]> | null\n private readonly ownedSelectedEmitter: Emitter<Key | null> | null\n private readonly ownedExpandedEmitter: Emitter<Key[]> | null\n private focusedKey: Key | null = null\n private typeahead = ''\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(props: TreeViewProps<TValue>) {\n super(props)\n if (isReadableEmitter<readonly TreeNode<TValue>[]>(props.nodes)) {\n this.nodesEmitter = props.nodes\n this.ownedNodesEmitter = null\n } else {\n const nodes = props.nodes ?? extractDeclarativeNodes<TValue>(props.children)\n this.ownedNodesEmitter = new Emitter(nodes, {\n owner: this,\n purpose: 'tree nodes',\n })\n this.nodesEmitter = this.ownedNodesEmitter\n }\n this.ownedSelectedEmitter = props.selectedKeyEmitter == null\n ? new Emitter<Key | null>(null, {owner: this, purpose: 'selected tree key'})\n : null\n this.selectedKeyEmitter = props.selectedKeyEmitter ?? this.ownedSelectedEmitter!\n this.ownedExpandedEmitter = props.expandedKeysEmitter == null\n ? new Emitter<Key[]>([], {owner: this, purpose: 'expanded tree keys'})\n : null\n this.expandedKeysEmitter = props.expandedKeysEmitter ?? this.ownedExpandedEmitter!\n }\n\n initialize(): void {\n this.reconcile(this.nodesEmitter.get())\n this.watch(this.nodesEmitter, this.selectedKeyEmitter, this.expandedKeysEmitter)\n this.onCleanup(this.nodesEmitter.subscribe(({value}) => this.reconcile(value), {\n emitCurrent: false,\n }))\n }\n\n render(): FrayChild {\n const nodes = this.nodesEmitter.get()\n assertTreeNodes(nodes)\n const expanded = new Set(this.expandedKeysEmitter.get())\n const visible = flattenVisible(nodes, expanded)\n const selected = this.selectedKeyEmitter.get()\n const active = visible.find(({node}) => Object.is(node.id, this.focusedKey))\n ?? visible.find(({node}) => Object.is(node.id, selected))\n ?? visible[0]\n ?? null\n this.focusedKey = active?.node.id ?? null\n\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n {visible.length === 0\n ? <p role=\"status\" data-part=\"empty\">No tree items</p>\n : <div role=\"tree\" aria-label={this.props.label} data-part=\"tree\">\n {visible.map((item, index) => {\n const {node, depth, position, setSize} = item\n const hasChildren = (node.children?.length ?? 0) > 0\n const isExpanded = hasChildren && expanded.has(node.id)\n const isSelected = Object.is(node.id, selected)\n const label = this.props.renderItem?.(node, depth) ?? node.label\n return <div\n key={node.id}\n role=\"treeitem\"\n data-part=\"item\"\n data-index={index}\n data-depth={depth}\n aria-level={depth + 1}\n aria-posinset={position}\n aria-setsize={setSize}\n aria-expanded={hasChildren ? String(isExpanded) : null}\n aria-selected={String(isSelected)}\n tabIndex={Object.is(node.id, active?.node.id) ? 0 : -1}\n style={{'--tree-depth': depth}}\n onClick={(event: MouseEvent) => {\n this.focusedKey = node.id\n if (isExpanderTarget(event.target) && hasChildren) {\n this.toggleExpanded(node.id)\n this.focusRow(node.id)\n return\n }\n this.selectNode(node, event)\n }}\n onFocus={() => this.focusedKey = node.id}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleKeyDown(event, index, visible)}\n >\n <span\n data-part=\"expander\"\n data-expandable={hasChildren ? '' : null}\n aria-hidden=\"true\"\n >{hasChildren ? (isExpanded ? '▾' : '▸') : '•'}</span>\n <span data-part=\"label\">{label}</span>\n </div>\n })}\n </div>}\n </Host>\n }\n\n onDestroy(): void {\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.ownedNodesEmitter?.dispose()\n this.ownedSelectedEmitter?.dispose()\n this.ownedExpandedEmitter?.dispose()\n }\n\n static dependencies = [TreeItem]\n\n static override hostName = 'tree-view'\n static override standaloneHostName = 'tree-view'\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n & > [data-part=\"tree\"] {\n display: grid;\n align-content: start;\n }\n\n & [data-part=\"item\"] {\n display: flex;\n align-items: flex-start;\n gap: 0.35rem;\n min-width: 0;\n padding: 0.38rem 0.5rem;\n padding-inline-start: calc(0.5rem + var(--tree-depth) * 1.1rem);\n cursor: default;\n user-select: none;\n }\n\n & [data-part=\"item\"]:hover {\n background: var(--button-background-hover);\n }\n\n & [data-part=\"item\"]:focus-visible {\n outline: 2px solid var(--ui-accent-color);\n outline-offset: -2px;\n }\n\n & [data-part=\"item\"][aria-selected=\"true\"] {\n color: var(--toggle-selected-text);\n background: var(--toggle-selected-bg);\n }\n\n & [data-part=\"expander\"] {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [data-part=\"expander\"][data-expandable] {\n cursor: pointer;\n }\n\n & [data-part=\"label\"] {\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [data-part=\"empty\"] {\n margin: 0;\n padding: var(--ui-padding, 0.75rem);\n }\n\n @media (forced-colors: active) {\n & [data-part=\"item\"][aria-selected=\"true\"] {\n outline: 2px solid Highlight;\n forced-color-adjust: auto;\n }\n }\n `\n\n private reconcile(nodes: readonly TreeNode<TValue>[]): void {\n assertTreeNodes(nodes)\n const allKeys = new Set(flattenAll(nodes).map(({node}) => node.id))\n const selected = this.selectedKeyEmitter.get()\n if (this.ownedSelectedEmitter != null && selected != null && !allKeys.has(selected)) {\n this.selectedKeyEmitter.set(null, 'selected tree item removed')\n }\n const expanded = this.expandedKeysEmitter.get()\n const retained = expanded.filter((key) => allKeys.has(key))\n if (this.ownedExpandedEmitter != null && !sameKeys(expanded, retained)) {\n this.expandedKeysEmitter.set(retained, 'removed tree expansions reconciled')\n }\n if (this.focusedKey != null && !allKeys.has(this.focusedKey)) this.focusedKey = null\n }\n\n private selectNode(node: TreeNode<TValue>, event: Event): void {\n this.selectedKeyEmitter.set(node.id, 'tree item selected')\n invoke(this.props.onSelect, node, event)\n this.focusRow(node.id)\n }\n\n private toggleExpanded(key: Key): void {\n const expanded = this.expandedKeysEmitter.get()\n const contains = expanded.some((candidate) => Object.is(candidate, key))\n this.expandedKeysEmitter.set(\n contains\n ? expanded.filter((candidate) => !Object.is(candidate, key))\n : [...expanded, key],\n contains ? 'tree item collapsed' : 'tree item expanded',\n )\n }\n\n private handleKeyDown(\n event: KeyboardEvent,\n index: number,\n visible: readonly VisibleNode<TValue>[],\n ): void {\n const current = visible[index]\n if (current == null) return\n if (event.key === 'ArrowDown') return this.move(event, visible[index + 1]?.node.id)\n if (event.key === 'ArrowUp') return this.move(event, visible[index - 1]?.node.id)\n if (event.key === 'Home') return this.move(event, visible[0]?.node.id)\n if (event.key === 'End') return this.move(event, visible.at(-1)?.node.id)\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n const children = current.node.children ?? []\n if (children.length === 0) return\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (!expanded) this.toggleExpanded(current.node.id)\n else this.focusRow(children[0]!.id)\n return\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (expanded) this.toggleExpanded(current.node.id)\n else if (current.parentId != null) this.focusRow(current.parentId)\n return\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectNode(current.node, event)\n return\n }\n if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n this.handleTypeahead(event, visible, index)\n }\n }\n\n private move(event: KeyboardEvent, key: Key | undefined): void {\n if (key === undefined) return\n event.preventDefault()\n this.focusRow(key)\n }\n\n private focusRow(key: Key): void {\n this.focusedKey = key\n const rows = this.dom instanceof Element\n ? [...this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')]\n : []\n for (const row of rows) {\n const index = Number(row.dataset.index)\n const visible = flattenVisible(\n this.nodesEmitter.get(),\n new Set(this.expandedKeysEmitter.get()),\n )\n const matches = Object.is(visible[index]?.node.id, key)\n row.tabIndex = matches ? 0 : -1\n if (matches) row.focus()\n }\n }\n\n private handleTypeahead(\n event: KeyboardEvent,\n visible: readonly VisibleNode<TValue>[],\n index: number,\n ): void {\n event.preventDefault()\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.typeahead += event.key.toLocaleLowerCase()\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = ''\n this.typeaheadTimer = null\n }, 650)\n const candidates = [...visible.slice(index + 1), ...visible.slice(0, index + 1)]\n const match = candidates.find(({node}) => textValue(node)\n .toLocaleLowerCase()\n .startsWith(this.typeahead))\n if (match != null) this.focusRow(match.node.id)\n }\n}\n\nfunction extractDeclarativeNodes<TValue>(children: ComponentProps['children']): TreeNode<TValue>[] {\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n return values.filter((child) => isVNode(child) && child.type === TreeItem).map((child) => {\n if (!isVNode(child)) throw new TypeError('TreeView children must be TreeItem nodes')\n const props = child.props as unknown as TreeItemProps<TValue>\n return {\n id: props.id,\n label: props.label,\n ...(props.textValue == null ? {} : {textValue: props.textValue}),\n ...(props.value === undefined ? {} : {value: props.value}),\n children: extractDeclarativeNodes<TValue>(props.children),\n }\n })\n}\n\nfunction flattenVisible<TValue>(\n nodes: readonly TreeNode<TValue>[],\n expanded: ReadonlySet<Key>,\n): VisibleNode<TValue>[] {\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n if ((node.children?.length ?? 0) > 0 && expanded.has(node.id)) {\n visit(node.children ?? [], depth + 1, node.id)\n }\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction flattenAll<TValue>(nodes: readonly TreeNode<TValue>[]): VisibleNode<TValue>[] {\n const allKeys = new Set<Key>()\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n if (allKeys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n allKeys.add(node.id)\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n visit(node.children ?? [], depth + 1, node.id)\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction assertTreeNodes<TValue>(value: unknown): asserts value is readonly TreeNode<TValue>[] {\n if (!Array.isArray(value)) throw new TypeError('TreeView nodes must be an array')\n for (const {node} of flattenAll(value as readonly TreeNode<TValue>[])) {\n if (node == null || typeof node !== 'object' || node.id == null) {\n throw new TypeError('Each tree node requires an id')\n }\n if (!Array.isArray(node.children ?? [])) {\n throw new TypeError(`Tree node ${String(node.id)} children must be an array`)\n }\n }\n}\n\nfunction textValue<TValue>(node: TreeNode<TValue>): string {\n if (node.textValue != null) return node.textValue\n if (typeof node.label === 'string' || typeof node.label === 'number') return String(node.label)\n return String(node.id)\n}\n\nfunction sameKeys(left: readonly Key[], right: readonly Key[]): boolean {\n return left.length === right.length\n && left.every((value, index) => Object.is(value, right[index]))\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction isExpanderTarget(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('[data-part=\"expander\"]') != null\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport interface DialogProps extends ValueControlProps<boolean> {\n id?: string | number | null\n title: FrayChild\n description?: FrayChild\n actions?: FrayChild\n closeLabel?: string\n showCloseButton?: boolean\n initialFocusRef?: Ref<HTMLElement>\n onClose?: () => void\n}\n\n/** Experimental controlled modal built on the native dialog element. */\nexport class Dialog extends Component<DialogProps> {\n readonly openEmitter: ValueEmitter<boolean>\n readonly dialogId: string\n readonly titleId: string\n readonly descriptionId: string\n private dialogElement: HTMLDialogElement | null = null\n private restoreFocusTo: HTMLElement | null = null\n private synchronizedOpen = false\n\n constructor(props: DialogProps) {\n super(props)\n this.openEmitter = createValueEmitter(this, props, false, 'dialog open state')\n this.dialogId = controlId('dialog', props.id)\n this.titleId = `${this.dialogId}-title`\n this.descriptionId = `${this.dialogId}-description`\n }\n\n initialize(): void {\n this.watch(this.openEmitter)\n }\n\n render(): FrayChild {\n const {\n title,\n description,\n actions,\n closeLabel = 'Close',\n showCloseButton = true,\n children = [],\n } = this.props\n return <dialog\n id={this.dialogId}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"dialog\"\n aria-labelledby={this.titleId}\n aria-describedby={description == null ? null : this.descriptionId}\n aria-modal=\"true\"\n ref={(element: HTMLDialogElement | null) => this.dialogElement = element}\n >\n <header data-part=\"header\">\n <h2 id={this.titleId}>{title}</h2>\n </header>\n {description == null ? null : <p id={this.descriptionId} data-part=\"description\">\n {description}\n </p>}\n <div data-part=\"content\">{children}</div>\n {actions == null && !showCloseButton ? null : <footer data-part=\"actions\">\n {actions}\n {showCloseButton ? <Button\n label={closeLabel}\n onClick={() => this.requestClose()}\n /> : null}\n </footer>}\n </dialog>\n }\n\n afterMount(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n this.listen(dialog, 'cancel', (event: Event) => {\n event.preventDefault()\n this.requestClose()\n })\n this.listen(dialog, 'close', () => {\n if (this.openEmitter.get()) this.openEmitter.set(false, 'native dialog closed')\n this.finishClose()\n })\n this.syncOpenState()\n }\n\n afterUpdate(): void {\n this.syncOpenState()\n }\n\n close(): void {\n this.requestClose()\n }\n\n onDestroy(): void {\n const dialog = this.dialogElement\n if (dialog?.open === true && typeof dialog.close === 'function') dialog.close()\n this.finishClose()\n this.dialogElement = null\n }\n\n static dependencies = [Button]\n\n static css = css`\n dialog[data-fray-component=\"dialog\"] {\n width: min(38rem, calc(100vw - 2rem));\n max-height: min(42rem, calc(100dvh - 2rem));\n padding: 0;\n color: var(--fray-panel-color, var(--ui-text-color));\n background: var(--fray-panel-background, var(--panel-bg));\n border: var(--fray-panel-border, var(--panel-border));\n border-radius: var(--fray-panel-radius, var(--panel-radius));\n box-shadow: var(--fray-dialog-shadow, var(--fray-panel-shadow));\n }\n\n dialog[data-fray-component=\"dialog\"]::backdrop {\n background: var(--fray-dialog-backdrop-background);\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part] {\n padding: var(--panel-padding, 0.75rem);\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"header\"] {\n color: var(\n --fray-dialog-header-color,\n var(--fray-section-header-color, var(--fray-header-color))\n );\n background: var(\n --fray-dialog-header-background,\n var(--fray-section-header-background, var(--fray-header-background))\n );\n border-block-end: var(\n --fray-section-header-border,\n var(--fray-header-border)\n );\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"header\"] h2,\n dialog[data-fray-component=\"dialog\"] > [data-part=\"description\"] {\n margin: 0;\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"content\"] {\n overflow: auto;\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"actions\"] {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-small, 0.5rem);\n border-block-start: 1px solid var(--ui-border-color);\n }\n\n @media (prefers-reduced-motion: no-preference) {\n dialog[data-fray-component=\"dialog\"][open] {\n animation: fray-dialog-enter 120ms ease-out;\n }\n }\n\n @keyframes fray-dialog-enter {\n from {\n transform: translateY(0.4rem);\n }\n }\n\n @media (forced-colors: active) {\n dialog[data-fray-component=\"dialog\"] {\n border: 2px solid CanvasText;\n }\n }\n `\n\n private requestClose(): void {\n if (!this.openEmitter.get()) return\n this.openEmitter.set(false, 'dialog close requested')\n }\n\n private syncOpenState(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n const shouldOpen = this.openEmitter.get()\n if (shouldOpen && !this.synchronizedOpen) {\n const active = document.activeElement\n this.restoreFocusTo = active instanceof HTMLElement ? active : null\n showModal(dialog)\n this.synchronizedOpen = true\n focusInitial(dialog, this.props.initialFocusRef)\n return\n }\n if (!shouldOpen && this.synchronizedOpen) {\n if (dialog.open && typeof dialog.close === 'function') dialog.close()\n else dialog.removeAttribute('open')\n this.finishClose()\n }\n }\n\n private finishClose(): void {\n if (!this.synchronizedOpen && this.restoreFocusTo == null) return\n this.synchronizedOpen = false\n const restore = this.restoreFocusTo\n this.restoreFocusTo = null\n if (restore?.isConnected === true) restore.focus()\n invoke(this.props.onClose)\n }\n}\n\nfunction showModal(dialog: HTMLDialogElement): void {\n if (dialog.open) return\n if (typeof dialog.showModal === 'function') {\n dialog.showModal()\n return\n }\n dialog.setAttribute('open', '')\n}\n\nfunction focusInitial(dialog: HTMLDialogElement, ref: Ref<HTMLElement> | undefined): void {\n const referenced = ref == null\n ? null\n : typeof ref === 'function' ? null : ref.current\n const target = referenced ?? dialog.querySelector<HTMLElement>(\n '[autofocus], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n target?.focus()\n}\n"],"names":["Placeholder","Component","width","normalizeWidth","Host","jsx","__publicField","css","numeric","BaseSelectionHandler","getItems","getKey","defaultItemKey","selectedItemsEmitter","owner","Emitter","rows","row","index","clampIndex","onClick","event","onKeyDown","onMouseDown","onMouseEnter","_a","ownerDocument","onMouseUp","lastIndex","nextIndex","_startIndex","_endIndex","_event","_index","items","cause","selected","selectedKeys","item","current","cleanup","suppressClick","SingleSelectionHandler","MultiSelectionHandler","first","last","range","next","isCommandPressed","mergeByKey","key","candidate","candidateIndex","startIndex","endIndex","createSelectionHandler","config","id","length","left","right","result","keys","ListView","props","isReadableEmitter","normalizeKeyGetter","status","error","isLoading","FetchState","jsxs","componentClass","errorMessage","_","content","defaultItemLabel","dom","_b","itemKey","value","label","isRenderablePrimitive","fallback","FilterPanel","isEmitterLike","values","fetchState","_c","filters","normalizeFilters","filterModes","Checkbox","defaultSemanticState","FilterMode","option","optionValue","optionLabel","state","FilterModeCheckbox","nextState","isFrayLabel","TableHeaderCell","currentSort","direction","isFilterSelectionEntry","filterLabel","panel","entry","TableHeader","column","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","entries","mode","isFilterMode","applyLocalTableState","filtered","matchesFilters","compareValues","readField","required","preferred","isSortDirection","searchParams","DataTable","normalizeColumns","normalizeRowKey","suppliedData","source","DerivedEmitter","assertTableQuery","handler","QueryArg","args","LiveQuery","options","RestQueryHandler","_d","renderCellValue","count","rowIndex","columnIndex","argument","columns","fields","render","rowKey","TreeItem","TreeView","nodes","extractDeclarativeNodes","assertTreeNodes","expanded","visible","flattenVisible","active","node","depth","position","setSize","hasChildren","isExpanded","isSelected","isExpanderTarget","allKeys","flattenAll","retained","sameKeys","invoke","contains","children","matches","match","textValue","child","isVNode","visit","parentId","target","Dialog","createValueEmitter","controlId","title","description","actions","closeLabel","showCloseButton","element","Button","dialog","shouldOpen","showModal","focusInitial","restore","ref"],"mappings":";;;;;;AAQO,MAAMA,UAAoBC,EAA4B;AAAA,EACzD,SAAS;AACL,UAAMC,IAAQC,GAAe,KAAK,MAAM,SAAS,EAAE,GAC7CC,IAAO,KAAK;AAClB,WAAO,gBAAAC,EAACD,GAAA,EAAK,OAAO,EAAC,OAAO,GAAGF,CAAK,IAAA,GAAM,eAAY,OAAA,CAAO;AAAA,EACjE;AA0BJ;AAxBII,EAPSN,GAOO,YAAW,gBAC3BM,EARSN,GAQO,sBAAqB,wBAErCM,EAVSN,GAUF,cAAa;AAAA,EAChB,CAAC,YAAY,CAAC,SAAS,SAAS,CAAC;AAAA,IAGrCM,EAdSN,GAcF,OAAMO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBjB,SAASJ,GAAeD,GAAgC;AACpD,QAAMM,IAAU,OAAON,CAAK;AAC5B,MAAI,CAAC,OAAO,SAASM,CAAO,EAAG,OAAM,IAAI,UAAU,mCAAmC;AACtF,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,IAAIA,CAAO,CAAC;AAC9C;ACvBO,MAAMC,EAAsC;AAAA,EAmB/C,YAAY;AAAA,IACR,UAAAC;AAAA,IACA,QAAAC,IAASC;AAAA,IACT,sBAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,EAAA,GACsB;AAvBzB,IAAAR,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACC,IAAAA,EAAA,cAAsB,CAAA;AACf,IAAAA,EAAA,qBAAiC,CAAA;AACxC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAA6B;AAC/B,IAAAA,EAAA,wBAAgC;AAChC,IAAAA,EAAA,yBAAqC;AACrC,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,qBAAmC;AACnC,IAAAA,EAAA,2BAAoB;AACpB,IAAAA,EAAA,4BAA2D;AAC3D,IAAAA,EAAA,mBAAY;AACH,IAAAA,EAAA;AAQb,QAAI,OAAOI,KAAa;AACpB,YAAM,IAAI,UAAU,+CAA+C;AAEvE,QAAI,OAAOC,KAAW;AAClB,YAAM,IAAI,UAAU,6CAA6C;AAErE,SAAK,WAAWD,GAChB,KAAK,SAASC,GACd,KAAK,4BAA4BE,KAAwB,OACnD,IAAIE,EAAiB,IAAI,EAAC,OAAAD,GAAO,SAAS,iBAAA,CAAiB,IAC3D,MACN,KAAK,uBAAuBD,KACrB,KAAK,2BACZ,KAAK,iBAAiB,KAAK,sBAC3B,KAAK,2BAA2B,KAAK,6BAA6B;AAAA,EACtE;AAAA,EAEA,YAAYG,GAAmE;AAC3E,IAAI,KAAK,cACT,KAAK,YAAA,GACL,KAAK,OAAO,MAAM,KAAKA,KAAQ,CAAA,CAAE,GACjC,KAAK,KAAK,QAAQ,CAACC,GAAKC,MAAU,KAAK,QAAQD,GAAKC,CAAK,CAAC,GAC1D,KAAK,cAAcC,GAAW,KAAK,aAAa,KAAK,KAAK,MAAM,GAChE,KAAK,uBAAA,GACL,KAAK,SAAA;AAAA,EACT;AAAA,EAEQ,QAAQF,GAAkBC,GAAqB;AACnD,UAAME,IAAU,CAACC,MAA4B,KAAK,YAAYH,GAAOG,CAAK,GACpEC,IAAY,CAACD,MAA+B,KAAK,cAAcH,GAAOG,CAAK,GAC3EE,IAAc,CAACF,MAA4B,KAAK,gBAAgBH,GAAOG,GAAOJ,CAAG,GACjFO,IAAe,CAACH,MAA4B,KAAK,iBAAiBH,GAAOG,CAAK;AACpF,IAAAJ,EAAI,iBAAiB,SAASG,CAAO,GACrCH,EAAI,iBAAiB,WAAWK,CAAS,GACzCL,EAAI,iBAAiB,aAAaM,CAAW,GAC7CN,EAAI,iBAAiB,cAAcO,CAAY,GAC/C,KAAK,YAAY,KAAK,MAAM;AACxB,MAAAP,EAAI,oBAAoB,SAASG,CAAO,GACxCH,EAAI,oBAAoB,WAAWK,CAAS,GAC5CL,EAAI,oBAAoB,aAAaM,CAAW,GAChDN,EAAI,oBAAoB,cAAcO,CAAY;AAAA,IACtD,CAAC;AAAA,EACL;AAAA,EAEQ,YAAYN,GAAeG,GAAyB;;AAExD,QADAA,EAAM,eAAA,GACF,KAAK,mBAAmB;AACxB,WAAK,sBAAA;AACL;AAAA,IACJ;AACA,SAAK,cAAcH,GACnB,KAAK,YAAYA,GAAOG,CAAK,IAC7BI,IAAA,KAAK,KAAKP,CAAK,MAAf,QAAAO,EAAkB;AAAA,EACtB;AAAA,EAEQ,gBAAgBP,GAAeG,GAAmBJ,GAAwB;AAC9E,QAAII,EAAM,WAAW,KAAK,CAAC,KAAK,wBAAyB;AACzD,SAAK,WAAW,EAAK,GACrB,KAAK,sBAAA,GACL,KAAK,iBAAiBH,GACtB,KAAK,kBAAkBG,GACvB,KAAK,YAAY;AACjB,UAAMK,IAAgBT,EAAI,eACpBU,IAAY,MAAY,KAAK,WAAW,KAAK,SAAS;AAC5D,IAAAD,EAAc,iBAAiB,WAAWC,CAAS,GACnD,KAAK,cAAc,MAAMD,EAAc,oBAAoB,WAAWC,CAAS;AAAA,EACnF;AAAA,EAEQ,iBAAiBT,GAAeG,GAAyB;;AAC7D,IAAI,KAAK,kBAAkB,SACvBH,MAAU,KAAK,kBAAkB,CAAC,KAAK,aACvCA,MAAU,KAAK,eAAe,KAAK,cACvCG,EAAM,eAAA,GACN,KAAK,YAAY,IACjB,KAAK,cAAcH,GACnB,KAAK,gBAAgB,KAAK,gBAAgBA,GAAO,KAAK,mBAAmBG,CAAK,IAC9EI,IAAA,KAAK,KAAKP,CAAK,MAAf,QAAAO,EAAkB;AAAA,EACtB;AAAA,EAEQ,cAAcP,GAAeG,GAA4B;;AAC7D,UAAMO,IAAY,KAAK,KAAK,SAAS;AACrC,QAAIC;AACJ,QAAIR,EAAM,QAAQ,YAAa,CAAAQ,IAAY,KAAK,IAAIX,IAAQ,GAAGU,CAAS;AAAA,aAC/DP,EAAM,QAAQ,UAAW,CAAAQ,IAAY,KAAK,IAAIX,IAAQ,GAAG,CAAC;AAAA,aAC1DG,EAAM,QAAQ,OAAQ,CAAAQ,IAAY;AAAA,aAClCR,EAAM,QAAQ,MAAO,CAAAQ,IAAYD;AAAA,aACjCP,EAAM,QAAQ,OAAOA,EAAM,QAAQ,SAAS;AACjD,MAAAA,EAAM,eAAA,GACN,KAAK,cAAcH,GACnB,KAAK,YAAYA,GAAOG,CAAK;AAC7B;AAAA,IACJ,MAAO;AAEP,IAAAA,EAAM,eAAA,GACN,KAAK,cAAcQ,GACnB,KAAK,eAAeA,GAAWR,CAAK,GACpC,KAAK,SAAA,IACLI,IAAA,KAAK,KAAKI,CAAS,MAAnB,QAAAJ,EAAsB;AAAA,EAC1B;AAAA,EAEU,eAAeP,GAAeG,GAA4B;AAChE,SAAK,YAAYH,GAAOG,CAAK;AAAA,EACjC;AAAA,EAEU,wBAAiC;AACvC,WAAO;AAAA,EACX;AAAA,EAEU,gBACNS,GACAC,GACAC,GACI;AAAA,EAAC;AAAA,EAEC,YAAYC,GAAgBD,GAA8B;AAAA,EAAC;AAAA,EAE3D,iBAAiBE,GAAgBC,IAAQ,qBAA2B;AAC1E,SAAK,qBAAqB,IAAID,GAAOC,CAAK,GAC1C,KAAK,SAAA;AAAA,EACT;AAAA,EAEA,mBAA4B;AACxB,WAAO,KAAK,qBAAqB,IAAA,KAAS,CAAA;AAAA,EAC9C;AAAA,EAEA,0BAAiD;AAC7C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,yBAA+B;AACnC,UAAMC,IAAW,KAAK,iBAAA;AACtB,QAAIA,EAAS,WAAW,EAAG;AAC3B,UAAMC,IAAe,IAAI,IAAID,EAAS,IAAI,CAACE,GAAMpB,MAAU,KAAK,OAAOoB,GAAMpB,CAAK,CAAC,CAAC,GAC9EqB,IAAU,KAAK,SAAA,EAAW,OAAO,CAACD,GAAMpB,MAC1CmB,EAAa,IAAI,KAAK,OAAOC,GAAMpB,CAAK,CAAC,CAAC;AAC9C,KAAIqB,EAAQ,WAAWH,EAAS,UACzBG,EAAQ,KAAK,CAACD,GAAMpB,MAAU,CAAC,OAAO,GAAGoB,GAAMF,EAASlB,CAAK,CAAC,CAAC,MAClE,KAAK,qBAAqB,IAAI,CAAC,GAAGqB,CAAO,GAAG,gCAAgC;AAAA,EAEpF;AAAA,EAEQ,WAAiB;AACrB,UAAMF,IAAe,IAAI,IAAI,KAAK,mBAAmB,IAAI,CAACC,GAAMpB,MAC5D,KAAK,OAAOoB,GAAMpB,CAAK,CAAC,CAAC,GACvBgB,IAAQ,KAAK,SAAA;AACnB,SAAK,KAAK,QAAQ,CAACjB,GAAKC,MAAU;AAC9B,YAAMoB,IAAOJ,EAAMhB,CAAK,GAClBkB,IAAWE,MAAS,UACnBD,EAAa,IAAI,KAAK,OAAOC,GAAMpB,CAAK,CAAC;AAChD,MAAAD,EAAI,UAAU,OAAO,YAAYmB,CAAQ,GACzCnB,EAAI,aAAa,iBAAiB,OAAOmB,CAAQ,CAAC,GAClDnB,EAAI,WAAWC,MAAU,KAAK,cAAc,IAAI;AAAA,IACpD,CAAC;AAAA,EACL;AAAA,EAEQ,cAAoB;AACxB,eAAWsB,KAAW,KAAK,YAAY,OAAO,CAAC,EAAG,CAAAA,EAAA;AAClD,SAAK,OAAO,CAAA;AAAA,EAChB;AAAA,EAEQ,WAAWC,GAA8B;;AAM7C,KALAhB,IAAA,KAAK,gBAAL,QAAAA,EAAA,YACA,KAAK,cAAc,MACnB,KAAK,iBAAiB,MACtB,KAAK,kBAAkB,MACvB,KAAK,YAAY,IACZgB,MACL,KAAK,oBAAoB,IACrB,KAAK,sBAAsB,QAAM,aAAa,KAAK,kBAAkB,GACzE,KAAK,qBAAqB,WAAW,MAAM,KAAK,sBAAA,GAAyB,CAAC;AAAA,EAC9E;AAAA,EAEQ,wBAA8B;AAClC,SAAK,oBAAoB,IACrB,KAAK,sBAAsB,QAAM,aAAa,KAAK,kBAAkB,GACzE,KAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,UAAgB;;AACZ,IAAI,KAAK,cACT,KAAK,YAAY,IACjB,KAAK,WAAW,EAAK,GACrB,KAAK,sBAAA,GACL,KAAK,YAAA,IACLhB,IAAA,KAAK,8BAAL,QAAAA,EAAgC;AAAA,EACpC;AACJ;AAEO,MAAMiB,WAAgDjC,EAA4B;AAAA,EAC3E,YAAYS,GAAqB;AACvC,UAAMoB,IAAO,KAAK,SAAA,EAAWpB,CAAK;AAClC,IAAIoB,MAAS,WACb,KAAK,cAAcpB,GACnB,KAAK,iBAAiB,CAACoB,CAAI,GAAG,0BAA0B;AAAA,EAC5D;AACJ;AAEO,MAAMK,WAA+ClC,EAA4B;AAAA,EAC1E,YAAYS,GAAeG,GAA6B;AAC9D,UAAMa,IAAQ,KAAK,SAAA,GACbI,IAAOJ,EAAMhB,CAAK;AACxB,QAAIoB,MAAS,QAEb;AAAA,UAAIjB,EAAM,YAAY,KAAK,eAAe,MAAM;AAC5C,cAAMuB,IAAQ,KAAK,IAAI,KAAK,aAAa1B,CAAK,GACxC2B,IAAO,KAAK,IAAI,KAAK,aAAa3B,CAAK,GACvC4B,IAAQZ,EAAM,MAAMU,GAAOC,IAAO,CAAC,GACnCE,IAAOC,EAAiB3B,CAAK,IAC7B4B,EAAW,KAAK,iBAAA,GAAoBH,GAAO,KAAK,MAAM,IACtD,CAAC,GAAGA,CAAK;AACf,aAAK,iBAAiBC,GAAM,yBAAyB;AACrD;AAAA,MACJ;AAEA,UAAIC,EAAiB3B,CAAK,KAAM,SAASA,KAASA,EAAM,QAAQ,KAAM;AAClE,cAAMe,IAAW,KAAK,iBAAA,GAChBc,IAAM,KAAK,OAAOZ,GAAMpB,CAAK,GAG7B6B,IAFSX,EAAS,KAAK,CAACe,GAAWC,MACrC,OAAO,GAAG,KAAK,OAAOD,GAAWC,CAAc,GAAGF,CAAG,CAAC,IAEpDd,EAAS,OAAO,CAACe,GAAWC,MAC1B,CAAC,OAAO,GAAG,KAAK,OAAOD,GAAWC,CAAc,GAAGF,CAAG,CAAC,IACzD,CAAC,GAAGd,GAAUE,CAAI;AACxB,aAAK,cAAcpB,GACnB,KAAK,iBAAiB6B,GAAM,yBAAyB;AACrD;AAAA,MACJ;AAEA,WAAK,cAAc7B,GACnB,KAAK,iBAAiB,CAACoB,CAAI,GAAG,yBAAyB;AAAA;AAAA,EAC3D;AAAA,EAEU,eAAepB,GAAeG,GAA4B;AAChE,IAAIA,EAAM,YAAU,KAAK,YAAYH,GAAOG,CAAK;AAAA,EACrD;AAAA,EAEU,wBAAiC;AACvC,WAAO;AAAA,EACX;AAAA,EAEU,gBACNgC,GACAC,GACAjC,GACI;AACJ,UAAMa,IAAQ,KAAK,SAAA,GACbU,IAAQ,KAAK,IAAIS,GAAYC,CAAQ,GACrCT,IAAO,KAAK,IAAIQ,GAAYC,CAAQ,GACpCR,IAAQZ,EAAM,MAAMU,GAAOC,IAAO,CAAC,GACnCE,IAAOC,EAAiB3B,CAAK,IAC7B4B,EAAW,KAAK,iBAAA,GAAoBH,GAAO,KAAK,MAAM,IACtD,CAAC,GAAGA,CAAK;AACf,SAAK,cAAcO,GACnB,KAAK,iBAAiBN,GAAM,wBAAwB;AAAA,EACxD;AACJ;AAEO,SAASQ,EACZC,GAC2B;AAC3B,SAAOA,EAAO,cACR,IAAIb,GAAsBa,CAAM,IAChC,IAAId,GAAuBc,CAAM;AAC3C;AAEO,SAAS5C,EAAsB0B,GAAapB,GAAwB;AACvE,MAAIoB,KAAQ,QAAQ,OAAOA,KAAS,UAAU;AAC1C,UAAMmB,IAAK,QAAQ,IAAInB,GAAM,IAAI;AACjC,QAAImB,KAAM,KAAM,QAAOA;AAAA,EAC3B;AACA,MAAI,OAAOnB,KAAS,YAAY,OAAOA,KAAS,SAAU,QAAOA;AACjE,QAAM,IAAI;AAAA,IACN,2BAA2BpB,CAAK;AAAA,EAAA;AAExC;AAEA,SAAS8B,EAAiB3B,GAA4C;AAClE,SAAO,GAAQA,EAAM,WAAWA,EAAM;AAC1C;AAEA,SAASF,GAAWD,GAAewC,GAAwB;AACvD,SAAIA,KAAU,IAAU,IACjB,KAAK,IAAI,KAAK,IAAIxC,GAAO,CAAC,GAAGwC,IAAS,CAAC;AAClD;AAEA,SAAST,EACLU,GACAC,GACAjD,GACO;AACP,QAAMkD,IAAS,CAAC,GAAGF,CAAI,GACjBG,IAAO,IAAI,IAAIH,EAAK,IAAI,CAACrB,GAAMpB,MAAUP,EAAO2B,GAAMpB,CAAK,CAAC,CAAC;AACnE,aAAWoB,KAAQsB,GAAO;AACtB,UAAMV,IAAMvC,EAAO2B,GAAMuB,EAAO,MAAM;AACtC,IAAKC,EAAK,IAAIZ,CAAG,MACbY,EAAK,IAAIZ,CAAG,GACZW,EAAO,KAAKvB,CAAI;AAAA,EAExB;AACA,SAAOuB;AACX;AC/TO,MAAME,UAAkC9D,EAAgC;AAAA,EAU3E,YAAY+D,IAA8B,IAAI;AAC1C,UAAMA,CAAK;AAVN,IAAA1D,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIb,IAAI2D,GAAoCD,EAAM,KAAK,KAC/C,KAAK,eAAeA,EAAM,OAC1B,KAAK,oBAAoB,SAEzB,KAAK,oBAAoB,IAAIjD,EAA0BiD,EAAM,SAAS,CAAA,GAAI;AAAA,MACtE,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,eAAe,KAAK,oBAE7B,KAAK,SAAS,KAAK,cACnB,KAAK,4BAA4BA,EAAM,wBAAwB,OACzD,IAAIjD,EAAiB,IAAI,EAAC,OAAO,MAAM,SAAS,sBAAA,CAAsB,IACtE,MACN,KAAK,uBAAuBiD,EAAM,wBAC3B,KAAK,2BACZ,KAAK,iBAAiB,KAAK,sBAC3B,KAAK,aAAaE,GAAmBF,EAAM,OAAO,GAClD,KAAK,mBAAmBT,EAAuB;AAAA,MAC3C,OAAO;AAAA,MACP,aAAaS,EAAM,eAAe;AAAA,MAClC,sBAAsB,KAAK;AAAA,MAC3B,UAAU,MAAM,KAAK,aAAa,IAAA;AAAA,MAClC,QAAQ,KAAK;AAAA,IAAA,CAChB;AAAA,EACL;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,cAAc,KAAK,oBAAoB;AAAA,EAC3D;AAAA,EAEA,SAAoB;AAChB,UAAMhD,IAAO,KAAK,aAAa,IAAA;AAC/B,QAAI,CAAC,MAAM,QAAQA,CAAI,EAAG,OAAM,IAAI,UAAU,iCAAiC;AAC/E,UAAMmD,IAAS,KAAK,aAAa,cAAA,GAC3BC,IAAQ,KAAK,aAAa,SAAA,GAC1BC,IAAYF,MAAWG,EAAW,WAAWH,MAAWG,EAAW,SACnEjC,IAAe,IAAI,IAAI,KAAK,qBAAqB,MAClD,IAAI,CAACC,GAAMpB,MAAU,KAAK,WAAWoB,GAAMpB,CAAK,CAAC,CAAC,GAEjDd,IAAO,KAAK;AAClB,WAAO,gBAAAmE;AAAA,MAACnE;AAAA,MAAA;AAAA,QACJ,WAAWoE,EAAe,KAAK,KAAK,KAAK;AAAA,QAExC,UAAA;AAAA,UAAAL,MAAWG,EAAW,QACjB,gBAAAjE,EAAC,KAAA,EAAE,MAAK,SAAQ,aAAU,SACvB,UAAAoE,GAAaL,GAAO,sBAAsB,EAAA,CAC/C,IACE;AAAA,UACLC,KAAarD,EAAK,WAAW,sBACvB,OAAA,EAAI,MAAK,UAAS,aAAU,WAC3B,UAAA;AAAA,YAAA,gBAAAX,EAAC,UAAK,UAAA,iBAAA,CAAc;AAAA,YACnB,MAAM,KAAK,EAAC,QAAQ,KAAK,MAAM,oBAAoB,EAAA,GAAI,CAACqE,GAAGxD,MACxD,gBAAAb,EAAC,SAAiC,aAAU,mBACxC,UAAA,gBAAAA,EAACL,GAAA,EAAY,OAAO,KAAKkB,IAAQ,EAAA,CAAG,EAAA,GAD9B,eAAeA,CAAK,EAE9B,CAAM;AAAA,UAAA,EAAA,CACd,IACE;AAAA,UACLiD,MAAWG,EAAW,SAAStD,EAAK,WAAW,IAC1C,gBAAAX,EAAC,KAAA,EAAE,MAAK,UAAS,aAAU,SAAQ,sBAAQ,IAC3C;AAAA,UACLW,EAAK,SAAS,IACT,gBAAAX;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAU;AAAA,cACV,cAAY,KAAK,MAAM,SAAS;AAAA,cAChC,aAAWgE,IAAY,SAAS;AAAA,cAChC,wBAAsB,KAAK,MAAM,cAAc,SAAS;AAAA,cAC1D,UAAArD,EAAK,IAAI,CAACsB,GAAMpB,MAAU;AACxB,sBAAMgC,IAAM,KAAK,WAAWZ,GAAMpB,CAAK,GACjCkB,IAAWC,EAAa,IAAIa,CAAG,GAC/ByB,IAAU,KAAK,MAAM,aACrB,KAAK,MAAM,WAAWrC,GAAMpB,CAAK,IACjC0D,GAAiBtC,CAAI;AAC3B,uBAAO,gBAAAjC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEJ,MAAK;AAAA,oBACL,aAAU;AAAA,oBACV,4BAAyB;AAAA,oBACzB,cAAYa;AAAA,oBACZ,iBAAe,OAAOkB,CAAQ;AAAA,oBAC9B,UAAUlB,MAAU,IAAI,IAAI;AAAA,oBAC9B,UAAAyD;AAAA,kBAAA;AAAA,kBAPO,OAAOzB,CAAG;AAAA,gBAAA;AAAA,cAQvB,CAAC;AAAA,YAAA;AAAA,UAAA,IACC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEd;AAAA,EAEA,YAAY2B,GAA6B;AACrC,UAAM7D,IAAO6D,aAAe,UACtBA,EAAI,iBAA8B,4BAA4B,IAC9D,CAAA;AACN,SAAK,iBAAiB,YAAY7D,CAAI;AAAA,EAC1C;AAAA,EAEA,mBAA4B;AACxB,WAAO,KAAK,iBAAiB,iBAAA;AAAA,EACjC;AAAA,EAEA,0BAAiD;AAC7C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAkB;;AACd,SAAK,iBAAiB,QAAA,IACtBS,IAAA,KAAK,sBAAL,QAAAA,EAAwB,YACxBqD,IAAA,KAAK,8BAAL,QAAAA,EAAgC;AAAA,EACpC;AAqDJ;AAnDIxE,EAzHSyD,GAyHF,gBAAe,CAAC/D,CAAW,IAElCM,EA3HSyD,GA2HO,YAAW,cAC3BzD,EA5HSyD,GA4HO,sBAAqB,cAErCzD,EA9HSyD,GA8HF,cAAa;AAAA,EAChB,CAAC,KAAK,WAAW;AAAA,EACjB,CAAC,8CAA8C,WAAW;AAAA,IAG9DzD,EAnISyD,GAmIF,OAAMxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CjB,SAAS2D,GACLa,GACoB;AACpB,MAAIA,KAAW,KAAM,QAAOnE;AAC5B,MAAI,OAAOmE,KAAY,WAAY,QAAOA;AAC1C,MAAI,OAAOA,KAAY,YAAYA,EAAQ,SAAS;AAChD,WAAO,CAACzC,GAAMpB,MAAU;AACpB,UAAIoB,KAAQ,QAAS,OAAOA,KAAS,YAAY,OAAOA,KAAS;AAC7D,cAAM,IAAI,UAAU,0BAA0BpB,CAAK,UAAU6D,CAAO,EAAE;AAE1E,YAAM7B,IAAM,QAAQ,IAAIZ,GAAMyC,CAAO;AACrC,UAAI7B,KAAO;AACP,cAAM,IAAI,UAAU,0BAA0BhC,CAAK,UAAU6D,CAAO,EAAE;AAE1E,aAAO7B;AAAA,IACX;AAEJ,QAAM,IAAI,UAAU,sDAAsD;AAC9E;AAEA,SAASe,GAA0Be,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASJ,GAAiBtC,GAA0B;AAChD,MAAIA,KAAQ,SAAS,OAAOA,KAAS,YAAY,OAAOA,KAAS,aAAa;AAC1E,UAAM2C,IAAQ,QAAQ,IAAI3C,GAAM,OAAO;AACvC,QAAI4C,GAAsBD,CAAK,EAAG,QAAOA;AAAA,EAC7C;AACA,SAAO,OAAO3C,CAAI;AACtB;AAEA,SAAS4C,GAAsBF,GAA6D;AACxF,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAC1E;AAEA,SAASP,GAAaL,GAAgBe,GAA0B;AAC5D,SAAIf,aAAiB,QAAcA,EAAM,UAClCA,KAAS,OAAOe,IAAW,OAAOf,CAAK;AAClD;AChNO,MAAMgB,UAAoBnF,EAA4B;AAAA,EAGzD,YAAY+D,IAA0B,IAAI;AACtC,UAAMA,CAAK;AAHN,IAAA1D,EAAA;AAIL,SAAK,iBAAiB+E,GAA6BrB,EAAM,OAAO,IAAIA,EAAM,UAAU;AAAA,EACxF;AAAA,EAEA,aAAmB;AACf,IAAI,KAAK,kBAAgB,KAAK,MAAM,KAAK,cAAc;AAAA,EAC3D;AAAA,EAEA,SAAoB;;AAChB,UAAMsB,MAAS7D,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,WAC5B,MAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,KAAK,MAAM,UAAU,CAAA;AACjE,QAAI,CAAC,MAAM,QAAQ6D,CAAM;AACrB,YAAM,IAAI,UAAU,2DAA2D;AAEnF,UAAMC,MAAaT,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,oBAAmBR,EAAW,OAChEF,KAAQoB,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,YAC7BC,IAAUC,GAAiB,KAAK,MAAM,OAAO,GAC7CC,IAAc,KAAK,MAAM,eAAeC,EAAS,SACjDC,IAAuB,KAAK,MAAM,wBAAwBC,EAAW,SACrE1F,IAAO,KAAK;AAElB,WAAImF,MAAejB,EAAW,QACnB,gBAAAjE;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,WAAWoE,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,MAAK;AAAA,QACL,cAAW;AAAA,QACb,UAAAC,GAAaL,GAAO,+BAA+B;AAAA,MAAA;AAAA,IAAA,KAEpDmB,MAAejB,EAAW,WAAWiB,MAAejB,EAAW,YAC7DgB,EAAO,WAAW,IACd,gBAAAjF;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,WAAWoE,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,MAAK;AAAA,QACL,cAAW;AAAA,QACd,UAAA;AAAA,MAAA;AAAA,IAAA,IAGE,gBAAAnE;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,WAAWoE,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,MAAK;AAAA,QACL,cAAY,KAAK,MAAM,SAAS;AAAA,QAE/B,UAAAc,EAAO,WAAW,IACb,gBAAAjF,EAAC,QAAA,EAAK,+BAAiB,IACvBiF,EAAO,IAAI,CAACS,MAAW;AACrB,gBAAMf,IAAQgB,EAAYD,CAAM,GAC1Bd,IAAQgB,GAAYF,CAAM,GAC1BG,IAAQT,EAAQ,IAAIT,CAAK,KAAKa;AACpC,iBAAO,gBAAAxF;AAAA,YAAC8F;AAAA,YAAA;AAAA,cAEJ,OAAAlB;AAAA,cACA,cAAciB;AAAA,cACd,SAASP;AAAA,cACT,UAAU,CAACS,GAAW/E,MAAU;;AAC5B,gBAAAA,KAAA,QAAAA,EAAO;AACP,sBAAM0B,IAAO,IAAI,IAAI0C,CAAO;AAC5B,gBAAIW,MAAcN,EAAW,UAAS/C,EAAK,OAAOiC,CAAK,IAClDjC,EAAK,IAAIiC,GAAOoB,CAAS,IAC9BtB,KAAArD,IAAA,KAAK,OAAM,aAAX,QAAAqD,EAAA,KAAArD,GAAsBsB,GAAM1B;AAAA,cAChC;AAAA,YAAA;AAAA,YAVK,GAAG,OAAO2D,CAAK,CAAC,IAAI,OAAOkB,CAAK,CAAC;AAAA,UAAA;AAAA,QAY9C,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAEb;AAyBJ;AAvBI5F,EArES8E,GAqEF,gBAAe,CAACQ,CAAQ,IAE/BtF,EAvES8E,GAuEO,YAAW,iBAC3B9E,EAxES8E,GAwEO,sBAAqB,iBAErC9E,EA1ES8E,GA0EF,OAAM7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBjB,MAAM4F,KAAqBP;AAI3B,SAASF,GACLD,GACiC;AACjC,MAAIA,KAAW,KAAM,QAAO,oBAAI,IAAA;AAChC,MAAIA,aAAmB,IAAK,QAAO,IAAI,IAAIA,CAAO;AAClD,MAAI,MAAM,QAAQA,CAAO,EAAG,QAAO,IAAI,IAAIA,CAAO;AAClD,QAAM,IAAI,UAAU,kDAAkD;AAC1E;AAEA,SAASO,EAAYD,GAAwC;AACzD,MAAI,OAAOA,KAAW,YAAY,OAAOA,KAAW,SAAU,QAAOA;AACrE,MAAIA,KAAU,QAAQ,OAAOA,KAAW,UAAU;AAC9C,UAAMf,IAAQ,QAAQ,IAAIe,GAAQ,OAAO;AACzC,QAAI,OAAOf,KAAU,YAAY,OAAOA,KAAU,SAAU,QAAOA;AAAA,EACvE;AACA,QAAM,IAAI,UAAU,iEAAiE;AACzF;AAEA,SAASiB,GAAYF,GAAsC;AACvD,MAAIA,KAAU,QAAQ,OAAOA,KAAW,UAAU;AAC9C,UAAMd,IAAQ,QAAQ,IAAIc,GAAQ,OAAO;AACzC,QAAId,KAAS,KAAM,QAAOoB,GAAYpB,CAAK,IAAIA,IAAQ,OAAOA,CAAK;AAAA,EACvE;AACA,SAAO,OAAOe,EAAYD,CAAM,CAAC;AACrC;AAEA,SAASM,GAAYrB,GAA0C;AAC3D,SAAO,OAAOA,KAAU,YAAY,OAAOA,KAAU;AACzD;AAEA,SAASK,GAAsBL,GAA2D;AACtF,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASP,GAAaL,GAAgBe,GAA0B;AAC5D,SAAIf,aAAiB,QAAcA,EAAM,UAClCA,KAAS,OAAOe,IAAW,OAAOf,CAAK;AAClD;AC7IO,MAAMkC,UAAwBrG,EAAgC;AAAA,EAA9D;AAAA;AACK,IAAAK,EAAA,uBAAgB;AA8FP,IAAAA,EAAA,uBAAgB,CAACe,MAA4B;AAC1D,MAAI,KAAK,iBACF,KAAK,eAAe,QACpBA,EAAM,kBAAkB,QACxB,CAAC,KAAK,IAAI,SAASA,EAAM,MAAM,MAClC,KAAK,gBAAgB,IACrB,KAAK,OAAA;AAAA,IAEb;AAAA;AAAA,EApGA,aAAmB;AACf,SAAK,MAAM,KAAK,MAAM,aAAa,KAAK,MAAM,cAAc,GACxD,KAAK,MAAM,iBAAiB,QAC5B,KAAK,OAAmB,UAAU,SAAS,KAAK,aAAa;AAAA,EAErE;AAAA,EAEA,aAAmB;AACf,QAAI,CAAC,KAAK,MAAM,SAAU;AAC1B,UAAMkB,IAAU,KAAK,MAAM,YAAY,IAAA;AACvC,QAAIQ;AACJ,KAAIR,KAAA,gBAAAA,EAAS,WAAU,KAAK,MAAM,QAC9BQ,IAAO,EAAC,OAAO,KAAK,MAAM,OAAO,WAAW,MAAA,IACrCR,EAAQ,cAAc,QAC7BQ,IAAO,EAAC,OAAO,KAAK,MAAM,OAAO,WAAW,OAAA,IACzCA,IAAO,MACd,KAAK,MAAM,YAAY,IAAIA,GAAM,oBAAoB;AAAA,EACzD;AAAA,EAEA,kBAAkB1B,GAAyB;AACvC,IAAAA,EAAM,gBAAA,GACN,KAAK,gBAAgB,CAAC,KAAK,eAC3B,KAAK,OAAA;AAAA,EACT;AAAA,EAEA,cAAc0B,GAAuB1B,GAA2B;;AAC5D,UAAMoE,IAAwB,EAAC,GAAG,KAAK,MAAM,eAAe,MAAI;AAChE,IAAI1C,EAAK,SAAS,WAAU0C,EAAQ,KAAK,MAAM,KAAK,IAC/CA,EAAQ,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG1C,EAAK,SAAS,GACnD,KAAK,MAAM,eAAe,IAAI0C,GAAS,uBAAuB,IAC9DX,KAAArD,IAAA,KAAK,OAAM,mBAAX,QAAAqD,EAAA,KAAArD,GAA4BgE,GAASpE;AAAA,EACzC;AAAA,EAEA,SAAoB;AAChB,UAAMkF,IAAc,KAAK,MAAM,YAAY,IAAA,GACrCC,KAAYD,KAAA,gBAAAA,EAAa,WAAU,KAAK,MAAM,QAC9CA,EAAY,YACZ,MACAd,IAAU,IAAI;AAAA,OACf,KAAK,MAAM,eAAe,IAAA,EAAM,KAAK,MAAM,KAAK,KAAK,CAAA,GACjD,OAAOgB,EAAsB;AAAA,IAAA,GAEhCxB,IAAQ,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,KAAK,GACnDyB,IAAc,UAAU,OAAOzB,CAAK,CAAC;AAE3C,QAAI0B,IAAmB;AACvB,WAAI,KAAK,iBAAiB,KAAK,MAAM,iBAAiB,SAClDA,IAAQ,gBAAAtG;AAAA,MAAC+E;AAAA,MAAA;AAAA,QAEL,OAAOsB;AAAA,QACP,SAAS,KAAK,MAAM;AAAA,QACpB,SAAAjB;AAAA,QACA,UAAU,CAAC1C,GAAM1B,MAAU,KAAK,cAAc0B,GAAM1B,CAAK;AAAA,QACxD,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,QAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,CAAA,IACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,MAAoB;AAAA,MAVxD;AAAA,IAAA,IAcL,gBAAAkD;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,OAAM;AAAA,QACN,uBAAoB;AAAA,QACpB,aAAWiC,MAAc,QACnB,cACAA,MAAc,SAAS,eAAe;AAAA,QAE3C,UAAA;AAAA,UAAA,KAAK,MAAM,WACN,gBAAAjC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAU;AAAA,cACV,SAAS,MAAM,KAAK,WAAA;AAAA,cAEnB,UAAA;AAAA,gBAAAU;AAAA,gBACAuB,MAAc,QAAQ,OAAOA,MAAc,SAAS,OAAO;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAE9D,gBAAAnG,EAAC,QAAA,EAAK,aAAU,SAAS,UAAA4E,GAAM;AAAA,UACpC,KAAK,MAAM,iBAAiB,OACvB,OACA,gBAAA5E;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAU;AAAA,cACV,cAAYqG;AAAA,cACZ,iBAAe,OAAO,KAAK,aAAa;AAAA,cACxC,SAAS,CAACrF,MAAsB,KAAK,kBAAkBA,CAAK;AAAA,cAC/D,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UACJsF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAET;AAoDJ;AAxCIrG,EAzGSgG,GAyGF,gBAAe,CAAClB,CAAW,IAElC9E,EA3GSgG,GA2GF,cAAa;AAAA,EAChB,CAAC,+CAA+C,UAAU;AAAA,EAC1D,CAAC,oEAAoE,CAAC,UAAU,QAAQ,CAAC;AAAA,EACzF,CAAC,6EAA6E,CAAC,UAAU,QAAQ,CAAC;AAAA,IAGtGhG,EAjHSgG,GAiHF,OAAM/F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCjB,SAASkG,GACLG,GACgD;AAChD,SAAO,OAAOA,EAAM,CAAC,KAAM,YAAY,OAAOA,EAAM,CAAC,KAAM;AAC/D;ACrKO,MAAMC,UACD5G,EAAkC;AAAA,EAC1C,SAAoB;AAChB,WAAO,gBAAAI,EAAC,SAAA,EAAM,uBAAoB,gBAC9B,UAAA,gBAAAA,EAAC,MAAA,EACI,UAAA,KAAK,MAAM,QAAQ,IAAI,CAACyG,MAAW,gBAAAzG;AAAA,MAACiG;AAAA,MAAA;AAAA,QAEjC,OAAOQ,EAAO;AAAA,QACd,aAAa,KAAK,MAAM;AAAA,QACxB,gBAAgB,KAAK,MAAM;AAAA,QAC1B,GAAIA,EAAO,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAO,MAAA;AAAA,QAC/C,GAAIA,EAAO,YAAY,OAAO,CAAA,IAAK,EAAC,UAAUA,EAAO,SAAA;AAAA,QACrD,GAAIA,EAAO,iBAAiB,OACvB,CAAA,IACA,EAAC,eAAeA,EAAO,cAAA;AAAA,QAC5B,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,QAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,KACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,QACvC,GAAI,KAAK,MAAM,kBAAkB,OAC5B,CAAA,IACA,EAAC,gBAAgB,KAAK,MAAM,eAAA;AAAA,MAAc;AAAA,MAjB3C,OAAOA,EAAO,KAAK;AAAA,IAAA,CAkB1B,GACN,EAAA,CACJ;AAAA,EACJ;AAGJ;AADIxG,EA7BSuG,GA6BF,gBAAe,CAACP,CAAe;ACtBnC,SAASS,GACZC,GACA,EAAC,MAAAC,IAAO,MAAM,SAAAxB,IAAU,CAAA,EAAC,IAAsB,IAC3C;AACJ,EAAAyB,GAAcF,CAAG,GACbC,KAAQ,SACRE,EAAWF,CAAI,GACfD,EAAI,aAAa,IAAI,QAAQ,GAAGC,EAAK,KAAK,IAAIA,EAAK,SAAS,EAAE;AAElE,aAAW,CAACG,GAAOC,CAAO,KAAK,OAAO,QAAQ5B,CAAO;AACjD,eAAW,CAACT,GAAOsC,CAAI,KAAKD,GAAS;AACjC,UAAI,CAACE,GAAaD,CAAI;AAClB,cAAM,IAAI,UAAU,2BAA2BF,CAAK,KAAK,OAAOE,CAAI,CAAC,EAAE;AAE3E,MAAAN,EAAI,aAAa;AAAA,QACb;AAAA,QACA,GAAGI,CAAK,IAAIE,CAAI,IAAI,KAAK,UAAUtC,CAAK,CAAC;AAAA,MAAA;AAAA,IAEjD;AAEJ,SAAOgC;AACX;AAEO,SAASQ,GACZxG,GACAiG,GACAxB,GACM;AACN,MAAI,CAAC,MAAM,QAAQzE,CAAI,EAAG,OAAM,IAAI,UAAU,mCAAmC;AACjF,QAAMyG,IAAWzG,EAAK,OAAO,CAACC,MAAQyG,GAAezG,GAAKwE,CAAO,CAAC;AAClE,MAAIwB,KAAQ,KAAM,QAAOQ;AACzB,EAAAN,EAAWF,CAAI;AACf,QAAMT,IAAYS,EAAK,cAAc,QAAQ,IAAI;AACjD,SAAO,CAAC,GAAGQ,CAAQ,EAAE,KAAK,CAAC9D,GAAMC,MAC7B+D,GAAcC,EAAUjE,GAAMsD,EAAK,KAAK,GAAGW,EAAUhE,GAAOqD,EAAK,KAAK,CAAC,IAAIT,CAAS;AAC5F;AAEA,SAASkB,GAAqBzG,GAAWwE,GAAgC;AACrE,aAAW,CAAC2B,GAAOC,CAAO,KAAK,OAAO,QAAQ5B,CAAO,GAAG;AACpD,UAAMT,IAAQ4C,EAAU3G,GAAKmG,CAAK;AAElC,QADeC,EAAQ,OAAO,CAAC,CAAA,EAAGC,CAAI,MAAMA,MAASxB,EAAW,IAAI,EACzD,KAAK,CAAC,CAAC3C,CAAS,MAAM,OAAO,GAAGA,GAAW6B,CAAK,CAAC,EAAG,QAAO;AAEtE,UAAM6C,IAAWR,EAAQ,OAAO,CAAC,CAAA,EAAGC,CAAI,MAAMA,MAASxB,EAAW,OAAO;AACzE,QAAI+B,EAAS,SAAS,KACf,CAACA,EAAS,KAAK,CAAC,CAAC1E,CAAS,MAAM,OAAO,GAAGA,GAAW6B,CAAK,CAAC,EAAG,QAAO;AAE5E,UAAM8C,IAAYT,EAAQ,OAAO,CAAC,CAAA,EAAGC,CAAI,MAAMA,MAASxB,EAAW,MAAM;AACzE,QAAIgC,EAAU,SAAS,KAChB,CAACA,EAAU,KAAK,CAAC,CAAC3E,CAAS,MAAM,OAAO,GAAGA,GAAW6B,CAAK,CAAC,EAAG,QAAO;AAAA,EACjF;AACA,SAAO;AACX;AAEO,SAASmC,EAAWF,GAA0C;AACjE,MAAIA,KAAQ,QACL,OAAOA,KAAS,YAChB,OAAO,QAAQ,IAAIA,GAAM,OAAO,KAAM,YACtC,CAACc,GAAgB,QAAQ,IAAId,GAAM,WAAW,CAAC;AAClD,UAAM,IAAI,UAAU,wDAAwD;AAEpF;AAEA,SAASc,GAAgB/C,GAAiD;AACtE,SAAOA,MAAU,SAASA,MAAU;AACxC;AAEA,SAASuC,GAAavC,GAA0C;AAC5D,SAAO,OAAO,OAAOc,CAAU,EAAE,KAAK,CAACwB,MAASA,MAAStC,CAAK;AAClE;AAEA,SAAS2C,GAAchE,GAAeC,GAAwB;AAC1D,SAAI,OAAO,GAAGD,GAAMC,CAAK,IAAU,IAC/BD,KAAQ,OAAa,KACrBC,KAAS,OAAa,IACtB,OAAOD,KAAS,YAAY,OAAOC,KAAU,WAAiBD,IAAOC,IAClE,OAAOD,CAAI,EAAE,cAAc,OAAOC,CAAK,CAAC;AACnD;AAEA,SAASgE,EAAU5C,GAAgBoC,GAAwB;AACvD,MAAI,EAAApC,KAAS,QAAS,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAGpE,WAAO,QAAQ,IAAIA,GAAOoC,CAAK;AACnC;AAEA,SAASF,GAAclC,GAA0C;AAC7D,MAAIA,KAAS,QACL,OAAOA,KAAU,YAAY,OAAOA,KAAU,cAC/C,OAAO,QAAQ,IAAIA,GAAO,UAAU,KAAM;AAC7C,UAAM,IAAI,UAAU,iCAAiC;AAEzD,QAAMgD,IAAe,QAAQ,IAAIhD,GAAO,cAAc;AACtD,MAAIgD,KAAgB,QACb,OAAO,QAAQ,IAAIA,GAAc,KAAK,KAAM,cAC5C,OAAO,QAAQ,IAAIA,GAAc,QAAQ,KAAM;AAClD,UAAM,IAAI,UAAU,iDAAiD;AAE7E;ACxDO,MAAMC,UACDhI,EAAgC;AAAA,EAcxC,YAAY+D,GAA6B;AACrC,UAAMA,CAAK;AAdN,IAAA1D,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,eAAsC;AAC9B,IAAAA,EAAA,oBAA+D;AACtD,IAAAA,EAAA;AACT,IAAAA,EAAA,yBAAmD;AACnD,IAAAA,EAAA,mBAAY;AACH,IAAAA,EAAA,mBAAwE,CAAA;AAIjF,QAAA0D,EAAM,SAAS,WAAWA,EAAM,SAAS;AACzC,YAAM,IAAI,UAAU,wCAAwC;AAEhE,SAAK,UAAUkE,GAAiBlE,EAAM,OAAO,GAC7C,KAAK,SAASmE,GAAgBnE,EAAM,MAAM,GAC1C,KAAK,cAAc,IAAIjD,EAA0B,MAAM;AAAA,MACnD,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,iBAAiB,IAAIA,EAAsB,IAAI;AAAA,MAChD,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,4BAA4BiD,EAAM,wBAAwB,OACzD,IAAIjD,EAAgB,IAAI,EAAC,OAAO,MAAM,SAAS,sBAAA,CAAsB,IACrE,MACN,KAAK,uBAAuBiD,EAAM,wBAC3B,KAAK,2BACZ,KAAK,mBAAmBT,EAAuB;AAAA,MAC3C,OAAO;AAAA,MACP,aAAaS,EAAM,eAAe;AAAA,MAClC,sBAAsB,KAAK;AAAA,MAC3B,UAAU,MAAA;;AAAM,iBAAAvC,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAS,CAAA;AAAA;AAAA,MACrC,QAAQ,KAAK;AAAA,IAAA,CAChB;AAAA,EACL;AAAA,EAEA,aAAmB;AACf,SAAK,QAAQ,KAAK,MAAM,SAAS,UAC3B,KAAK,iBAAA,IACL,KAAK,kBAAA,GACX,KAAK,MAAM,KAAK,OAAO,KAAK,oBAAoB;AAAA,EACpD;AAAA,EAEQ,mBAA0C;AAC9C,UAAM2G,IAAe,KAAK,MAAM,QAAQ,CAAA;AACxC,QAAIC;AACJ,WAAIpE,GAAmCmE,CAAY,IAC/CC,IAASD,KAET,KAAK,kBAAkB,IAAIrH,EAAyBqH,GAAc;AAAA,MAC9D,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACDC,IAAS,KAAK,kBAElB,KAAK,aAAaA,GAClB,KAAK,YAAY,IACV,IAAIC;AAAA,MACP,CAACD,GAAQ,KAAK,aAAa,KAAK,cAAc;AAAA,MAC9C,CAAC,CAACrH,GAAMiG,GAAMxB,CAAO,MAAM+B,GAAqBxG,GAAMiG,GAAMxB,CAAO;AAAA,MACnE,EAAC,OAAO,MAAM,SAAS,mBAAA;AAAA,IAAkB;AAAA,EAEjD;AAAA,EAEQ,oBAA2C;AAC/C,QAAI,KAAK,MAAM,SAAS;AACpB,aAAA8C,GAAiB,KAAK,MAAM,KAAK,GAC1B,KAAK,MAAM;AAGtB,UAAMC,IAAU,KAAK,MAAM,gBAAgB,KAAK,kBAAA;AAChD,QAAIA,KAAW,QAAQ,OAAOA,EAAQ,SAAU;AAC5C,YAAM,IAAI,UAAU,4DAA4D;AAEpF,UAAMvB,IAAO,IAAIwB,EAA2B,QAAQ,KAAK,aAAa;AAAA,MAClE,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACKhD,IAAU,IAAIgD,EAAuB,WAAW,KAAK,gBAAgB;AAAA,MACvE,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ;AACD,SAAK,UAAU,KAAKxB,GAAMxB,CAAO,GACjC,KAAK,YAAY;AACjB,UAAMiD,IAAO,EAAC,MAAAzB,GAAM,SAAAxB,EAAA;AACpB,WAAO,IAAIkD,GAAwC;AAAA,MAC/C,SAAAH;AAAA,MACA,MAAAE;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,mBAAmB;AAAA,IAAA,CACtB;AAAA,EACL;AAAA,EAEQ,oBAGC;AACL,QAAI,KAAK,MAAM,YAAY,KAAM,QAAO;AACxC,UAAME,IAKF;AAAA,MACA,KAAK,KAAK,MAAM;AAAA,MAChB,WAAW,KAAK,MAAM,kBAAkB7B;AAAA,IAAA;AAE5C,WAAI,KAAK,MAAM,WAAW,SAAM6B,EAAQ,UAAU,KAAK,MAAM,UACzD,KAAK,MAAM,SAAS,SAAMA,EAAQ,QAAQ,KAAK,MAAM,QAClD,IAAIC,GAAuDD,CAAO;AAAA,EAC7E;AAAA,EAEA,SAAoB;;AAChB,UAAM5H,MAAOS,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAS,CAAA;AAClC,QAAI,CAAC,MAAM,QAAQT,CAAI,EAAG,OAAM,IAAI,UAAU,wCAAwC;AACtF,UAAMmD,MAASW,IAAA,KAAK,UAAL,gBAAAA,EAAY,oBAAmBR,EAAW,SACnDF,KAAQoB,IAAA,KAAK,UAAL,gBAAAA,EAAY,YACpBnB,IAAYF,MAAWG,EAAW,WAAWH,MAAWG,EAAW,SACnEjC,IAAe,IAAI;AAAA,MACrB,KAAK,qBAAqB,IAAA,EAAM,IAAI,CAACC,GAAMpB,MAAU,KAAK,OAAOoB,GAAMpB,CAAK,CAAC;AAAA,IAAA,GAE3Ed,IAAO,KAAK;AAClB,WAAO,gBAAAmE;AAAA,MAACnE;AAAA,MAAA;AAAA,QACJ,WAAWoE,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,gBAAcH,IAAY,KAAK;AAAA,QAC/B,cAAYF,MAAWG,EAAW,QAAQ,KAAK;AAAA,QAE9C,UAAA;AAAA,UAAAD,sBAAa,KAAA,EAAE,MAAK,UAAS,aAAU,UAAS,2BAAa,IAAO;AAAA,UACpEF,MAAWG,EAAW,QAAQ,gBAAAC,EAAC,SAAI,aAAU,SAAQ,MAAK,SACvD,UAAA;AAAA,YAAA,gBAAAlE,EAAC,QAAA,EAAM,UAAAoE,GAAaL,GAAO,qBAAqB,GAAE;AAAA,YACjD,SAAO0E,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAU,aACxB,gBAAAzI;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAA;;AAAM,0BAAAyE,KAAArD,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAZ,gBAAAqD,EAAA,KAAArD,GAAoB;AAAA;AAAA,gBACtC,UAAA;AAAA,cAAA;AAAA,YAAA,IACC;AAAA,UAAA,EAAA,CACV,IAAS;AAAA,4BACR,SAAA,EAAM,aAAU,SAAQ,aAAW4C,IAAY,SAAS,MACpD,UAAA;AAAA,YAAA,KAAK,MAAM,WAAW,OAAO,yBAAQ,WAAA,EAAS,UAAA,KAAK,MAAM,QAAA,CAAQ;AAAA,YAClE,gBAAAhE;AAAA,cAACwG;AAAA,cAAA;AAAA,gBAEG,SAAS,KAAK;AAAA,gBACd,aAAa,KAAK;AAAA,gBAClB,gBAAgB,KAAK;AAAA,gBACpB,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,gBAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,KACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,gBACvC,GAAI,KAAK,MAAM,kBAAkB,OAC5B,CAAA,IACA,EAAC,gBAAgB,KAAK,MAAM,eAAA;AAAA,cAAc;AAAA,cAZ5C;AAAA,YAAA;AAAA,8BAcP,SAAA,EACI,UAAA7F,EAAK,SAAS,IACTA,EAAK,IAAI,CAACC,GAAKC,MACb,KAAK,UAAUD,GAAKC,GAAOmB,CAAY,CAAC,IAC1CgC,IACI,KAAK,uBACLF,MAAWG,EAAW,QAClB,OACA,gBAAAjE,EAAC,MAAA,EACC,4BAAC,MAAA,EAAG,SAAS,KAAK,QAAQ,QACrB,UAAA,KAAK,MAAM,gBAAgB,UAAA,CAChC,KAHM,OAIV,EAAA,CAChB;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAER;AAAA,EAEQ,UACJY,GACAC,GACAmB,GACS;AACT,UAAMa,IAAM,KAAK,OAAOjC,GAAKC,CAAK,GAC5BkB,IAAWC,EAAa,IAAIa,CAAG;AACrC,WAAO,gBAAA7C;AAAA,MAAC;AAAA,MAAA;AAAA,QAEJ,4BAAyB;AAAA,QACzB,cAAYa;AAAA,QACZ,iBAAe,OAAOkB,CAAQ;AAAA,QAC9B,UAAUlB,MAAU,IAAI,IAAI;AAAA,QAE3B,UAAA,KAAK,QAAQ,IAAI,CAAC4F,wBAAY,MAAA,EAC1B,UAAAA,EAAO,SACFA,EAAO,OAAO7F,GAAKC,CAAK,IACxB6H,GAAgB9H,EAAI6F,EAAO,KAAK,CAAC,KAHJ,OAAOA,EAAO,KAAK,CAI1D,CAAK;AAAA,MAAA;AAAA,MAVA,OAAO5D,CAAG;AAAA,IAAA;AAAA,EAYvB;AAAA,EAEQ,qBAAkC;AACtC,UAAM8F,IAAQ,KAAK,MAAM,oBAAoB;AAC7C,WAAO,MAAM,KAAK,EAAC,QAAQA,EAAA,GAAQ,CAACtE,GAAGuE,MACnC,gBAAA5I,EAAC,MAAA,EACI,eAAK,QAAQ,IAAI,CAACyG,GAAQoC,wBACtB,MAAA,EACG,UAAA,gBAAA7I;AAAA,MAACL;AAAA,MAAA;AAAA,QACG,OAAO,MAAOiJ,IAAWC,KAAe,IAAK;AAAA,MAAA;AAAA,IAAA,KAF5C,OAAOpC,EAAO,KAAK,CAI5B,CAAK,EAAA,GANJ,eAAemC,CAAQ,EAOhC,CAAK;AAAA,EACb;AAAA,EAEA,YAAYpE,GAA6B;AACrC,UAAM7D,IAAO6D,aAAe,UACtBA,EAAI,iBAA8B,kCAAkC,IACpE,CAAA;AACN,SAAK,iBAAiB,YAAY7D,CAAI;AAAA,EAC1C;AAAA,EAEA,kBAA0B;AACtB,WAAO,KAAK,iBAAiB,iBAAA;AAAA,EACjC;AAAA,EAEA,yBAA+C;AAC3C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAkB;;AACd,SAAK,iBAAiB,QAAA,GAClB,KAAK,eAAW8D,KAAArD,IAAA,KAAK,UAAL,gBAAAA,EAAY,YAAZ,QAAAqD,EAAA,KAAArD;AACpB,eAAW0H,KAAY,KAAK,UAAW,CAAAA,EAAS,QAAA;AAChD,KAAA3D,IAAA,KAAK,oBAAL,QAAAA,EAAsB,YACtBsD,IAAA,KAAK,8BAAL,QAAAA,EAAgC,WAChC,KAAK,YAAY,QAAA,GACjB,KAAK,eAAe,QAAA;AAAA,EACxB;AAuDJ;AArDIxI,EAjPS2H,GAiPF,gBAAe,CAACjI,GAAa6G,CAAW,IAE/CvG,EAnPS2H,GAmPO,YAAW,eAC3B3H,EApPS2H,GAoPO,sBAAqB,eAErC3H,EAtPS2H,GAsPF,OAAM1H;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkDjB,SAAS2H,GACLkB,GAC4B;AAC5B,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,UAAM,IAAI,UAAU,6CAA6C;AAErE,QAAMC,wBAAa,IAAA;AACnB,SAAOD,EAAQ,IAAI,CAACtC,MAAoB;AACpC,QAAIA,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,yCAAyC;AAEjE,UAAMM,IAAQ,QAAQ,IAAIN,GAAQ,OAAO;AACzC,QAAI,OAAOM,KAAU,YAAYA,EAAM,WAAW;AAC9C,YAAM,IAAI,UAAU,yCAAyC;AAEjE,QAAIiC,EAAO,IAAIjC,CAAK,SAAS,IAAI,MAAM,+BAA+BA,CAAK,EAAE;AAC7E,IAAAiC,EAAO,IAAIjC,CAAK;AAChB,UAAMkC,IAAS,QAAQ,IAAIxC,GAAQ,QAAQ;AAC3C,QAAIwC,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,oBAAoBlC,CAAK,4BAA4B;AAI7E,WAAON;AAAA,EACX,CAAC;AACL;AAEA,SAASqB,GACLoB,GACmB;AACnB,MAAIA,KAAU,KAAM,QAAO3I;AAC3B,MAAI,OAAO2I,KAAW,WAAY,QAAOA;AACzC,MAAI,OAAOA,KAAW,YAAYA,EAAO,SAAS;AAC9C,WAAO,CAACtI,GAAKC,MAAU;AACnB,YAAMgC,IAAMjC,EAAIsI,CAAM;AACtB,UAAIrG,KAAO;AACP,cAAM,IAAI,UAAU,0BAA0BhC,CAAK,UAAUqI,CAAM,EAAE;AAEzE,aAAOrG;AAAA,IACX;AAEJ,QAAM,IAAI,UAAU,sDAAsD;AAC9E;AAEA,SAASe,GAA0Be,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM,cAC3C,OAAO,QAAQ,IAAIA,GAAO,eAAe,KAAM,cAC/C,OAAO,QAAQ,IAAIA,GAAO,UAAU,KAAM;AACrD;AAEA,SAASuD,GACLvD,GACsC;AACtC,MAAI,CAACf,GAA+Ce,CAAK;AACrD,UAAM,IAAI,UAAU,oCAAoC;AAEhE;AAEA,SAAS+D,GAAgB/D,GAA2B;AAChD,SAAIA,KAAS,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU,WAAiBA,IAC7E,OAAOA,CAAK;AACvB;AAEA,SAASP,GAAaL,GAAgBe,GAA0B;AAC5D,SAAIf,aAAiB,QAAcA,EAAM,UAClCA,KAAS,OAAOe,IAAW,OAAOf,CAAK;AAClD;AChaO,MAAMoF,WAAmCvJ,EAAiC;AAAA,EAC7E,SAAoB;AAChB,WAAO,KAAK,MAAM,YAAY,CAAA;AAAA,EAClC;AACJ;ACKO,MAAMwJ,UAAmCxJ,EAAiC;AAAA,EAW7E,YAAY+D,GAA8B;AACtC,UAAMA,CAAK;AAXN,IAAA1D,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,oBAAyB;AACzB,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,wBAAuD;AAIvD,QAAA2D,GAA+CD,EAAM,KAAK;AAC1D,WAAK,eAAeA,EAAM,OAC1B,KAAK,oBAAoB;AAAA,SACtB;AACH,YAAM0F,IAAQ1F,EAAM,SAAS2F,GAAgC3F,EAAM,QAAQ;AAC3E,WAAK,oBAAoB,IAAIjD,EAAQ2I,GAAO;AAAA,QACxC,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACZ,GACD,KAAK,eAAe,KAAK;AAAA,IAC7B;AACA,SAAK,uBAAuB1F,EAAM,sBAAsB,OAClD,IAAIjD,EAAoB,MAAM,EAAC,OAAO,MAAM,SAAS,oBAAA,CAAoB,IACzE,MACN,KAAK,qBAAqBiD,EAAM,sBAAsB,KAAK,sBAC3D,KAAK,uBAAuBA,EAAM,uBAAuB,OACnD,IAAIjD,EAAe,IAAI,EAAC,OAAO,MAAM,SAAS,qBAAA,CAAqB,IACnE,MACN,KAAK,sBAAsBiD,EAAM,uBAAuB,KAAK;AAAA,EACjE;AAAA,EAEA,aAAmB;AACf,SAAK,UAAU,KAAK,aAAa,IAAA,CAAK,GACtC,KAAK,MAAM,KAAK,cAAc,KAAK,oBAAoB,KAAK,mBAAmB,GAC/E,KAAK,UAAU,KAAK,aAAa,UAAU,CAAC,EAAC,OAAAgB,QAAW,KAAK,UAAUA,CAAK,GAAG;AAAA,MAC3E,aAAa;AAAA,IAAA,CAChB,CAAC;AAAA,EACN;AAAA,EAEA,SAAoB;AAChB,UAAM0E,IAAQ,KAAK,aAAa,IAAA;AAChC,IAAAE,EAAgBF,CAAK;AACrB,UAAMG,IAAW,IAAI,IAAI,KAAK,oBAAoB,KAAK,GACjDC,IAAUC,EAAeL,GAAOG,CAAQ,GACxCzH,IAAW,KAAK,mBAAmB,IAAA,GACnC4H,IAASF,EAAQ,KAAK,CAAC,EAAC,MAAAG,EAAA,MAAU,OAAO,GAAGA,EAAK,IAAI,KAAK,UAAU,CAAC,KACpEH,EAAQ,KAAK,CAAC,EAAC,MAAAG,QAAU,OAAO,GAAGA,EAAK,IAAI7H,CAAQ,CAAC,KACrD0H,EAAQ,CAAC,KACT;AACP,SAAK,cAAaE,KAAA,gBAAAA,EAAQ,KAAK,OAAM;AAErC,UAAM5J,IAAO,KAAK;AAClB,WAAO,gBAAAC,EAACD,GAAA,EAAK,WAAWoE,EAAe,KAAK,KAAK,KAAK,MACjD,UAAAsF,EAAQ,WAAW,IACd,gBAAAzJ,EAAC,KAAA,EAAE,MAAK,UAAS,aAAU,SAAQ,UAAA,gBAAA,CAAa,IAChD,gBAAAA,EAAC,OAAA,EAAI,MAAK,QAAO,cAAY,KAAK,MAAM,OAAO,aAAU,QACtD,UAAAyJ,EAAQ,IAAI,CAACxH,GAAMpB,MAAU;;AAC1B,YAAM,EAAC,MAAA+I,GAAM,OAAAC,GAAO,UAAAC,GAAU,SAAAC,MAAW9H,GACnC+H,OAAe5I,IAAAwI,EAAK,aAAL,gBAAAxI,EAAe,WAAU,KAAK,GAC7C6I,IAAaD,KAAeR,EAAS,IAAII,EAAK,EAAE,GAChDM,IAAa,OAAO,GAAGN,EAAK,IAAI7H,CAAQ,GACxC6C,MAAQO,KAAAV,IAAA,KAAK,OAAM,eAAX,gBAAAU,EAAA,KAAAV,GAAwBmF,GAAMC,OAAUD,EAAK;AAC3D,aAAO,gBAAA1F;AAAA,QAAC;AAAA,QAAA;AAAA,UAEJ,MAAK;AAAA,UACL,aAAU;AAAA,UACV,cAAYrD;AAAA,UACZ,cAAYgJ;AAAA,UACZ,cAAYA,IAAQ;AAAA,UACpB,iBAAeC;AAAA,UACf,gBAAcC;AAAA,UACd,iBAAeC,IAAc,OAAOC,CAAU,IAAI;AAAA,UAClD,iBAAe,OAAOC,CAAU;AAAA,UAChC,UAAU,OAAO,GAAGN,EAAK,IAAID,KAAA,gBAAAA,EAAQ,KAAK,EAAE,IAAI,IAAI;AAAA,UACpD,OAAO,EAAC,gBAAgBE,EAAA;AAAA,UACxB,SAAS,CAAC7I,MAAsB;AAE5B,gBADA,KAAK,aAAa4I,EAAK,IACnBO,GAAiBnJ,EAAM,MAAM,KAAKgJ,GAAa;AAC/C,mBAAK,eAAeJ,EAAK,EAAE,GAC3B,KAAK,SAASA,EAAK,EAAE;AACrB;AAAA,YACJ;AACA,iBAAK,WAAWA,GAAM5I,CAAK;AAAA,UAC/B;AAAA,UACA,SAAS,MAAM,KAAK,aAAa4I,EAAK;AAAA,UACtC,WAAW,CAAC5I,MACR,KAAK,cAAcA,GAAOH,GAAO4I,CAAO;AAAA,UAE5C,UAAA;AAAA,YAAA,gBAAAzJ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,aAAU;AAAA,gBACV,mBAAiBgK,IAAc,KAAK;AAAA,gBACpC,eAAY;AAAA,gBACd,UAAAA,IAAeC,IAAa,MAAM,MAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAC3C,gBAAAjK,EAAC,QAAA,EAAK,aAAU,SAAS,UAAA4E,EAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QA9B1BgF,EAAK;AAAA,MAAA;AAAA,IAgClB,CAAC,GACL,GACR;AAAA,EACJ;AAAA,EAEA,YAAkB;;AACd,IAAI,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,IACjExI,IAAA,KAAK,sBAAL,QAAAA,EAAwB,YACxBqD,IAAA,KAAK,yBAAL,QAAAA,EAA2B,YAC3BU,IAAA,KAAK,yBAAL,QAAAA,EAA2B;AAAA,EAC/B;AAAA,EAyEQ,UAAUkE,GAA0C;AACxD,IAAAE,EAAgBF,CAAK;AACrB,UAAMe,IAAU,IAAI,IAAIC,GAAWhB,CAAK,EAAE,IAAI,CAAC,EAAC,MAAAO,EAAA,MAAUA,EAAK,EAAE,CAAC,GAC5D7H,IAAW,KAAK,mBAAmB,IAAA;AACzC,IAAI,KAAK,wBAAwB,QAAQA,KAAY,QAAQ,CAACqI,EAAQ,IAAIrI,CAAQ,KAC9E,KAAK,mBAAmB,IAAI,MAAM,4BAA4B;AAElE,UAAMyH,IAAW,KAAK,oBAAoB,IAAA,GACpCc,IAAWd,EAAS,OAAO,CAAC3G,MAAQuH,EAAQ,IAAIvH,CAAG,CAAC;AAC1D,IAAI,KAAK,wBAAwB,QAAQ,CAAC0H,GAASf,GAAUc,CAAQ,KACjE,KAAK,oBAAoB,IAAIA,GAAU,oCAAoC,GAE3E,KAAK,cAAc,QAAQ,CAACF,EAAQ,IAAI,KAAK,UAAU,MAAG,KAAK,aAAa;AAAA,EACpF;AAAA,EAEQ,WAAWR,GAAwB5I,GAAoB;AAC3D,SAAK,mBAAmB,IAAI4I,EAAK,IAAI,oBAAoB,GACzDY,EAAO,KAAK,MAAM,UAAUZ,GAAM5I,CAAK,GACvC,KAAK,SAAS4I,EAAK,EAAE;AAAA,EACzB;AAAA,EAEQ,eAAe/G,GAAgB;AACnC,UAAM2G,IAAW,KAAK,oBAAoB,IAAA,GACpCiB,IAAWjB,EAAS,KAAK,CAAC1G,MAAc,OAAO,GAAGA,GAAWD,CAAG,CAAC;AACvE,SAAK,oBAAoB;AAAA,MACrB4H,IACMjB,EAAS,OAAO,CAAC1G,MAAc,CAAC,OAAO,GAAGA,GAAWD,CAAG,CAAC,IACzD,CAAC,GAAG2G,GAAU3G,CAAG;AAAA,MACvB4H,IAAW,wBAAwB;AAAA,IAAA;AAAA,EAE3C;AAAA,EAEQ,cACJzJ,GACAH,GACA4I,GACI;;AACJ,UAAMvH,IAAUuH,EAAQ5I,CAAK;AAC7B,QAAIqB,KAAW,MACf;AAAA,UAAIlB,EAAM,QAAQ,YAAa,QAAO,KAAK,KAAKA,IAAOI,IAAAqI,EAAQ5I,IAAQ,CAAC,MAAjB,gBAAAO,EAAoB,KAAK,EAAE;AAClF,UAAIJ,EAAM,QAAQ,UAAW,QAAO,KAAK,KAAKA,IAAOyD,IAAAgF,EAAQ5I,IAAQ,CAAC,MAAjB,gBAAA4D,EAAoB,KAAK,EAAE;AAChF,UAAIzD,EAAM,QAAQ,OAAQ,QAAO,KAAK,KAAKA,IAAOmE,IAAAsE,EAAQ,CAAC,MAAT,gBAAAtE,EAAY,KAAK,EAAE;AACrE,UAAInE,EAAM,QAAQ,MAAO,QAAO,KAAK,KAAKA,IAAOyH,IAAAgB,EAAQ,GAAG,EAAE,MAAb,gBAAAhB,EAAgB,KAAK,EAAE;AACxE,UAAIzH,EAAM,QAAQ,cAAc;AAC5B,QAAAA,EAAM,eAAA;AACN,cAAM0J,IAAWxI,EAAQ,KAAK,YAAY,CAAA;AAC1C,YAAIwI,EAAS,WAAW,EAAG;AAG3B,QAFiB,KAAK,oBAAoB,IAAA,EAAM,KAAK,CAAC7H,MAClD,OAAO,GAAGA,GAAKX,EAAQ,KAAK,EAAE,CAAC,IAE9B,KAAK,SAASwI,EAAS,CAAC,EAAG,EAAE,IADnB,KAAK,eAAexI,EAAQ,KAAK,EAAE;AAElD;AAAA,MACJ;AACA,UAAIlB,EAAM,QAAQ,aAAa;AAC3B,QAAAA,EAAM,eAAA,GACW,KAAK,oBAAoB,IAAA,EAAM,KAAK,CAAC6B,MAClD,OAAO,GAAGA,GAAKX,EAAQ,KAAK,EAAE,CAAC,IACrB,KAAK,eAAeA,EAAQ,KAAK,EAAE,IACxCA,EAAQ,YAAY,QAAM,KAAK,SAASA,EAAQ,QAAQ;AACjE;AAAA,MACJ;AACA,UAAIlB,EAAM,QAAQ,WAAWA,EAAM,QAAQ,KAAK;AAC5C,QAAAA,EAAM,eAAA,GACN,KAAK,WAAWkB,EAAQ,MAAMlB,CAAK;AACnC;AAAA,MACJ;AACA,MAAIA,EAAM,IAAI,WAAW,KAAK,CAACA,EAAM,UAAU,CAACA,EAAM,WAAW,CAACA,EAAM,WACpE,KAAK,gBAAgBA,GAAOyI,GAAS5I,CAAK;AAAA;AAAA,EAElD;AAAA,EAEQ,KAAKG,GAAsB6B,GAA4B;AAC3D,IAAIA,MAAQ,WACZ7B,EAAM,eAAA,GACN,KAAK,SAAS6B,CAAG;AAAA,EACrB;AAAA,EAEQ,SAASA,GAAgB;;AAC7B,SAAK,aAAaA;AAClB,UAAMlC,IAAO,KAAK,eAAe,UAC3B,CAAC,GAAG,KAAK,IAAI,iBAA8B,mBAAmB,CAAC,IAC/D,CAAA;AACN,eAAWC,KAAOD,GAAM;AACpB,YAAME,IAAQ,OAAOD,EAAI,QAAQ,KAAK,GAChC6I,IAAUC;AAAA,QACZ,KAAK,aAAa,IAAA;AAAA,QAClB,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAAA,MAAA,GAEpCiB,IAAU,OAAO,IAAGvJ,IAAAqI,EAAQ5I,CAAK,MAAb,gBAAAO,EAAgB,KAAK,IAAIyB,CAAG;AACtD,MAAAjC,EAAI,WAAW+J,IAAU,IAAI,IACzBA,OAAa,MAAA;AAAA,IACrB;AAAA,EACJ;AAAA,EAEQ,gBACJ3J,GACAyI,GACA5I,GACI;AACJ,IAAAG,EAAM,eAAA,GACF,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,GACjE,KAAK,aAAaA,EAAM,IAAI,kBAAA,GAC5B,KAAK,iBAAiB,WAAW,MAAM;AACnC,WAAK,YAAY,IACjB,KAAK,iBAAiB;AAAA,IAC1B,GAAG,GAAG;AAEN,UAAM4J,IADa,CAAC,GAAGnB,EAAQ,MAAM5I,IAAQ,CAAC,GAAG,GAAG4I,EAAQ,MAAM,GAAG5I,IAAQ,CAAC,CAAC,EACtD,KAAK,CAAC,EAAC,MAAA+I,EAAA,MAAUiB,GAAUjB,CAAI,EACnD,kBAAA,EACA,WAAW,KAAK,SAAS,CAAC;AAC/B,IAAIgB,KAAS,QAAM,KAAK,SAASA,EAAM,KAAK,EAAE;AAAA,EAClD;AACJ;AAvLI3K,EA9GSmJ,GA8GF,gBAAe,CAACD,EAAQ,IAE/BlJ,EAhHSmJ,GAgHO,YAAW,cAC3BnJ,EAjHSmJ,GAiHO,sBAAqB,cAErCnJ,EAnHSmJ,GAmHF,OAAMlJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoLjB,SAASoJ,GAAgCoB,GAA0D;AAE/F,UADe,MAAM,QAAQA,CAAQ,IAAIA,IAAWA,KAAY,OAAO,KAAK,CAACA,CAAQ,GACvE,OAAO,CAACI,MAAUC,EAAQD,CAAK,KAAKA,EAAM,SAAS3B,EAAQ,EAAE,IAAI,CAAC2B,MAAU;AACtF,QAAI,CAACC,EAAQD,CAAK,EAAG,OAAM,IAAI,UAAU,0CAA0C;AACnF,UAAMnH,IAAQmH,EAAM;AACpB,WAAO;AAAA,MACH,IAAInH,EAAM;AAAA,MACV,OAAOA,EAAM;AAAA,MACb,GAAIA,EAAM,aAAa,OAAO,CAAA,IAAK,EAAC,WAAWA,EAAM,UAAA;AAAA,MACrD,GAAIA,EAAM,UAAU,SAAY,CAAA,IAAK,EAAC,OAAOA,EAAM,MAAA;AAAA,MACnD,UAAU2F,GAAgC3F,EAAM,QAAQ;AAAA,IAAA;AAAA,EAEhE,CAAC;AACL;AAEA,SAAS+F,EACLL,GACAG,GACqB;AACrB,QAAMhG,IAAgC,CAAA,GAChCwH,IAAQ,CAACnJ,GAAoCgI,GAAeoB,MAAyB;AACvF,IAAApJ,EAAM,QAAQ,CAAC+H,GAAM/I,MAAU;;AAC3B,MAAA2C,EAAO,KAAK,EAAC,MAAAoG,GAAM,OAAAC,GAAO,UAAAoB,GAAU,UAAUpK,IAAQ,GAAG,SAASgB,EAAM,OAAA,CAAO,MAC1ET,IAAAwI,EAAK,aAAL,gBAAAxI,EAAe,WAAU,KAAK,KAAKoI,EAAS,IAAII,EAAK,EAAE,KACxDoB,EAAMpB,EAAK,YAAY,CAAA,GAAIC,IAAQ,GAAGD,EAAK,EAAE;AAAA,IAErD,CAAC;AAAA,EACL;AACA,SAAAoB,EAAM3B,GAAO,GAAG,IAAI,GACb7F;AACX;AAEA,SAAS6G,GAAmBhB,GAA2D;AACnF,QAAMe,wBAAc,IAAA,GACd5G,IAAgC,CAAA,GAChCwH,IAAQ,CAACnJ,GAAoCgI,GAAeoB,MAAyB;AACvF,IAAApJ,EAAM,QAAQ,CAAC+H,GAAM/I,MAAU;AAC3B,UAAIuJ,EAAQ,IAAIR,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,2BAA2B,OAAOA,EAAK,EAAE,CAAC,EAAE;AACtF,MAAAQ,EAAQ,IAAIR,EAAK,EAAE,GACnBpG,EAAO,KAAK,EAAC,MAAAoG,GAAM,OAAAC,GAAO,UAAAoB,GAAU,UAAUpK,IAAQ,GAAG,SAASgB,EAAM,OAAA,CAAO,GAC/EmJ,EAAMpB,EAAK,YAAY,CAAA,GAAIC,IAAQ,GAAGD,EAAK,EAAE;AAAA,IACjD,CAAC;AAAA,EACL;AACA,SAAAoB,EAAM3B,GAAO,GAAG,IAAI,GACb7F;AACX;AAEA,SAAS+F,EAAwB5E,GAA8D;AAC3F,MAAI,CAAC,MAAM,QAAQA,CAAK,EAAG,OAAM,IAAI,UAAU,iCAAiC;AAChF,aAAW,EAAC,MAAAiF,EAAA,KAASS,GAAW1F,CAAoC,GAAG;AACnE,QAAIiF,KAAQ,QAAQ,OAAOA,KAAS,YAAYA,EAAK,MAAM;AACvD,YAAM,IAAI,UAAU,+BAA+B;AAEvD,QAAI,CAAC,MAAM,QAAQA,EAAK,YAAY,CAAA,CAAE;AAClC,YAAM,IAAI,UAAU,aAAa,OAAOA,EAAK,EAAE,CAAC,4BAA4B;AAAA,EAEpF;AACJ;AAEA,SAASiB,GAAkBjB,GAAgC;AACvD,SAAIA,EAAK,aAAa,OAAaA,EAAK,YACpC,OAAOA,EAAK,SAAU,YAAY,OAAOA,EAAK,SAAU,WAAiB,OAAOA,EAAK,KAAK,IACvF,OAAOA,EAAK,EAAE;AACzB;AAEA,SAASW,GAASjH,GAAsBC,GAAgC;AACpE,SAAOD,EAAK,WAAWC,EAAM,UACtBD,EAAK,MAAM,CAACqB,GAAO9D,MAAU,OAAO,GAAG8D,GAAOpB,EAAM1C,CAAK,CAAC,CAAC;AACtE;AAEA,SAAS+C,GAA0Be,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASwF,GAAiBe,GAAqC;AAC3D,SAAOA,aAAkB,WAAWA,EAAO,QAAQ,wBAAwB,KAAK;AACpF;AC3XO,MAAMC,UAAevL,EAAuB;AAAA,EAS/C,YAAY+D,GAAoB;AAC5B,UAAMA,CAAK;AATN,IAAA1D,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACD,IAAAA,EAAA,uBAA0C;AAC1C,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,0BAAmB;AAIvB,SAAK,cAAcmL,GAAmB,MAAMzH,GAAO,IAAO,mBAAmB,GAC7E,KAAK,WAAW0H,GAAU,UAAU1H,EAAM,EAAE,GAC5C,KAAK,UAAU,GAAG,KAAK,QAAQ,UAC/B,KAAK,gBAAgB,GAAG,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,WAAW;AAAA,EAC/B;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,OAAA2H;AAAA,MACA,aAAAC;AAAA,MACA,SAAAC;AAAA,MACA,YAAAC,IAAa;AAAA,MACb,iBAAAC,IAAkB;AAAA,MAClB,UAAAhB,IAAW,CAAA;AAAA,IAAC,IACZ,KAAK;AACT,WAAO,gBAAAxG;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,WAAWC,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,uBAAoB;AAAA,QACpB,mBAAiB,KAAK;AAAA,QACtB,oBAAkBoH,KAAe,OAAO,OAAO,KAAK;AAAA,QACpD,cAAW;AAAA,QACX,KAAK,CAACI,MAAsC,KAAK,gBAAgBA;AAAA,QAEjE,UAAA;AAAA,UAAA,gBAAA3L,EAAC,UAAA,EAAO,aAAU,UACd,UAAA,gBAAAA,EAAC,QAAG,IAAI,KAAK,SAAU,UAAAsL,EAAA,CAAM,EAAA,CACjC;AAAA,UACCC,KAAe,OAAO,OAAO,gBAAAvL,EAAC,KAAA,EAAE,IAAI,KAAK,eAAe,aAAU,eAC9D,UAAAuL,EAAA,CACL;AAAA,UACA,gBAAAvL,EAAC,OAAA,EAAI,aAAU,WAAW,UAAA0K,EAAA,CAAS;AAAA,UAClCc,KAAW,QAAQ,CAACE,IAAkB,OAAO,gBAAAxH,EAAC,UAAA,EAAO,aAAU,WAC3D,UAAA;AAAA,YAAAsH;AAAA,YACAE,IAAkB,gBAAA1L;AAAA,cAAC4L;AAAA,cAAA;AAAA,gBAChB,OAAOH;AAAA,gBACP,SAAS,MAAM,KAAK,aAAA;AAAA,cAAa;AAAA,YAAA,IAChC;AAAA,UAAA,EAAA,CACT;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,aAAmB;AACf,UAAMI,IAAS,KAAK;AACpB,IAAIA,KAAU,SACd,KAAK,OAAOA,GAAQ,UAAU,CAAC7K,MAAiB;AAC5C,MAAAA,EAAM,eAAA,GACN,KAAK,aAAA;AAAA,IACT,CAAC,GACD,KAAK,OAAO6K,GAAQ,SAAS,MAAM;AAC/B,MAAI,KAAK,YAAY,IAAA,UAAY,YAAY,IAAI,IAAO,sBAAsB,GAC9E,KAAK,YAAA;AAAA,IACT,CAAC,GACD,KAAK,cAAA;AAAA,EACT;AAAA,EAEA,cAAoB;AAChB,SAAK,cAAA;AAAA,EACT;AAAA,EAEA,QAAc;AACV,SAAK,aAAA;AAAA,EACT;AAAA,EAEA,YAAkB;AACd,UAAMA,IAAS,KAAK;AACpB,KAAIA,KAAA,gBAAAA,EAAQ,UAAS,MAAQ,OAAOA,EAAO,SAAU,gBAAmB,MAAA,GACxE,KAAK,YAAA,GACL,KAAK,gBAAgB;AAAA,EACzB;AAAA,EA0EQ,eAAqB;AACzB,IAAK,KAAK,YAAY,SACtB,KAAK,YAAY,IAAI,IAAO,wBAAwB;AAAA,EACxD;AAAA,EAEQ,gBAAsB;AAC1B,UAAMA,IAAS,KAAK;AACpB,QAAIA,KAAU,KAAM;AACpB,UAAMC,IAAa,KAAK,YAAY,IAAA;AACpC,QAAIA,KAAc,CAAC,KAAK,kBAAkB;AACtC,YAAMnC,IAAS,SAAS;AACxB,WAAK,iBAAiBA,aAAkB,cAAcA,IAAS,MAC/DoC,GAAUF,CAAM,GAChB,KAAK,mBAAmB,IACxBG,GAAaH,GAAQ,KAAK,MAAM,eAAe;AAC/C;AAAA,IACJ;AACA,IAAI,CAACC,KAAc,KAAK,qBAChBD,EAAO,QAAQ,OAAOA,EAAO,SAAU,eAAmB,MAAA,IACzDA,EAAO,gBAAgB,MAAM,GAClC,KAAK,YAAA;AAAA,EAEb;AAAA,EAEQ,cAAoB;AACxB,QAAI,CAAC,KAAK,oBAAoB,KAAK,kBAAkB,KAAM;AAC3D,SAAK,mBAAmB;AACxB,UAAMI,IAAU,KAAK;AACrB,SAAK,iBAAiB,OAClBA,KAAA,gBAAAA,EAAS,iBAAgB,MAAMA,EAAQ,MAAA,GAC3CzB,EAAO,KAAK,MAAM,OAAO;AAAA,EAC7B;AACJ;AAxGIvK,EArFSkL,GAqFF,gBAAe,CAACS,CAAM,IAE7B3L,EAvFSkL,GAuFF,OAAMjL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwGjB,SAAS6L,GAAUF,GAAiC;AAChD,MAAI,CAAAA,EAAO,MACX;AAAA,QAAI,OAAOA,EAAO,aAAc,YAAY;AACxC,MAAAA,EAAO,UAAA;AACP;AAAA,IACJ;AACA,IAAAA,EAAO,aAAa,QAAQ,EAAE;AAAA;AAClC;AAEA,SAASG,GAAaH,GAA2BK,GAAyC;AAItF,QAAMhB,KAHagB,KAAO,QAEpB,OAAOA,KAAQ,aADf,OACmCA,EAAI,YAChBL,EAAO;AAAA,IAChC;AAAA,EAAA;AAEJ,EAAAX,KAAA,QAAAA,EAAQ;AACZ;"}
|