@fsegurai/ngx-sidenav
Version:
Angular component for creating a resizeable sidenav with drag and drop functionality.
1 lines • 66.4 kB
Source Map (JSON)
{"version":3,"file":"fsegurai-ngx-sidenav.mjs","sources":["../../../lib/src/components/link-item/link-item.ts","../../../lib/src/components/link-item/link-item.html","../../../lib/src/directives/content-area/content-area.directive.ts","../../../lib/src/types/stack.ts","../../../lib/src/services/sidenav/sidenav.service.ts","../../../lib/src/components/sidenav-menu/sidenav-menu.ts","../../../lib/src/components/sidenav-menu/sidenav-menu.html","../../../lib/src/components/sidenav/sidenav.ts","../../../lib/src/components/sidenav/sidenav.html","../../../lib/public_api.ts","../../../lib/fsegurai-ngx-sidenav.ts"],"sourcesContent":["import { Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\n\n@Component({\n selector: 'ngx-sidenav-link-item',\n imports: [\n RouterLink,\n RouterLinkActive,\n ],\n templateUrl: './link-item.html',\n styleUrl: './link-item.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class LinkItem {\n // ? === Public inputs signals ===\n routerLink: InputSignal<string | string[] | null> = input<string | string[] | null>(null);\n routerLinkActiveOptions: InputSignal<{ exact: boolean }> = input<{ exact: boolean }>({ exact: true });\n isTitle: InputSignal<boolean> = input<boolean>(false);\n isParent: InputSignal<boolean> = input<boolean>(false);\n isDisabled: InputSignal<boolean> = input<boolean>(false);\n}\n","<a class=\"link-item\"\n [class.is-parent]=\"isParent()\"\n [class.is-title]=\"isTitle()\"\n [routerLink]=\"routerLink()\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\">\n\n <span class=\"link-content-container\">\n <ng-content></ng-content>\n </span>\n</a>","import { Directive, inject, ViewContainerRef } from '@angular/core';\n\n@Directive({\n selector: '[ngxSidenavContentArea]',\n})\nexport class ContentAreaDirective {\n public _viewContainerRef = inject(ViewContainerRef);\n}\n","import { ComponentStackItem, MenuStackItem } from '../interfaces/stack-item';\n\n/**\n * Represents an item in the side navigation stack.\n *\n * A `SidenavStackItem` can either be a `MenuStackItem` or a `ComponentStackItem`.\n * It is used to define the structure and hierarchy of items in the side navigation panel.\n */\nexport type SidenavStackItem = MenuStackItem | ComponentStackItem;\n\n/**\n * Determines if the given item is a MenuStackItem.\n *\n * @param {SidenavStackItem} item - The item to check.\n * @return {boolean} True if the item is a MenuStackItem, otherwise false.\n */\nexport function isMenuStackItem(item: SidenavStackItem): item is MenuStackItem {\n return item.type === 'menu';\n}\n\n/**\n * Determines if the given stack item is a ComponentStackItem.\n *\n * @param {SidenavStackItem} item - The stack item to evaluate.\n * @return {boolean} - Returns true if the item is of type ComponentStackItem, otherwise false.\n */\nexport function isComponentStackItem(item: SidenavStackItem): item is ComponentStackItem {\n return item.type === 'component';\n}\n","import { Type as Component, computed, Injectable, Signal, signal, WritableSignal } from '@angular/core';\nimport { ContentAreaDirective } from '../../directives/content-area/content-area.directive';\nimport { ComponentStackItem, MenuStackItem, SerializableStackItem } from '../../interfaces/stack-item';\nimport { StackMenuItem } from '../../interfaces/stack-menu-item';\nimport { isComponentStackItem, isMenuStackItem, SidenavStackItem } from '../../types/stack';\n\n// LocalStorage keys\nconst STORAGE_KEY_WIDTH = 'ngx-sidenav-width';\nconst STORAGE_KEY_EXPANDED = 'ngx-sidenav-expanded';\nconst STORAGE_KEY_STACK = 'ngx-sidenav-stack';\nconst STORAGE_KEY_CLEAR_ON_RELOAD = 'ngx-sidenav-clear-on-reload';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SidenavService {\n // ? Public constants\n readonly COLLAPSE_WIDTH = 30; // Minimum width for collapse\n readonly INITIAL_WIDTH = 300; // Default initial width of the sidenav\n\n // ! === Private constants ===\n readonly #DEBOUNCE_DELAY = 300; // Debounce delay for localStorage writes\n readonly #TRANSITION_DURATION = 400; // Default transition duration in milliseconds\n\n // ! === Private reactive signals ===\n #minWidth: WritableSignal<number> = signal(250); // Minimum width of the sidenav\n #maxWidth: WritableSignal<number> = signal(600); // Maximum width of the sidenav\n #isExpanded: WritableSignal<boolean> = signal(true);\n #sidenavWidth: WritableSignal<number> = signal(this.INITIAL_WIDTH);\n #stack: WritableSignal<SidenavStackItem[]> = signal([]);\n\n // ? === Public readonly signals ===\n minWidth: Signal<number> = this.#minWidth.asReadonly();\n maxWidth: Signal<number> = this.#maxWidth.asReadonly();\n isExpanded: Signal<boolean> = this.#isExpanded.asReadonly();\n sidenavWidth: Signal<number> = this.#sidenavWidth.asReadonly();\n readonly currentMenu = computed(() => {\n const current: SidenavStackItem | undefined = this.#stack().at(-1); // Get the last item in the stack\n // Return early if there's no item or if it's not a valid MenuStackItem\n return current && isMenuStackItem(current) ? current : undefined;\n });\n readonly canGoBack = computed(() => this.#stack().length > 1);\n\n // ? === Public non-reactive state flags ===\n isSlidingInFromRight = false;\n isSlidingInFromLeft = false;\n\n // ! === Private internals ===\n #shouldPersistStack = true;\n #stackItemCounter = 0;\n #contentArea?: ContentAreaDirective;\n\n constructor() {\n // Clear-once flag logic\n const shouldClear = localStorage.getItem(STORAGE_KEY_CLEAR_ON_RELOAD) === 'true';\n if (shouldClear) {\n localStorage.removeItem(STORAGE_KEY_STACK);\n localStorage.removeItem(STORAGE_KEY_CLEAR_ON_RELOAD); // Reset flag\n this.#shouldPersistStack = false; // 👈 prevent saving again\n }\n\n // Restore basic config\n const storedWidth = Number(localStorage.getItem(STORAGE_KEY_WIDTH));\n if (!isNaN(storedWidth)) this.#sidenavWidth.set(storedWidth);\n this.#isExpanded.set(localStorage.getItem(STORAGE_KEY_EXPANDED) === 'true');\n\n // Save stack when the user exits\n window.addEventListener('beforeunload', () => {\n if (this.#shouldPersistStack) this.#saveStack();\n });\n }\n\n /**\n * Marks the application or specific data to be cleared on the next reload\n * by setting a flag in the local storage.\n *\n * @return {void} This method does not return a value.\n */\n clearOnNextReload(): void {\n localStorage.setItem(STORAGE_KEY_CLEAR_ON_RELOAD, 'true');\n }\n\n /**\n * Configures the parameters for the sidenav, including minimum width, maximum width,\n * and initial width. Updates the sidenav properties and optionally stores the\n * initial width in local storage.\n *\n * @param {Object} config - Configuration object for the sidenav.\n * @param {number} [config.minWidth] - Specifies the minimum width of the sidenav.\n * @param {number} [config.maxWidth] - Specifies the maximum width of the sidenav.\n * @param {number} [config.initialWidth] - Specifies the initial width of the sidenav.\n * @return {void}\n */\n setConfig({ minWidth, maxWidth, initialWidth }: {\n minWidth?: number;\n maxWidth?: number;\n initialWidth?: number\n }): void {\n if (minWidth) this.#minWidth.set(minWidth);\n if (maxWidth) this.#maxWidth.set(maxWidth);\n if (initialWidth) {\n this.#sidenavWidth.set(initialWidth);\n localStorage.setItem(STORAGE_KEY_WIDTH, String(initialWidth));\n } else if (!this.#sidenavWidth()) {\n this.#sidenavWidth.set(this.INITIAL_WIDTH);\n localStorage.setItem(STORAGE_KEY_WIDTH, String(this.#sidenavWidth()));\n }\n }\n\n /**\n * Adjusts the width of the sidenav, constraining it within the defined minimum and maximum bounds.\n * The adjusted width is stored both in a state variable and in local storage.\n *\n * @param {number} width - The desired width of the sidenav to be set.\n * @return {void} This method does not return a value.\n */\n setSidenavWidth(width: number): void {\n const clampedWidth = Math.min(Math.max(width, this.#minWidth()), this.#maxWidth());\n this.#sidenavWidth.set(clampedWidth);\n this.#debouncedSave(STORAGE_KEY_WIDTH, clampedWidth);\n }\n\n /**\n * Toggles the state of the sidenav between expanded and collapsed.\n * Updates the local storage to reflect the new state.\n *\n * @return {void} Does not return a value.\n */\n toggleSidenav(): void {\n this.#isExpanded.update(v => {\n this.#debouncedSave(STORAGE_KEY_EXPANDED, !v);\n return !v;\n });\n }\n\n /**\n * Sets the dynamic content area by assigning the provided host to an internal property.\n *\n * @param {ContentAreaDirective} host The ContentAreaDirective instance to be set as the dynamic content area.\n * @return {void} No return value.\n */\n setDynamicContentArea(host: ContentAreaDirective): void {\n this.#contentArea = host;\n }\n\n /**\n * Pushes a new stack item onto the sidenav stack. The item can be either a menu stack item\n * or a component stack item. Based on the type of the item, the method processes and adds it\n * to the stack accordingly. Additionally, certain UI elements and animations are updated or triggered.\n *\n * @param {SidenavStackItem} item - The stack item to be added. This can either represent a menu\n * (with title, badge, items) or a component (with data and behavior).\n * @return {Promise<void>} - A promise that resolves once the push operation and associated\n * animations have been completed.\n */\n push(item: SidenavStackItem): Promise<void> {\n const stackItem: SidenavStackItem = item.type === 'menu'\n ? this.#createMenuStackItem(item.items, item.title, item.badge, item.badgeColor)\n : this.#createComponentStackItem(item.component, item.componentData);\n\n this.#stack.update(stack => [...stack, stackItem]);\n\n if (isMenuStackItem(stackItem)) {\n this.#clearContent();\n } else {\n this.#setContent(stackItem.component);\n }\n\n if (this.#shouldPersistStack) this.#saveStack();\n return this.#animateInFromTheRight();\n }\n\n /**\n * Removes the top item from the navigation stack and updates the display.\n * If the stack contains only one or no items, it resolves immediately without making changes.\n * Adjusts the content displayed based on the type of the new top item in the stack.\n * Persists the stack state if configured to do so.\n * Executes an animation to visually represent the stack update.\n *\n * @return {Promise<void>} A promise that resolves when the operation is complete.\n */\n pop(): Promise<void> {\n if (this.#stack().length <= 1) return Promise.resolve();\n\n this.#stack.update(stack => stack.slice(0, -1));\n\n const previous: SidenavStackItem | undefined = this.#stack().at(-1);\n if (!previous) return Promise.resolve();\n\n if (isMenuStackItem(previous)) {\n this.#clearContent();\n } else if (isComponentStackItem(previous)) {\n this.#setContent(previous.component);\n }\n\n if (this.#shouldPersistStack) this.#saveStack();\n return this.#animateInFromTheLeft();\n }\n\n /**\n * Restores the stack from local storage if available; otherwise, initializes the stack from the provided root items.\n *\n * @param {StackMenuItem[]} rootItems - An array of StackMenuItem objects representing the root stack menu items.\n * @return {void} Does not return any value.\n */\n restoreStackHybrid(rootItems: StackMenuItem[]): void {\n const raw = localStorage.getItem(STORAGE_KEY_STACK);\n if (raw) this.restoreStackFromStorage();\n\n if (!this.#stack().length) this.restoreStackFromMenuRoot(rootItems);\n }\n\n /**\n * Restores the stack state from the browser's localStorage. The method retrieves a serialized stack,\n * validates its type, and deserializes appropriate items, reconstructing the stack content.\n * Invalid or unparsable data will result in an empty stack being restored.\n *\n * @return {void} Does not return any value.\n */\n restoreStackFromStorage(): void {\n const raw = localStorage.getItem(STORAGE_KEY_STACK);\n if (!raw) return;\n\n try {\n const parsed = JSON.parse(raw) as SerializableStackItem[];\n // Validate type safety\n if (!Array.isArray(parsed)) {\n console.error('Invalid stack format in localStorage:', parsed);\n return;\n }\n\n this.#clearContent();\n this.#stack.set(parsed\n .filter(item => item.type === 'menu')\n .map(item => this.#deserializeMenuItem(item)),\n );\n\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.warn('Failed to restore stack from localStorage:', errorMessage);\n this.#stack.set([]);\n }\n }\n\n /**\n * Restores the menu stack to reflect the current application route based on the given menu root items.\n * It clears the existing menu stack, rebuilds it starting from the root items, and persists the updated stack.\n *\n * @param {StackMenuItem[]} rootItems - An array of StackMenuItem objects representing the root menu structure.\n * @return {void} This method does not return a value.\n */\n restoreStackFromMenuRoot(rootItems: StackMenuItem[]): void {\n const currentRoute = location.pathname;\n\n // Always reset the stack\n this.#clearContent();\n this.#stack.set([]);\n\n // Always start with the root\n this.#stack.update(stack => [...stack, this.#createMenuStackItem(rootItems)]);\n\n const path = this.#findPathToRoute(rootItems, currentRoute);\n\n if (!path.length) {\n this.#saveStack();\n return;\n }\n\n let currentChildren = rootItems;\n\n for (const item of path) {\n const match = currentChildren.find(i => i.route === item.route || i.label === item.label);\n\n if (!match) continue;\n\n if (match.children?.length) {\n this.#stack.update(stack => [\n ...stack,\n this.#createMenuStackItem(\n match.children!,\n match.label,\n match.badge,\n match.badgeColor,\n ),\n ]);\n\n currentChildren = match.children;\n }\n }\n\n this.#saveStack(); // Persist\n }\n\n /**\n * Sets the content of the content area by creating and attaching the provided component.\n * It ensures the content area is not null and the component is a valid constructor function\n * before attempting to create it.\n *\n * @param {Component<unknown>} component - The component to be created and attached to the content area.\n * @return {void} Does not return a value.\n */\n #setContent(component: Component<unknown>): void {\n if (!this.#contentArea) return;\n\n this.#contentArea._viewContainerRef.clear();\n\n // Type guard to ensure a component is a valid constructor function\n if (!component || typeof component !== 'function') {\n console.warn('Attempted to create a component with an invalid type:', component);\n return;\n }\n\n this.#contentArea._viewContainerRef.createComponent(component);\n }\n\n /**\n * Clears the content of the private content area by removing all child views from the view container reference.\n *\n * @return {void} This method does not return any value.\n */\n #clearContent(): void {\n this.#contentArea?._viewContainerRef.clear();\n }\n\n /**\n * Animates the element by sliding it in from the left.\n * Sets the `isSlidingInFromLeft` flag to true during the animation.\n * Waits for the duration specified by `sidenavTransitionDuration` before resetting the flag.\n *\n * @return {Promise<void>} A promise that resolves after the animation is complete.\n */\n async #animateInFromTheLeft(): Promise<void> {\n this.isSlidingInFromLeft = true;\n await this.#sleep(this.#TRANSITION_DURATION);\n this.isSlidingInFromLeft = false;\n }\n\n /**\n * Handles the animation by sliding in an element from the right side.\n * Temporarily sets the sliding state to true, waits for the defined transition duration,\n * and then resets the sliding state to false.\n *\n * @return {Promise<void>} A promise that resolves when the animation is complete.\n */\n async #animateInFromTheRight(): Promise<void> {\n this.isSlidingInFromRight = true;\n await this.#sleep(this.#TRANSITION_DURATION);\n this.isSlidingInFromRight = false;\n }\n\n /**\n * Pauses the execution for the specified duration.\n *\n * @param {number} ms - The duration to sleep in milliseconds.\n * @return {Promise<void>} A Promise that resolves after the specified duration.\n */\n #sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Finds the path to a specific route within a nested structure of menu items.\n *\n * @param {StackMenuItem[]} items - The array of menu items to search through.\n * @param {string} route - The route to find within the menu items.\n * @param {StackMenuItem[]} path - The current path being constructed (default is an empty array).\n * @return {StackMenuItem[]} - An array representing the path to the specified route. If the route is not found, it returns an empty array.\n */\n #findPathToRoute(items: StackMenuItem[], route: string, path: StackMenuItem[] = []): StackMenuItem[] {\n for (const item of items) {\n const newPath = [...path, item];\n\n if (item.route === route) {\n return newPath;\n }\n\n if (item.children?.length) {\n const found = this.#findPathToRoute(item.children, route, newPath);\n if (found.length) return found;\n }\n }\n\n return [];\n }\n\n /**\n * Creates and returns a menu stack item object with specified properties.\n * Performance optimized with counter-based IDs instead of UUIDs.\n */\n #createMenuStackItem(\n items: StackMenuItem[],\n title?: string,\n badge?: string | number,\n badgeColor?: string,\n ): MenuStackItem {\n return {\n type: 'menu',\n items,\n title,\n badge,\n badgeColor,\n id: `menu-${ ++this.#stackItemCounter }`, // Much faster than crypto.randomUUID()\n timestamp: Date.now(),\n };\n }\n\n /**\n * Creates a new component stack item with the specified component and optional data.\n * Performance optimized with counter-based IDs.\n */\n #createComponentStackItem(component: Component<unknown>, data?: Record<string, unknown>): ComponentStackItem {\n return {\n type: 'component',\n component,\n componentData: data,\n id: `component-${ ++this.#stackItemCounter }`, // Much faster than crypto.randomUUID()\n timestamp: Date.now(),\n };\n }\n\n /**\n * Deserializes a SerializableStackItem object and converts it into a MenuStackItem.\n * Uses fallback ID generation for better performance.\n */\n #deserializeMenuItem(item: SerializableStackItem): MenuStackItem {\n return {\n type: 'menu',\n items: item.items,\n title: item.title,\n badge: item.badge,\n badgeColor: item.badgeColor,\n id: item.id || `menu-${ ++this.#stackItemCounter }`, // Use counter instead of crypto.randomUUID()\n timestamp: item.timestamp || Date.now(),\n };\n }\n\n /**\n * Persists the current stack of menu items into localStorage if the stack persistence is enabled.\n * Filters the stack to include only menu stack items, serializes the necessary properties, and stores the result.\n *\n * @return {void} This method does not return any value.\n */\n #saveStack(): void {\n if (!this.#shouldPersistStack) return;\n\n const serialized: SerializableStackItem[] = this.#stack()\n .filter(isMenuStackItem)\n .map(item => ({\n type: 'menu' as const,\n title: item.title,\n badge: item.badge,\n badgeColor: item.badgeColor,\n items: item.items,\n id: item.id,\n timestamp: item.timestamp,\n }));\n\n localStorage.setItem(STORAGE_KEY_STACK, JSON.stringify(serialized));\n }\n\n /**\n * A Map object that stores timeout identifiers returned by the `setTimeout` function.\n * The keys in the Map are string identifiers, representing unique names or categories for each timeout.\n * The values are the actual timeout identifiers, as returned by the `setTimeout` function.\n * This allows for efficient tracking and management of multiple timeouts,\n * such as clearing or updating them when necessary.\n */\n #timeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\n /**\n * Saves a key-value pair to localStorage with a debounced mechanism to prevent rapid consecutive writes.\n *\n * @param {string} key - The key under which the value will be stored in localStorage.\n * @param {unknown} value - The value to be stored, which will be converted to a string.\n * @return {void} This method does not return a value.\n */\n #debouncedSave(key: string, value: unknown): void {\n const existingTimeout = this.#timeouts.get(key);\n if (existingTimeout !== undefined) {\n clearTimeout(existingTimeout);\n }\n\n this.#timeouts.set(\n key,\n setTimeout(() => {\n const stringValue = typeof value === 'string' ? value : String(value);\n localStorage.setItem(key, stringValue);\n this.#timeouts.delete(key);\n }, this.#DEBOUNCE_DELAY),\n );\n }\n}","import { NgOptimizedImage } from '@angular/common';\nimport { Component, inject, input, ViewEncapsulation } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { RouterLink } from '@angular/router';\nimport { StackMenuItem } from '../../interfaces/stack-menu-item';\nimport { SidenavService } from '../../services/sidenav/sidenav.service';\nimport { SidenavStackItem } from '../../types/stack';\nimport { LinkItem } from '../link-item/link-item';\n\n@Component({\n selector: 'ngx-sidenav-menu',\n imports: [RouterLink, LinkItem, MatIconModule, NgOptimizedImage],\n templateUrl: './sidenav-menu.html',\n styleUrls: ['./sidenav-menu.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class SidenavMenu {\n // ! === Private Services ===\n private readonly _sidenav = inject(SidenavService);\n\n // ? === Public inputs signals ===\n items = input<StackMenuItem[]>([]);\n parentLabel = input<string | undefined>(undefined);\n parentBadge = input<string | number | undefined>(undefined);\n parentBadgeColor = input<string | undefined>(undefined);\n\n // * === Protected computed signals ===\n protected readonly canGoBack = this._sidenav.canGoBack;\n protected readonly currentMenu = this._sidenav.currentMenu;\n\n protected onBack(): void {\n this._sidenav.pop();\n }\n\n protected onMenuItemClick(item: StackMenuItem): void {\n if (item.children?.length) {\n\n const stackItem = {\n type: 'menu',\n items: item.children,\n title: item.label,\n badge: item.badge,\n badgeColor: item.badgeColor,\n } as SidenavStackItem;\n\n // this._sidenav.push(item.children, item.label, item.badge, item.badgeColor);\n this._sidenav.push(stackItem);\n }\n }\n}\n\n","@let goBack = canGoBack();\n@let menuItems = items().length ? items() : (currentMenu()?.items || []);\n\n<ul class=\"sidenav-menu\">\n @if (goBack) {\n <li>\n <ngx-sidenav-link-item (click)=\"onBack()\" [isParent]=\"true\">\n <div class=\"sidenav-menu-back-btn\">\n <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n arrow_back\n </mat-icon>\n <span class=\"sidenav-menu-label\">{{ parentLabel() }}</span>\n @if (parentBadge() && parentBadgeColor()) {\n <span [class]=\"`sidenav-menu-badge ${parentBadgeColor()}`\">{{ parentBadge() }}</span>\n }\n </div>\n </ngx-sidenav-link-item>\n </li>\n }\n\n @for (item of menuItems; track item) {\n <li>\n @if (item.route && !(item.children?.length) && (!item.isParent && !item.isTitle)) {\n <ngx-sidenav-link-item\n [routerLink]=\"item.route\"\n [routerLinkActiveOptions]=\"{ exact: true }\">\n <div class=\"sidenav-menu-label-container\">\n @if (item.icon) {\n @switch (item.iconType) {\n @case ('svg') {\n <img\n class=\"sidenav-menu-icon\"\n [ngSrc]=\"item.icon\"\n alt=\"{{ item.label }} Path\"\n width=\"24\"\n height=\"24\"\n priority>\n }\n @case ('material') {\n <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n {{ item.icon }}\n </mat-icon>\n }\n }\n }\n <span class=\"sidenav-menu-label\">{{ item.label }}</span>\n @if (item.badge) {\n <span [class]=\"`sidenav-menu-badge ${item.badgeColor}`\">{{ item.badge }}</span>\n }\n </div>\n </ngx-sidenav-link-item>\n } @else if (item.children?.length) {\n <ngx-sidenav-link-item (click)=\"onMenuItemClick(item)\">\n <div class=\"sidenav-menu-label-container\">\n @if (item.icon) {\n @switch (item.iconType) {\n @case ('svg') {\n <img\n class=\"sidenav-menu-icon\"\n [ngSrc]=\"item.icon\"\n alt=\"{{ item.label }} Path\"\n width=\"24\"\n height=\"24\"\n priority>\n }\n @case ('material') {\n <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n {{ item.icon }}\n </mat-icon>\n }\n }\n }\n <span class=\"sidenav-menu-label\">{{ item.label }}</span>\n <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n chevron_right\n </mat-icon>\n @if (item.badge) {\n <span [class]=\"`sidenav-menu-badge ${item.badgeColor}`\">{{ item.badge }}</span>\n }\n </div>\n </ngx-sidenav-link-item>\n } @else {\n <ngx-sidenav-link-item (click)=\"onBack()\" [isTitle]=\"true\">\n <div class=\"sidenav-menu-title-container\">\n @if (item.icon) {\n @switch (item.iconType) {\n @case ('svg') {\n <img\n class=\"sidenav-menu-icon\"\n [ngSrc]=\"item.icon\"\n alt=\"{{ item.label }} Path\"\n width=\"24\"\n height=\"24\"\n priority>\n }\n @case ('material') {\n <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n {{ item.icon }}\n </mat-icon>\n }\n }\n }\n <span class=\"sidenav-menu-title\">{{ item.label }}</span>\n </div>\n </ngx-sidenav-link-item>\n }\n </li>\n }\n</ul>\n","import { Component, HostBinding, HostListener, inject, input, OnInit, output, viewChild } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ContentAreaDirective } from '../../directives/content-area/content-area.directive';\nimport { SidenavService } from '../../services/sidenav/sidenav.service';\nimport { SidenavMenu } from '../sidenav-menu/sidenav-menu';\n\n@Component({\n selector: 'ngx-sidenav',\n imports: [ContentAreaDirective, SidenavMenu, MatIconModule, MatTooltipModule],\n templateUrl: './sidenav.html',\n styleUrl: './sidenav.scss',\n})\nexport class Sidenav implements OnInit {\n // ! === Private Services ===\n private readonly _sidenav = inject(SidenavService);\n\n // ? === Public inputs signals ===\n readonly collapseWidth = input<number>(this._sidenav.COLLAPSE_WIDTH); // Minimum width for collapse\n readonly minWidth = input<number>(this._sidenav.minWidth()); // Minimum width for sidenav\n readonly maxWidth = input<number>(this._sidenav.maxWidth()); // Maximum width for sidenav\n readonly initialWidth = input<number>(this._sidenav.INITIAL_WIDTH); // Initial width for sidenav\n readonly clearCacheOnReload = input<boolean>(false); // Clear cache on reload\n readonly position = input<'left' | 'right'>('left');\n readonly direction = input<'ltr' | 'rtl'>('ltr'); // RTL support\n readonly backdrop = input<boolean>(false); // Backdrop support\n readonly canCollapse = input<boolean>(true); // Allow collapsing\n readonly canResize = input<boolean>(true); // Allow resizing\n readonly menuIconCollapse = input<string>('menu_open'); // Icon for collapsed menu\n readonly menuIconExpand = input<string>('menu'); // Icon for expanded menu\n\n // ? === Public output signals ===\n readonly opened = output<void>();\n readonly closed = output<void>();\n readonly resized = output<number>();\n\n // ! === Private view children ===\n readonly sidenavContentArea = viewChild(ContentAreaDirective);\n\n // * === Protected computed signals ===\n protected readonly currentMenu = this._sidenav.currentMenu;\n protected resizingEvent = {\n isResizing: false,\n startingCursorX: 0,\n startingWidth: 0,\n };\n\n // ! === Private reactive signals ===\n readonly #expanded = this._sidenav.isExpanded;\n readonly #width = this._sidenav.sidenavWidth;\n\n ngOnInit() {\n const sidenavContentArea = this.sidenavContentArea();\n if (!sidenavContentArea) throw new Error('Sidenav content area is not defined');\n\n this._sidenav.setDynamicContentArea(sidenavContentArea);\n this._sidenav.setConfig({\n minWidth: this.minWidth(),\n maxWidth: this.maxWidth(),\n initialWidth: this.initialWidth(),\n });\n\n const rootItems = this.currentMenu()?.items ?? [];\n this._sidenav.restoreStackHybrid(rootItems); // 👈 key line\n\n this.#updateSidenavVariables(); // Set initial CSS variables for better reactivity\n\n this.#clearSidenavCache();\n }\n\n /**\n * Getter method to determine if resizing is in progress.\n *\n * @return {boolean} Returns true if a resizing event is currently active, false otherwise.\n */\n @HostBinding('class.resizing')\n get isResizing(): boolean {\n return this.resizingEvent.isResizing;\n }\n\n /**\n * Determines if the element is in an expanded state by invoking the `expanded` method.\n *\n * @return {boolean} Returns true if the element is expanded, otherwise false.\n */\n @HostBinding('class.is-expanded')\n get isExpanded(): boolean {\n return this.#expanded();\n }\n\n /**\n * Retrieves the dynamic width of the host element based on the sidenav service\n * and the component's expanded or collapsed state.\n *\n * @return {string} The calculated width of the host element as a string, e.g., \"250 px\" or a CSS variable value.\n */\n @HostBinding('style.width')\n get hostWidth(): string {\n // Always use the width from the service for reactivity\n const width = this.#width();\n return this.isExpanded\n ? `${ width }px`\n : 'var(--sidenav-collapsed-width, 56px)';\n }\n\n /**\n * Determines if the sidenav is positioned to the right.\n *\n * @return {boolean} Returns true if the sidenav's position is 'right', false otherwise.\n */\n @HostBinding('class.sidenav-right')\n get isRight(): boolean {\n return this.position() === 'right';\n }\n\n /**\n * Updates the width of the sidenav during a resize operation based on mouse movement.\n *\n * @param {MouseEvent} event The mouse event containing the current position of the cursor.\n * @return {void}\n */\n @HostListener('window:mousemove', ['$event'])\n updateSidenavWidth(event: MouseEvent): void {\n if (!this.resizingEvent.isResizing) return;\n const cursorDeltaX = event.clientX - this.resizingEvent.startingCursorX;\n const newWidth = this.resizingEvent.startingWidth + cursorDeltaX;\n this.#calculateSidenavWidth(newWidth);\n }\n\n /**\n * Stops the resizing action and resets the cursor style when the mouse button is released.\n *\n * @return {void} Does not return a value.\n */\n @HostListener('window:mouseup')\n stopResizing(): void {\n if (this.resizingEvent.isResizing) {\n this.resizingEvent.isResizing = false;\n document.body.style.cursor = '';\n }\n }\n\n /**\n * Handles the keydown events for specific elements and performs actions such as resizing a sidebar or toggling navigation.\n *\n * @param {KeyboardEvent} event The keyboard event triggered by the user.\n * @return {void} Does not return a value.\n */\n @HostListener('keydown', ['$event'])\n handleKeydown(event: KeyboardEvent): void {\n if (event.target && (event.target as HTMLElement).classList.contains('resize-handle')) {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n const delta = event.key === 'ArrowLeft' ? -10 : 10;\n const newWidth = this.#width() + delta;\n this.#calculateSidenavWidth(newWidth);\n event.preventDefault();\n }\n }\n if (event.key === 'Escape' && this.#expanded()) {\n this.toggleNav();\n event.preventDefault();\n }\n }\n\n /**\n * Checks the sliding orientation of the side navigation.\n *\n * @param {'left' | 'right'} sideNav - Specifies the side navigation position (left or right).\n * @return {boolean} Returns true if the sliding orientation matches the specified side navigation position, otherwise false.\n */\n protected checkSlideOrientation(sideNav: 'left' | 'right'): boolean {\n if (this.position() === 'right') {\n return sideNav === 'right' ? this._sidenav.isSlidingInFromRight : this._sidenav.isSlidingInFromLeft;\n }\n return sideNav === 'left' ? this._sidenav.isSlidingInFromLeft : this._sidenav.isSlidingInFromRight;\n }\n\n /**\n * Toggles the state of the navigation menu by opening it if it is closed or closing it if it is open.\n * Emits an event to indicate whether the navigation menu has been opened or closed.\n *\n * @return {void} This method does not return a value.\n */\n protected toggleNav(): void {\n this._sidenav.toggleSidenav();\n if (this.#expanded()) {\n this.closed.emit();\n } else {\n this.opened.emit();\n }\n }\n\n /**\n * Initializes the resizing process for the sidenav component when it is in an expanded state.\n *\n * @param {MouseEvent | TouchEvent} event - The event triggered to start resizing, can be a mouse or touch event.\n * @return {void} This method does not return a value.\n */\n protected startResizing(event: MouseEvent | TouchEvent): void {\n if (!this.isExpanded) return; // Only allow resizing when expanded\n\n event.preventDefault();\n event.stopPropagation();\n\n const clientX = this.#getClientX(event);\n\n this.resizingEvent = {\n isResizing: true,\n startingCursorX: clientX,\n startingWidth: this.#width(),\n };\n document.body.style.cursor = 'ew-resize';\n }\n\n /**\n * Updates the CSS variables related to the side navigation layout.\n * Sets the values for collapsed width, minimum width, and maximum width\n * dynamically using the corresponding methods for calculation.\n *\n * @return {void} Does not return a value.\n */\n #updateSidenavVariables(): void {\n document.documentElement.style.setProperty('--sidenav-collapsed-width', `${ this.collapseWidth() }px`);\n document.documentElement.style.setProperty('--sidenav-min-width', `${ this.minWidth() }px`);\n document.documentElement.style.setProperty('--sidenav-max-width', `${ this.maxWidth() }px`);\n }\n\n /**\n * Adjusts the sidenav width to the specified value while respecting the minimum and maximum width constraints.\n *\n * @param {number} newWidth The new desired width for the sidenav.\n * @return {void} This method does not return a value.\n */\n #calculateSidenavWidth(newWidth: number): void {\n const minWidth = this.minWidth() ?? parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sidenav-min-width'), 10);\n const maxWidth = this.maxWidth() ?? parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sidenav-max-width'), 10);\n\n if (minWidth) newWidth = Math.max(minWidth, newWidth);\n if (maxWidth) newWidth = Math.min(maxWidth, newWidth);\n\n this._sidenav.setSidenavWidth(newWidth);\n this.resized.emit(newWidth);\n }\n\n /**\n * Clears the sidenav cache if the conditions are met.\n * Specifically, it checks whether the cache should be cleared on reload\n * and triggers a clear operation for the sidenav on the next reload.\n *\n * @return {void} No return value.\n */\n #clearSidenavCache(): void {\n if (this.clearCacheOnReload()) this._sidenav.clearOnNextReload();\n }\n\n /**\n * Retrieves the clientX coordinate from a MouseEvent or the first touchpoint in a TouchEvent.\n *\n * @param {MouseEvent | TouchEvent} event - The input event from which the clientX coordinate is extracted. Can be a MouseEvent or a TouchEvent.\n * @return {number} The clientX coordinate of the event. If the event is a MouseEvent, returns its clientX value. If the event is a TouchEvent with at least one touchpoint, it returns the clientX value of the first touch. Returns 0 if no valid clientX value is found.\n */\n #getClientX(event: MouseEvent | TouchEvent): number {\n if (event instanceof MouseEvent) {\n return event.clientX;\n } else if (event instanceof TouchEvent && event.touches.length > 0) {\n return event.touches[0].clientX;\n }\n return 0;\n }\n}\n","@let menu = currentMenu();\n@let resizing = resizingEvent;\n\n<!-- Enhanced Toggle Button - moved outside container to always be visible -->\n@if (menu && canCollapse()) {\n <button\n class=\"sidenav-toggle-btn\"\n [class.expanded]=\"isExpanded\"\n [class.rotated]=\"position() === 'right'\"\n type=\"button\"\n (click)=\"toggleNav()\"\n [attr.aria-label]=\"'Menu Toggle Button'\"\n tabindex=\"0\">\n <mat-icon role=\"button\" class=\"material-symbols-outlined\">\n {{ isExpanded ? menuIconCollapse() : menuIconExpand() }}\n </mat-icon>\n </button>\n}\n\n<div class=\"sidenav-container\"\n [class.is-expanded]=\"isExpanded\"\n [class.slide-in-from-left]=\"checkSlideOrientation('left')\"\n [class.slide-in-from-right]=\"checkSlideOrientation('right')\"\n [attr.dir]=\"direction()\"\n role=\"navigation\"\n [attr.aria-label]=\"'Side navigation'\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-orientation]=\"position() === 'left' ? 'vertical' : 'horizontal'\"\n [attr.aria-modal]=\"backdrop() ? isExpanded : null\"\n [attr.tabindex]=\"isExpanded ? 0 : -1\">\n\n <div class=\"sidenav-content\">\n <!-- Section to load components menu -->\n <ng-template ngxSidenavContentArea></ng-template>\n\n <!-- Section to load items menu -->\n @if (menu) {\n <ngx-sidenav-menu\n [items]=\"menu.items\"\n [parentLabel]=\"menu.title\"\n [parentBadge]=\"menu.badge\"\n [parentBadgeColor]=\"menu.badgeColor\"/>\n }\n </div>\n</div>\n\n<!-- Optional Backdrop for modal mode -->\n@if (backdrop() && isExpanded) {\n <div class=\"sidenav-backdrop\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n (click)=\"toggleNav()\">\n </div>\n}\n\n<!-- Enhanced Resize Handle with better icon -->\n@if (canResize()) {\n <div class=\"resize-handle\"\n tabindex=\"0\"\n [class.resizing]=\"resizing.isResizing\"\n (mousedown)=\"startResizing($event)\"\n (touchstart)=\"startResizing($event)\"\n [attr.aria-label]=\"'Resize navigation panel'\"\n role=\"separator\">\n\n <!-- Always visible resize indicator -->\n <div class=\"resize-indicator\"></div>\n\n @if (isExpanded) {\n <!-- Enhanced resize icon with better styling -->\n <div class=\"resize-icon\" matTooltip=\"Resize navigation panel\" matTooltipPosition=\"above\"\n [matTooltipPosition]=\"position() === 'left' ? 'right' : 'left'\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <!-- Vertical grip dots pattern for better resize indication -->\n <circle cx=\"8\" cy=\"5\" r=\"1\"/>\n <circle cx=\"8\" cy=\"9\" r=\"1\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1\"/>\n <circle cx=\"8\" cy=\"17\" r=\"1\"/>\n <circle cx=\"8\" cy=\"21\" r=\"1\"/>\n\n <circle cx=\"12\" cy=\"3\" r=\"1\"/>\n <circle cx=\"12\" cy=\"7\" r=\"1\"/>\n <circle cx=\"12\" cy=\"11\" r=\"1\"/>\n <circle cx=\"12\" cy=\"15\" r=\"1\"/>\n <circle cx=\"12\" cy=\"19\" r=\"1\"/>\n <circle cx=\"12\" cy=\"23\" r=\"1\"/>\n\n <circle cx=\"16\" cy=\"5\" r=\"1\"/>\n <circle cx=\"16\" cy=\"9\" r=\"1\"/>\n <circle cx=\"16\" cy=\"13\" r=\"1\"/>\n <circle cx=\"16\" cy=\"17\" r=\"1\"/>\n <circle cx=\"16\" cy=\"21\" r=\"1\"/>\n </svg>\n </div>\n }\n </div>\n}\n","/*\n * Public API Surface of code-editor\n */\n\nexport * from './src/index';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;MAaa,QAAQ,CAAA;AAVrB,IAAA,WAAA,GAAA;;AAYE,QAAA,IAAA,CAAA,UAAU,GAA0C,KAAK,CAA2B,IAAI,sDAAC;QACzF,IAAA,CAAA,uBAAuB,GAAoC,KAAK,CAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,yBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACrG,QAAA,IAAA,CAAA,OAAO,GAAyB,KAAK,CAAU,KAAK,mDAAC;AACrD,QAAA,IAAA,CAAA,QAAQ,GAAyB,KAAK,CAAU,KAAK,oDAAC;AACtD,QAAA,IAAA,CAAA,UAAU,GAAyB,KAAK,CAAU,KAAK,sDAAC;AACzD;8GAPY,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAR,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbrB,4TAUI,EAAA,MAAA,EAAA,CAAA,4vDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJA,UAAU,oOACV,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAMP,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAVpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB;wBACP,UAAU;wBACV,gBAAgB;qBACjB,EAAA,aAAA,EAGc,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,4TAAA,EAAA,MAAA,EAAA,CAAA,4vDAAA,CAAA,EAAA;;;MEN1B,oBAAoB,CAAA;AAHjC,IAAA,WAAA,GAAA;AAIS,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACpD;8GAFY,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACpC,iBAAA;;;ACMD;;;;;AAKG;AACG,SAAU,eAAe,CAAC,IAAsB,EAAA;AACpD,IAAA,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM;AAC7B;AAEA;;;;;AAKG;AACG,SAAU,oBAAoB,CAAC,IAAsB,EAAA;AACzD,IAAA,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW;AAClC;;ACtBA;AACA,MAAM,iBAAiB,GAAG,mBAAmB;AAC7C,MAAM,oBAAoB,GAAG,sBAAsB;AACnD,MAAM,iBAAiB,GAAG,mBAAmB;AAC7C,MAAM,2BAA2B,GAAG,6BAA6B;MAKpD,cAAc,CAAA;;IAMhB,eAAe,CAAO;IACtB,oBAAoB,CAAO;;IAGpC,SAAS,CAAuC;IAChD,SAAS,CAAuC;AAChD,IAAA,WAAW;AACX,IAAA,aAAa;AACb,IAAA,MAAM;;AAmBN,IAAA,mBAAmB;AACnB,IAAA,iBAAiB;AACjB,IAAA,YAAY;AAEZ,IAAA,WAAA,GAAA;;AAnCS,QAAA,IAAA,CAAA,cAAc,GAAG,EAAE,CAAC;AACpB,QAAA,IAAA,CAAA,aAAa,GAAG,GAAG,CAAC;;AAGpB,QAAA,IAAA,CAAA,eAAe,GAAG,GAAG,CAAC;AACtB,QAAA,IAAA,CAAA,oBAAoB,GAAG,GAAG,CAAC;;AAGpC,QAAA,IAAA,CAAA,SAAS,GAA2B,MAAM,CAAC,GAAG,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,SAAS,GAA2B,MAAM,CAAC,GAAG,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,WAAW,GAA4B,MAAM,CAAC,IAAI,uDAAC;AACnD,QAAA,IAAA,CAAA,aAAa,GAA2B,MAAM,CAAC,IAAI,CAAC,aAAa,yDAAC;AAClE,QAAA,IAAA,CAAA,MAAM,GAAuC,MAAM,CAAC,EAAE,kDAAC;;AAGvD,QAAA,IAAA,CAAA,QAAQ,GAAmB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AACtD,QAAA,IAAA,CAAA,QAAQ,GAAmB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AACtD,QAAA,IAAA,CAAA,UAAU,GAAoB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAC3D,QAAA,IAAA,CAAA,YAAY,GAAmB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AACrD,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,YAAA,MAAM,OAAO,GAAiC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;AAEnE,YAAA,OAAO,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,SAAS;AAClE,SAAC,uDAAC;AACO,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,qDAAC;;QAG7D,IAAA,CAAA,oBAAoB,GAAG,KAAK;QAC5B,IAAA,CAAA,mBAAmB,GAAG,KAAK;;QAG3B,IAAA,CAAA,mBAAmB,GAAG,IAAI;QAC1B,IAAA,CAAA,iBAAiB,GAAG,CAAC;AA2ZrB;;;;;;AAMG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAyC;;QA7Z1D,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,2BAA2B,CAAC,KAAK,MAAM;QAChF,IAAI,WAAW,EAAE;AACf,YAAA,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC;AAC1C,YAAA,YAAY,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC;AACrD,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;;;QAInC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;AAC5D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,MAAM,CAAC;;AAG3E,QAAA,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAK;YAC3C,IAAI,IAAI,CAAC,mBAAmB;gBAAE,IAAI,CAAC,UAAU,EAAE;AACjD,SAAC,CAAC;;AAGJ;;;;;AAKG;IACH,iBAAiB,GAAA;AACf,QAAA,YAAY,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC;;AAG3D;;;;;;;;;;AAUG;AACH,IAAA,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAI3C,EAAA;AACC,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC1C,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1C,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;YACpC,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;;AACxD,aAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;YAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;AAC1C,YAAA,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;;;AAIzE;;;;;;AAMG;AACH,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAClF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;AACpC,QAAA,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,YAAY,CAAC;;AAGtD;;;;;AAKG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAG;YAC1B,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC;AACX,SAAC,CAAC;;AAGJ;;;;;AAKG;AACH,IAAA,qBAAqB,CAAC,IAA0B,EAAA;AAC9C,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;AAG1B;;;;;;;;;AASG;AACH,IAAA,IAAI,CAAC,IAAsB,EAAA;AACzB,QAAA,MAAM,SAAS,GAAqB,IAAI,CAAC,IAAI,KAAK;cAC9C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU;AAC/E,cAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;AAEtE,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC;AAElD,QAAA,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE;YAC9B,IAAI,CAAC,aAAa,EAAE;;aACf;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC;;QAGvC,IAAI,IAAI,CAAC,mBAAmB;YAAE,IAAI,CAAC,UAAU,EAAE;AAC/C,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE;;AAGtC;;;;;;;;AAQG;IACH,GAAG,GAAA;AACD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AAEvD,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE/C,QAAA,MAAM,QAAQ,GAAiC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AAEvC,QAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,EAAE;;AACf,aAAA,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;;QAGtC,IAAI,IAAI,CAAC,mBAAmB;YAAE,IAAI,CAAC,UAAU,EAAE;AAC/C,QAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE;;AAGrC;;;;;AAKG;AACH,IAAA,kBAAkB,CAAC,SAA0B,EAAA;QAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACnD,QAAA,IAAI,GAAG;YAAE,IAAI,CAAC,uBAAuB,EAAE;AAEvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC;;AAGrE;;;;;;AAMG;IACH,uBAAuB,GAAA;QACrB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACnD,QAAA,IAAI,CAAC,GAAG;YAAE;AAEV,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B;;YAEzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC1B,gBAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,MAAM,CAAC;gBAC9D;;YAGF,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;iBACb,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;AACnC,iBAAA,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAC9C;;QAED,OAAO,KAAc,EAAE;AACvB,YAAA,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe;AAC7E,YAAA,OAAO,CAAC,IAAI,CAAC,4CAA4C,EAAE,YAAY,CAAC;AACxE,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;;AAIvB;;;;;;AAMG;AACH,IAAA,wBAAwB,CAAC,SAA0B,EAAA;AACjD,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ;;QAGtC,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;QAGnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC;AAE3D,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,UAAU,EAAE;YACjB;;QAGF,IAAI,eAAe,GAAG,SAAS;AAE/B,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;YACvB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;AAEzF,YAAA,IAAI,CAAC,KAAK;gBAAE;AAEZ,YAAA,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE;gBAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI;AAC1B,oBAAA,GAAG,KAAK;AACR,oBAAA,IAAI,CAAC,oBAAoB,CACvB,KAAK,CAAC,QAAS,EACf,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,UAAU,CACjB;AACF,iBAAA,CAAC;AAEF,gBAAA,eAAe,GAAG,KAAK,CAAC,QAAQ;;;AAIpC,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC;;AAGpB;;;;;;;AAOG;AACH,IAAA,WAAW,CAAC,SAA6B,EAAA;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAExB,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,EAAE;;QAG3C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;AACjD,YAAA,OAAO,CAAC,IAAI,CAAC,uDAAuD,EAAE,SAAS,CAAC;YAChF;;QAGF,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC;;AAGhE;;;;AAIG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,KAAK,EAAE;;AAG9C;;;;;;AAMG;AACH,IAAA,MAAM,qBAAqB,GAAA;AACzB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;AAC5C,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;;AAGlC;;;;;;AAMG;AACH,IAAA,MAAM,sBAAsB,GAAA;AAC1B,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QAChC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;AAC5C,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;;AAGnC;;;;;AAKG;AACH,IAAA,MAAM,CAAC,EAAU,EAAA;AACf,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;;AAG1D;;;;;;;AAOG;AACH,IAAA,gBAAgB,CAAC,KAAsB,EAAE,KAAa,EAAE,OAAwB,EAAE,EAAA;AAChF,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC;AAE/B,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;AACxB,gBAAA,OAAO,OAAO;;AAGhB,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AACzB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;gBAClE,IAAI,KAAK,CAAC,MAAM;AAAE,oBAAA,OAAO,KAAK;;;AAIlC,QAAA,OAAO,EAAE;;AAGX;;;AAGG;AACH,IAAA,oBAAoB,CAClB,KAAsB,EACtB,KAAc,EACd,KAAuB,EACvB,UAAmB,EAAA;QAEnB,OAAO;AACL,YAAA,IAAI,EAAE,MAAM;YACZ,KAAK;YACL,KAAK;YACL,KAAK;YACL,UAAU;YACV,EAAE,EAAE,QAAS,EAAE,IAAI,CAAC,iBAAkB,CAAA,CAAE;AACxC,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;;AAGH;;;AAGG;IACH,yBAAyB,CAAC,SAA6B,EAAE,IAA8B,EAAA;QACrF,OAAO;AACL,YAAA,IAAI,EAAE,WAAW;YACjB,SAAS;AACT,YAAA,aAAa,EAAE,IAAI;YACnB,EAAE,EAAE,aAAc,EAAE,IAAI,CAAC,iBAAkB,CAAA,CAAE;AAC7C,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;;AAGH;;;AAGG;AACH,IAAA,oBAAoB,CAAC,IAA2B,EAAA;QAC9C,OAAO;AACL,YAAA,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,YAAA,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,CAAA,KAAA,EAAS,EAAE,IAAI,CAAC,iBAAkB,CAAA,CAAE;YACnD,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;SACxC;;AAGH;;;;;AAKG;IACH,UAAU,GAAA;QACR,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE;AAE/B,QAAA,MAAM,UAAU,GAA4B,IAAI,CAAC,MAAM;aACpD,MAAM,CAAC,eAAe;AACtB,aAAA,GAAG,CAAC,IAAI,KAAK;AACZ,YAAA,IAAI,EAAE,MAAe;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,SAAA,CAAC,CAAC;AAEL,QAAA,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;;AAGrE;;;;;;AAMG;AACH,IAAA,SAAS;AAET;;;;;;AAMG;IACH,cAAc,CAAC,GAAW,EAAE,KAAc,EAAA;QACxC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/C,QAAA,IAAI,eAAe,KAAK,SAAS,EAAE;YACjC,YAAY,CAAC,eAAe,CAAC;;QAG/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,GAAG,EACH,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrE,YAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC;AACtC,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;AAC5B,SAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CACzB;;8GA1dQ,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCEY,WAAW,CAAA;AAPxB,IAAA,WAAA,GAAA;;AASmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;;AAGlD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAkB,EAAE,iDAAC;AAClC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqB,SAAS,uDAAC;AAClD,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA8B,SAAS,uDAAC;AAC3D,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAqB,SAAS,4DAAC;;AAGpC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AAqB3D;IAnBW,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;;AAGX,IAAA,eAAe,CAAC,IAAmB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AAEzB,YAAA,MAAM,SAAS,GAAG;AAChB,gBAAA,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,IAAI,CAAC,QAAQ;gBACpB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;aACR;;AAGrB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;;;8GA9BtB,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBxB,0/HA6GA,EAAA,MAAA,EAAA,CAAA,m9IAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlGY,UAAU,oOAAE,QAAQ,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,yBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAKpD,WAAW,EAAA,UAAA,EAAA,CAAA;kBAPvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,OAAA,EACnB,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,aAAA,EAGjD,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,0/HAAA,EAAA,MAAA,EAAA,CAAA,m9IAAA,CAAA,EAAA;;;MED1B,OAAO,CAAA;AANpB,IAAA,WAAA,GAAA;;AAQmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;;QAGzC,IAAA,CAAA,aAAa,GAAG,KAAK,CAAS,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AAC5D,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AACnD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;QACnD,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AAC1D,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AAC3C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAmB,MAAM,oDAAC;AAC1C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAgB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AACjC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAU,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AACnC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAU,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AACjC,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAS,WAAW,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;AAC9C,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;;QAGvC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QACvB,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QACvB,IAAA,CAAA,OAAO,GAAG,MAAM,EAAU;;AAG1B,QAAA,IAAA,CAAA,kBAAkB,GAAG,SAAS,CAAC,oBAAoB,8DAAC;;AAG1C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AAChD,QAAA,IAAA,CAAA,aAAa,GAAG;AACxB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,eAAe,EAAE,CAAC;AAClB,YAAA,aAAa,EAAE,CAAC;SACjB;;AAGQ,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU;AACpC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY;AA4N7C;;AA7NU,IAAA,SAAS;AACT,IAAA,MAAM;IAEf,QAAQ,GAAA;AACN,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACpD,QAAA,IAAI,CAAC,kBAAkB;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;AAE/E,QAAA,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,kBAAkB,CAAC;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;AACtB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;AAClC,SAAA,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,IAAI,EAAE;QACjD,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAE5C,QAAA,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,IAAI,CAAC,kBAAkB,EAAE;;AAG3B;;;;AAIG;AACH,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU;;AAGtC;;;;AAIG;AACH,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;;AAGzB;;;;;AAKG;AACH,IAAA,IACI,SAAS,GAAA;;AAEX,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,OAAO,IAAI,CAAC;cACR,CAAA,EAAI,KAAM,CAAA,EAAA;cACV,sCAAsC;;AAG5C;;;;AAIG;AACH,IAAA,IACI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,OAAO;;AAGpC;;;;;AAKG;AAEH,IAAA,kBAAkB,CAAC,KAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU;YAAE;QACpC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,GAAG,YAAY;AAChE,QAAA,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;;AAGvC;;;;AAIG;IAEH,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AACjC,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,KAAK;YACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;;;AAInC;;;;;AAKG;AAEH,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,KAAK,CAAC,MAAM,IAAK,KAAK,CAAC,MAAsB,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;AACrF,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE;AAC3D,gBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,CAAC,EAAE,GAAG,EAAE;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK;AACtC,gBAAA,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;gBACrC,KAAK,CAAC,cAAc,EAAE;;;QAG1B,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9C,IAAI,CAAC,SAAS,EAAE;YAChB,KAAK,CAAC,cAAc,EAAE;;;AAI1B;;;;;AAKG;AACO,IAAA,qBAAqB,CAAC,OAAyB,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE;AAC/B,YAAA,OAAO,OAAO,KAAK,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB;;AAErG,QAAA,OAAO,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB;;AAGpG;;;;;AAKG;IACO,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AAC7B,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;aACb;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;;AAItB;;;;;AAKG;AACO,IAAA,aAAa,CAAC,KAA8B,EAAA;QACpD,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO;QAE7B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAEvC,IAAI,CAAC,aAAa,GAAG;AACnB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,eAAe,EAAE,OAAO;AACxB,YAAA,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE;SAC7B;QACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW;;AAG1C;;;;;;AAMG;IACH,uBAAuB,GAAA;AACrB,QAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,2BAA2B,EAAE,CAAA,EAAI,IAAI,CAAC,aAAa,EAAG,CAAA,EAAA,CAAI,CAAC;AACtG,QAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAA,EAAI,IAAI,CAAC,QAAQ,EAAG,CAAA,EAAA,CAAI,CAAC;AAC3F,QAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAA,EAAI,IAAI,CAAC,QAAQ,EAAG,CAAA,EAAA,CAAI,CAAC;;AAG7F;;;;;AAKG;AACH,IAAA,sBAAsB,CAAC,QAAgB,EAAA;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,EAAE,EAAE,CAAC;QACpI,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,EAAE,EAAE,CAAC;AAEpI,QAAA,IAAI,QAAQ;YAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACrD,QAAA,IAAI,QAAQ;YAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAErD,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAG7B;;;;;;AAMG;IACH,kBAAkB,GAAA;QAChB,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;;AAGlE;;;;;AAKG;AACH,IAAA,WAAW,CAAC,KAA8B,EAAA;AACxC,QAAA,IAAI,KAAK,YAAY,UAAU,EAAE;YAC/B,OAAO,KAAK,CAAC,OAAO;;AACf,aAAA,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAClE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;;AAEjC,QAAA,OAAO,CAAC;;8GA9PC,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,kBAAA,EAAA,4BAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAwBsB,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrC9D,63GAiGA,EAAA,MAAA,EAAA,CAAA,gzLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxFY,oBAAoB,EAAA,QAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAIjE,OAAO,EAAA,UAAA,EAAA,CAAA;kBANnB,SAAS;+BACE,aAAa,EAAA,OAAA,EACd,CAAC,oBAAoB,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,63GAAA,EAAA,MAAA,EAAA,CAAA,gzLAAA,CAAA,EAAA;8BAmEzE,UAAU,EAAA,CAAA;sBADb,WAAW;uBAAC,gBAAgB;gBAWzB,UAAU,EAAA,CAAA;sBADb,WAAW;uBAAC,mBAAmB;gBAY5B,SAAS,EAAA,CAAA;sBADZ,WAAW;uBAAC,aAAa;gBAetB,OAAO,EAAA,CAAA;sBADV,WAAW;uBAAC,qBAAqB;gBAYlC,kBAAkB,EAAA,CAAA;sBADjB,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;gBAc5C,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,gBAAgB;gBAe9B,aAAa,EAAA,CAAA;sBADZ,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;AEpJrC;;AAEG;;ACFH;;AAEG;;;;"}