@expressivecss/expressive 0.2.0 → 0.3.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.
Files changed (37) hide show
  1. package/README.md +8 -8
  2. package/dist/css/expressive.css +1038 -361
  3. package/dist/css/expressive.css.map +1 -1
  4. package/dist/css/expressive.min.css +1 -1
  5. package/dist/css/expressive.min.css.map +1 -1
  6. package/dist/js/expressive.cjs +708 -746
  7. package/dist/js/expressive.cjs.map +3 -3
  8. package/dist/js/expressive.js +708 -746
  9. package/dist/js/expressive.js.map +3 -3
  10. package/dist/js/expressive.min.js +10 -10
  11. package/dist/js/expressive.min.js.map +3 -3
  12. package/dist/js/expressive.mjs +708 -746
  13. package/dist/js/expressive.mjs.map +3 -3
  14. package/dist/types/components/buttons.d.ts +17 -41
  15. package/dist/types/components/carousel.d.ts +40 -46
  16. package/dist/types/components/chips.d.ts +2 -2
  17. package/dist/types/components/collapsible.d.ts +35 -13
  18. package/dist/types/components/parallax.d.ts +7 -31
  19. package/dist/types/components/tapTarget.d.ts +23 -24
  20. package/dist/types/index.d.ts +1 -1
  21. package/package.json +1 -1
  22. package/src/sass/README.md +4 -3
  23. package/src/sass/components/_badges.scss +5 -4
  24. package/src/sass/components/_breadcrumb.scss +93 -16
  25. package/src/sass/components/_buttons.scss +195 -96
  26. package/src/sass/components/_carousel.scss +130 -63
  27. package/src/sass/components/_chips.scss +1 -1
  28. package/src/sass/components/_collapsible.scss +160 -60
  29. package/src/sass/components/_collection.scss +161 -77
  30. package/src/sass/components/_icons-material-design.scss +77 -4
  31. package/src/sass/components/_lightbox.scss +4 -0
  32. package/src/sass/components/_navbar.scss +15 -0
  33. package/src/sass/components/_pagination.scss +131 -25
  34. package/src/sass/components/_parallax.scss +116 -20
  35. package/src/sass/components/_sidenav.scss +10 -5
  36. package/src/sass/components/_slider.scss +8 -0
  37. package/src/sass/components/_tapTarget.scss +134 -47
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/ts/core/utils.ts", "../../src/ts/core/component.ts", "../../src/ts/components/cards.ts", "../../src/ts/components/dropdown.ts", "../../src/ts/components/autocomplete.ts", "../../src/ts/components/chips.ts", "../../src/ts/components/range.ts", "../../src/ts/behaviors/dialogs.ts", "../../src/ts/behaviors/forms.ts", "../../src/ts/behaviors/waves.ts", "../../src/ts/components/buttons.ts", "../../src/ts/components/carousel.ts", "../../src/ts/components/characterCounter.ts", "../../src/ts/components/collapsible.ts", "../../src/ts/components/select.ts", "../../src/ts/plugins/dockedDisplayPlugin.ts", "../../src/ts/components/datepicker.ts", "../../src/ts/components/lightbox.ts", "../../src/ts/components/modal.ts", "../../src/ts/components/parallax.ts", "../../src/ts/components/pushpin.ts", "../../src/ts/components/scrollspy.ts", "../../src/ts/components/sidenav.ts", "../../src/ts/components/slider.ts", "../../src/ts/components/tabs.ts", "../../src/ts/components/tapTarget.ts", "../../src/ts/components/timepicker.ts", "../../src/ts/components/toasts.ts", "../../src/ts/components/tooltip.ts", "../../src/ts/components/registry.ts", "../../src/ts/index.ts"],
4
- "sourcesContent": ["import { Edges } from './edges';\nimport { Bounding } from './bounding';\n\n/**\n * Class with utilitary functions for global usage.\n */\nexport class Utils {\n /** Specifies wether tab is pressed or not. */\n static tabPressed: boolean = false;\n /** Specifies wether there is a key pressed. */\n static keyDown: boolean = false;\n\n /**\n * Key maps.\n */\n static keys = {\n TAB: ['Tab'],\n ENTER: ['Enter'],\n ESC: ['Escape', 'Esc'],\n BACKSPACE: ['Backspace'],\n ARROW_UP: ['ArrowUp', 'Up'],\n ARROW_DOWN: ['ArrowDown', 'Down'],\n ARROW_LEFT: ['ArrowLeft', 'Left'],\n ARROW_RIGHT: ['ArrowRight', 'Right'],\n DELETE: ['Delete', 'Del']\n };\n\n /**\n * Keys that count as keyboard navigation, precomputed.\n *\n * These handlers run at capture phase on the document for every keystroke on\n * the page, and used to rebuild three arrays and spread them into a fourth\n * on each one.\n */\n private static _navigationKeys = new Set([\n ...Utils.keys.TAB,\n ...Utils.keys.ARROW_DOWN,\n ...Utils.keys.ARROW_UP\n ]);\n\n /**\n * Detects when a key is pressed.\n * @param e Event instance.\n */\n static docHandleKeydown(e: KeyboardEvent) {\n Utils.keyDown = true;\n if (Utils._navigationKeys.has(e.key)) {\n Utils.tabPressed = true;\n }\n }\n\n /**\n * Detects when a key is released.\n * @param e Event instance.\n */\n static docHandleKeyup(e: KeyboardEvent) {\n Utils.keyDown = false;\n if (Utils._navigationKeys.has(e.key)) {\n Utils.tabPressed = false;\n }\n }\n\n /**\n * Detects when document is focused.\n * @param e Event instance.\n */\n /* eslint-disabled as of required event type condition check */\n /* eslint-disable-next-line */\n static docHandleFocus(e: FocusEvent) {\n if (Utils.keyDown) {\n document.body.classList.add('keyboard-focused');\n }\n }\n\n /**\n * Detects when document is not focused.\n * @param e Event instance.\n */\n /* eslint-disabled as of required event type condition check */\n /* eslint-disable-next-line */\n static docHandleBlur(e: FocusEvent) {\n document.body.classList.remove('keyboard-focused');\n }\n\n /**\n * Run `callback` once the document is parsed.\n *\n * The document-level behaviors all used a bare DOMContentLoaded listener,\n * which never fires if the bundle is loaded after that event - an async or\n * deferred script tag, or a dynamic import. Checking readyState first covers\n * both orders.\n */\n static onDocumentReady(callback: () => void): void {\n if (typeof document === 'undefined') return;\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', callback, { once: true });\n } else {\n callback();\n }\n }\n\n /**\n * Generates a unique string identifier.\n */\n static guid(): string {\n const s4 = (): string => {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n };\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n }\n\n /**\n * Checks for exceeded edges\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkWithinContainer(container: HTMLElement, bounding: Bounding, offset: number): Edges {\n const edges = {\n top: false,\n right: false,\n bottom: false,\n left: false\n };\n\n const containerRect = container.getBoundingClientRect();\n // If body element is smaller than viewport, use viewport height instead.\n const containerBottom =\n container === document.body\n ? Math.max(containerRect.bottom, window.innerHeight)\n : containerRect.bottom;\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledY = bounding.top - scrollTop;\n\n // Check for container and viewport for each edge\n if (scrolledX < containerRect.left + offset || scrolledX < offset) {\n edges.left = true;\n }\n\n if (\n scrolledX + bounding.width > containerRect.right - offset ||\n scrolledX + bounding.width > window.innerWidth - offset\n ) {\n edges.right = true;\n }\n\n if (scrolledY < containerRect.top + offset || scrolledY < offset) {\n edges.top = true;\n }\n\n if (\n scrolledY + bounding.height > containerBottom - offset ||\n scrolledY + bounding.height > window.innerHeight - offset\n ) {\n edges.bottom = true;\n }\n\n return edges;\n }\n\n /**\n * Checks if element can be aligned in multiple directions.\n * @param el Element to be inspected.\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkPossibleAlignments(\n el: HTMLElement,\n container: HTMLElement,\n bounding: Bounding,\n offset: number\n ) {\n const canAlign: {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n spaceOnTop: number;\n spaceOnRight: number;\n spaceOnBottom: number;\n spaceOnLeft: number;\n } = {\n top: true,\n right: true,\n bottom: true,\n left: true,\n spaceOnTop: null,\n spaceOnRight: null,\n spaceOnBottom: null,\n spaceOnLeft: null\n };\n\n const containerAllowsOverflow = getComputedStyle(container).overflow === 'visible';\n const containerRect = container.getBoundingClientRect();\n const containerHeight = Math.min(containerRect.height, window.innerHeight);\n const containerWidth = Math.min(containerRect.width, window.innerWidth);\n const elOffsetRect = el.getBoundingClientRect();\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledYTopEdge = bounding.top - scrollTop;\n const scrolledYBottomEdge = bounding.top + elOffsetRect.height - scrollTop;\n\n // Check for container and viewport for left\n canAlign.spaceOnRight = !containerAllowsOverflow\n ? containerWidth - (scrolledX + bounding.width)\n : window.innerWidth - (elOffsetRect.left + bounding.width);\n if (canAlign.spaceOnRight < 0) {\n canAlign.left = false;\n }\n\n // Check for container and viewport for Right\n canAlign.spaceOnLeft = !containerAllowsOverflow\n ? scrolledX - bounding.width + elOffsetRect.width\n : elOffsetRect.right - bounding.width;\n if (canAlign.spaceOnLeft < 0) {\n canAlign.right = false;\n }\n\n // Check for container and viewport for Top\n canAlign.spaceOnBottom = !containerAllowsOverflow\n ? containerHeight - (scrolledYTopEdge + bounding.height + offset)\n : window.innerHeight - (elOffsetRect.top + bounding.height + offset);\n if (canAlign.spaceOnBottom < 0) {\n canAlign.top = false;\n }\n\n // Check for container and viewport for Bottom\n canAlign.spaceOnTop = !containerAllowsOverflow\n ? scrolledYBottomEdge - (bounding.height - offset)\n : elOffsetRect.bottom - (bounding.height + offset);\n if (canAlign.spaceOnTop < 0) {\n canAlign.bottom = false;\n }\n\n return canAlign;\n }\n\n /**\n * Retrieves target element id from trigger.\n * @param trigger Trigger element.\n */\n static getIdFromTrigger(trigger: HTMLElement): string {\n let id = trigger.dataset.target;\n if (!id) {\n id = trigger.getAttribute('href');\n return id ? id.slice(1) : '';\n }\n return id;\n }\n\n /**\n * Retrieves document scroll postion from top.\n */\n static getDocumentScrollTop(): number {\n return window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0;\n }\n\n /**\n * Retrieves document scroll postion from left.\n */\n static getDocumentScrollLeft(): number {\n return window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft || 0;\n }\n\n /**\n * Fires the given function after a certain ammount of time.\n * @param func Function to be fired.\n * @param wait Wait time.\n * @param options Additional options.\n */\n static throttle(\n func: (...args: unknown[]) => void,\n wait: number,\n options: Partial<{ leading: boolean; trailing: boolean }> = {}\n ) {\n // `options` is nullable because callers pass an explicit null.\n let lastArgs: unknown[] = null,\n result,\n timeout = null,\n previous = 0;\n\n const later = () => {\n previous = options?.leading === false ? 0 : Date.now();\n timeout = null;\n // The trailing call replays the most recent arguments; without this it\n // used to fire with none at all.\n result = func(...(lastArgs ?? []));\n lastArgs = null;\n };\n\n return (...args: unknown[]) => {\n const now = Date.now();\n if (!previous && options?.leading === false) previous = now;\n const remaining = wait - (now - previous);\n lastArgs = args;\n if (remaining <= 0) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n lastArgs = null;\n result = func(...args);\n } else if (!timeout && options?.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n }\n\n /**\n * Renders confirm/close buttons with callback function\n */\n static createConfirmationContainer(\n container: HTMLElement,\n confirmText: string,\n cancelText: string,\n onConfirm: (Function: object) => void,\n onCancel: (Function: object) => void\n ): void {\n const confirmationButtonsContainer = document.createElement('div');\n confirmationButtonsContainer.classList.add('confirmation-btns');\n container.append(confirmationButtonsContainer);\n\n this.createButton(confirmationButtonsContainer, cancelText, ['btn-cancel'], true, onCancel);\n this.createButton(confirmationButtonsContainer, confirmText, ['btn-confirm'], true, onConfirm);\n }\n\n /**\n * Renders a button with optional callback function\n */\n static createButton(\n container: HTMLElement,\n text: string,\n className: string[] = [],\n visibility: boolean = true,\n callback: (Function: object) => void = null\n ): void {\n className = className.concat(['btn', 'waves-effect', 'text']);\n const button = document.createElement('button');\n button.className = className.join(' ');\n button.style.visibility = visibility ? 'visible' : 'hidden';\n button.type = 'button';\n button.tabIndex = !!visibility ? 0 : -1;\n button.innerText = text;\n // The keypress handler used to call `callback` unconditionally, so a\n // button created without one threw on Enter.\n if (typeof callback === 'function') {\n button.addEventListener('click', callback);\n button.addEventListener('keypress', (e) => {\n if (Utils.keys.ENTER.includes(e.key)) callback(e);\n });\n }\n container.append(button);\n }\n\n static _setAbsolutePosition(\n origin: HTMLElement,\n container: HTMLElement,\n position: string,\n margin: number,\n transitionMovement: number,\n align: string = 'center'\n ) {\n const originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n containerHeight = container.offsetHeight,\n containerWidth = container.offsetWidth,\n originRect = origin.getBoundingClientRect(); // one rect, read twice below\n let xMovement = 0,\n yMovement = 0,\n targetTop = originRect.top + Utils.getDocumentScrollTop(),\n targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n\n if (position === 'top') {\n targetTop += -containerHeight - margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = -transitionMovement;\n } else if (position === 'right') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = originWidth + margin;\n xMovement = transitionMovement;\n } else if (position === 'left') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = -containerWidth - margin;\n xMovement = -transitionMovement;\n } else {\n targetTop += originHeight + margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = transitionMovement;\n }\n if (align === 'right') {\n targetLeft += originWidth - containerWidth - margin;\n }\n\n const newCoordinates = Utils._repositionWithinScreen(\n targetLeft,\n targetTop,\n containerWidth,\n containerHeight,\n margin,\n transitionMovement,\n align\n );\n\n container.style.top = newCoordinates.y + 'px';\n container.style.left = newCoordinates.x + 'px';\n\n return {x: xMovement, y: yMovement};\n }\n\n static _repositionWithinScreen(\n x: number,\n y: number,\n width: number,\n height: number,\n margin: number,\n transitionMovement: number,\n align: string\n ) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding: Bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n let offset: number;\n if (align === 'left' || align == 'center') {\n offset = margin + transitionMovement;\n } else if (align === 'right') {\n offset = margin - transitionMovement;\n }\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n}\n", "/**\n * Base options for component initialization.\n */\nexport interface BaseOptions {}\n\nexport type MElement = HTMLElement | Element;\nexport type InitElements<T extends MElement> = NodeListOf<T> | HTMLCollectionOf<T>;\ntype ComponentConstructor<T extends Component<O>, O extends BaseOptions> = {\n new (el: HTMLElement, options: Partial<O>): T;\n};\ntype ComponentType<C extends Component<O>, O extends BaseOptions> = ComponentConstructor<C, O> &\n typeof Component<O>;\n\nexport interface I18nOptions {\n cancel: string;\n clear: string;\n done: string;\n}\n\nexport interface Openable {\n isOpen: boolean;\n open(): void;\n close(): void;\n}\n\n/**\n * Base class implementation for Expressive components.\n */\nexport class Component<O extends BaseOptions> {\n /**\n * The DOM element the plugin was initialized with.\n */\n el: HTMLElement;\n /**\n * The options the instance was initialized with.\n */\n options: O;\n\n /**\n * Constructs component instance and set everything up.\n */\n constructor(el: HTMLElement, options: Partial<O>, classDef: ComponentType<Component<O>, O>) {\n // Display error if el is not a valid HTML Element\n if (!(el instanceof HTMLElement)) {\n console.error(Error(el + ' is not an HTML Element'));\n }\n // If exists, destroy and reinitialize in child\n const ins = classDef.getInstance(el);\n if (!!ins) {\n ins.destroy();\n }\n this.el = el;\n }\n\n /**\n * Initializes component instance.\n * @param el HTML element.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends HTMLElement, O extends BaseOptions, C extends Component<O>>(\n el: I,\n options: O,\n classDef: ComponentType<C, O>\n ): C;\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends MElement, O extends BaseOptions, C extends Component<O>>(\n els: InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends MElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends MElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[] {\n let instances = null;\n if (els instanceof Element) {\n instances = new classDef(<HTMLElement>els, options);\n } else if (!!els && els.length) {\n instances = [];\n for (let i = 0; i < els.length; i++) {\n instances.push(new classDef(<HTMLElement>els[i], options));\n }\n }\n return instances;\n }\n\n /**\n * @returns default options for component instance.\n */\n static get defaults(): BaseOptions {\n return {};\n }\n\n /**\n * Retrieves component instance for the given element.\n * @param el Associated HTML Element.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static getInstance(el: HTMLElement): Component<BaseOptions> {\n throw new Error('This method must be implemented.');\n }\n\n /**\n * Destroy plugin instance and teardown.\n */\n destroy(): void {\n throw new Error('This method must be implemented.');\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface CardsOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n inDuration: number;\n outDuration: number;\n}\n\nconst _defaults: CardsOptions = {\n onOpen: null,\n onClose: null,\n inDuration: 225,\n outDuration: 300\n};\n\n/**\n * What counts as a card.\n *\n * Shared with `components/registry.ts` rather than written out twice: the\n * registry used to claim `.cards`, which matches nothing this component\n * actually initializes, so the AutoInit entry was dead while `Cards.Init()`\n * quietly did the work through the selector below.\n */\nexport const CARDS_SELECTOR = '.card, article:has(> aside), article:has(.card-reveal)';\n\nexport class Cards extends Component<CardsOptions> implements Openable {\n isOpen: boolean = false;\n private readonly cardReveal: HTMLElement | null;\n private readonly initialOverflow: string;\n private _activators: HTMLElement[] | null;\n private cardRevealClose: HTMLElement | null;\n\n constructor(el: HTMLElement, options: Partial<CardsOptions>) {\n super(el, options, Cards);\n this.el['Expressive_Cards'] = this;\n\n this.options = {\n ...Cards.defaults,\n ...options\n };\n\n this._activators = [];\n\n this.cardReveal = this.el.querySelector(':scope > aside, .card-reveal');\n if (this.cardReveal) {\n this.initialOverflow = getComputedStyle(this.el).overflow;\n this._activators = Array.from(this.el.querySelectorAll('.activator'));\n this._activators.forEach((el: HTMLElement) => {\n if (el) el.tabIndex = 0;\n });\n\n this.cardRevealClose = this.cardReveal.querySelector(\n '.card-title, :scope > :is(h1, h2, h3, h4, h5, h6)'\n );\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n\n this.cardReveal.ariaExpanded = 'false';\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): CardsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Cards.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CardsOptions>): Cards;\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<CardsOptions>): Cards[];\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options?: Partial<CardsOptions>\n ): Cards | Cards[] {\n return super.init(els, options, Cards);\n }\n\n static getInstance(el: HTMLElement): Cards {\n return el['Expressive_Cards'];\n }\n\n /**\n * {@inheritDoc}\n */\n destroy() {\n this._removeEventHandlers();\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n this._activators = [];\n this.el['Expressive_Cards'] = undefined;\n }\n\n _setupEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.addEventListener('click', this._handleClickInteraction);\n el.addEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _removeEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.removeEventListener('click', this._handleClickInteraction);\n el.removeEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _handleClickInteraction = () => {\n this._handleRevealEvent();\n };\n\n _handleKeypressEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleRevealEvent();\n }\n };\n\n _handleRevealEvent = () => {\n // Reveal Card\n this._activators.forEach((el: HTMLElement) => (el.tabIndex = -1));\n this.open();\n };\n\n _setupRevealCloseEventHandlers = () => {\n this.cardRevealClose.addEventListener('click', this.close);\n this.cardRevealClose.addEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _removeRevealCloseEventHandlers = () => {\n this.cardRevealClose.removeEventListener('click', this.close);\n this.cardRevealClose.removeEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _handleKeypressCloseEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this.close();\n }\n };\n\n /**\n * Show card reveal.\n */\n open: () => void = () => {\n if (this.isOpen) return;\n this.isOpen = true;\n this.el.style.overflow = 'hidden';\n this.cardReveal.style.display = 'block';\n this.cardReveal.ariaExpanded = 'true';\n // A reveal without a title has no close affordance; that is allowed.\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = 0;\n setTimeout(() => {\n this.cardReveal.style.transition = `transform ${this.options.outDuration}ms ease`; //easeInOutQuad\n this.cardReveal.style.transform = 'translateY(-100%)';\n }, 1);\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen.call(this);\n }\n if (this.cardRevealClose) this._setupRevealCloseEventHandlers();\n };\n\n /**\n * Hide card reveal.\n */\n close: () => void = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.cardReveal.style.transition = `transform ${this.options.inDuration}ms ease`; //easeInOutQuad\n this.cardReveal.style.transform = 'translateY(0)';\n setTimeout(() => {\n this.cardReveal.style.display = 'none';\n this.cardReveal.ariaExpanded = 'false';\n this._activators.forEach((el: HTMLElement) => (el.tabIndex = 0));\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n this.el.style.overflow = this.initialOverflow;\n }, this.options.inDuration);\n if (typeof this.options.onClose === 'function') {\n this.options.onClose.call(this);\n }\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n };\n\n static Init() {\n // Handle initialization of static cards.\n Utils.onDocumentReady(() => {\n const cards = document.querySelectorAll(CARDS_SELECTOR);\n cards.forEach((el) => {\n if (el && el['Expressive_Cards'] == undefined) this.init(el as HTMLElement);\n });\n });\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface DropdownOptions extends BaseOptions {\n /**\n * Defines the edge the menu is aligned to.\n * @default 'left'\n */\n alignment: 'left' | 'right';\n /**\n * If true, automatically focus dropdown el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the dropdown activator.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the dropdown.\n * @default null\n */\n container: Element;\n /**\n * If false, the dropdown will show below the trigger.\n * @default true\n */\n coverTrigger: boolean;\n /**\n * If true, close dropdown on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the dropdown will open on hover.\n * @default false\n */\n hover: boolean;\n /**\n * The duration of the transition enter in milliseconds.\n * @default 150\n */\n inDuration: number;\n /**\n * The duration of the transition out in milliseconds.\n * @default 250\n */\n outDuration: number;\n /**\n * Function called when dropdown starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when dropdown finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when dropdown starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when dropdown finishes exiting.\n * @default null\n */\n onCloseEnd: (el: HTMLElement) => void;\n /**\n * Function called when item is clicked.\n * @default null\n */\n onItemClick: (el: HTMLLIElement) => void;\n}\n\nconst _defaults: DropdownOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: true,\n closeOnClick: true,\n hover: false,\n inDuration: 150,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n onItemClick: null\n};\n\nexport class Dropdown extends Component<DropdownOptions> implements Openable {\n static _dropdowns: Dropdown[] = [];\n /** ID of the dropdown element. */\n id: string;\n /** The DOM element of the dropdown. */\n dropdownEl: HTMLElement;\n /** If the dropdown is open. */\n isOpen: boolean;\n /** If the dropdown content is scrollable. */\n isScrollable: boolean;\n isTouchMoving: boolean;\n /** The index of the item focused. */\n focusedIndex: number;\n filterQuery: string[];\n filterTimeout: ReturnType<typeof setTimeout>;\n\n constructor(el: HTMLElement, options: Partial<DropdownOptions>) {\n super(el, options, Dropdown);\n this.el['Expressive_Dropdown'] = this;\n\n Dropdown._dropdowns.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.dropdownEl = document.getElementById(this.id);\n this.dropdownEl?.classList.add('dropdown-content');\n\n this.options = {\n ...Dropdown.defaults,\n ...options\n };\n\n this.isOpen = false;\n this.isScrollable = false;\n this.isTouchMoving = false;\n this.focusedIndex = -1;\n this.filterQuery = [];\n this.el.ariaExpanded = 'false';\n\n // Move dropdown-content after dropdown-trigger\n this._moveDropdownToElement();\n this._makeDropdownFocusable();\n this._setupEventHandlers();\n }\n\n static get defaults(): DropdownOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Dropdown.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<DropdownOptions>): Dropdown;\n /**\n * Initializes instances of Dropdown.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<DropdownOptions>): Dropdown[];\n /**\n * Initializes instances of Dropdown.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<DropdownOptions> = {}\n ): Dropdown | Dropdown[] {\n return super.init(els, options, Dropdown);\n }\n\n static getInstance(el: HTMLElement): Dropdown {\n return el['Expressive_Dropdown'];\n }\n\n destroy() {\n clearTimeout(this.filterTimeout);\n this._resetDropdownStyles();\n this._removeEventHandlers();\n // Temporary handlers only exist while open, but removing them is a no-op\n // otherwise and leaving them attached leaks the instance.\n this._removeTemporaryEventHandlers();\n const index = Dropdown._dropdowns.indexOf(this);\n if (index >= 0) Dropdown._dropdowns.splice(index, 1);\n this.el['Expressive_Dropdown'] = undefined;\n }\n\n _setupEventHandlers() {\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown);\n // Item click handler\n this.dropdownEl?.addEventListener('click', this._handleDropdownClick);\n // Hover event handlers\n if (this.options.hover) {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.dropdownEl.addEventListener('mouseleave', this._handleMouseLeave);\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick);\n }\n }\n\n _removeEventHandlers() {\n // `dropdownEl` is optional-chained on the way in (the trigger may point at\n // an id that does not resolve); it has to be here too, or destroy() throws\n // before it can detach anything else.\n this.el.removeEventListener('keydown', this._handleTriggerKeydown);\n this.dropdownEl?.removeEventListener('click', this._handleDropdownClick);\n if (this.options.hover) {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.dropdownEl?.removeEventListener('mouseleave', this._handleMouseLeave);\n } else {\n this.el.removeEventListener('click', this._handleClick);\n }\n }\n\n _setupTemporaryEventHandlers() {\n document.body.addEventListener('click', this._handleDocumentClick);\n document.body.addEventListener('touchmove', this._handleDocumentTouchmove, { passive: true });\n this.dropdownEl?.addEventListener('keydown', this._handleDropdownKeydown);\n window.addEventListener('resize', this._handleWindowResize);\n }\n\n _removeTemporaryEventHandlers() {\n document.body.removeEventListener('click', this._handleDocumentClick);\n document.body.removeEventListener('touchmove', this._handleDocumentTouchmove);\n this.dropdownEl?.removeEventListener('keydown', this._handleDropdownKeydown);\n window.removeEventListener('resize', this._handleWindowResize);\n }\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n //this._moveDropdown((<HTMLElement>e.target).closest('li'));\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n //this._moveDropdown((<HTMLElement>e.target).closest('li'));\n this.open();\n };\n\n _handleMouseLeave = (e: MouseEvent) => {\n const toEl = e.relatedTarget as HTMLElement;\n // relatedTarget is null when the pointer leaves the window entirely.\n if (!toEl) {\n this.close();\n return;\n }\n const leaveToDropdownContent = !!toEl.closest('.dropdown-content, menu');\n let leaveToActiveDropdownTrigger = false;\n const closestTrigger = toEl.closest('.dropdown-trigger');\n if (closestTrigger && !!closestTrigger['Expressive_Dropdown'] && closestTrigger['Expressive_Dropdown'].isOpen) {\n leaveToActiveDropdownTrigger = true;\n }\n // Close hover dropdown if mouse did not leave to either active dropdown-trigger or dropdown-content\n if (!leaveToActiveDropdownTrigger && !leaveToDropdownContent) {\n this.close();\n }\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n if (this.options.closeOnClick && target.closest('.dropdown-content, menu') && !this.isTouchMoving) {\n // isTouchMoving to check if scrolling on mobile.\n this.close();\n } else if (!target.closest('.dropdown-content, menu')) {\n // Do this one frame later so that if the element clicked also triggers _handleClick\n // For example, if a label for a select was clicked, that we don't close/open the dropdown\n setTimeout(() => {\n if (this.isOpen) {\n this.close();\n }\n }, 0);\n }\n this.isTouchMoving = false;\n };\n\n _handleTriggerKeydown = (e: KeyboardEvent) => {\n // ARROW DOWN OR ENTER WHEN SELECT IS CLOSED - open Dropdown\n const arrowDownOrEnter =\n Utils.keys.ARROW_DOWN.includes(e.key) || Utils.keys.ENTER.includes(e.key);\n if (arrowDownOrEnter && !this.isOpen) {\n e.preventDefault();\n this.open();\n }\n };\n\n _handleDocumentTouchmove = (e: TouchEvent) => {\n const target = <HTMLElement>e.target;\n if (target.closest('.dropdown-content, menu')) {\n this.isTouchMoving = true;\n }\n };\n\n _handleDropdownClick = (e: MouseEvent) => {\n // onItemClick callback\n if (typeof this.options.onItemClick === 'function') {\n const itemEl = (<HTMLElement>e.target).closest('li');\n this.options.onItemClick.call(this, itemEl);\n }\n };\n\n _handleDropdownKeydown = (e: KeyboardEvent) => {\n const arrowUpOrDown =\n Utils.keys.ARROW_DOWN.includes(e.key) || Utils.keys.ARROW_UP.includes(e.key);\n if (Utils.keys.TAB.includes(e.key)) {\n e.preventDefault();\n this.close();\n }\n // Navigate down dropdown list\n else if (arrowUpOrDown && this.isOpen) {\n e.preventDefault();\n const direction = Utils.keys.ARROW_DOWN.includes(e.key) ? 1 : -1;\n let newFocusedIndex = this.focusedIndex;\n let hasFoundNewIndex = false;\n do {\n newFocusedIndex = newFocusedIndex + direction;\n if (\n !!this.dropdownEl.children[newFocusedIndex] &&\n (<HTMLLIElement>this.dropdownEl.children[newFocusedIndex]).tabIndex !== -1\n ) {\n hasFoundNewIndex = true;\n break;\n }\n } while (newFocusedIndex < this.dropdownEl.children.length && newFocusedIndex >= 0);\n\n if (hasFoundNewIndex) {\n // Remove active class from old element\n if (this.focusedIndex >= 0)\n this.dropdownEl.children[this.focusedIndex].classList.remove('active');\n this.focusedIndex = newFocusedIndex;\n this._focusFocusedItem();\n }\n }\n // ENTER selects choice on focused item\n else if (Utils.keys.ENTER.includes(e.key) && this.isOpen) {\n // Search for <a> and <button>\n const focusedElement = this.dropdownEl.children[this.focusedIndex];\n const activatableElement = <HTMLElement>focusedElement?.querySelector('a, button');\n // Click a or button tag if exists, otherwise click li tag\n if (!!activatableElement) {\n activatableElement.click();\n } else if (!!focusedElement) {\n if (focusedElement instanceof HTMLElement) {\n focusedElement.click();\n }\n }\n }\n // Close dropdown on ESC\n else if (Utils.keys.ESC.includes(e.key) && this.isOpen) {\n e.preventDefault();\n this.close();\n }\n\n // CASE WHEN USER TYPE LTTERS\n const keyText = e.key.toLowerCase();\n const isLetter = /[a-zA-Z0-9-_]/.test(keyText);\n const specialKeys = [\n ...Utils.keys.ARROW_DOWN,\n ...Utils.keys.ARROW_UP,\n ...Utils.keys.ENTER,\n ...Utils.keys.ESC,\n ...Utils.keys.TAB\n ];\n if (isLetter && !specialKeys.includes(e.key)) {\n this.filterQuery.push(keyText);\n const string = this.filterQuery.join('');\n // textContent rather than innerText: this scans every item on every\n // keystroke, and innerText forces a layout flush per item.\n const newOptionEl = Array.from(this.dropdownEl.querySelectorAll('li')).find(\n (el) => el.textContent.trim().toLowerCase().indexOf(string) === 0\n );\n if (newOptionEl) {\n this.focusedIndex = [...newOptionEl.parentNode.children].indexOf(newOptionEl);\n this._focusFocusedItem();\n }\n }\n // Re-arm rather than stack: without the clear, every keystroke left a live\n // timer behind and the query could reset while the user was still typing.\n clearTimeout(this.filterTimeout);\n this.filterTimeout = setTimeout(this._resetFilterQuery, 1000);\n };\n\n _handleWindowResize = () => {\n // Only re-place the dropdown if it's still visible\n // Accounts for elements hiding via media queries\n if (this.el.offsetParent) {\n this.recalculateDimensions();\n }\n };\n\n _resetFilterQuery = () => {\n this.filterQuery = [];\n };\n\n _resetDropdownStyles() {\n this.dropdownEl.style.display = '';\n this._resetDropdownPositioningStyles();\n this.dropdownEl.style.transform = '';\n this.dropdownEl.style.opacity = '';\n }\n\n _resetDropdownPositioningStyles() {\n this.dropdownEl.style.width = '';\n this.dropdownEl.style.height = '';\n this.dropdownEl.style.left = '';\n this.dropdownEl.style.top = '';\n this.dropdownEl.style.transformOrigin = '';\n }\n\n _moveDropdownToElement(containerEl: HTMLElement = null) {\n if (this.options.container) {\n this.options.container.append(this.dropdownEl);\n return;\n }\n if (containerEl) {\n if (!containerEl.contains(this.dropdownEl)) containerEl.append(this.dropdownEl);\n return;\n }\n this.el.after(this.dropdownEl);\n }\n\n _makeDropdownFocusable() {\n if (!this.dropdownEl) return;\n this.dropdownEl.popover = '';\n // Needed for arrow key navigation\n this.dropdownEl.tabIndex = 0;\n // Only set tabindex if it hasn't been set by user\n Array.from(this.dropdownEl.children).forEach((el) => {\n if (el instanceof HTMLHRElement || el.classList.contains('divider')) {\n el.setAttribute('tabindex', '-1');\n return;\n }\n if (!el.getAttribute('tabindex')) el.setAttribute('tabindex', '0');\n });\n }\n\n _focusFocusedItem() {\n if (\n this.focusedIndex >= 0 &&\n this.focusedIndex < this.dropdownEl.children.length &&\n this.options.autoFocus\n ) {\n (this.dropdownEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.dropdownEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n _getDropdownPosition(closestOverflowParent: HTMLElement) {\n // const offsetParentBRect = this.el.offsetParent.getBoundingClientRect();\n const triggerBRect = this.el.getBoundingClientRect();\n const dropdownBRect = this.dropdownEl.getBoundingClientRect();\n\n let idealHeight = dropdownBRect.height;\n let idealWidth = dropdownBRect.width;\n let idealXPos = triggerBRect.left - dropdownBRect.left;\n let idealYPos = triggerBRect.top - dropdownBRect.top;\n\n const dropdownBounds = {\n left: idealXPos,\n top: idealYPos,\n height: idealHeight,\n width: idealWidth\n };\n\n const alignments = Utils.checkPossibleAlignments(\n this.el,\n closestOverflowParent,\n dropdownBounds,\n this.options.coverTrigger ? 0 : triggerBRect.height\n );\n\n let verticalAlignment = 'top';\n let horizontalAlignment = this.options.alignment;\n idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n // Reset isScrollable\n this.isScrollable = false;\n\n if (!alignments.top) {\n if (alignments.bottom) {\n verticalAlignment = 'bottom';\n\n if (!this.options.coverTrigger) {\n idealYPos -= triggerBRect.height;\n }\n } else {\n this.isScrollable = true;\n\n // Determine which side has most space and cutoff at correct height\n idealHeight -= 20; // Add padding when cutoff\n if (alignments.spaceOnTop > alignments.spaceOnBottom) {\n verticalAlignment = 'bottom';\n idealHeight += alignments.spaceOnTop;\n idealYPos -= this.options.coverTrigger\n ? alignments.spaceOnTop - 20\n : alignments.spaceOnTop - 20 + triggerBRect.height;\n } else {\n idealHeight += alignments.spaceOnBottom;\n }\n }\n }\n\n // If preferred horizontal alignment is possible\n if (!alignments[horizontalAlignment]) {\n const oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n if (alignments[oppositeAlignment]) {\n horizontalAlignment = oppositeAlignment;\n } else {\n // Determine which side has most space and cutoff at correct height\n if (alignments.spaceOnLeft > alignments.spaceOnRight) {\n horizontalAlignment = 'right';\n idealWidth += alignments.spaceOnLeft;\n idealXPos -= alignments.spaceOnLeft;\n } else {\n horizontalAlignment = 'left';\n idealWidth += alignments.spaceOnRight;\n }\n }\n }\n\n if (verticalAlignment === 'bottom') {\n idealYPos =\n idealYPos - dropdownBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - dropdownBRect.width + triggerBRect.width;\n }\n return {\n x: idealXPos,\n y: idealYPos,\n verticalAlignment: verticalAlignment,\n horizontalAlignment: horizontalAlignment,\n height: idealHeight,\n width: idealWidth\n };\n }\n\n _animateIn() {\n const duration = this.options.inDuration;\n this.dropdownEl.style.transition = 'none';\n // from\n this.dropdownEl.style.opacity = '0';\n this.dropdownEl.style.transform = 'scale(0.3, 0.3)';\n setTimeout(() => {\n // easeOutQuad (opacity) & easeOutQuint\n this.dropdownEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.dropdownEl.style.opacity = '1';\n this.dropdownEl.style.transform = 'scale(1, 1)';\n }, 1);\n setTimeout(() => {\n if (this.options.autoFocus) this.dropdownEl.focus();\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutQuad (opacity) & easeOutQuint\n this.dropdownEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.dropdownEl.style.opacity = '0';\n this.dropdownEl.style.transform = 'scale(0.3, 0.3)';\n setTimeout(() => {\n this._resetDropdownStyles();\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _getClosestAncestor(el: HTMLElement, condition: (Function) => boolean): HTMLElement {\n let ancestor = el.parentNode;\n while (ancestor !== null && ancestor !== document) {\n if (condition(ancestor)) {\n return <HTMLElement>ancestor;\n }\n ancestor = ancestor.parentElement;\n }\n return null;\n }\n\n _placeDropdown() {\n // Container here will be closest ancestor with overflow: hidden\n let closestOverflowParent: HTMLElement = this._getClosestAncestor(\n this.dropdownEl,\n (ancestor: HTMLElement) => {\n return (\n !['HTML', 'BODY'].includes(ancestor.tagName) &&\n getComputedStyle(ancestor).overflow !== 'visible'\n );\n }\n );\n // Fallback\n if (!closestOverflowParent) {\n closestOverflowParent = <HTMLElement>(\n (!!this.dropdownEl.offsetParent ? this.dropdownEl.offsetParent : this.dropdownEl.parentNode)\n );\n }\n\n if (getComputedStyle(closestOverflowParent).position === 'static')\n closestOverflowParent.style.position = 'relative';\n\n //this._moveDropdown(closestOverflowParent);\n\n // Set width before calculating positionInfo\n const idealWidth = this.options.constrainWidth\n ? this.el.getBoundingClientRect().width\n : this.dropdownEl.getBoundingClientRect().width;\n this.dropdownEl.style.width = idealWidth + 'px';\n\n const positionInfo = this._getDropdownPosition(closestOverflowParent);\n this.dropdownEl.style.left = positionInfo.x + 'px';\n this.dropdownEl.style.top = positionInfo.y + 'px';\n this.dropdownEl.style.height = positionInfo.height + 'px';\n this.dropdownEl.style.width = positionInfo.width + 'px';\n this.dropdownEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /**\n * Open dropdown.\n */\n open = () => {\n if (this.isOpen) return;\n this.isOpen = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n // Reset styles\n this._resetDropdownStyles();\n this.dropdownEl.style.display = 'block';\n this._placeDropdown();\n this._animateIn();\n // Do this one frame later so that we don't bind an event handler that's immediately\n // called when the event bubbles up to the document and closes the dropdown\n setTimeout(() => this._setupTemporaryEventHandlers(), 0);\n this.el.ariaExpanded = 'true';\n };\n\n /**\n * Close dropdown.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.focusedIndex = -1;\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this._animateOut();\n this._removeTemporaryEventHandlers();\n if (this.options.autoFocus) {\n this.el.focus();\n }\n this.el.ariaExpanded = 'false';\n };\n\n /**\n * While dropdown is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetDropdownPositioningStyles();\n this._placeDropdown();\n }\n };\n}\n", "import { Utils } from '../core/utils';\nimport { Dropdown, DropdownOptions } from './dropdown';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface AutocompleteData {\n /**\n * A primitive value that can be converted to string.\n * If \"text\" is not provided, it will also be used as \"option text\" as well\n */\n id: string | number;\n /**\n * This optional attribute is used as \"display value\" for the current entry.\n * When provided, it will also be taken into consideration by the standard search function.\n */\n text?: string;\n /**\n * This optional attribute is used to provide a valid image URL to the current option.\n */\n image?: string;\n /**\n * Optional attributes which describes the option.\n */\n description?: string;\n}\n\nexport interface AutocompleteOptions extends BaseOptions {\n /**\n * Data object defining autocomplete options with\n * optional icon strings.\n */\n data: AutocompleteData[];\n /**\n * Flag which can be set if multiple values can be selected. The Result will be an Array.\n * @default false\n */\n isMultiSelect: boolean;\n /**\n * Callback for when autocompleted.\n */\n onAutocomplete: (entries: AutocompleteData[]) => void;\n /**\n * Minimum number of characters before autocomplete starts.\n * @default 1\n */\n minLength: number;\n /**\n * The height of the Menu which can be set via css-property.\n * @default '300px'\n */\n maxDropDownHeight: string;\n /**\n * Function is called when the input text is altered and data can also be loaded asynchronously.\n * If the results are collected the items in the list can be updated via the function setMenuItems(collectedItems).\n * @param text Searched text.\n * @param autocomplete Current autocomplete instance.\n */\n onSearch: (text: string, autocomplete: Autocomplete) => void;\n /**\n * If true will render the key from each item directly as HTML.\n * User input MUST be properly sanitized first.\n * @default false\n */\n allowUnsafeHTML: boolean;\n /**\n * Pass options object to select dropdown initialization.\n * @default {}\n */\n dropdownOptions: Partial<DropdownOptions>;\n /**\n * Predefined selected values\n */\n selected: number[] | string[];\n}\n\nconst _defaults: AutocompleteOptions = {\n data: [], // Autocomplete data set\n onAutocomplete: null, // Callback for when autocompleted\n dropdownOptions: {\n // Default dropdown options\n autoFocus: false,\n closeOnClick: false,\n coverTrigger: false\n },\n minLength: 1, // Min characters before autocomplete starts\n isMultiSelect: false,\n onSearch: (text: string, autocomplete: Autocomplete) => {\n const normSearch = text.toLocaleLowerCase();\n autocomplete.setMenuItems(\n\n autocomplete.options.data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n\n )\n );\n },\n maxDropDownHeight: '300px',\n allowUnsafeHTML: false,\n selected: []\n};\n\nexport class Autocomplete extends Component<AutocompleteOptions> {\n declare el: HTMLInputElement;\n /** If the autocomplete is open. */\n isOpen: boolean;\n /** Number of matching autocomplete options. */\n count: number;\n /** Index of the current selected option. */\n activeIndex: number;\n private oldVal: string;\n private $active: HTMLElement | null;\n private _mousedown: boolean;\n container: HTMLElement;\n /** Instance of the dropdown plugin for this autocomplete. */\n dropdown: Dropdown;\n static _keydown: boolean;\n selectedValues: AutocompleteData[];\n menuItems: AutocompleteData[];\n\n constructor(el: HTMLInputElement, options: Partial<AutocompleteOptions>) {\n super(el, options, Autocomplete);\n this.el['Expressive_Autocomplete'] = this;\n\n this.options = {\n ...Autocomplete.defaults,\n ...options\n };\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n this.selectedValues = this.selectedValues || this.options.selected.map((value) => <AutocompleteData>{ id: value }) || [];\n this.menuItems = this.options.data || [];\n this.$active = null;\n this._mousedown = false;\n this._setupDropdown();\n this._setupEventHandlers();\n }\n\n static get defaults(): AutocompleteOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Autocomplete.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<AutocompleteOptions>): Autocomplete;\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<AutocompleteOptions>\n ): Autocomplete[];\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<AutocompleteOptions> = {}\n ): Autocomplete | Autocomplete[] {\n return super.init(els, options, Autocomplete);\n }\n\n static getInstance(el: HTMLElement): Autocomplete {\n return el['Expressive_Autocomplete'];\n }\n\n /**\n * The three-dot loading indicator, parsed once and cloned thereafter.\n *\n * It is shown on every input change, and it used to be assigned as an\n * innerHTML string each time - re-running the HTML parser over the same\n * fixed markup on every keystroke.\n */\n private static _loadingTemplate: HTMLElement = null;\n\n private static _loadingIndicator(): HTMLElement {\n if (!Autocomplete._loadingTemplate) {\n const template = document.createElement('template');\n template.innerHTML = `<div style=\"height:100%;width:50px;\"><svg version=\"1.1\" id=\"L4\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 0 0\" xml:space=\"preserve\">\n <circle fill=\"#888c\" stroke=\"none\" cx=\"6\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.1\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"26\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.2\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"46\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.3\"/></circle>\n </svg></div>`;\n Autocomplete._loadingTemplate = template.content.firstElementChild as HTMLElement;\n }\n return Autocomplete._loadingTemplate.cloneNode(true) as HTMLElement;\n }\n\n destroy() {\n this._removeEventHandlers();\n this._removeDropdown();\n this.el['Expressive_Autocomplete'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('blur', this._handleInputBlur);\n this.el.addEventListener('keyup', this._handleInputKeyup);\n this.el.addEventListener('focus', this._handleInputFocus);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('click', this._handleInputClick);\n this.container.addEventListener('mousedown', this._handleContainerMousedownAndTouchstart);\n this.container.addEventListener('mouseup', this._handleContainerMouseupAndTouchend);\n if (typeof window.ontouchstart !== 'undefined') {\n this.container.addEventListener('touchstart', this._handleContainerMousedownAndTouchstart);\n this.container.addEventListener('touchend', this._handleContainerMouseupAndTouchend);\n }\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('blur', this._handleInputBlur);\n this.el.removeEventListener('keyup', this._handleInputKeyup);\n this.el.removeEventListener('focus', this._handleInputFocus);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('click', this._handleInputClick);\n this.container.removeEventListener('mousedown', this._handleContainerMousedownAndTouchstart);\n this.container.removeEventListener('mouseup', this._handleContainerMouseupAndTouchend);\n\n if (typeof window.ontouchstart !== 'undefined') {\n this.container.removeEventListener('touchstart', this._handleContainerMousedownAndTouchstart);\n this.container.removeEventListener('touchend', this._handleContainerMouseupAndTouchend);\n }\n }\n\n _setupDropdown() {\n this.container = document.createElement('ul');\n this.container.style.maxHeight = this.options.maxDropDownHeight;\n this.container.id = `autocomplete-options-${Utils.guid()}`;\n this.container.classList.add('autocomplete-content', 'dropdown-content');\n this.container.ariaExpanded = 'true';\n this.el.setAttribute('data-target', this.container.id);\n\n this.menuItems.forEach((menuItem) => {\n const itemElement = this._createDropdownItem(menuItem);\n this.container.append(itemElement);\n });\n\n // ! Issue in Component Dropdown: _placeDropdown moves dom-position\n this.el.parentElement.appendChild(this.container);\n\n // Initialize dropdown\n const dropdownOptions = {\n ...Autocomplete.defaults.dropdownOptions,\n ...this.options.dropdownOptions\n };\n // @todo shouldn't we conditionally check if dropdownOptions.onItemClick is set in first place?\n const userOnItemClick = dropdownOptions.onItemClick;\n // Ensuring the select Option call when user passes custom onItemClick function to dropdown\n dropdownOptions.onItemClick = (li) => {\n if (!li) return;\n const entryID = li.getAttribute('data-id');\n this.selectOption(entryID);\n // Handle user declared onItemClick if needed\n if (userOnItemClick && typeof userOnItemClick === 'function')\n userOnItemClick.call(this.dropdown, this.el);\n };\n this.dropdown = Dropdown.init(this.el, dropdownOptions);\n\n // ! Workaround for Label: move label up again\n // TODO: Just use PopperJS in future!\n const label = this.el.parentElement.querySelector('label');\n if (label) this.el.after(label);\n\n // Sketchy removal of dropdown click handler\n this.el.removeEventListener('click', this.dropdown._handleClick);\n if(!this.options.isMultiSelect && !(this.options.selected.length === 0)) {\n const selectedValue = this.menuItems.filter((value) => value.id === this.selectedValues[0].id);\n this.el.value = selectedValue[0].text;\n }\n // Set Value if already set in HTML\n if (this.el.value) this.selectOption(this.el.value);\n // Add StatusInfo\n const div = document.createElement('div');\n div.classList.add('status-info');\n div.setAttribute('style', 'position: absolute;right:0;top:0;');\n this.el.parentElement.appendChild(div);\n this._updateSelectedInfo();\n }\n\n _removeDropdown() {\n this.container.ariaExpanded = 'false';\n this.container.parentNode.removeChild(this.container);\n }\n\n _handleInputBlur = () => {\n if (!this._mousedown) {\n this.close();\n this._resetAutocomplete();\n }\n };\n\n _handleInputKeyup = (e: KeyboardEvent) => {\n if (e.type === 'keyup') Autocomplete._keydown = false;\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n // Don't capture enter or arrow key usage.\n if (\n Utils.keys.ENTER.includes(e.key) ||\n Utils.keys.ARROW_UP.includes(e.key) ||\n Utils.keys.ARROW_DOWN.includes(e.key)\n )\n return;\n // Check if the input isn't empty\n // Check if focus triggered by tab\n if (this.oldVal !== actualValue && Utils.tabPressed) {\n this.open();\n }\n this._inputChangeDetection(actualValue);\n };\n\n _handleInputFocus = () => {\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n this._inputChangeDetection(actualValue);\n };\n\n _inputChangeDetection = (value: string) => {\n // Value has changed!\n if (this.oldVal !== value) {\n this._setStatusLoading();\n this.options.onSearch(this.el.value, this);\n }\n // Reset Single-Select when Input cleared\n if (!this.options.isMultiSelect && this.el.value.length === 0) {\n this.selectedValues = [];\n this._triggerChanged();\n }\n this.oldVal = value;\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Autocomplete._keydown = true;\n // Arrow keys and enter key usage\n const numItems = this.container.querySelectorAll('li').length;\n // select element on Enter\n if (Utils.keys.ENTER.includes(e.key) && this.activeIndex >= 0) {\n const liElement = this.container.querySelectorAll('li')[this.activeIndex];\n if (liElement) {\n this.selectOption(liElement.getAttribute('data-id'));\n e.preventDefault();\n }\n return;\n }\n // Capture up and down key\n if (Utils.keys.ARROW_UP.includes(e.key) || Utils.keys.ARROW_DOWN.includes(e.key)) {\n e.preventDefault();\n if (Utils.keys.ARROW_UP.includes(e.key) && this.activeIndex > 0) this.activeIndex--;\n if (Utils.keys.ARROW_DOWN.includes(e.key) && this.activeIndex < numItems - 1)\n this.activeIndex++;\n this.$active?.classList.remove('active');\n if (this.activeIndex >= 0) {\n this.$active = this.container.querySelectorAll('li')[this.activeIndex];\n this.$active?.classList.add('active');\n // Focus selected\n this.container.children[this.activeIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n };\n\n _handleInputClick = () => {\n this.open();\n };\n\n _handleContainerMousedownAndTouchstart = () => {\n this._mousedown = true;\n };\n\n _handleContainerMouseupAndTouchend = () => {\n this._mousedown = false;\n };\n\n _resetCurrentElementPosition() {\n this.activeIndex = -1;\n this.$active?.classList.remove('active');\n }\n\n _resetAutocomplete() {\n this.container.replaceChildren();\n this._resetCurrentElementPosition();\n this.oldVal = null;\n this.isOpen = false;\n this._mousedown = false;\n }\n\n _highlightPartialText(input: string, label: string) {\n const start = label.toLocaleLowerCase().indexOf('' + input.toLocaleLowerCase() + '');\n const end = start + input.length - 1;\n //custom filters may return results where the string does not match any part\n if (start == -1 || end == -1) {\n return [label, '', ''];\n }\n return [label.slice(0, start), label.slice(start, end + 1), label.slice(end + 1)];\n }\n\n _createDropdownItem(entry: AutocompleteData) {\n const item = document.createElement('li');\n item.setAttribute('data-id', <string>entry.id);\n item.setAttribute(\n 'style',\n 'display:grid; grid-auto-flow: column; user-select: none; align-items: center;'\n );\n item.tabIndex = 0;\n // Checkbox\n if (this.options.isMultiSelect) {\n const selection = document.createElement('div');\n selection.classList.add('item-selection');\n selection.style.textAlign = 'center';\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = this.selectedValues.some((sel) => sel.id === entry.id);\n const spacer = document.createElement('span');\n spacer.style.paddingLeft = '21px';\n selection.append(checkbox, spacer);\n item.appendChild(selection);\n }\n // Image\n if (entry.image) {\n const img = document.createElement('img');\n img.classList.add('circle');\n img.src = entry.image;\n item.appendChild(img);\n }\n\n // Text\n const inputText = this.el.value.toLocaleLowerCase();\n const parts = this._highlightPartialText(inputText, (entry.text || entry.id).toString());\n const div = document.createElement('div');\n div.setAttribute('style', 'line-height:1.2;font-weight:500;');\n if (this.options.allowUnsafeHTML) {\n div.innerHTML = parts[0] + '<span class=\"highlight\">' + parts[1] + '</span>' + parts[2];\n } else {\n div.appendChild(document.createTextNode(parts[0]));\n if (parts[1]) {\n const highlight = document.createElement('span');\n highlight.textContent = parts[1];\n highlight.classList.add('highlight');\n div.appendChild(highlight);\n div.appendChild(document.createTextNode(parts[2]));\n }\n }\n\n const itemText = document.createElement('div');\n itemText.classList.add('item-text');\n itemText.setAttribute('style', 'padding:5px;overflow:hidden;');\n item.appendChild(itemText);\n item.querySelector('.item-text').appendChild(div);\n // Description\n if (\n typeof entry.description === 'string' ||\n (typeof entry.description === 'number' && !isNaN(entry.description))\n ) {\n const description = document.createElement('small');\n description.setAttribute(\n 'style',\n 'line-height:1.3;color:grey;white-space:nowrap;text-overflow:ellipsis;display:block;width:90%;overflow:hidden;'\n );\n description.innerText = entry.description;\n item.querySelector('.item-text').appendChild(description);\n }\n // Set Grid\n const getGridConfig = () => {\n if (this.options.isMultiSelect) {\n if (entry.image) return '40px min-content auto'; // cb-img-txt\n return '40px auto'; // cb-txt\n }\n if (entry.image) return 'min-content auto'; // img-txt\n return 'auto'; // txt\n };\n item.style.gridTemplateColumns = getGridConfig();\n return item;\n }\n\n _renderDropdown() {\n this._resetAutocomplete();\n // Check if Data is empty\n if (this.menuItems.length === 0) {\n this.menuItems = this.selectedValues; // Show selected Items\n }\n for (let i = 0; i < this.menuItems.length; i++) {\n const item = this._createDropdownItem(this.menuItems[i]);\n this.container.append(item);\n }\n }\n\n _setStatusLoading() {\n const statusElement = this.el.parentElement.querySelector('.status-info');\n if (statusElement) statusElement.replaceChildren(Autocomplete._loadingIndicator());\n }\n\n _updateSelectedInfo() {\n const statusElement = this.el.parentElement.querySelector('.status-info');\n if (statusElement) {\n if (this.options.isMultiSelect)\n statusElement.textContent = this.selectedValues.length.toString();\n else statusElement.replaceChildren();\n }\n }\n\n _refreshInputText() {\n if (this.selectedValues.length === 1) {\n const entry = this.selectedValues[0];\n this.el.value = entry.text || <string>entry.id; // Write Text to Input\n }\n }\n\n _triggerChanged() {\n this.el.dispatchEvent(new Event('change'));\n // Trigger Autocomplete Event\n if (typeof this.options.onAutocomplete === 'function')\n this.options.onAutocomplete.call(this, this.selectedValues);\n }\n\n /**\n * Show autocomplete.\n */\n open = () => {\n const inputText = this.el.value.toLocaleLowerCase();\n this._resetAutocomplete();\n if (inputText.length >= this.options.minLength) {\n this.isOpen = true;\n this._renderDropdown();\n }\n // Open dropdown\n if (!this.dropdown.isOpen) {\n setTimeout(() => {\n this.dropdown.open();\n }, 0); // TODO: why?\n } else this.dropdown.recalculateDimensions(); // Recalculate dropdown when its already open\n };\n\n /**\n * Hide autocomplete.\n */\n close = () => {\n this.dropdown.close();\n };\n\n /**\n * Updates the visible or selectable items shown in the menu.\n * @param menuItems Items to be available.\n * @param selected Selected item ids\n * @param open Option to conditionally open dropdown\n */\n setMenuItems(menuItems: AutocompleteData[], selected: number[] | string[] = null, open: boolean = true) {\n this.menuItems = menuItems;\n this.options.data = menuItems;\n if (selected) {\n this.selectedValues = this.menuItems.filter(\n (item) => !(selected.indexOf(<never>item.id) === -1)\n );\n }\n if (this.options.isMultiSelect) {\n this._renderDropdown();\n } else {\n this._refreshInputText();\n }\n if (open) this.open();\n this._updateSelectedInfo();\n this._triggerChanged();\n }\n\n /**\n * Sets selected values.\n * @deprecated @see https://github.com/materializecss/materialize/issues/552\n * @param entries\n */\n setValues(entries: AutocompleteData[]) {\n this.selectedValues = entries;\n this._updateSelectedInfo();\n if (!this.options.isMultiSelect) {\n this._refreshInputText();\n }\n this._triggerChanged();\n }\n\n /**\n * Select a specific autocomplete option via id-property.\n * @param id The id of a data-entry.\n */\n selectOption(id: number | string) {\n const entry = this.menuItems.find((item) => item.id == id);\n if (!entry) return;\n // Toggle Checkbox\n /* const li = this.container.querySelector('li[data-id=\"' + id + '\"]');\n if (!li) return;*/\n if (this.options.isMultiSelect) {\n /* const checkbox = <HTMLInputElement | null>li.querySelector('input[type=\"checkbox\"]');\n checkbox.checked = !checkbox.checked;*/\n if (!(this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id === entry.id\n ).length >= 1)) this.selectedValues.push(entry);\n else this.selectedValues = this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id !== entry.id\n );\n this._renderDropdown();\n this.el.focus();\n } else {\n // Single-Select\n this.selectedValues = [entry];\n this._refreshInputText();\n this._resetAutocomplete();\n this.close();\n }\n this._updateSelectedInfo();\n this._triggerChanged();\n }\n\n selectOptions(ids: []) {\n const entries = this.menuItems.filter(\n (item) => !(ids.indexOf(<never>item.id) === -1)\n );\n if (!entries) return;\n this.selectedValues = entries;\n this._renderDropdown();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Autocomplete, AutocompleteOptions } from './autocomplete';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface ChipData {\n /**\n * Unique identifier.\n */\n id: number | string;\n /**\n * Chip text. If not specified, \"id\" will be used.\n */\n text?: string;\n /**\n * Chip image (URL).\n */\n image?: string;\n}\n\nexport interface ChipsOptions extends BaseOptions {\n /**\n * Set the chip data.\n * @default []\n */\n data: ChipData[];\n /**\n * Set first placeholder when there are no tags.\n * @default \"\"\n */\n placeholder: string;\n /**\n * Set second placeholder when adding additional tags.\n * @default \"\"\n */\n secondaryPlaceholder: string;\n /**\n * Set autocomplete options.\n * @default {}\n */\n autocompleteOptions: Partial<AutocompleteOptions>;\n /**\n * Toggles abililty to add custom value not in autocomplete list.\n * @default false\n */\n autocompleteOnly: boolean;\n /**\n * Set chips limit.\n * @default Infinity\n */\n limit: number;\n /**\n * Specifies class to be used in \"close\" button (useful when working with Material Symbols icon set).\n * @default 'material-icons'\n */\n closeIconClass: string;\n /**\n * Specifies option to render user input field\n * @default false;\n */\n allowUserInput: boolean;\n /**\n * Callback for chip add.\n * @default null\n */\n onChipAdd: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip select.\n * @default null\n */\n onChipSelect: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip delete.\n * @default null\n */\n onChipDelete: (element: HTMLElement, chip: HTMLElement) => void;\n}\n\nconst _defaults: ChipsOptions = {\n data: [],\n placeholder: '',\n secondaryPlaceholder: '',\n closeIconClass: 'material-icons',\n autocompleteOptions: {},\n autocompleteOnly: false,\n limit: Infinity,\n allowUserInput: false,\n onChipAdd: null,\n onChipSelect: null,\n onChipDelete: null\n};\n\nexport class Chips extends Component<ChipsOptions> {\n /** Array of the current chips data. */\n chipsData: ChipData[];\n /** If the chips has autocomplete enabled. */\n hasAutocomplete: boolean;\n /** Autocomplete instance, if any. */\n autocomplete: Autocomplete;\n _input: HTMLInputElement;\n _label: HTMLLabelElement;\n _chips: HTMLElement[];\n static _keydown: boolean;\n private _selectedChip: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<ChipsOptions>) {\n super(el, options, Chips);\n this.el['Expressive_Chips'] = this;\n\n this.options = {\n ...Chips.defaults,\n ...options\n };\n\n this.el.classList.add('chips');\n this.chipsData = [];\n this._chips = [];\n\n // Render initial chips\n if (this.options.data.length) {\n this.chipsData = this.options.data;\n this._renderChips();\n }\n\n // Render input element, setup event handlers\n if (this.options.allowUserInput) {\n this.el.classList.add('input-field');\n this._setupInput();\n this._setupEventHandlers();\n // move input to end\n this.el.append(this._input);\n }\n // After _setupInput: the label points at the input's id, which is only\n // assigned there. Running this first threw on any .chips with a <label>.\n this._setupLabel();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Chips.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ChipsOptions>): Chips;\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<ChipsOptions>): Chips[];\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ChipsOptions> = {}\n ): Chips | Chips[] {\n return super.init(els, options, Chips);\n }\n\n static getInstance(el: HTMLElement): Chips {\n return el['Expressive_Chips'];\n }\n\n getData() {\n return this.chipsData;\n }\n\n destroy() {\n if (this.options.allowUserInput) {\n this._removeEventHandlers();\n }\n this._chips.forEach((c) => c.remove());\n this._chips = [];\n this.el['Expressive_Chips'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleChipClick);\n // @todo why do we need this as document event listener, shouldn't we apply it to the element wrapper itself?\n document.addEventListener('keydown', Chips._handleChipsKeydown);\n document.addEventListener('keyup', Chips._handleChipsKeyup);\n this.el.addEventListener('blur', Chips._handleChipsBlur, true);\n this._input.addEventListener('focus', this._handleInputFocus);\n this._input.addEventListener('blur', this._handleInputBlur);\n this._input.addEventListener('keydown', this._handleInputKeydown);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleChipClick);\n document.removeEventListener('keydown', Chips._handleChipsKeydown);\n document.removeEventListener('keyup', Chips._handleChipsKeyup);\n this.el.removeEventListener('blur', Chips._handleChipsBlur, true);\n this._input.removeEventListener('focus', this._handleInputFocus);\n this._input.removeEventListener('blur', this._handleInputBlur);\n this._input.removeEventListener('keydown', this._handleInputKeydown);\n }\n\n _handleChipClick = (e: MouseEvent) => {\n const _chip = (<HTMLElement>e.target).closest('.chip');\n const clickedClose = (<HTMLElement>e.target).classList.contains('close');\n if (_chip) {\n // Index into the chip list, not into the container's children: the\n // container also holds the label and the input, so counting children\n // gave an index that did not line up with chipsData.\n const index = this._chips.indexOf(_chip as HTMLElement);\n if (index < 0) return;\n if (clickedClose) {\n this.deleteChip(index);\n this._input.focus();\n } else {\n this.selectChip(index);\n }\n // Default handle click to focus on input\n } else {\n this._input.focus();\n }\n };\n\n static _handleChipsKeydown(e: KeyboardEvent) {\n Chips._keydown = true;\n const chips = (<HTMLElement>e.target).closest('.chips');\n const chipsKeydown = e.target && chips;\n\n // Don't handle keydown inputs on input and textarea\n const tag = (<HTMLElement>e.target).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || !chipsKeydown) return;\n\n const currChips: Chips = chips['Expressive_Chips'];\n if (!currChips) return; // .chips markup without an instance behind it\n\n if (Utils.keys.BACKSPACE.includes(e.key) || Utils.keys.DELETE.includes(e.key)) {\n e.preventDefault();\n let selectIndex = currChips.chipsData.length;\n if (currChips._selectedChip) {\n const index = currChips._chips.indexOf(currChips._selectedChip);\n currChips.deleteChip(index);\n currChips._selectedChip = null;\n // Make sure selectIndex doesn't go negative\n selectIndex = Math.max(index - 1, 0);\n }\n if (currChips.chipsData.length) currChips.selectChip(selectIndex);\n else currChips._input.focus();\n } else if (Utils.keys.ARROW_LEFT.includes(e.key)) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) - 1;\n if (selectIndex < 0) return;\n currChips.selectChip(selectIndex);\n }\n } else if (Utils.keys.ARROW_RIGHT.includes(e.key)) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) + 1;\n if (selectIndex >= currChips.chipsData.length) currChips._input.focus();\n else currChips.selectChip(selectIndex);\n }\n }\n }\n\n static _handleChipsKeyup() {\n Chips._keydown = false;\n }\n\n static _handleChipsBlur(e: Event) {\n if (!Chips._keydown && document.hidden) {\n const chips = (<HTMLElement>e.target).closest('.chips');\n const currChips: Chips = chips?.['Expressive_Chips'];\n if (currChips) currChips._selectedChip = null;\n }\n }\n\n _handleInputFocus = () => {\n this.el.classList.add('focus');\n };\n\n _handleInputBlur = () => {\n this.el.classList.remove('focus');\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Chips._keydown = true;\n if (Utils.keys.ENTER.includes(e.key)) {\n // Override enter if autocompleting.\n if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {\n return;\n }\n e.preventDefault();\n if (!this.hasAutocomplete || (this.hasAutocomplete && !this.options.autocompleteOnly)) {\n this.addChip({ id: this._input.value });\n }\n this._input.value = '';\n } else if (\n (Utils.keys.BACKSPACE.includes(e.key) || Utils.keys.ARROW_LEFT.includes(e.key)) &&\n this._input.value === '' &&\n this.chipsData.length\n ) {\n e.preventDefault();\n this.selectChip(this.chipsData.length - 1);\n }\n };\n\n _renderChip(chip: ChipData): HTMLDivElement {\n if (!chip.id) return;\n const renderedChip = document.createElement('div');\n renderedChip.classList.add('chip');\n renderedChip.innerText = chip.text || <string>chip.id;\n // attach image if needed\n if (chip.image) {\n const img = document.createElement('img');\n img.setAttribute('src', chip.image);\n renderedChip.insertBefore(img, renderedChip.firstChild);\n }\n if (this.options.allowUserInput) {\n renderedChip.setAttribute('tabindex', '0');\n const closeIcon = document.createElement('i');\n closeIcon.classList.add(this.options.closeIconClass, 'close');\n closeIcon.innerText = 'close';\n renderedChip.appendChild(closeIcon);\n }\n return renderedChip;\n }\n\n _renderChips() {\n this._chips = []; //.remove();\n for (let i = 0; i < this.chipsData.length; i++) {\n const chipElem = this._renderChip(this.chipsData[i]);\n this.el.appendChild(chipElem);\n this._chips.push(chipElem);\n }\n }\n\n _setupAutocomplete() {\n this.options.autocompleteOptions.onAutocomplete = (items) => {\n if (items.length > 0)\n this.addChip({\n id: items[0].id,\n text: items[0].text,\n image: items[0].image\n });\n this._input.value = '';\n this._input.focus();\n };\n this.autocomplete = Autocomplete.init(this._input, this.options.autocompleteOptions);\n }\n\n _setupInput() {\n this._input = this.el.querySelector('input');\n if (!this._input) {\n this._input = document.createElement('input');\n this.el.append(this._input);\n }\n this._input.classList.add('input');\n this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;\n // Setup autocomplete if needed\n if (this.hasAutocomplete) this._setupAutocomplete();\n this._setPlaceholder();\n // Set input id\n if (!this._input.getAttribute('id')) this._input.setAttribute('id', Utils.guid());\n }\n\n _setupLabel() {\n this._label = this.el.querySelector('label');\n // No input to point at when allowUserInput is off.\n if (this._label && this._input) this._label.setAttribute('for', this._input.getAttribute('id'));\n }\n\n _setPlaceholder() {\n if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {\n this._input.placeholder = this.options.placeholder;\n } else if (\n (this.chipsData === undefined || !!this.chipsData.length) &&\n this.options.secondaryPlaceholder\n ) {\n this._input.placeholder = this.options.secondaryPlaceholder;\n }\n }\n\n _isValidAndNotExist(chip: ChipData) {\n const isValid = !!chip.id;\n const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);\n return isValid && doesNotExist;\n }\n\n /**\n * Add chip to input.\n * @param chip Chip data object\n */\n addChip(chip: ChipData) {\n if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;\n const renderedChip = this._renderChip(chip);\n this._chips.push(renderedChip);\n this.chipsData.push(chip);\n //$(this._input).before(renderedChip);\n this._input.before(renderedChip);\n this._setPlaceholder();\n // fire chipAdd callback\n if (typeof this.options.onChipAdd === 'function') {\n this.options.onChipAdd(this.el, renderedChip);\n }\n }\n\n /**\n * Delete nth chip.\n * @param chipIndex Index of chip\n */\n deleteChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n chip.remove();\n this._chips.splice(chipIndex, 1);\n this.chipsData.splice(chipIndex, 1);\n this._setPlaceholder();\n // fire chipDelete callback\n if (typeof this.options.onChipDelete === 'function') {\n this.options.onChipDelete(this.el, chip);\n }\n }\n\n /**\n * Select nth chip.\n * @param chipIndex Index of chip\n */\n selectChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n this._selectedChip = chip;\n chip.focus();\n // fire chipSelect callback\n if (typeof this.options.onChipSelect === 'function') {\n this.options.onChipSelect(this.el, chip);\n }\n }\n\n static Init() {\n // Handle removal of static chips - markup written by hand, with no Chips\n // instance behind it. Where there *is* an instance, _handleChipClick owns\n // the close button: removing the node here as well left chipsData holding\n // an entry whose element was gone.\n Utils.onDocumentReady(() => {\n const chips = document.querySelectorAll('.chips');\n chips.forEach((el) => {\n el.addEventListener('click', (e) => {\n if (el['Expressive_Chips']) return;\n if ((<HTMLElement>e.target).classList.contains('close')) {\n const chip = (<HTMLElement>e.target).closest('.chip');\n if (chip) chip.remove();\n }\n });\n });\n });\n }\n\n static {\n Chips._keydown = false;\n }\n}\n", "import { Component, BaseOptions, InitElements, MElement } from '../core/component';\nimport { Utils } from '../core/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface RangeOptions extends BaseOptions {}\n\nconst _defaults: RangeOptions = {};\n\nexport class Range extends Component<RangeOptions> {\n declare el: HTMLInputElement;\n private _mousedown: boolean;\n value: HTMLElement;\n thumb: HTMLElement;\n\n constructor(el: HTMLInputElement, options: Partial<RangeOptions>) {\n super(el, options, Range);\n this.el['Expressive_Range'] = this;\n\n this.options = {\n ...Range.defaults,\n ...options\n };\n\n this._mousedown = false;\n this._setupThumb();\n this._sync();\n this._setupEventHandlers();\n }\n\n static get defaults(): RangeOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Range.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<RangeOptions>): Range;\n /**\n * Initializes instances of Range.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<RangeOptions>\n ): Range[];\n /**\n * Initializes instances of Range.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<RangeOptions> = {}\n ): Range | Range[] {\n return super.init(els, options, Range);\n }\n\n static getInstance(el: HTMLInputElement): Range {\n return el['Expressive_Range'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._removeThumb();\n this.el['Expressive_Range'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('change', this._handleRangeChange);\n this.el.addEventListener('mousedown', this._handleRangeMousedownTouchstart);\n this.el.addEventListener('touchstart', this._handleRangeMousedownTouchstart);\n this.el.addEventListener('input', this._handleRangeInputMousemoveTouchmove);\n this.el.addEventListener('mousemove', this._handleRangeInputMousemoveTouchmove);\n // Never calls preventDefault, so it does not need to block scrolling.\n this.el.addEventListener('touchmove', this._handleRangeInputMousemoveTouchmove, {\n passive: true\n });\n this.el.addEventListener('mouseup', this._handleRangeMouseupTouchend);\n this.el.addEventListener('touchend', this._handleRangeMouseupTouchend);\n this.el.addEventListener('blur', this._handleRangeBlurMouseoutTouchleave);\n this.el.addEventListener('mouseout', this._handleRangeBlurMouseoutTouchleave);\n this.el.addEventListener('touchleave', this._handleRangeBlurMouseoutTouchleave);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('change', this._handleRangeChange);\n this.el.removeEventListener('mousedown', this._handleRangeMousedownTouchstart);\n this.el.removeEventListener('touchstart', this._handleRangeMousedownTouchstart);\n this.el.removeEventListener('input', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('mousemove', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('touchmove', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('mouseup', this._handleRangeMouseupTouchend);\n this.el.removeEventListener('touchend', this._handleRangeMouseupTouchend);\n this.el.removeEventListener('blur', this._handleRangeBlurMouseoutTouchleave);\n this.el.removeEventListener('mouseout', this._handleRangeBlurMouseoutTouchleave);\n this.el.removeEventListener('touchleave', this._handleRangeBlurMouseoutTouchleave);\n }\n\n _handleRangeChange = () => {\n this._sync();\n this.thumb.classList.add('active');\n };\n\n _handleRangeMousedownTouchstart = (e: MouseEvent | TouchEvent) => {\n this._mousedown = true;\n this.el.classList.add('active');\n this._sync();\n if (e.type !== 'input') {\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangeInputMousemoveTouchmove = () => {\n if (this._mousedown) {\n this._sync();\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangeMouseupTouchend = () => {\n this._mousedown = false;\n this.el.classList.remove('active');\n };\n\n _handleRangeBlurMouseoutTouchleave = () => {\n if (!this._mousedown) {\n this.thumb.classList.remove('active');\n }\n };\n\n _setupThumb() {\n this.thumb = document.createElement('span');\n this.value = document.createElement('span');\n this.thumb.classList.add('thumb');\n this.value.classList.add('value');\n this.thumb.append(this.value);\n this.el.after(this.thumb);\n }\n\n _removeThumb() {\n this.thumb.remove();\n }\n\n _isVertical(): boolean {\n return !!this.el.closest('.vertical');\n }\n\n _sync() {\n const max = parseFloat(this.el.getAttribute('max')) || 100;\n const min = parseFloat(this.el.getAttribute('min')) || 0;\n const val = parseFloat(this.el.value) || 0;\n const percent = max === min ? 0 : (val - min) / (max - min);\n\n // Read before writing. This runs on every pointer move during a drag, and\n // setting the custom property first made each of the four offset reads\n // below flush a fresh layout.\n const left = this.el.offsetLeft;\n const top = this.el.offsetTop;\n const width = this.el.offsetWidth;\n const height = this.el.offsetHeight;\n\n this.el.style.setProperty('--md-comp-slider-active-fraction', `${percent * 100}%`);\n this.value.textContent = this.el.value;\n if (this._isVertical()) {\n this.thumb.style.left = `${left + width / 2}px`;\n this.thumb.style.top = `${top + (1 - percent) * height}px`;\n } else {\n this.thumb.style.left = `${left + percent * width}px`;\n this.thumb.style.top = `${top}px`;\n }\n }\n\n /**\n * Initializes every range input in the current document.\n */\n static Init() {\n // Deferred like every other Init(): this ran at import time, so a bundle\n // loaded in <head> found no inputs at all.\n Utils.onDocumentReady(() => {\n Range.init(document.querySelectorAll('input[type=range]') as NodeListOf<HTMLInputElement>, {});\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\ntype ClosedBy = 'any' | 'closerequest' | 'none';\n\n/**\n * Light-dismiss for native `<dialog>` elements.\n *\n * `showModal()` does not close on a backdrop tap. A naive `click` listener\n * on the dialog (where `::backdrop` events retarget) also fires when the\n * user starts a gesture on the dialog and releases on the scrim \u2014 selecting\n * text, missing a button, dragging a thumb. Both ends of the pointer\n * gesture must land outside the dialog's border box.\n *\n * Default is on. Opt out with `closedby=\"none\"` or `closedby=\"closerequest\"`.\n * If the browser already honours `closedby=\"any\"`, we leave that alone.\n */\nexport class Dialogs {\n private static _down: { dialog: HTMLDialogElement; pointerId: number } | null = null;\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('pointerdown', Dialogs._onPointerDown, { passive: true });\n document.addEventListener('pointerup', Dialogs._onPointerUp, { passive: true });\n document.addEventListener('pointercancel', Dialogs._onPointerCancel, { passive: true });\n });\n }\n\n static _onPointerDown(event: PointerEvent) {\n if (!Dialogs._isPrimaryPress(event)) {\n Dialogs._down = null;\n return;\n }\n const dialog = Dialogs._backdropDialog(event);\n if (!dialog || !Dialogs._lightDismissible(dialog) || !Dialogs._outside(event, dialog)) {\n Dialogs._down = null;\n return;\n }\n Dialogs._down = { dialog, pointerId: event.pointerId };\n }\n\n static _onPointerUp(event: PointerEvent) {\n const started = Dialogs._down;\n Dialogs._down = null;\n if (!started || started.pointerId !== event.pointerId) return;\n if (!event.isPrimary) return;\n if (!started.dialog.isConnected || !started.dialog.open) return;\n if (!Dialogs._lightDismissible(started.dialog)) return;\n if (Dialogs._backdropDialog(event) !== started.dialog) return;\n if (Dialogs._outside(event, started.dialog)) {\n started.dialog.close();\n }\n }\n\n static _onPointerCancel() {\n Dialogs._down = null;\n }\n\n /** Backdrop hits retarget to the dialog itself, never a child. */\n private static _backdropDialog(event: Event): HTMLDialogElement | null {\n const target = event.target;\n if (!(target instanceof HTMLDialogElement) || !target.open) return null;\n return target;\n }\n\n private static _outside(event: PointerEvent, dialog: HTMLDialogElement): boolean {\n const rect = dialog.getBoundingClientRect();\n return (\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n );\n }\n\n private static _isPrimaryPress(event: PointerEvent): boolean {\n if (!event.isPrimary) return false;\n return event.pointerType !== 'mouse' || event.button === 0;\n }\n\n private static _lightDismissible(dialog: HTMLDialogElement): boolean {\n const value = Dialogs._closedBy(dialog);\n if (value === 'none' || value === 'closerequest') return false;\n // Native closedby=\"any\" already light-dismisses with the same\n // \"both ends outside\" rule. Don't race it.\n if (value === 'any' && 'closedBy' in HTMLDialogElement.prototype) return false;\n return true;\n }\n\n // Read the attribute only. The IDL default for an unset closedby is\n // \"closerequest\" (Escape, no light dismiss) \u2014 treating that as an\n // author opt-out made every dialog undismissable from the scrim.\n private static _closedBy(dialog: HTMLDialogElement): ClosedBy | null {\n const attr = dialog.getAttribute('closedby');\n if (attr === 'any' || attr === 'closerequest' || attr === 'none') return attr;\n return null;\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport class Forms {\n /**\n * Checks if the label has validation and apply\n * the correct class and styles\n * @param textfield\n */\n static validateField(textfield: HTMLInputElement) {\n if (!textfield) {\n console.error('No text field element found');\n return;\n }\n\n const hasLength = textfield.getAttribute('data-length') !== null;\n const lenAttr = parseInt(textfield.getAttribute('data-length'));\n const len = textfield.value.length;\n\n if (\n len === 0 &&\n textfield.validity.badInput === false &&\n !textfield.required &&\n textfield.classList.contains('validate')\n ) {\n textfield.classList.remove('invalid');\n } else if (textfield.classList.contains('validate')) {\n // Check for character counter attributes\n if (\n (textfield.validity.valid && hasLength && len <= lenAttr) ||\n (textfield.validity.valid && !hasLength)\n ) {\n textfield.classList.remove('invalid');\n } else {\n textfield.classList.add('invalid');\n }\n }\n }\n\n /**\n * Resizes the given TextArea after updating the\n * value content dynamically.\n * @param e EventTarget\n */\n static textareaAutoResize(e: EventTarget) {\n const textarea = e as HTMLTextAreaElement;\n if (!textarea) return;\n\n // Measure the textarea against itself: collapse it to its natural height,\n // then read the content height back. `.expressive-textarea` is\n // `overflow-y: hidden`, so scrollHeight is the full content height and\n // offsetHeight - clientHeight is exactly the borders (no scrollbar to\n // account for) - which border-box sizing needs added back.\n //\n // This replaces a mirror div that the value was copied into via\n // `innerHTML = innerHTML.replace(...)` - a full serialize and reparse of\n // the text on every keystroke, plus getComputedStyle and seven style\n // writes, run twice per keystroke because it was bound to keydown and\n // keyup both.\n if (!textarea.hasAttribute('original-height')) {\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n }\n const originalHeight = parseInt(textarea.getAttribute('original-height'));\n if (isNaN(originalHeight)) return;\n\n textarea.style.height = 'auto';\n // Three reads after a single write: one layout flush for the whole resize.\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const contentHeight = textarea.scrollHeight + borders;\n textarea.style.height = Math.max(originalHeight, contentHeight) + 'px';\n }\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('change', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n if (target instanceof HTMLInputElement) {\n // The sibling-label loop that used to live here compared\n // `tagName == 'label'` (tagName is uppercase) so it never matched,\n // and no rule in the Sass styles `label.active` anyway - the\n // floating label is driven by CSS, not by a class from here.\n Forms.validateField(target);\n }\n });\n\n document.addEventListener('keyup', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n // Radio and Checkbox focus class\n if (target instanceof HTMLInputElement && ['radio', 'checkbox'].includes(target.type)) {\n // TAB, check if tabbing to radio or checkbox.\n if (Utils.keys.TAB.includes(e.key)) {\n target.classList.add('tabbed');\n target.addEventListener('blur', () => target.classList.remove('tabbed'), {\n once: true\n });\n }\n }\n });\n\n document.querySelectorAll('.expressive-textarea').forEach((textArea: HTMLTextAreaElement) => {\n Forms.InitTextarea(textArea);\n });\n\n // File Input Path\n document\n .querySelectorAll('.file-field input[type=\"file\"]')\n .forEach((fileInput: HTMLInputElement) => {\n Forms.InitFileInputPath(fileInput);\n });\n });\n }\n\n static InitTextarea(textarea: HTMLTextAreaElement) {\n // Save Data in Element\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n Forms.textareaAutoResize(textarea);\n // `input` rather than keydown + keyup: it fires once per actual value\n // change and also covers paste, drag-drop and IME composition, which the\n // key events missed.\n textarea.addEventListener('input', (e) => Forms.textareaAutoResize(e.target));\n }\n\n static InitFileInputPath(fileInput: HTMLInputElement) {\n fileInput.addEventListener('change', () => {\n const fileField = fileInput.closest('.file-field');\n const pathInput = <HTMLInputElement>fileField.querySelector('input.file-path');\n const files = fileInput.files;\n const filenames = [];\n for (let i = 0; i < files.length; i++) {\n filenames.push(files[i].name);\n }\n pathInput.value = filenames.join(', ');\n pathInput.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\ntype RGBColor = {\n r: number;\n g: number;\n b: number;\n};\n\ntype Position = {\n x: number;\n y: number;\n};\n\nexport class Waves {\n private static _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.pageYOffset - docElem.clientTop,\n left: box.left + window.pageXOffset - docElem.clientLeft\n };\n }\n\n // https://phoenix-dx.com/css-techniques-for-material-ripple-effect/\n\n static renderWaveEffect(\n targetElement: HTMLElement,\n position: Position | null = null,\n color: RGBColor | null = null\n ): void {\n const isCentered = position === null;\n const duration = 500;\n let animationFrame: number, animationStart: number;\n const animationStep = function (timestamp: number) {\n if (!animationStart) {\n animationStart = timestamp;\n }\n const frame = timestamp - animationStart;\n if (frame < duration) {\n const easing = (frame / duration) * (2 - frame / duration);\n const circle = isCentered\n ? 'circle at 50% 50%'\n : `circle at ${position.x}px ${position.y}px`;\n const waveColor = `rgba(${color?.r || 0}, ${color?.g || 0}, ${color?.b || 0}, ${0.3 * (1 - easing)})`;\n const stop = 90 * easing + '%';\n targetElement.style.backgroundImage =\n 'radial-gradient(' +\n circle +\n ', ' +\n waveColor +\n ' ' +\n stop +\n ', transparent ' +\n stop +\n ')';\n animationFrame = window.requestAnimationFrame(animationStep);\n } else {\n targetElement.style.backgroundImage = 'none';\n window.cancelAnimationFrame(animationFrame);\n }\n };\n animationFrame = window.requestAnimationFrame(animationStep);\n }\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.body.addEventListener('click', (e) => {\n const trigger = <HTMLElement>e.target;\n const el = <HTMLElement>trigger.closest('.waves-effect');\n if (el && el.contains(trigger)) {\n const isCircular = el.classList.contains('waves-circle');\n const offset = Waves._offset(el); // one rect, not one per axis\n const x = e.pageX - offset.left;\n const y = e.pageY - offset.top;\n\n let color = null;\n if (el.classList.contains('waves-light')) color = { r: 255, g: 255, b: 255 };\n\n Waves.renderWaveEffect(el, isCircular ? null : { x, y }, color);\n }\n });\n });\n }\n}\n", "import { Component, BaseOptions, InitElements, MElement, Openable } from \"../core/component\";\nimport { Utils } from '../core/utils';\n\nexport interface FloatingActionButtonOptions extends BaseOptions {\n /**\n * Direction FAB menu opens.\n * @default \"top\"\n */\n direction: 'top' | 'right' | 'bottom' | 'left';\n /**\n * true: FAB menu appears on hover, false: FAB menu appears on click.\n * @default true\n */\n hoverEnabled: boolean;\n /**\n * Enable transit the FAB into a toolbar on click.\n * @default false\n */\n toolbarEnabled: boolean;\n}\n\nconst _defaults: FloatingActionButtonOptions = {\n direction: 'top',\n hoverEnabled: true,\n toolbarEnabled: false\n};\n\nexport class FloatingActionButton\n extends Component<FloatingActionButtonOptions>\n implements Openable\n{\n /**\n * Describes open/close state of FAB.\n */\n isOpen: boolean;\n\n private _anchor: HTMLElement;\n private _menu: HTMLElement | null;\n private _floatingBtns: HTMLElement[];\n private _floatingBtnsReverse: HTMLElement[];\n /** Toolbar-mode backdrop, kept so closing can take it back out. */\n private _backdrop: HTMLElement | null = null;\n\n offsetY: number;\n offsetX: number;\n btnBottom: number;\n btnLeft: number;\n btnWidth: number;\n\n constructor(el: HTMLElement, options: Partial<FloatingActionButtonOptions>) {\n super(el, options, FloatingActionButton);\n this.el['Expressive_FloatingActionButton'] = this;\n\n this.options = {\n ...FloatingActionButton.defaults,\n ...options\n };\n\n this.isOpen = false;\n this._anchor = this.el.querySelector('a, button');\n this._menu = this.el.querySelector('ul');\n this._floatingBtns = Array.from(this.el.querySelectorAll('ul .btn-floating'));\n this._floatingBtnsReverse = this._floatingBtns.reverse();\n this.offsetY = 0;\n this.offsetX = 0;\n\n this.el.classList.add(`direction-${this.options.direction}`);\n if (this._anchor) this._anchor.tabIndex = 0;\n if (this._menu) this._menu.ariaExpanded = 'false';\n if (this.options.direction === 'top')\n this.offsetY = 40;\n else if (this.options.direction === 'right')\n this.offsetX = -40;\n else if (this.options.direction === 'bottom')\n this.offsetY = -40;\n else\n this.offsetX = 40;\n this._setupEventHandlers();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of FloatingActionButton.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(\n el: HTMLElement,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton;\n /**\n * Initializes instances of FloatingActionButton.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<MElement>,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton[];\n /**\n * Initializes instances of FloatingActionButton.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<FloatingActionButtonOptions> = {}\n ): FloatingActionButton | FloatingActionButton[] {\n return super.init(els, options, FloatingActionButton);\n }\n\n static getInstance(el: HTMLElement): FloatingActionButton {\n return el['Expressive_FloatingActionButton'];\n }\n\n destroy() {\n this._removeEventHandlers();\n // Toolbar mode parks a capture-phase scroll listener and a body click\n // listener on the document; close() is what takes them back off.\n this.close();\n this.el['Expressive_FloatingActionButton'] = undefined;\n }\n\n _setupEventHandlers() {\n if (this.options.hoverEnabled && !this.options.toolbarEnabled) {\n this.el.addEventListener('mouseenter', this.open);\n this.el.addEventListener('mouseleave', this.close);\n } else {\n this.el.addEventListener('click', this._handleFABClick);\n }\n this.el.addEventListener('keypress', this._handleFABKeyPress);\n }\n\n _removeEventHandlers() {\n if (this.options.hoverEnabled && !this.options.toolbarEnabled) {\n this.el.removeEventListener('mouseenter', this.open);\n this.el.removeEventListener('mouseleave', this.close);\n } else {\n this.el.removeEventListener('click', this._handleFABClick);\n }\n this.el.removeEventListener('keypress', this._handleFABKeyPress);\n }\n\n _handleFABClick = () => {\n this._handleFABToggle()\n}\n\n _handleFABKeyPress = (e) => {\n if(Utils.keys.ENTER.includes(e.key)) {\n this._handleFABToggle();\n }\n }\n\n _handleFABToggle = () => {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const elem = e.target;\n if (elem !== this._menu) this.close();\n };\n\n /**\n * Open FAB.\n */\n open = (): void => {\n if (this.isOpen) return;\n if (this.options.toolbarEnabled) this._animateInToolbar();\n else this._animateInFAB();\n this.isOpen = true;\n };\n\n /**\n * Close FAB.\n */\n close = (): void => {\n if (!this.isOpen) return;\n if (this.options.toolbarEnabled) {\n window.removeEventListener('scroll', this.close, true);\n document.body.removeEventListener('click', this._handleDocumentClick, true);\n this._animateOutToolbar();\n } else {\n this._animateOutFAB();\n }\n this.isOpen = false;\n };\n\n _animateInFAB() {\n this.el.classList.add('active');\n if (this._menu) this._menu.ariaExpanded = 'true';\n const delayIncrement = 40;\n const duration = 275;\n\n this._floatingBtnsReverse.forEach((el, index) => {\n const delay = delayIncrement * index;\n el.style.transition = 'none';\n el.style.opacity = '0';\n el.style.transform = `translate(${this.offsetX}px, ${this.offsetY}px) scale(0.4)`;\n setTimeout(() => {\n // from:\n el.style.opacity = '0.4';\n // easeInOutQuad\n setTimeout(() => {\n // to:\n el.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n el.style.opacity = '1';\n el.style.transform = 'translate(0, 0) scale(1)';\n el.tabIndex = 0;\n }, 1);\n }, delay);\n });\n }\n\n _animateOutFAB() {\n const duration = 175;\n setTimeout(() => {\n this.el.classList.remove('active');\n if (this._menu) this._menu.ariaExpanded = 'false';\n }, duration);\n this._floatingBtnsReverse.forEach((el) => {\n el.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n el.style.opacity = '0';\n el.style.transform = `translate(${this.offsetX}px, ${this.offsetY}px) scale(0.4)`;\n el.tabIndex = -1;\n });\n }\n\n _animateInToolbar() {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const btnRect = this.el.getBoundingClientRect();\n const fabColor = getComputedStyle(this._anchor).backgroundColor;\n\n // The backdrop has to be in the document before it has a width. Reading\n // `backdrop[0].clientWidth` off a bare element - a leftover from the\n // cash-based original, where [0] unwrapped the collection - threw here and\n // took the whole of toolbar mode with it.\n const backdrop = document.createElement('div');\n backdrop.classList.add('fab-backdrop');\n backdrop.style.backgroundColor = fabColor;\n this._anchor.append(backdrop);\n this._backdrop = backdrop;\n const backdropWidth = backdrop.clientWidth;\n const scaleFactor = backdropWidth > 0 ? windowWidth / backdropWidth : 1;\n\n this.offsetX = btnRect.left - windowWidth / 2 + btnRect.width / 2;\n this.offsetY = windowHeight - btnRect.bottom;\n this.btnBottom = btnRect.bottom;\n this.btnLeft = btnRect.left;\n this.btnWidth = btnRect.width;\n\n // Set initial state\n this.el.classList.add('active');\n this.el.style.textAlign = 'center';\n this.el.style.width = '100%';\n this.el.style.bottom = '0';\n this.el.style.left = '0';\n this.el.style.transform = 'translateX(' + this.offsetX + 'px)';\n this.el.style.transition = 'none';\n if (this._menu) this._menu.ariaExpanded = 'true';\n\n // Was missing its closing paren, so the browser dropped the declaration.\n this._anchor.style.transform = `translateY(${this.offsetY}px)`;\n this._anchor.style.transition = 'none';\n\n setTimeout(() => {\n this.el.style.transform = '';\n this.el.style.transition =\n 'transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s';\n\n this._anchor.style.overflow = 'visible';\n this._anchor.style.transform = '';\n this._anchor.style.transition = 'transform .2s';\n\n setTimeout(() => {\n this.el.style.overflow = 'hidden';\n this.el.style.backgroundColor = fabColor;\n\n backdrop.style.transform = 'scale(' + scaleFactor + ')';\n backdrop.style.transition = 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)';\n\n this._menu.querySelectorAll('li > a').forEach((a: HTMLAnchorElement) => {\n a.style.opacity = '1';\n a.tabIndex = 0;\n });\n\n // Scroll to close.\n window.addEventListener('scroll', this.close, true);\n document.body.addEventListener('click', this._handleDocumentClick, true);\n }, 100);\n }, 0);\n }\n\n /**\n * Reverse {@link _animateInToolbar}.\n *\n * Closing used to only unbind the listeners, leaving the FAB stretched\n * across the viewport with its backdrop still in the DOM - and a fresh\n * backdrop appended on every subsequent open.\n */\n _animateOutToolbar() {\n const backdrop = this._backdrop;\n this._backdrop = null;\n\n this._menu?.querySelectorAll('li > a').forEach((a: HTMLAnchorElement) => {\n a.style.opacity = '';\n a.tabIndex = -1;\n });\n\n if (backdrop) {\n backdrop.style.transition = 'transform .2s';\n backdrop.style.transform = 'scale(0)';\n }\n\n this.el.style.overflow = '';\n this.el.style.backgroundColor = '';\n this.el.style.transition = 'transform .2s';\n this.el.style.transform = `translateX(${this.offsetX}px)`;\n this._anchor.style.transition = 'transform .2s';\n this._anchor.style.transform = `translateY(${this.offsetY}px)`;\n\n setTimeout(() => {\n backdrop?.remove();\n this.el.classList.remove('active');\n if (this._menu) this._menu.ariaExpanded = 'false';\n // Clear every inline style _animateInToolbar wrote.\n this.el.style.textAlign = '';\n this.el.style.width = '';\n this.el.style.bottom = '';\n this.el.style.left = '';\n this.el.style.transform = '';\n this.el.style.transition = '';\n this._anchor.style.overflow = '';\n this._anchor.style.transform = '';\n this._anchor.style.transition = '';\n }, 200);\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface CarouselOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 200\n */\n duration: number;\n /**\n * Perspective zoom. If 0, all items are the same size.\n * @default -100\n */\n dist: number;\n /**\n * Set the spacing of the center item.\n * @default 0\n */\n shift: number;\n /**\n * Set the padding between non center items.\n * @default 0\n */\n padding: number;\n /**\n * Set the number of visible items.\n * @default 5\n */\n numVisible: number;\n /**\n * Make the carousel a full width slider like the second example.\n * @default false\n */\n fullWidth: boolean;\n /**\n * Set to true to show indicators.\n * @default false\n */\n indicators: boolean;\n /**\n * Don't wrap around and cycle through items.\n * @default false\n */\n noWrap: boolean;\n /**\n * Callback for when a new slide is cycled to.\n * @default null\n */\n onCycleTo: (current: Element, dragged: boolean) => void;\n}\n\nconst _defaults: CarouselOptions = {\n duration: 200, // ms\n dist: -100, // zoom scale TODO: make this more intuitive as an option\n shift: 0, // spacing for center image\n padding: 0, // Padding between non center items\n numVisible: 5, // Number of visible items in carousel\n fullWidth: false, // Change to full width styles\n indicators: false, // Toggle indicators\n noWrap: false, // Don't wrap around and cycle through items.\n onCycleTo: null // Callback for when a new slide is cycled to.\n};\n\nexport class Carousel extends Component<CarouselOptions> {\n hasMultipleSlides: boolean;\n showIndicators: boolean;\n noWrap: boolean;\n /** If the carousel is being clicked or tapped. */\n pressed: boolean;\n /** If the carousel is currently being dragged. */\n dragged: boolean;\n offset: number;\n target: number;\n images: HTMLElement[];\n itemWidth: number;\n itemHeight: number;\n dim: number;\n _indicators: HTMLUListElement;\n count: number;\n verticalDragged: boolean;\n reference: number;\n referenceY: number;\n velocity: number;\n frame: number;\n timestamp: number;\n ticker: ReturnType<typeof setTimeout>;\n amplitude: number;\n /** The index of the center carousel item. */\n center: number = 0;\n imageHeight: number;\n scrollingTimeout: ReturnType<typeof setTimeout>;\n oneTimeCallback: (current: Element, dragged: boolean) => void | null;\n\n constructor(el: HTMLElement, options: Partial<CarouselOptions>) {\n super(el, options, Carousel);\n this.el['Expressive_Carousel'] = this;\n\n this.options = {\n ...Carousel.defaults,\n ...options\n };\n\n // Setup\n this.hasMultipleSlides = this.el.querySelectorAll('.carousel-item').length > 1;\n this.showIndicators = this.options.indicators && this.hasMultipleSlides;\n this.noWrap = this.options.noWrap || !this.hasMultipleSlides;\n this.pressed = false;\n this.dragged = false;\n this.offset = this.target = 0;\n this.images = [];\n const firstItem = this.el.querySelector('.carousel-item');\n if (!firstItem) {\n console.error('Carousel: no .carousel-item elements to show');\n return;\n }\n this.itemWidth = firstItem.clientWidth;\n this.itemHeight = firstItem.clientHeight;\n this.dim = this.itemWidth * 2 + this.options.padding || 1; // Make sure dim is non zero for divisions.\n\n // Full Width carousel setup\n if (this.options.fullWidth) {\n this.options.dist = 0;\n this._setCarouselHeight();\n\n // Offset fixed items when indicators.\n if (this.showIndicators) {\n this.el.querySelector('.carousel-fixed-item')?.classList.add('with-indicators');\n }\n }\n\n // Iterate through slides\n this._indicators = document.createElement('ul');\n this._indicators.classList.add('indicators');\n\n this.el.querySelectorAll('.carousel-item').forEach((item: HTMLElement, i) => {\n this.images.push(item);\n if (this.showIndicators) {\n const indicator = document.createElement('li');\n indicator.classList.add('indicator-item');\n indicator.tabIndex = 0;\n if (i === 0) {\n indicator.classList.add('active');\n }\n this._indicators.appendChild(indicator);\n }\n });\n\n if (this.showIndicators) this.el.appendChild(this._indicators);\n\n this.count = this.images.length;\n\n // Cap numVisible at count\n this.options.numVisible = Math.min(this.count, this.options.numVisible);\n\n this._setupEventHandlers();\n this._scroll(this.offset);\n }\n\n static get defaults(): CarouselOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Carousel.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CarouselOptions>): Carousel;\n /**\n * Initializes instances of Carousel.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<CarouselOptions>): Carousel[];\n /**\n * Initializes instances of Carousel.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<CarouselOptions> = {}\n ): Carousel | Carousel[] {\n return super.init(els, options, Carousel);\n }\n\n static getInstance(el: HTMLElement): Carousel {\n return el['Expressive_Carousel'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_Carousel'] = undefined;\n }\n\n _setupEventHandlers() {\n if (typeof window.ontouchstart !== 'undefined') {\n this.el.addEventListener('touchstart', this._handleCarouselTap);\n this.el.addEventListener('touchmove', this._handleCarouselDrag);\n this.el.addEventListener('touchend', this._handleCarouselRelease);\n }\n this.el.addEventListener('mousedown', this._handleCarouselTap);\n this.el.addEventListener('mousemove', this._handleCarouselDrag);\n this.el.addEventListener('mouseup', this._handleCarouselRelease);\n this.el.addEventListener('mouseleave', this._handleCarouselRelease);\n this.el.addEventListener('click', this._handleCarouselClick);\n if (this.showIndicators && this._indicators) {\n this._indicators.querySelectorAll('.indicator-item').forEach((el) => {\n el.addEventListener('click', this._handleIndicatorClick);\n el.addEventListener('keypress', this._handleIndicatorKeyPress);\n });\n }\n // Resize\n window.addEventListener('resize', this._handleThrottledResize);\n }\n\n _removeEventHandlers() {\n if (typeof window.ontouchstart !== 'undefined') {\n this.el.removeEventListener('touchstart', this._handleCarouselTap);\n this.el.removeEventListener('touchmove', this._handleCarouselDrag);\n this.el.removeEventListener('touchend', this._handleCarouselRelease);\n }\n this.el.removeEventListener('mousedown', this._handleCarouselTap);\n this.el.removeEventListener('mousemove', this._handleCarouselDrag);\n this.el.removeEventListener('mouseup', this._handleCarouselRelease);\n this.el.removeEventListener('mouseleave', this._handleCarouselRelease);\n this.el.removeEventListener('click', this._handleCarouselClick);\n if (this.showIndicators && this._indicators) {\n this._indicators.querySelectorAll('.indicator-item').forEach((el) => {\n el.removeEventListener('click', this._handleIndicatorClick);\n });\n }\n window.removeEventListener('resize', this._handleThrottledResize);\n }\n\n // Built once per instance. Creating the throttled function inside the\n // handler - as this used to - produced a fresh closure per resize event and\n // never actually called it, so resizing did nothing at all.\n _handleThrottledResize = Utils.throttle(() => this._handleResize(), 200);\n\n _handleCarouselTap = (e: MouseEvent | TouchEvent) => {\n // Fixes firefox draggable image bug\n if (e.type === 'mousedown' && (<HTMLElement>e.target).tagName === 'IMG') {\n e.preventDefault();\n }\n this.pressed = true;\n this.dragged = false;\n this.verticalDragged = false;\n this.reference = this._xpos(e);\n this.referenceY = this._ypos(e);\n\n this.velocity = this.amplitude = 0;\n this.frame = this.offset;\n this.timestamp = Date.now();\n clearInterval(this.ticker);\n this.ticker = setInterval(this._track, 100);\n };\n\n _handleCarouselDrag = (e: MouseEvent | TouchEvent) => {\n let x: number, y: number, delta: number, deltaY: number;\n if (this.pressed) {\n x = this._xpos(e);\n y = this._ypos(e);\n delta = this.reference - x;\n deltaY = Math.abs(this.referenceY - y);\n if (deltaY < 30 && !this.verticalDragged) {\n // If vertical scrolling don't allow dragging.\n if (delta > 2 || delta < -2) {\n this.dragged = true;\n this.reference = x;\n this._scroll(this.offset + delta);\n }\n } else if (this.dragged) {\n // If dragging don't allow vertical scroll.\n e.preventDefault();\n e.stopPropagation();\n return false;\n } else {\n // Vertical scrolling.\n this.verticalDragged = true;\n }\n }\n if (this.dragged) {\n // If dragging don't allow vertical scroll.\n e.preventDefault();\n e.stopPropagation();\n return false;\n }\n };\n\n _handleCarouselRelease = (e: MouseEvent | TouchEvent) => {\n if (this.pressed) {\n this.pressed = false;\n } else {\n return;\n }\n clearInterval(this.ticker);\n this.target = this.offset;\n if (this.velocity > 10 || this.velocity < -10) {\n this.amplitude = 0.9 * this.velocity;\n this.target = this.offset + this.amplitude;\n }\n this.target = Math.round(this.target / this.dim) * this.dim;\n // No wrap of items.\n if (this.noWrap) {\n if (this.target >= this.dim * (this.count - 1)) {\n this.target = this.dim * (this.count - 1);\n } else if (this.target < 0) {\n this.target = 0;\n }\n }\n this.amplitude = this.target - this.offset;\n this.timestamp = Date.now();\n requestAnimationFrame(this._autoScroll);\n if (this.dragged) {\n e.preventDefault();\n e.stopPropagation();\n }\n return false;\n };\n\n _handleCarouselClick = (e: MouseEvent | TouchEvent) => {\n // Disable clicks if carousel was dragged.\n if (this.dragged) {\n e.preventDefault();\n e.stopPropagation();\n return false;\n } else if (!this.options.fullWidth) {\n const clickedElem = (<HTMLElement>e.target).closest('.carousel-item');\n if (!clickedElem) return;\n const clickedIndex = [...clickedElem.parentNode.children].indexOf(clickedElem);\n const diff = this._wrap(this.center) - clickedIndex;\n // Disable clicks if carousel was shifted by click\n if (diff !== 0) {\n e.preventDefault();\n e.stopPropagation();\n }\n // fixes https://github.com/materializecss/materialize/issues/180\n if (clickedIndex < 0) {\n // relative X position > center of carousel = clicked at the right part of the carousel\n if (\n (e as MouseEvent).clientX - (e.target as HTMLElement).getBoundingClientRect().left >\n this.el.clientWidth / 2\n ) {\n this.next();\n } else {\n this.prev();\n }\n } else {\n this._cycleTo(clickedIndex);\n }\n }\n };\n\n _handleIndicatorClick = (e: Event) => {\n e.stopPropagation();\n this._handleIndicatorInteraction(e);\n };\n\n _handleIndicatorKeyPress = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleIndicatorInteraction(e);\n }\n };\n\n _handleIndicatorInteraction = (e: Event) => {\n const indicator = (<HTMLElement>e.target).closest('.indicator-item');\n if (indicator) {\n const index = [...indicator.parentNode.children].indexOf(indicator);\n this._cycleTo(index);\n }\n };\n\n _handleResize = () => {\n if (this.options.fullWidth) {\n const firstItem = this.el.querySelector('.carousel-item');\n const activeItem = this.el.querySelector('.carousel-item.active');\n if (!firstItem || !activeItem) return;\n this.itemWidth = firstItem.clientWidth;\n this.imageHeight = activeItem.clientHeight;\n this.dim = this.itemWidth * 2 + this.options.padding;\n this.offset = this.center * 2 * this.itemWidth;\n this.target = this.offset;\n this._setCarouselHeight(true);\n } else {\n this._scroll();\n }\n };\n\n _setCarouselHeight(imageOnly: boolean = false) {\n const firstSlide = this.el.querySelector('.carousel-item.active')\n ? this.el.querySelector('.carousel-item.active')\n : this.el.querySelector('.carousel-item');\n\n const firstImage = firstSlide.querySelector('img');\n if (firstImage) {\n if (firstImage.complete) {\n // If image won't trigger the load event\n const imageHeight = firstImage.clientHeight;\n if (imageHeight > 0) {\n this.el.style.height = imageHeight + 'px';\n } else {\n // If image still has no height, use the natural dimensions to calculate\n const naturalWidth = firstImage.naturalWidth;\n const naturalHeight = firstImage.naturalHeight;\n const adjustedHeight = (this.el.clientWidth / naturalWidth) * naturalHeight;\n this.el.style.height = adjustedHeight + 'px';\n }\n } else {\n // Get height when image is loaded normally\n firstImage.addEventListener('load', () => {\n this.el.style.height = firstImage.offsetHeight + 'px';\n });\n }\n } else if (!imageOnly) {\n const slideHeight = firstSlide.clientHeight;\n this.el.style.height = slideHeight + 'px';\n }\n }\n\n _xpos(e: MouseEvent | TouchEvent) {\n // touch event\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return (e as TouchEvent).targetTouches[0].clientX;\n }\n // mouse event\n return (e as MouseEvent).clientX;\n }\n\n _ypos(e: MouseEvent | TouchEvent) {\n // touch event\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return (e as TouchEvent).targetTouches[0].clientY;\n }\n // mouse event\n return (e as MouseEvent).clientY;\n }\n\n _wrap(x: number) {\n return x >= this.count ? x % this.count : x < 0 ? this._wrap(this.count + (x % this.count)) : x;\n }\n\n _track = () => {\n const now: number = Date.now(),\n elapsed: number = now - this.timestamp,\n delta: number = this.offset - this.frame,\n v: number = (1000 * delta) / (1 + elapsed);\n // now = Date.now();\n // elapsed = now - this.timestamp;\n this.timestamp = now;\n // delta = this.offset - this.frame;\n this.frame = this.offset;\n // v = (1000 * delta) / (1 + elapsed);\n this.velocity = 0.8 * v + 0.2 * this.velocity;\n };\n\n _autoScroll = () => {\n let elapsed: number, delta: number;\n if (this.amplitude) {\n elapsed = Date.now() - this.timestamp;\n delta = this.amplitude * Math.exp(-elapsed / this.options.duration);\n if (delta > 2 || delta < -2) {\n this._scroll(this.target - delta);\n requestAnimationFrame(this._autoScroll);\n } else {\n this._scroll(this.target);\n }\n }\n };\n\n _scroll(x: number = 0) {\n // Track scrolling state\n if (!this.el.classList.contains('scrolling')) {\n this.el.classList.add('scrolling');\n }\n if (this.scrollingTimeout != null) {\n clearTimeout(this.scrollingTimeout);\n }\n this.scrollingTimeout = setTimeout(() => {\n this.el.classList.remove('scrolling');\n }, this.options.duration);\n\n // Start actual scroll\n this.offset = typeof x === 'number' ? x : this.offset;\n this.center = Math.floor((this.offset + this.dim / 2) / this.dim);\n\n const half: number = this.count >> 1,\n delta: number = this.offset - this.center * this.dim,\n dir: number = delta < 0 ? 1 : -1,\n tween: number = (-dir * delta * 2) / this.dim;\n let i: number,\n el: HTMLElement,\n alignment: string,\n zTranslation: number,\n tweenedOpacity: number,\n centerTweenedOpacity: number;\n const lastCenter = this.center;\n const numVisibleOffset = 1 / this.options.numVisible;\n\n // delta = this.offset - this.center * this.dim;\n // dir = delta < 0 ? 1 : -1;\n // tween = (-dir * delta * 2) / this.dim;\n // half = this.count >> 1;\n\n if (this.options.fullWidth) {\n alignment = 'translateX(0)';\n centerTweenedOpacity = 1;\n } else {\n alignment = 'translateX(' + (this.el.clientWidth - this.itemWidth) / 2 + 'px) ';\n alignment += 'translateY(' + (this.el.clientHeight - this.itemHeight) / 2 + 'px)';\n centerTweenedOpacity = 1 - numVisibleOffset * tween;\n }\n\n // Set indicator active\n if (this.showIndicators) {\n const diff = this.center % this.count;\n const activeIndicator = this._indicators.querySelector('.indicator-item.active');\n const activeIndicatorIndex = [...activeIndicator.parentNode.children].indexOf(\n activeIndicator\n );\n if (activeIndicatorIndex !== diff) {\n activeIndicator.classList.remove('active');\n const pos = diff < 0 ? this.count + diff : diff;\n this._indicators.querySelectorAll('.indicator-item')[pos].classList.add('active');\n }\n }\n\n // center\n // Don't show wrapped items.\n if (!this.noWrap || (this.center >= 0 && this.center < this.count)) {\n el = this.images[this._wrap(this.center)];\n\n // Add active class to center item. Clear it off whichever item actually\n // has it - this used to unconditionally clear the *first* item.\n if (!el.classList.contains('active')) {\n this.el.querySelector('.carousel-item.active')?.classList.remove('active');\n el.classList.add('active');\n }\n // The transform for the centre item is written once, after the loop\n // below. A second copy used to be written here too, multiplied by `i` -\n // which is not assigned until the loop starts, so it produced\n // `translateX(NaNpx)` and the browser dropped the declaration.\n }\n\n for (i = 1; i <= half; ++i) {\n // right side\n if (this.options.fullWidth) {\n zTranslation = this.options.dist;\n tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1;\n } else {\n zTranslation = this.options.dist * (i * 2 + tween * dir);\n tweenedOpacity = 1 - numVisibleOffset * (i * 2 + tween * dir);\n }\n // Don't show wrapped items.\n if (!this.noWrap || this.center + i < this.count) {\n el = this.images[this._wrap(this.center + i)];\n const transformString = `${alignment} translateX(${\n this.options.shift + (this.dim * i - delta) / 2\n }px) translateZ(${zTranslation}px)`;\n this._updateItemStyle(el, tweenedOpacity, -i, transformString);\n }\n // left side\n if (this.options.fullWidth) {\n zTranslation = this.options.dist;\n tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1;\n } else {\n zTranslation = this.options.dist * (i * 2 - tween * dir);\n tweenedOpacity = 1 - numVisibleOffset * (i * 2 - tween * dir);\n }\n // Don't show wrapped items.\n if (!this.noWrap || this.center - i >= 0) {\n el = this.images[this._wrap(this.center - i)];\n const transformString = `${alignment} translateX(${\n -this.options.shift + (-this.dim * i - delta) / 2\n }px) translateZ(${zTranslation}px)`;\n this._updateItemStyle(el, tweenedOpacity, -i, transformString);\n }\n }\n // center\n // Don't show wrapped items.\n if (!this.noWrap || (this.center >= 0 && this.center < this.count)) {\n el = this.images[this._wrap(this.center)];\n const transformString = `${alignment} translateX(${-delta / 2}px) translateX(${\n dir * this.options.shift * tween\n }px) translateZ(${this.options.dist * tween}px)`;\n this._updateItemStyle(el, centerTweenedOpacity, 0, transformString);\n }\n // onCycleTo callback\n const _currItem = this.el.querySelectorAll('.carousel-item')[this._wrap(this.center)];\n\n if (lastCenter !== this.center && typeof this.options.onCycleTo === 'function') {\n this.options.onCycleTo.call(this, _currItem, this.dragged);\n }\n // One time callback\n if (typeof this.oneTimeCallback === 'function') {\n this.oneTimeCallback.call(this, _currItem, this.dragged);\n this.oneTimeCallback = null;\n }\n }\n\n _updateItemStyle(el: HTMLElement, opacity: number, zIndex: number, transform: string) {\n el.style.transform = transform;\n el.style.zIndex = zIndex.toString();\n el.style.opacity = opacity.toString();\n el.style.visibility = 'visible';\n }\n\n _cycleTo(n: number, callback: CarouselOptions['onCycleTo'] = null) {\n let diff = (this.center % this.count) - n;\n // Account for wraparound.\n if (!this.noWrap) {\n if (diff < 0) {\n if (Math.abs(diff + this.count) < Math.abs(diff)) {\n diff += this.count;\n }\n } else if (diff > 0) {\n if (Math.abs(diff - this.count) < diff) {\n diff -= this.count;\n }\n }\n }\n this.target = this.dim * Math.round(this.offset / this.dim);\n // Next\n if (diff < 0) {\n this.target += this.dim * Math.abs(diff);\n } // Prev\n else if (diff > 0) {\n this.target -= this.dim * diff;\n }\n // Set one time callback\n if (typeof callback === 'function') {\n this.oneTimeCallback = callback;\n }\n // Scroll\n if (this.offset !== this.target) {\n this.amplitude = this.target - this.offset;\n this.timestamp = Date.now();\n requestAnimationFrame(this._autoScroll);\n }\n }\n\n /**\n * Move carousel to next slide or go forward a given amount of slides.\n * @param n How many times the carousel slides.\n */\n next(n: number = 1) {\n if (n === undefined || isNaN(n)) {\n n = 1;\n }\n let index = this.center + n;\n if (index >= this.count || index < 0) {\n if (this.noWrap) return;\n index = this._wrap(index);\n }\n this._cycleTo(index);\n }\n\n /**\n * Move carousel to previous slide or go back a given amount of slides.\n * @param n How many times the carousel slides.\n */\n prev(n: number = 1) {\n if (n === undefined || isNaN(n)) {\n n = 1;\n }\n let index = this.center - n;\n if (index >= this.count || index < 0) {\n if (this.noWrap) return;\n index = this._wrap(index);\n }\n this._cycleTo(index);\n }\n\n /**\n * Move carousel to nth slide.\n * @param n Index of slide.\n * @param callback \"onCycleTo\" optional callback.\n */\n set(n: number, callback?: CarouselOptions['onCycleTo']) {\n if (n === undefined || isNaN(n)) {\n n = 0;\n }\n if (n > this.count || n < 0) {\n if (this.noWrap) return;\n n = this._wrap(n);\n }\n this._cycleTo(n, callback);\n }\n}\n", "import { Component, InitElements, MElement } from '../core/component';\n\nexport interface BaseOptions {}\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<object> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, {}, CharacterCounter);\n this.el['Expressive_CharacterCounter'] = this;\n\n this.options = {\n ...CharacterCounter.defaults,\n ...options\n };\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of CharacterCounter.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: InputElement, options?: Partial<BaseOptions>): CharacterCounter;\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InputElement | MElement>,\n options?: Partial<BaseOptions>\n ): CharacterCounter[];\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InputElement | InitElements<InputElement | MElement>,\n options: Partial<BaseOptions> = {}\n ): CharacterCounter | CharacterCounter[] {\n return super.init(els, options, CharacterCounter);\n }\n\n static getInstance(el: InputElement): CharacterCounter {\n return el['Expressive_CharacterCounter'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_CharacterCounter'] = undefined;\n this._removeCounter();\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('focus', this.updateCounter, true);\n this.el.addEventListener('input', this.updateCounter, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('focus', this.updateCounter, true);\n this.el.removeEventListener('input', this.updateCounter, true);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n this.counterEl.style.float = 'right';\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = (this.el as HTMLInputElement).value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface CollapsibleOptions extends BaseOptions {\n /**\n * If accordion versus collapsible.\n * @default true\n */\n accordion: boolean;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 300\n */\n outDuration: number;\n /**\n * Callback function called before collapsible is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after collapsible is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before collapsible is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after collapsible is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: CollapsibleOptions = {\n accordion: true,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n inDuration: 300,\n outDuration: 300\n};\n\nexport class Collapsible extends Component<CollapsibleOptions> {\n private _headers: HTMLElement[];\n\n constructor(el: HTMLElement, options: Partial<CollapsibleOptions>) {\n super(el, options, Collapsible);\n this.el['Expressive_Collapsible'] = this;\n\n this.options = {\n ...Collapsible.defaults,\n ...options\n };\n\n // Setup tab indices\n this._headers = Array.from(this.el.querySelectorAll('li > .collapsible-header'));\n this._headers.forEach((el) => (el.tabIndex = 0));\n this._setupEventHandlers();\n\n // Open active\n const activeBodies: HTMLElement[] = Array.from(\n this.el.querySelectorAll('li.active > .collapsible-body')\n );\n if (this.options.accordion) {\n if (activeBodies.length > 0) {\n // Accordion => open first active only\n this._setExpanded(activeBodies[0]);\n }\n } else {\n // Expandables => all active\n activeBodies.forEach((el) => this._setExpanded(el));\n }\n }\n\n static get defaults(): CollapsibleOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Collapsible.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CollapsibleOptions>): Collapsible;\n /**\n * Initializes instances of Collapsible.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<CollapsibleOptions>): Collapsible[];\n /**\n * Initializes instances of Collapsible.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<CollapsibleOptions> = {}\n ): Collapsible | Collapsible[] {\n return super.init(els, options, Collapsible);\n }\n\n static getInstance(el: HTMLElement): Collapsible {\n return el['Expressive_Collapsible'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_Collapsible'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleCollapsibleClick);\n this._headers.forEach((header) =>\n header.addEventListener('keydown', this._handleCollapsibleKeydown)\n );\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleCollapsibleClick);\n this._headers.forEach((header) =>\n header.removeEventListener('keydown', this._handleCollapsibleKeydown)\n );\n }\n\n _handleCollapsibleClick = (e: MouseEvent | KeyboardEvent) => {\n const header = (e.target as HTMLElement).closest('.collapsible-header');\n if (e.target && header) {\n const collapsible = header.closest('.collapsible');\n if (collapsible !== this.el) return;\n\n const li = header.closest('li');\n const isActive = li.classList.contains('active');\n const index = [...li.parentNode.children].indexOf(li);\n\n if (isActive) this.close(index);\n else this.open(index);\n }\n };\n\n _handleCollapsibleKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleCollapsibleClick(e);\n }\n };\n\n private _setExpanded(li: HTMLElement): void {\n li.style.maxHeight = li.scrollHeight + 'px';\n }\n\n _animateIn(index: number) {\n const li = <HTMLLIElement>this.el.children[index];\n if (!li) return;\n const body: HTMLElement = li.querySelector('.collapsible-body');\n const duration = this.options.inDuration; // easeInOutCubic\n body.style.transition = `max-height ${duration}ms ease-out`;\n this._setExpanded(body);\n setTimeout(() => {\n if (typeof this.options.onOpenEnd === 'function') {\n this.options.onOpenEnd.call(this, li);\n }\n }, duration);\n }\n\n _animateOut(index: number) {\n const li = this.el.children[index];\n if (!li) return;\n const body: HTMLElement = li.querySelector('.collapsible-body');\n const duration = this.options.outDuration; // easeInOutCubic\n body.style.transition = `max-height ${duration}ms ease-out`;\n body.style.maxHeight = '0';\n setTimeout(() => {\n if (typeof this.options.onCloseEnd === 'function') {\n this.options.onCloseEnd.call(this, li);\n }\n }, duration);\n }\n\n /**\n * Open collapsible section.\n * @param n Nth section to open.\n */\n open = (index: number) => {\n const listItems = Array.from(this.el.children).filter((c) => c.tagName === 'LI');\n const li = listItems[index];\n if (li && !li.classList.contains('active')) {\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, li);\n }\n // Handle accordion behavior\n if (this.options.accordion) {\n const activeLis = listItems.filter((li) => li.classList.contains('active'));\n activeLis.forEach((activeLi) => {\n const index = listItems.indexOf(activeLi);\n this.close(index);\n });\n }\n // Animate in\n li.classList.add('active');\n this._animateIn(index);\n }\n };\n\n /**\n * Close collapsible section.\n * @param n Nth section to close.\n */\n close = (index: number) => {\n const li = Array.from(this.el.children).filter((c) => c.tagName === 'LI')[index];\n if (li && li.classList.contains('active')) {\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, li);\n }\n // Animate out\n li.classList.remove('active');\n this._animateOut(index);\n }\n };\n}\n", "import { Utils } from '../core/utils';\nimport { Dropdown, DropdownOptions } from './dropdown';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select dropdown initialization.\n * @default {}\n */\n dropdownOptions: Partial<DropdownOptions>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n dropdownOptions: {}\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** Dropdown UL element. */\n dropdownOptions: HTMLUListElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the dropdown plugin for this select. */\n dropdown: Dropdown;\n /** The select wrapper element. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n private _values: ValueStruct[];\n nativeTabIndex: number;\n\n constructor(el: HTMLSelectElement, options: FormSelectOptions) {\n super(el, options, FormSelect);\n if (this.el.classList.contains('browser-default')) return;\n this.el['Expressive_FormSelect'] = this;\n\n this.options = {\n ...FormSelect.defaults,\n ...options\n };\n\n this.isMultiple = this.el.multiple;\n this.nativeTabIndex = this.el.tabIndex ?? -1;\n this.el.tabIndex = -1;\n this._values = [];\n this._setupDropdown();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of FormSelect.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLSelectElement, options?: Partial<FormSelectOptions>): FormSelect;\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLSelectElement | MElement>,\n options?: Partial<FormSelectOptions>\n ): FormSelect[];\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLSelectElement | InitElements<HTMLSelectElement | MElement>,\n options: Partial<FormSelectOptions> = {}\n ): FormSelect | FormSelect[] {\n return super.init(els, options, FormSelect);\n }\n\n static getInstance(el: HTMLElement): FormSelect {\n return el['Expressive_FormSelect'];\n }\n\n destroy() {\n this._removeEventHandlers();\n // The Dropdown holds itself in the static Dropdown._dropdowns registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.dropdown?.destroy();\n this._removeDropdown();\n this.el['Expressive_FormSelect'] = undefined;\n }\n\n /**\n * Re-read the native `<select>` and update the generated dropdown to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Call this after mutating the underlying select programmatically.\n */\n refresh() {\n this._setValueToInput();\n this._setSelectedStates();\n }\n\n _setupEventHandlers() {\n this.dropdownOptions.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick);\n el.addEventListener('keydown', this._handleOptionKeydown);\n });\n this.el.addEventListener('change', this._handleSelectChange);\n this.input.addEventListener('click', this._handleInputClick);\n }\n\n _removeEventHandlers() {\n this.dropdownOptions.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.removeEventListener('click', this._handleOptionClick);\n el.removeEventListener('keydown', this._handleOptionKeydown);\n });\n this.el.removeEventListener('change', this._handleSelectChange);\n this.input.removeEventListener('click', this._handleInputClick);\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n };\n\n // Named rather than inline so that _removeEventHandlers can actually detach\n // it - an anonymous listener per option was unremovable.\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n _arraysEqual<T, E>(a: T[], b: (E | T)[]) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; ++i) if (a[i] !== b[i]) return false;\n return true;\n }\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n const previousSelectedValues = this.getSelectedValues();\n if (this.isMultiple) {\n // Multi-Select\n this._toggleEntryFromArray(value);\n } else {\n // Single-Select\n this._deselectAll();\n this._selectValue(value);\n }\n // Refresh Input-Text\n this._setValueToInput();\n // Trigger Change-Event only when data is different\n const actualSelectedValues = this.getSelectedValues();\n const selectionHasChanged = !this._arraysEqual(previousSelectedValues, actualSelectedValues);\n if (selectionHasChanged)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n ); // trigger('change');\n }\n if (!this.isMultiple) this.dropdown.close();\n }\n\n _handleInputClick = () => {\n if (this.dropdown && this.dropdown.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n _setupDropdown() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('select-wrapper', 'input-field');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n this.el.before(this.wrapper);\n\n // Move actual select element into overflow hidden wrapper\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n this.wrapper.append(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n\n if (this.el.disabled) this.wrapper.classList.add('disabled');\n\n this.selectOptions = <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n\n // Create dropdown\n this.dropdownOptions = document.createElement('ul');\n this.dropdownOptions.id = `select-options-${Utils.guid()}`;\n this.dropdownOptions.setAttribute('popover', 'auto');\n this.dropdownOptions.classList.add('dropdown-content', 'select-dropdown');\n this.dropdownOptions.setAttribute('role', 'listbox');\n this.dropdownOptions.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.dropdownOptions.classList.add('multiple-select-dropdown');\n\n // Create dropdown structure\n if (this.selectOptions.length > 0) {\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n // Option\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._addOptionToValues(realOption as HTMLOptionElement, virtualOption);\n } else if (realOption.tagName === 'OPTGROUP') {\n // Optgroup\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this.dropdownOptions.append(groupParent);\n\n const groupChildren = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((realOption) => {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n 'optgroup-option'\n );\n const childId = 'opt-child-' + Utils.guid();\n virtualOption.id = childId;\n groupChildren.push(childId);\n this._addOptionToValues(realOption, virtualOption);\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n this.wrapper.append(this.dropdownOptions);\n\n // Add input dropdown\n this.input = document.createElement('input');\n this.input.id = 'm_select-input-' + Utils.guid();\n this.input.classList.add('select-dropdown', 'dropdown-trigger');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.dropdownOptions.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString(); //setAttribute(\"aria-required\", this.el.hasAttribute(\"required\"));\n if (this.el.disabled) this.input.disabled = true; // 'true');\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n // Adds aria-attributes to input element\n this.input.setAttribute('role', 'combobox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-owns', this.dropdownOptions.id);\n this.input.setAttribute('aria-controls', this.dropdownOptions.id);\n this.input.placeholder = ' ';\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n\n // Add caret\n const dropdownIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); //document.createElement('svg')\n dropdownIcon.classList.add('caret');\n dropdownIcon.setAttribute('height', '24');\n dropdownIcon.setAttribute('width', '24');\n dropdownIcon.setAttribute('viewBox', '0 0 24 24');\n dropdownIcon.ariaHidden = 'true';\n dropdownIcon.innerHTML = `<path d=\"M7 10l5 5 5-5z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/>`;\n this.wrapper.prepend(dropdownIcon);\n\n // Initialize dropdown\n if (!this.el.disabled) {\n const dropdownOptions = { ...this.options.dropdownOptions };\n dropdownOptions.coverTrigger = false;\n const userOnOpenEnd = dropdownOptions.onOpenEnd;\n const userOnCloseEnd = dropdownOptions.onCloseEnd;\n // Add callback for centering selected option when dropdown content is scrollable\n dropdownOptions.onOpenEnd = () => {\n const selectedOption = this.dropdownOptions.querySelector('.selected');\n if (selectedOption) {\n // Focus selected option in dropdown\n Utils.keyDown = true;\n this.dropdown.focusedIndex = [...selectedOption.parentNode.children].indexOf(\n selectedOption\n );\n this.dropdown._focusFocusedItem();\n Utils.keyDown = false;\n // Handle scrolling to selected option\n if (this.dropdown.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n (this.dropdownOptions as HTMLElement).getBoundingClientRect().top; // scroll to selected option\n scrollOffset -= this.dropdownOptions.clientHeight / 2; // center in dropdown\n this.dropdownOptions.scrollTop = scrollOffset;\n }\n }\n this.input.ariaExpanded = 'true';\n // Handle user declared onOpenEnd if needed\n if (userOnOpenEnd && typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.dropdown, this.el);\n };\n // Add callback for reseting \"expanded\" state\n dropdownOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n // Handle user declared onOpenEnd if needed\n if (userOnCloseEnd && typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.dropdown, this.el);\n };\n // Prevent dropdown from closing too early\n dropdownOptions.closeOnClick = false;\n this.dropdown = Dropdown.init(this.input, dropdownOptions);\n }\n // Add initial selections\n this._setSelectedStates();\n // move label\n if (this.labelEl) this.input.after(this.labelEl);\n }\n\n _addOptionToValues(realOption: HTMLOptionElement, virtualOption: HTMLElement) {\n this._values.push({ el: realOption, optionEl: virtualOption });\n }\n\n _removeDropdown() {\n this.wrapper.querySelector('.caret').remove();\n this.input.remove();\n this.dropdownOptions.remove();\n this.wrapper.before(this.el);\n this.wrapper.remove();\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.setAttribute('role', 'option');\n if (realOption.disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !realOption.disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n // add Icon\n const iconUrl = realOption.getAttribute('data-icon');\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (iconUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = iconUrl;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n // Check for multiple type\n this.dropdownOptions.append(li);\n return li;\n }\n\n _selectValue(value: ValueStruct) {\n value.el.selected = true;\n value.optionEl.classList.add('selected');\n value.optionEl.ariaSelected = 'true'; // setAttribute(\"aria-selected\", true);\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = true;\n }\n\n _deselectValue(value: ValueStruct) {\n value.el.selected = false;\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false'; //setAttribute(\"aria-selected\", false);\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = false;\n }\n\n _deselectAll() {\n this._values.forEach((value) => this._deselectValue(value));\n }\n\n _isValueSelected(value: ValueStruct) {\n const realValues = this.getSelectedValues();\n return realValues.some((realValue) => realValue === value.el.value);\n }\n\n _toggleEntryFromArray(value: ValueStruct) {\n if (this._isValueSelected(value)) this._deselectValue(value);\n else this._selectValue(value);\n }\n\n _getSelectedOptions(): HTMLOptionElement[] {\n // remove null, false, ... values\n return Array.prototype.filter.call(\n this.el.selectedOptions,\n (realOption: HTMLOptionElement) => realOption\n );\n }\n\n _setValueToInput() {\n const selectedRealOptions = this._getSelectedOptions();\n const selectedOptionPairs = this._values.filter(\n (value) => selectedRealOptions.indexOf(value.el) >= 0\n );\n // Filter not disabled\n const notDisabledOptionPairs = selectedOptionPairs.filter((op) => !op.el.disabled);\n // textContent, not innerText: innerText is layout-dependent, so reading it\n // once per selected option forced a reflow each time.\n const texts = notDisabledOptionPairs.map((value) =>\n value.optionEl.querySelector('span').textContent.trim()\n );\n // Set input-text to first Option with empty value which indicates a description like \"choose your option\"\n if (texts.length === 0) {\n const firstDisabledOption = <HTMLOptionElement>this.el.querySelector('option:disabled');\n if (firstDisabledOption && firstDisabledOption.value === '') {\n this.input.value = firstDisabledOption.innerText;\n return;\n }\n }\n this.input.value = texts.join(', ');\n }\n\n _setSelectedStates() {\n this._values.forEach((value) => {\n const optionIsSelected = value.el.selected;\n const cb = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (cb) cb.checked = optionIsSelected;\n if (optionIsSelected) {\n this._activateOption(this.dropdownOptions, value.optionEl);\n } else {\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false'; // attr(\"aria-selected\", 'false');\n }\n });\n }\n\n _activateOption(ul: HTMLElement, li: HTMLElement) {\n if (!li) return;\n if (!this.isMultiple)\n ul.querySelectorAll('li.selected').forEach((li) => li.classList.remove('selected'));\n li.classList.add('selected');\n li.ariaSelected = 'true';\n }\n\n getSelectedValues() {\n return this._getSelectedOptions().map((realOption) => realOption.value);\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport interface DockedDisplayPluginOptions {\n /**\n * Margin between element and docked container\n */\n margin: number,\n /**\n * Transition movement\n */\n transition: number,\n /**\n * Transition duration\n */\n duration: number,\n /**\n * The alignment of the docked container\n */\n align: string\n}\n\nconst _defaults: DockedDisplayPluginOptions = {\n margin: 5,\n transition: 10,\n duration: 250,\n align: 'left'\n}\n\nexport class DockedDisplayPlugin {\n private readonly el: HTMLElement;\n private readonly container: HTMLDivElement;\n private options: Partial<DockedDisplayPluginOptions>;\n private visible: boolean;\n\n constructor(el: HTMLElement, container: HTMLElement, options: Partial<DockedDisplayPluginOptions>) {\n this.el = el;\n this.options = {\n ..._defaults,\n ...options\n };\n\n this.container = document.createElement('div');\n this.container.classList.add('display-docked');\n this.container.append(container);\n el.parentElement.append(this.container);\n\n document.addEventListener('click', this._handleDocumentClick);\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n if (this.visible && !(this.el === <HTMLElement>e.target) && !((<HTMLElement>e.target).closest('.display-docked'))) {\n this.hide();\n }\n };\n\n /**\n * Tears the plugin down. The document listener holds a reference to this\n * instance - and through it the whole picker subtree - so the owning\n * component must call this from its own destroy().\n */\n destroy = () => {\n document.removeEventListener('click', this._handleDocumentClick);\n this.container.remove();\n };\n\n /**\n * Initializes instance of DockedDisplayPlugin\n * @param el HTMLElement to position to\n * @param container HTMLElement to be positioned\n * @param options Plugin options\n */\n static init(el: HTMLElement, container: HTMLElement, options?: Partial<DockedDisplayPluginOptions>): DockedDisplayPlugin {\n return new DockedDisplayPlugin(el, container, options);\n }\n\n show = () => {\n if (this.visible) return;\n this.visible = true;\n const coordinates = Utils._setAbsolutePosition(this.el, this.container, 'bottom', this.options.margin, this.options.transition, this.options.align);\n\n // @todo move to Util? -> duplicate code fragment with tooltip\n // easeOutCubic\n this.container.style.visibility = 'visible';\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(${coordinates.x}px) translateY(${coordinates.y}px)`;\n this.container.style.opacity = (1).toString();\n }, 1);\n };\n\n hide = () => {\n if (!this.visible) return;\n this.visible = false;\n // @todo move to Util? -> duplicate code fragment with tooltip\n this.container.removeAttribute('style');\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(0px) translateY(0px)`;\n this.container.style.opacity = '0';\n }, 1);\n };\n}\n", "import { Utils } from '../core/utils';\nimport { FormSelect } from './select';\nimport { BaseOptions, Component, I18nOptions, InitElements, MElement } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport interface DateI18nOptions extends I18nOptions {\n previousMonth: string;\n nextMonth: string;\n months: string[];\n monthsShort: string[];\n weekdays: string[];\n weekdaysShort: string[];\n weekdaysAbbrev: string[];\n}\n\nexport interface DatepickerOptions extends BaseOptions {\n /**\n * The date output format for the input field value\n * or a function taking the date and outputting the\n * formatted date string.\n * @default 'mmm dd, yyyy'\n */\n format: string | ((d: Date) => string);\n /**\n * Used to create date object from current input string.\n * @default null\n */\n parse: ((value: string, format: string) => Date) | null;\n /**\n * The initial condition if the datepicker is based on date range.\n * @default false\n */\n isDateRange: boolean;\n /**\n * The selector of the user specified date range end element\n */\n dateRangeEndEl: string | null;\n /**\n * The initial condition if the datepicker is based on multiple date selection.\n * @default false\n */\n isMultipleSelection: boolean;\n /**\n * The initial date to view when first opened.\n * @default null\n */\n defaultDate: Date | null;\n /**\n * The initial end date to view when first opened.\n * @default null\n */\n defaultEndDate: Date | null;\n /**\n * Make the `defaultDate` the initial selected value.\n * @default false\n */\n setDefaultDate: boolean;\n /**\n * Make the `defaultEndDate` the initial selected value.\n * @default false\n */\n setDefaultEndDate: boolean;\n /**\n * Prevent selection of any date on the weekend.\n * @default false\n */\n disableWeekends: boolean;\n /**\n * Custom function to disable certain days.\n * @default null\n */\n disableDayFn: ((day: Date) => boolean) | null;\n /**\n * First day of week (0: Sunday, 1: Monday etc).\n * @default 0\n */\n firstDay: number;\n /**\n * The earliest date that can be selected.\n * @default null\n */\n minDate: Date | null;\n /**\n * The latest date that can be selected.\n * @default null\n */\n maxDate: Date | null;\n /**\n * Number of years either side, or array of upper/lower range.\n * @default 10\n */\n yearRange: number | number[];\n /**\n * Sort year range in reverse order.\n * @default false\n */\n yearRangeReverse: boolean;\n /**\n * Changes Datepicker to RTL.\n * @default false\n */\n isRTL: boolean;\n /**\n * Show month after year in Datepicker title.\n * @default false\n */\n showMonthAfterYear: boolean;\n /**\n * Render days of the calendar grid that fall in the next\n * or previous month.\n * @default false\n */\n showDaysInNextAndPreviousMonths: boolean;\n /**\n * Specify if the docked datepicker is in open state by default\n */\n openByDefault: boolean;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the calendar in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the datepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit calendar day select to input field\n * @default false\n */\n autoSubmit: true;\n /**\n * Internationalization options.\n */\n i18n: Partial<DateI18nOptions>;\n /**\n * An array of string returned by `Date.toDateString()`,\n * indicating there are events in the specified days.\n * @default []\n */\n events: string[];\n /**\n * Callback function when date is selected,\n * first parameter is the newly selected date.\n * @default null\n */\n onSelect: ((selectedDate: Date) => void) | null;\n /**\n * Callback function when Datepicker is closed.\n * @default null\n */\n //onClose: (() => void) | null; // TODO: Remove\n /**\n * Callback function when Datepicker HTML is refreshed.\n * @default null\n */\n onDraw: (() => void) | null;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for interaction with confirm button.\n * @default null\n */\n onConfirm: (() => void) | null;\n /**\n * Callback function for interaction with close button.\n * @default null\n */\n onCancel: (() => void) | null;\n\n /** Field used for internal calculations DO NOT CHANGE IT */\n minYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n minMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n startRange?: Date;\n /** Field used for internal calculations DO NOT CHANGE IT */\n endRange?: Date;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: DatepickerOptions = {\n // the default output format for the input field value\n format: 'mmm dd, yyyy',\n // Used to create date object from current input string\n parse: null,\n // The initial condition if the datepicker is based on date range\n isDateRange: false,\n // The selector of the user specified date range end element\n dateRangeEndEl: null,\n // The initial condition if the datepicker is based on multiple date selection\n isMultipleSelection: false,\n // The initial date to view when first opened\n defaultDate: null,\n // The initial end date to view when first opened\n defaultEndDate: null,\n // Make the `defaultDate` the initial selected value\n setDefaultDate: false,\n // Make the `defaultEndDate` the initial selected value\n setDefaultEndDate: false,\n disableWeekends: false,\n disableDayFn: null,\n // First day of week (0: Sunday, 1: Monday etc)\n firstDay: 0,\n // The earliest date that can be selected\n minDate: null,\n // Thelatest date that can be selected\n maxDate: null,\n // Number of years either side, or array of upper/lower range\n yearRange: 10,\n // used internally (don't config outside)\n minYear: 0,\n maxYear: 9999,\n minMonth: undefined,\n maxMonth: undefined,\n startRange: null,\n endRange: null,\n isRTL: false,\n yearRangeReverse: false,\n // Render the month after year in the calendar title\n showMonthAfterYear: false,\n // Render days of the calendar grid that fall in the next or previous month\n showDaysInNextAndPreviousMonths: false,\n // Specify if docked picker is in open state by default\n openByDefault: false,\n // Specify a DOM element to render the calendar in\n container: null,\n // Show clear button\n showClearBtn: false,\n // Autosubmit\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok',\n previousMonth: '\u2039',\n nextMonth: '\u203A',\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ],\n monthsShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n },\n // events array\n events: [],\n // callback function\n onSelect: null,\n onDraw: null,\n onInputInteraction: null,\n displayPlugin: null,\n displayPluginOptions: null,\n onConfirm: null,\n onCancel: null,\n};\n\nexport class Datepicker extends Component<DatepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n multiple: boolean = false;\n calendarEl: HTMLElement;\n\n /** CLEAR button instance. */\n // clearBtn: HTMLElement;\n /** DONE button instance */\n /*doneBtn: HTMLElement;\n cancelBtn: HTMLElement;*/\n\n containerEl: HTMLElement;\n yearTextEl: HTMLElement;\n dateTextEl: HTMLElement;\n endDateEl: HTMLInputElement;\n dateEls: HTMLInputElement[];\n /** The selected Date. */\n date: Date;\n endDate: null | Date;\n dates: Date[];\n formats: object;\n calendars: [{ month: number; year: number }];\n private _y: number;\n private _m: number;\n private displayPlugin: DockedDisplayPlugin;\n private footer: HTMLElement;\n /** Nesting depth of {@link _batchDraws}; > 0 means draws are being collected. */\n private _drawDepth = 0;\n /** Whether a draw was requested while batching. */\n private _drawDirty = false;\n /** Shape of the currently rendered controls; see {@link _controlsCacheKey}. */\n private _controlsKey: string = null;\n /** id linking the controls element to the table's aria-labelledby. */\n private _randId: string = null;\n static _template: string;\n\n constructor(el: HTMLInputElement, options: Partial<DatepickerOptions>) {\n super(el, options, Datepicker);\n this.el['Expressive_Datepicker'] = this;\n\n this.options = {\n ...Datepicker.defaults,\n ...options\n };\n\n // make sure i18n defaults are not lost when only few i18n option properties are passed\n if (!!options && options.hasOwnProperty('i18n') && typeof options.i18n === 'object') {\n this.options.i18n = { ...Datepicker.defaults.i18n, ...options.i18n };\n }\n\n // Remove time component from minDate and maxDate options\n if (this.options.minDate) this.options.minDate.setHours(0, 0, 0, 0);\n if (this.options.maxDate) this.options.maxDate.setHours(0, 0, 0, 0);\n\n this.id = Utils.guid();\n\n this._setupVariables();\n this._insertHTMLIntoDOM();\n this._setupEventHandlers();\n\n if (!this.options.defaultDate) {\n this.options.defaultDate = new Date(Date.parse(this.el.value));\n }\n\n const defDate = this.options.defaultDate;\n if (Datepicker._isDate(defDate)) {\n if (this.options.setDefaultDate) {\n this.setDate(defDate, true);\n this.setInputValue(this.el, defDate);\n } else {\n this.gotoDate(defDate);\n }\n } else {\n this.gotoDate(new Date());\n }\n if (this.options.isDateRange) {\n this.multiple = true;\n const defEndDate = this.options.defaultEndDate;\n if (Datepicker._isDate(defEndDate)) {\n if (this.options.setDefaultEndDate) {\n this.setDate(defEndDate, true, true);\n this.setInputValue(this.endDateEl, defEndDate);\n }\n }\n }\n if (this.options.isMultipleSelection) {\n this.multiple = true;\n this.dates = [];\n this.dateEls = [];\n this.dateEls.push(el);\n }\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Datepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<DatepickerOptions>): Datepicker;\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<DatepickerOptions>\n ): Datepicker[];\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<DatepickerOptions> = {}\n ): Datepicker | Datepicker[] {\n return super.init(els, options, Datepicker);\n }\n\n /**\n * Escape a value for interpolation into the calendar markup.\n *\n * `draw()` assembles the calendar as an HTML string, so every value that is\n * not a number this class computed itself has to go through here. In\n * practice that means the i18n strings: month and weekday names are the one\n * part of a datepicker that routinely comes from a translation file, and a\n * translation file is as trustworthy as whatever wrote it.\n */\n static _escape(value: unknown): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n static _isDate(obj) {\n return /Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n }\n\n static _isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n }\n\n /**\n * @deprecated as this function has no effect without any return statement or global parameter setter.\n */\n static _setToStartOfDay(date) {\n if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n }\n\n static _getDaysInMonth(year, month) {\n return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][\n month\n ];\n }\n\n static _isLeapYear(year) {\n // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n static _compareDates(a, b) {\n // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n return a.getTime() === b.getTime();\n }\n\n static _compareWithinRange(day: Date, date: Date, dateEnd: Date) {\n return day.getTime() > date.getTime() && day.getTime() < dateEnd.getTime();\n }\n\n static _comparePastDate(a: Date, b: Date) {\n return a.getTime() < b.getTime();\n }\n\n static getInstance(el: HTMLElement): Datepicker {\n return el['Expressive_Datepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.destroySelects();\n this.el['Expressive_Datepicker'] = undefined;\n }\n\n destroySelects() {\n const oldYearSelect = this.calendarEl.querySelector('.orig-select-year');\n if (oldYearSelect) {\n FormSelect.getInstance(oldYearSelect as HTMLElement).destroy();\n }\n const oldMonthSelect = this.calendarEl.querySelector('.orig-select-month');\n if (oldMonthSelect) {\n FormSelect.getInstance(oldMonthSelect as HTMLElement).destroy();\n }\n }\n\n _insertHTMLIntoDOM() {\n // HTML5 input date field support\n if (this.el.type == 'date') {\n this.el.classList.add('datepicker-date-input');\n }\n\n // `!x === null` is always false, so this never ran; _renderDateInputFormat\n // now no-ops on its own when there is no hint element to fill in.\n this._renderDateInputFormat(this.el);\n\n if (this.options.isDateRange) {\n this.containerEl.classList.add('daterange');\n if (!this.options.dateRangeEndEl) {\n this.endDateEl = this.createDateInput();\n this.endDateEl.classList.add('datepicker-end-date');\n } else {\n // querySelector returns null, never undefined: the old check compared\n // against undefined, so a miss skipped the warning and fell through to\n // dereferencing null.\n this.endDateEl = document.querySelector(this.options.dateRangeEndEl);\n if (!this.endDateEl) {\n console.warn('Specified date range end input element in dateRangeEndEl not found');\n } else {\n this._renderDateInputFormat(this.endDateEl);\n }\n }\n }\n\n /*if (this.options.showClearBtn) {\n this.clearBtn.style.visibility = '';\n this.clearBtn.innerText = this.options.i18n.clear;\n }\n this.doneBtn.innerText = this.options.i18n.done;\n this.cancelBtn.innerText = this.options.i18n.cancel;*/\n Utils.createButton(this.footer, this.options.i18n.clear, ['datepicker-clear'], this.options.showClearBtn, this._handleClearClick);\n\n if (!this.options.autoSubmit) {\n Utils.createConfirmationContainer(this.footer, this.options.i18n.done, this.options.i18n.cancel, this._confirm, this._cancel);\n }\n\n if (this.options.container) {\n const optEl = this.options.container;\n this.options.container =\n optEl instanceof HTMLElement ? optEl : (document.querySelector(optEl) as HTMLElement);\n this.options.container.append(this.containerEl);\n } else {\n //this.containerEl.before(this.el);\n const appendTo = !this.endDateEl ? this.el : this.endDateEl;\n if (!this.options.openByDefault) (this.containerEl as HTMLElement).setAttribute('style', 'display: none; visibility: hidden;');\n appendTo.parentElement.after(this.containerEl);\n }\n }\n\n /**\n * Renders the date input format into the optional `.datepicker-format` hint\n * next to the input, if the consumer provided one.\n */\n _renderDateInputFormat(el: HTMLInputElement) {\n const formatEl = el.parentElement?.querySelector('.datepicker-format');\n if (!formatEl) return;\n // textContent, and nothing at all for a function format: this used to be\n // `innerHTML = format.toString()`, which rendered a format string as\n // markup and dumped a function's entire source into the page.\n formatEl.textContent =\n typeof this.options.format === 'function' ? '' : String(this.options.format);\n }\n\n /**\n * Gets a string representation of the given date.\n */\n toString(date: Date = this.date, format: string | ((d: Date) => string) = null): string {\n format = format || this.options.format;\n if (typeof format === 'function') return format(date);\n if (!Datepicker._isDate(date)) return '';\n // String Format\n return this.formatDate(date, format);\n }\n\n /**\n * Returns the formatted date.\n */\n formatDate(date: Date, format: string) {\n const formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);\n return formatArray\n .map((label) => (this.formats[label] ? this.formats[label](date) : label))\n .join('');\n }\n\n /**\n * Sets date from input field.\n */\n setDateFromInput(el: HTMLInputElement) {\n const date = new Date(Date.parse(el.value));\n this.setDate(date, false, el == this.endDateEl, true);\n }\n\n /**\n * Set a date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param preventOnSelect Undocumented as of 5 March 2018.\n * @param isEndDate\n * @param fromUserInput\n */\n setDate(\n date: Date = null,\n preventOnSelect: boolean = false,\n isEndDate: boolean = false,\n fromUserInput: boolean = false\n ) {\n const selectedDate = this.validateDate(date);\n if (!selectedDate) {\n return;\n }\n if (!this.options.isMultipleSelection) this.setSingleDate(selectedDate, isEndDate);\n else if (!fromUserInput) this.setMultiDate(selectedDate);\n Datepicker._setToStartOfDay(selectedDate);\n this.gotoDate(selectedDate);\n if (!preventOnSelect && typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, selectedDate);\n }\n }\n\n validateDate(date: Date) {\n if (!date) {\n this._renderDateDisplay(date);\n return this.draw();\n }\n if (typeof date === 'string') {\n date = new Date(Date.parse(date));\n }\n if (!Datepicker._isDate(date)) {\n return;\n }\n const min = this.options.minDate,\n max = this.options.maxDate;\n if (Datepicker._isDate(min) && date < min) {\n date = min;\n } else if (Datepicker._isDate(max) && date > max) {\n date = max;\n }\n return new Date(date.getTime());\n }\n\n /**\n * Set a single date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param isEndDate\n */\n setSingleDate(date: Date, isEndDate: boolean) {\n if (!isEndDate) {\n this.date = date;\n } else if (isEndDate) {\n this.endDate = date;\n }\n }\n\n /**\n * Set a multi date on the datepicker.\n * @param date Date to set on the datepicker.\n */\n setMultiDate(date: Date) {\n const selectedDate = this.dates?.find((item) => {\n return item.getTime() === date.getTime() ? item : false;\n });\n if (!selectedDate) {\n this.dates.push(date);\n } else {\n this.dates.splice(this.dates.indexOf(selectedDate), 1);\n }\n this.dates.sort((a: Date, b: Date) => (a.getTime() < b.getTime() ? -1 : 0));\n }\n\n /**\n * Sets the data-date attribute on the date input field\n */\n setDataDate(el, date) {\n el.setAttribute('data-date', this.toString(date));\n }\n\n /**\n * Sets dates on the input values.\n */\n setInputValues() {\n if (!this.options?.isMultipleSelection) {\n this.setInputValue(this.el, this.date);\n if (this.options?.isDateRange) {\n this.setInputValue(this.endDateEl, this.endDate);\n }\n return;\n }\n this.setMultipleSelectionInputValues();\n }\n\n setMultipleSelectionInputValues() {\n const dateElsArr = Array.from(this.dateEls).filter((el, index) => {\n if (index > this.dates.length - 1) return el;\n });\n dateElsArr.forEach((el) => {\n el.remove();\n });\n this.dates.forEach((date: Date, index: number) => {\n if (Array.from(this.dateEls)[index]) {\n this.setInputValue(this.dateEls[index], date);\n return;\n }\n\n const dateEl = this.createDateInput();\n this.setInputValue(dateEl, date);\n this.dateEls.push(dateEl);\n });\n }\n\n /**\n * Sets given date as the input value on the given element.\n */\n setInputValue(el, date) {\n if (el.type == 'date') {\n this.setDataDate(el, date);\n el.value = this.formatDate(date, 'yyyy-mm-dd');\n } else {\n el.value = this.toString(date);\n }\n this.el.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { firedBy: this }\n })\n );\n }\n\n /**\n * Renders the date in the modal head section.\n */\n _renderDateDisplay(date: Date, endDate: Date = null) {\n const displayDate = Datepicker._isDate(date) ? date : new Date();\n // this.yearTextEl.innerHTML = displayDate.getFullYear().toString();\n // @todo should we include an option for date formatting by component options?\n // textContent: formatDate splices i18n month and weekday names in.\n if (!this.options.isDateRange) {\n this.dateTextEl.textContent = this.formatDate(displayDate, 'ddd, mmm d');\n } else {\n const displayEndDate = Datepicker._isDate(endDate) ? endDate : new Date();\n this.dateTextEl.textContent = `${this.formatDate(displayDate, 'mmm d')} - ${this.formatDate(displayEndDate, 'mmm d')}`;\n }\n }\n\n /**\n * Change date view to a specific date on the datepicker.\n * @param date Date to show on the datepicker.\n */\n gotoDate(date: Date) {\n let newCalendar = true;\n if (!Datepicker._isDate(date)) {\n return;\n }\n if (this.calendars) {\n const firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n lastVisibleDate = new Date(\n this.calendars[this.calendars.length - 1].year,\n this.calendars[this.calendars.length - 1].month,\n 1\n ),\n visibleDate = date.getTime();\n // get the end of the month\n lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);\n lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);\n newCalendar =\n visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;\n }\n if (newCalendar) {\n this.calendars = [\n {\n month: date.getMonth(),\n year: date.getFullYear()\n }\n ];\n }\n this.adjustCalendars();\n }\n\n adjustCalendars() {\n this.calendars[0] = this.adjustCalendar(this.calendars[0]);\n this.draw();\n }\n\n adjustCalendar(calendar) {\n if (calendar.month < 0) {\n calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);\n calendar.month += 12;\n }\n if (calendar.month > 11) {\n calendar.year += Math.floor(Math.abs(calendar.month) / 12);\n calendar.month -= 12;\n }\n return calendar;\n }\n\n nextMonth() {\n this.calendars[0].month++;\n this.adjustCalendars();\n }\n\n prevMonth() {\n this.calendars[0].month--;\n this.adjustCalendars();\n }\n\n render(year, month, randId) {\n const now = new Date(),\n days = Datepicker._getDaysInMonth(year, month),\n data = [];\n let before = new Date(year, month, 1).getDay(),\n row = [];\n Datepicker._setToStartOfDay(now);\n if (this.options.firstDay > 0) {\n before -= this.options.firstDay;\n if (before < 0) {\n before += 7;\n }\n }\n const previousMonth = month === 0 ? 11 : month - 1,\n nextMonth = month === 11 ? 0 : month + 1,\n yearOfPreviousMonth = month === 0 ? year - 1 : year,\n yearOfNextMonth = month === 11 ? year + 1 : year,\n daysInPreviousMonth = Datepicker._getDaysInMonth(yearOfPreviousMonth, previousMonth);\n let cells = days + before,\n after = cells;\n while (after > 7) {\n after -= 7;\n }\n cells += 7 - after;\n let isWeekSelected = false;\n for (let i = 0, r = 0; i < cells; i++) {\n const day = new Date(year, month, 1 + (i - before)),\n isToday = Datepicker._compareDates(day, now),\n hasEvent = this.options.events.indexOf(day.toDateString()) !== -1,\n isEmpty = i < before || i >= days + before,\n isStartRange =\n this.options.startRange && Datepicker._compareDates(this.options.startRange, day),\n isEndRange = this.options.endRange && Datepicker._compareDates(this.options.endRange, day),\n isInRange =\n this.options.startRange &&\n this.options.endRange &&\n this.options.startRange < day &&\n day < this.options.endRange,\n isDisabled =\n (this.options.minDate && day < this.options.minDate) ||\n (this.options.maxDate && day > this.options.maxDate) ||\n (this.options.disableWeekends && Datepicker._isWeekend(day)) ||\n (this.options.disableDayFn && this.options.disableDayFn(day)),\n isDateRangeStart = this.options.isDateRange && this.date && this.endDate && Datepicker._compareDates(this.date, day),\n isDateRangeEnd = this.options.isDateRange && this.endDate && Datepicker._compareDates(this.endDate, day),\n isDateRange =\n this.options.isDateRange &&\n Datepicker._isDate(this.endDate) &&\n Datepicker._compareWithinRange(day, this.date, this.endDate);\n let dayNumber = 1 + (i - before),\n monthNumber = month,\n yearNumber = year;\n\n let isSelected = false;\n if (Datepicker._isDate(this.date)) {\n isSelected = Datepicker._compareDates(day, this.date);\n }\n\n if (!isSelected && Datepicker._isDate(this.endDate)) {\n isSelected = Datepicker._compareDates(day, this.endDate);\n }\n\n if (\n this.options.isMultipleSelection &&\n this.dates?.some((item) => item.getTime() === day.getTime())\n ) {\n isSelected = true;\n }\n\n if (isEmpty) {\n if (i < before) {\n dayNumber = daysInPreviousMonth + dayNumber;\n monthNumber = previousMonth;\n yearNumber = yearOfPreviousMonth;\n } else {\n dayNumber = dayNumber - days;\n monthNumber = nextMonth;\n yearNumber = yearOfNextMonth;\n }\n }\n\n const dayConfig = {\n day: dayNumber,\n month: monthNumber,\n year: yearNumber,\n hasEvent: hasEvent,\n isSelected: isSelected,\n isToday: isToday,\n isDisabled: isDisabled,\n isEmpty: isEmpty,\n isStartRange: isStartRange,\n isEndRange: isEndRange,\n isInRange: isInRange,\n showDaysInNextAndPreviousMonths: this.options.showDaysInNextAndPreviousMonths,\n isDateRangeStart: isDateRangeStart,\n isDateRangeEnd: isDateRangeEnd,\n isDateRange: isDateRange\n };\n\n row.push(this.renderDay(dayConfig));\n\n if (++r === 7) {\n data.push(this.renderRow(row, this.options.isRTL, isWeekSelected));\n row = [];\n r = 0;\n isWeekSelected = false;\n }\n }\n return this.renderTable(this.options, data, randId);\n }\n\n renderDay(opts) {\n const classMap = {\n isDisabled: 'is-disabled',\n isToday: 'is-today',\n isSelected: 'is-selected',\n hasEvent: 'has-event',\n isInRange: 'is-inrange',\n isStartRange: 'is-startrange',\n isEndRange: 'is-endrange',\n isDateRangeStart: 'is-daterange-start',\n isDateRangeEnd: 'is-daterange-end',\n isDateRange: 'is-daterange'\n },\n ariaSelected = !(['isSelected', 'isDateRange'].filter((prop) => !!(opts.hasOwnProperty(prop) && opts[prop] === true)).length === 0),\n arr = ['datepicker-day'];\n\n if (opts.isEmpty) {\n if (opts.showDaysInNextAndPreviousMonths) {\n arr.push('is-outside-current-month');\n arr.push('is-selection-disabled');\n } else {\n return '<td class=\"is-empty\"></td>';\n }\n }\n\n for (const [property, className] of Object.entries(classMap)) {\n if (opts.hasOwnProperty(property) && opts[property]) {\n arr.push(className);\n }\n }\n\n return (\n `<td data-day=\"${opts.day}\" class=\"${arr.join(' ')}\" aria-selected=\"${ariaSelected}\">` +\n `<button class=\"datepicker-day-button\" type=\"button\" data-year=\"${opts.year}\" data-month=\"${opts.month}\" data-day=\"${opts.day}\">${opts.day}</button>` +\n '</td>'\n );\n }\n\n renderRow(days, isRTL, isRowSelected) {\n return (\n '<tr class=\"datepicker-row' +\n (isRowSelected ? ' is-selected' : '') +\n '\">' +\n (isRTL ? days.reverse() : days).join('') +\n '</tr>'\n );\n }\n\n renderTable(opts, data, randId) {\n return (\n '<div class=\"datepicker-table-wrapper\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"datepicker-table\" role=\"grid\" aria-labelledby=\"' +\n randId +\n '\">' +\n this.renderHead(opts) +\n this.renderBody(data) +\n '</table></div>'\n );\n }\n\n renderHead(opts) {\n const arr = [];\n let i;\n for (i = 0; i < 7; i++) {\n const full = Datepicker._escape(this.renderDayName(opts, i));\n const abbrev = Datepicker._escape(this.renderDayName(opts, i, true));\n arr.push(`<th scope=\"col\"><abbr title=\"${full}\">${abbrev}</abbr></th>`);\n }\n return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n }\n\n renderBody(rows) {\n return '<tbody>' + rows.join('') + '</tbody>';\n }\n\n /**\n * Whether each month arrow is usable at this position in the allowed range.\n *\n * Depends on the month, which is deliberately *not* part of the controls\n * cache key - so the reuse path has to recompute and reapply it.\n */\n private _arrowState(year: number, month: number) {\n const opts = this.options;\n const isMinYear = year === opts.minYear;\n const isMaxYear = year === opts.maxYear;\n return {\n prev: !(isMinYear && (month === 0 || opts.minMonth >= month)),\n next: !(isMaxYear && (month === 11 || opts.maxMonth <= month))\n };\n }\n\n /**\n * Identifies the *shape* of the controls - everything that changes which\n * options the month and year selects contain, as opposed to which one is\n * picked. While this is stable the two FormSelects can be left alone.\n *\n * `year` is in the key because a numeric `yearRange` centres the year list\n * on the displayed year, so paging across a year boundary does change it.\n */\n private _controlsCacheKey(year: number): string {\n const o = this.options;\n return [\n year,\n o.minYear,\n o.maxYear,\n o.minMonth,\n o.maxMonth,\n Array.isArray(o.yearRange) ? o.yearRange.join('-') : o.yearRange,\n o.yearRangeReverse,\n o.showMonthAfterYear\n ].join('|');\n }\n\n renderTitle(instance, c, year, month, refYear, randId) {\n const opts = this.options,\n isMinYear = year === opts.minYear,\n isMaxYear = year === opts.maxYear;\n let i,\n j,\n arr = [],\n html =\n '<div id=\"' +\n randId +\n '\" class=\"datepicker-controls\" role=\"heading\" aria-live=\"assertive\">';\n\n // Decided up front. These used to be computed *below* the month-prev\n // button that reads `prev`, so the previous arrow was never disabled at\n // the start of the allowed range.\n const { prev, next } = this._arrowState(year, month);\n\n for (i = 0; i < 12; i++) {\n arr.push(\n '<option value=\"' +\n (year === refYear ? i - c : 12 + i - c) +\n '\"' +\n (i === month ? ' selected=\"selected\"' : '') +\n ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth)\n ? 'disabled=\"disabled\"'\n : '') +\n '>' +\n Datepicker._escape(opts.i18n.months[i]) +\n '</option>'\n );\n }\n\n const monthHtml =\n '<select class=\"datepicker-select orig-select-month\" tabindex=\"-1\">' +\n arr.join('') +\n '</select>';\n\n if (Array.isArray(opts.yearRange)) {\n i = opts.yearRange[0];\n j = opts.yearRange[1] + 1;\n } else {\n i = year - opts.yearRange;\n j = 1 + year + opts.yearRange;\n }\n\n for (arr = []; i < j && i <= opts.maxYear; i++) {\n if (i >= opts.minYear) {\n arr.push(`<option value=\"${i}\" ${i === year ? 'selected=\"selected\"' : ''}>${i}</option>`);\n }\n }\n if (opts.yearRangeReverse) arr.reverse();\n\n const yearHtml = `<select class=\"datepicker-select orig-select-year\" tabindex=\"-1\">${arr.join('')}</select>`;\n\n const leftArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/><path d=\"M0-.5h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-prev${\n prev ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n } btn\" type=\"button\">${leftArrow}</button>`;\n\n html += '<div class=\"selects-container\">';\n if (opts.showMonthAfterYear) {\n html += yearHtml + monthHtml;\n } else {\n html += monthHtml + yearHtml;\n }\n html += '</div>';\n\n const rightArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/><path d=\"M0-.25h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-next${\n next ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n } btn\" type=\"button\">${rightArrow}</button>`;\n\n return (html += '</div>');\n }\n\n /**\n * Run `fn`, collapsing every draw it triggers into a single one at the end.\n *\n * A single input click reaches draw() three times - once through\n * setDateFromInput -> setDate -> gotoDate, once directly, and once through\n * the trailing gotoDate - and each one destroys two FormSelect instances,\n * reparses the calendar and builds two fresh FormSelects. The three calls\n * cannot simply be deleted: the direct draw() is what covers an empty input\n * (setDate bails before drawing when the value does not parse), and the\n * trailing gotoDate re-centres on a date validateDate may have clamped to\n * minDate/maxDate. So they are collected instead of removed.\n *\n * Deliberately synchronous: the constructor and callers read calendarEl\n * immediately after init(), which a microtask-deferred draw would leave\n * empty.\n */\n private _batchDraws(fn: () => void) {\n this._drawDepth++;\n try {\n fn();\n } finally {\n this._drawDepth--;\n if (this._drawDepth === 0 && this._drawDirty) {\n this._drawDirty = false;\n this.draw();\n }\n }\n }\n\n // refresh HTML\n draw() {\n // Inside a batch, note that a draw is due and let the batch do it once.\n if (this._drawDepth > 0) {\n this._drawDirty = true;\n return;\n }\n const opts = this.options,\n minYear = opts.minYear,\n maxYear = opts.maxYear,\n minMonth = opts.minMonth,\n maxMonth = opts.maxMonth;\n\n if (this._y <= minYear) {\n this._y = minYear;\n if (!isNaN(minMonth) && this._m < minMonth) {\n this._m = minMonth;\n }\n }\n if (this._y >= maxYear) {\n this._y = maxYear;\n if (!isNaN(maxMonth) && this._m > maxMonth) {\n this._m = maxMonth;\n }\n }\n\n const year = this.calendars[0].year;\n const month = this.calendars[0].month;\n\n if (!this.options.isDateRange) {\n this._renderDateDisplay(this.date);\n } else {\n this._renderDateDisplay(this.date, this.endDate);\n }\n\n // Only the day grid changes when you page within a year. Rebuilding the\n // controls as well meant tearing down and reconstructing two FormSelects -\n // each with its own <ul> of 12 or 21+ options, an input, a caret and a\n // Dropdown - on every single draw.\n const key = this._controlsCacheKey(year);\n if (key === this._controlsKey && this.calendarEl.querySelector('.datepicker-controls')) {\n this._reuseControls(year, month);\n } else {\n this._controlsKey = key;\n // Held across table re-renders: the table's aria-labelledby points at\n // the controls element's id.\n this._randId = 'datepicker-title-' + Utils.guid();\n this._rebuildControls(year, month);\n }\n this._renderCalendarTable(year, month);\n\n if (typeof this.options.onDraw === 'function') {\n this.options.onDraw.call(this);\n }\n }\n\n /** Tear down the two FormSelects and render the controls from scratch. */\n private _rebuildControls(year: number, month: number) {\n this.destroySelects();\n this.calendarEl.innerHTML = this.renderTitle(this, 0, year, month, year, this._randId);\n\n const yearSelect = this.calendarEl.querySelector('.orig-select-year') as HTMLSelectElement;\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n // @todo fix accessibility @see https://github.com/materializecss/materialize/issues/522\n FormSelect.init(yearSelect, {\n classes: 'select-year',\n dropdownOptions: { container: document.body, constrainWidth: false }\n });\n FormSelect.init(monthSelect, {\n classes: 'select-month',\n dropdownOptions: { container: document.body, constrainWidth: false }\n });\n\n // Add change handlers for select\n yearSelect.addEventListener('change', this._handleYearChange);\n monthSelect.addEventListener('change', this._handleMonthChange);\n }\n\n /**\n * Keep the existing controls and bring them up to date: the selected month,\n * and the arrow states, which depend on the month rather than on the key.\n */\n private _reuseControls(year: number, month: number) {\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n if (monthSelect && monthSelect.value !== month.toString()) {\n monthSelect.value = month.toString();\n // Assigning .value fires no change event, so the wrapper needs telling.\n FormSelect.getInstance(monthSelect)?.refresh();\n }\n\n const { prev, next } = this._arrowState(year, month);\n this.calendarEl.querySelector('.month-prev')?.classList.toggle('is-disabled', !prev);\n this.calendarEl.querySelector('.month-next')?.classList.toggle('is-disabled', !next);\n }\n\n /** Replace just the day grid, leaving the controls in place. */\n private _renderCalendarTable(year: number, month: number) {\n const html = this.render(year, month, this._randId);\n const existing = this.calendarEl.querySelector('.datepicker-table-wrapper');\n if (existing) existing.outerHTML = html;\n else this.calendarEl.insertAdjacentHTML('beforeend', html);\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('change', this._handleInputChange);\n this.calendarEl.addEventListener('click', this._handleCalendarClick);\n /* this.doneBtn.addEventListener('click', this._confirm);\n this.cancelBtn.addEventListener('click', this._cancel);\n\n if (this.options.showClearBtn) {\n this.clearBtn.addEventListener('click', this._handleClearClick);\n }*/\n }\n\n _setupVariables() {\n const template = document.createElement('template');\n template.innerHTML = Datepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n\n this.calendarEl = this.containerEl.querySelector('.datepicker-calendar');\n this.yearTextEl = this.containerEl.querySelector('.year-text');\n this.dateTextEl = this.containerEl.querySelector('.date-text');\n /* if (this.options.showClearBtn) {\n this.clearBtn = this.containerEl.querySelector('.datepicker-clear');\n }\n this.doneBtn = this.containerEl.querySelector('.datepicker-done');\n this.cancelBtn = this.containerEl.querySelector('.datepicker-cancel');*/\n this.footer = this.containerEl.querySelector('.datepicker-footer');\n\n this.formats = {\n d: (date: Date) => {\n return date.getDate();\n },\n dd: (date: Date) => {\n const d = date.getDate();\n return (d < 10 ? '0' : '') + d;\n },\n ddd: (date: Date) => {\n return this.options.i18n.weekdaysShort[date.getDay()];\n },\n dddd: (date: Date) => {\n return this.options.i18n.weekdays[date.getDay()];\n },\n m: (date: Date) => {\n return date.getMonth() + 1;\n },\n mm: (date: Date) => {\n const m = date.getMonth() + 1;\n return (m < 10 ? '0' : '') + m;\n },\n mmm: (date: Date) => {\n return this.options.i18n.monthsShort[date.getMonth()];\n },\n mmmm: (date: Date) => {\n return this.options.i18n.months[date.getMonth()];\n },\n yy: (date: Date) => {\n return ('' + date.getFullYear()).slice(2);\n },\n yyyy: (date: Date) => {\n return date.getFullYear();\n }\n };\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('change', this._handleInputChange);\n this.calendarEl.removeEventListener('click', this._handleCalendarClick);\n if (this.options.isDateRange && this.endDateEl) {\n this.endDateEl.removeEventListener('click', this._handleInputClick);\n this.endDateEl.removeEventListener('keypress', this._handleInputKeydown);\n this.endDateEl.removeEventListener('change', this._handleInputChange);\n }\n }\n\n _handleInputClick = (e) => {\n // Prevents default browser datepicker modal rendering\n if (e.type == 'date') {\n e.preventDefault();\n }\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n this.gotoDate(<HTMLElement>e.target === this.el ? this.date : this.endDate);\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n }\n };\n\n _handleCalendarClick = (e) => {\n const target = <HTMLElement>e.target;\n if (target.classList.contains('is-disabled')) return;\n\n this._batchDraws(() => {\n if (\n target.classList.contains('datepicker-day-button') &&\n !target.classList.contains('is-empty') &&\n !target.parentElement.classList.contains('is-disabled')\n ) {\n const selectedDate = new Date(\n e.target.getAttribute('data-year'),\n e.target.getAttribute('data-month'),\n e.target.getAttribute('data-day')\n );\n\n if (!this.multiple || (this.multiple && this.options.isMultipleSelection)) {\n this.setDate(selectedDate);\n }\n\n // Selecting a range end draws a second time on top of setDate's.\n if (this.options.isDateRange) {\n this._handleDateRangeCalendarClick(selectedDate);\n }\n\n if (this.options.autoSubmit) this._finishSelection();\n } else if (target.closest('.month-prev')) {\n this.prevMonth();\n } else if (target.closest('.month-next')) {\n this.nextMonth();\n }\n });\n };\n\n _handleDateRangeCalendarClick = (date: Date) => {\n if (this.endDate == null || !Datepicker._compareDates(date, this.endDate)) {\n if (Datepicker._isDate(this.date) && Datepicker._comparePastDate(date, this.date)) {\n return;\n }\n\n this.setDate(date, false, Datepicker._isDate(this.date));\n return;\n }\n\n this._clearDates();\n this.draw();\n };\n\n _handleClearClick = () => {\n this._clearDates();\n this.setInputValues();\n };\n\n _clearDates = () => {\n this.date = null;\n this.endDate = null;\n this.draw();\n };\n\n _handleMonthChange = (e) => {\n this.gotoMonth(e.target.value);\n };\n\n _handleYearChange = (e) => {\n this.gotoYear(e.target.value);\n };\n\n // change view to a specific month (zero-index, e.g. 0: January)\n gotoMonth(month) {\n if (!isNaN(month)) {\n this.calendars[0].month = parseInt(month, 10);\n this.adjustCalendars();\n }\n }\n\n // change view to a specific full year (e.g. \"2012\")\n gotoYear(year) {\n if (!isNaN(year)) {\n this.calendars[0].year = parseInt(year, 10);\n this.adjustCalendars();\n }\n }\n\n _handleInputChange = (e: Event) => {\n let date;\n const el = e.target as HTMLElement;\n // Prevent change event from being fired when triggered by the plugin\n if (e['detail']?.firedBy === this) return;\n // Prevent change event from being fired if an end date is set without a start date\n if (el == this.endDateEl && !this.date) return;\n if (this.options.parse) {\n date = this.options.parse(\n (e.target as HTMLInputElement).value,\n typeof this.options.format === 'function'\n ? this.options.format(new Date(this.el.value))\n : this.options.format\n );\n } else {\n date = new Date(Date.parse((e.target as HTMLInputElement).value));\n }\n if (Datepicker._isDate(date)) {\n this.setDate(date, false, el == this.endDateEl, true);\n if (e.type == 'date') {\n this.setDataDate(e, date);\n this.setInputValues();\n }\n }\n };\n\n renderDayName(opts, day, abbr: boolean = false) {\n day += opts.firstDay;\n while (day >= 7) {\n day -= 7;\n }\n return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];\n }\n\n createDateInput() {\n const dateInput = <HTMLInputElement>this.el.cloneNode(true);\n // cloneNode copies the id too, and two elements sharing one id break every\n // lookup that goes through it.\n dateInput.removeAttribute('id');\n dateInput.addEventListener('click', this._handleInputClick);\n dateInput.addEventListener('keypress', this._handleInputKeydown);\n dateInput.addEventListener('change', this._handleInputChange);\n this.el.parentElement.appendChild(dateInput);\n return dateInput;\n }\n\n // Set input value to the selected date and close Datepicker\n _finishSelection = () => {\n this.setInputValues();\n // Commented out because of function deprecations\n // this.close();\n };\n\n _confirm = () => {\n this._finishSelection();\n if (typeof this.options.onConfirm === 'function') this.options.onConfirm.call(this);\n }\n\n _cancel = () => {\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n };\n\n // deprecated\n open() {\n console.warn('Datepicker.open() is deprecated. Remove this method and wrap in modal yourself.');\n return this;\n }\n close() {\n console.warn(\n 'Datepicker.close() is deprecated. Remove this method and wrap in modal yourself.'\n );\n return this;\n }\n\n static {\n Datepicker._template = `\n <div class=\"datepicker-container\">\n <div class=\"datepicker-date-display\">\n <span class=\"year-text\"></span>\n <span class=\"date-text\"></span>\n </div>\n <div class=\"datepicker-calendar-container\">\n <div class=\"datepicker-calendar\"></div>\n <div class=\"datepicker-footer\">\n <!--<button class=\"btn-flat datepicker-clear waves-effect\" style=\"visibility: hidden;\" type=\"button\"></button>\n <div class=\"confirmation-btns\">\n <button class=\"btn-flat datepicker-cancel waves-effect\" type=\"button\"></button>\n <button class=\"btn-flat datepicker-done waves-effect\" type=\"button\"></button>\n </div>-->\n </div>\n </div>\n </div>`;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { BaseOptions, Component, InitElements, MElement } from '../core/component';\n\nexport interface LightboxOptions extends BaseOptions {\n /**\n * Transition in duration in milliseconds.\n * @default 275\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 200\n */\n outDuration: number;\n /**\n * Callback function called before lightbox is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before lightbox is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: LightboxOptions = {\n inDuration: 275,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nexport class Lightbox extends Component<LightboxOptions> {\n /** If the lightbox overlay is showing. */\n overlayActive: boolean;\n /** If the lightbox is no longer being animated. */\n doneAnimating: boolean;\n /** Caption, if specified. */\n caption: string;\n /** Original width of image. */\n originalWidth: number;\n /** Original height of image. */\n originalHeight: number;\n private originInlineStyles: string;\n private placeholder: HTMLElement;\n private _changedAncestorList: HTMLElement[];\n private newHeight: number;\n private newWidth: number;\n private windowWidth: number;\n private windowHeight: number;\n private attrWidth: string;\n private attrHeight: string;\n private _overlay: HTMLElement;\n private _photoCaption: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<LightboxOptions>) {\n super(el, options, Lightbox);\n this.el['Expressive_Lightbox'] = this;\n\n this.options = {\n ...Lightbox.defaults,\n ...options\n };\n\n this.overlayActive = false;\n this.doneAnimating = true;\n this.placeholder = document.createElement('div');\n this.placeholder.classList.add('material-placeholder');\n this.originalWidth = 0;\n this.originalHeight = 0;\n this.originInlineStyles = this.el.getAttribute('style');\n this.caption = this.el.getAttribute('data-caption') || '';\n this.el.tabIndex = 0;\n // Wrap\n this.el.before(this.placeholder);\n this.placeholder.append(this.el);\n this._setupEventHandlers();\n }\n\n static get defaults(): LightboxOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Lightbox.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<LightboxOptions>): Lightbox;\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<LightboxOptions>): Lightbox[];\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<LightboxOptions> = {}\n ): Lightbox | Lightbox[] {\n return super.init(els, options, Lightbox);\n }\n\n static getInstance(el: HTMLElement): Lightbox {\n return el['Expressive_Lightbox'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_Lightbox'] = undefined;\n // Unwrap image\n //this.placeholder.after(this.el).remove();\n this.placeholder.remove();\n this.el.removeAttribute('style');\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleLightboxClick);\n this.el.addEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleLightboxClick);\n this.el.removeEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _handleLightboxClick = () => {\n this._handleLightboxToggle();\n };\n\n private _handleLightboxKeypress = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleLightboxToggle();\n }\n };\n\n private _handleLightboxToggle = () => {\n // If already modal, return to original\n if (this.doneAnimating === false || (this.overlayActive && this.doneAnimating)) this.close();\n else this.open();\n };\n\n private _handleWindowScroll = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowResize = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowEscape = (e: KeyboardEvent) => {\n if (Utils.keys.ESC.includes(e.key) && this.doneAnimating && this.overlayActive) this.close();\n };\n\n private _makeAncestorsOverflowVisible() {\n this._changedAncestorList = [];\n let ancestor = this.placeholder.parentNode;\n while (ancestor !== null && ancestor !== document) {\n const curr = <HTMLElement>ancestor;\n if (curr.style.overflow !== 'visible') {\n curr.style.overflow = 'visible';\n this._changedAncestorList.push(curr);\n }\n ancestor = ancestor.parentNode;\n }\n }\n\n private _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.scrollY - docElem.clientTop,\n left: box.left + window.scrollX - docElem.clientLeft\n };\n }\n private _updateVars(): void {\n this.windowWidth = window.innerWidth;\n this.windowHeight = window.innerHeight;\n this.caption = this.el.getAttribute('data-caption') || '';\n }\n\n // Image\n private _animateImageIn(): void {\n this.el.style.maxHeight = this.newHeight.toString() + 'px';\n this.el.style.maxWidth = this.newWidth.toString() + 'px';\n const duration = this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.height = this.originalHeight + 'px';\n this.el.style.width = this.originalWidth + 'px';\n setTimeout(() => {\n // One offset for both axes, read before any of the writes below.\n const placeholderOffset = this._offset(this.placeholder);\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.newHeight + 'px';\n this.el.style.width = this.newWidth + 'px';\n this.el.style.left =\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n placeholderOffset.left -\n this.newWidth / 2 +\n 'px';\n\n this.el.style.top =\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n placeholderOffset.top -\n this.newHeight / 2 +\n 'px';\n }, 1);\n\n setTimeout(() => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n\n /*\n anim({\n targets: this.el, // image\n height: [this.originalHeight, this.newHeight],\n width: [this.originalWidth, this.newWidth],\n left:\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n this._offset(this.placeholder).left -\n this.newWidth / 2,\n top:\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n this._offset(this.placeholder).top -\n this.newHeight / 2,\n\n duration: this.options.inDuration,\n easing: 'easeOutQuad',\n complete: () => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }\n });\n */\n }\n private _animateImageOut(): void {\n const duration = this.options.outDuration;\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.originalHeight + 'px'; // was originalWidth\n this.el.style.width = this.originalWidth + 'px';\n this.el.style.left = '0';\n this.el.style.top = '0';\n setTimeout(() => {\n this.placeholder.style.height = '';\n this.placeholder.style.width = '';\n this.placeholder.style.position = '';\n this.placeholder.style.top = '';\n this.placeholder.style.left = '';\n // Revert to width or height attribute\n if (this.attrWidth) this.el.setAttribute('width', this.attrWidth.toString());\n if (this.attrHeight) this.el.setAttribute('height', this.attrHeight.toString());\n this.el.removeAttribute('style');\n if (this.originInlineStyles) this.el.setAttribute('style', this.originInlineStyles);\n // Remove class\n this.el.classList.remove('active');\n this.doneAnimating = true;\n // Remove overflow overrides on ancestors\n this._changedAncestorList.forEach((anchestor) => (anchestor.style.overflow = ''));\n // onCloseEnd callback\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n // Caption\n private _addCaption(): void {\n this._photoCaption = document.createElement('div');\n this._photoCaption.classList.add('lightbox-caption');\n this._photoCaption.innerText = this.caption;\n document.body.append(this._photoCaption);\n this._photoCaption.style.display = 'inline';\n // Animate\n this._photoCaption.style.transition = 'none';\n this._photoCaption.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '1';\n }, 1);\n }\n private _removeCaption(): void {\n const duration = this.options.outDuration;\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '0';\n setTimeout(() => {\n this._photoCaption.remove();\n }, duration);\n }\n\n // Overlay\n private _addOverlay(): void {\n this._overlay = document.createElement('div');\n this._overlay.id = 'lightbox-overlay';\n this._overlay.addEventListener(\n 'click',\n () => {\n if (this.doneAnimating) this.close();\n },\n { once: true }\n );\n\n // Put before in origin image to preserve z-index layering.\n this.el.before(this._overlay);\n\n // Set dimensions if needed\n const overlayOffset = this._overlay.getBoundingClientRect();\n this._overlay.style.width = this.windowWidth + 'px';\n this._overlay.style.height = this.windowHeight + 'px';\n this._overlay.style.left = -1 * overlayOffset.left + 'px';\n this._overlay.style.top = -1 * overlayOffset.top + 'px';\n\n // Animate\n this._overlay.style.transition = 'none';\n this._overlay.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '1';\n }, 1);\n }\n private _removeOverlay(): void {\n const duration = this.options.outDuration;\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '0';\n setTimeout(() => {\n this.overlayActive = false;\n this._overlay.remove();\n }, duration);\n }\n\n /**\n * Open lightbox.\n */\n open = () => {\n this._updateVars();\n // Both rects are read up front: measuring the placeholder after writing\n // its width forced a second layout for the height.\n const originRect = this.el.getBoundingClientRect();\n const placeholderRect = this.placeholder.getBoundingClientRect();\n this.originalWidth = originRect.width;\n this.originalHeight = originRect.height;\n // Set states\n this.doneAnimating = false;\n this.el.classList.add('active');\n this.overlayActive = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function')\n this.options.onOpenStart.call(this, this.el);\n // Set positioning for placeholder\n this.placeholder.style.width = placeholderRect.width + 'px';\n this.placeholder.style.height = placeholderRect.height + 'px';\n this.placeholder.style.position = 'relative';\n this.placeholder.style.top = '0';\n this.placeholder.style.left = '0';\n this._makeAncestorsOverflowVisible();\n // Set css on origin\n this.el.style.position = 'absolute';\n this.el.style.zIndex = '1000';\n this.el.style.willChange = 'left, top, width, height';\n // Change from width or height attribute to css\n this.attrWidth = this.el.getAttribute('width');\n this.attrHeight = this.el.getAttribute('height');\n if (this.attrWidth) {\n this.el.style.width = this.attrWidth + 'px';\n this.el.removeAttribute('width');\n }\n if (this.attrHeight) {\n this.el.style.height = this.attrHeight + 'px'; // was width, from the height attribute\n this.el.removeAttribute('height');\n }\n this._addOverlay();\n // Add and animate caption if it exists\n if (this.caption !== '') this._addCaption();\n // Resize Image\n const widthPercent = this.originalWidth / this.windowWidth;\n const heightPercent = this.originalHeight / this.windowHeight;\n this.newWidth = 0;\n this.newHeight = 0;\n if (widthPercent > heightPercent) {\n // Width first\n const ratio = this.originalHeight / this.originalWidth;\n this.newWidth = this.windowWidth * 0.9;\n this.newHeight = this.windowWidth * 0.9 * ratio;\n } else {\n // Height first\n const ratio = this.originalWidth / this.originalHeight;\n this.newWidth = this.windowHeight * 0.9 * ratio;\n this.newHeight = this.windowHeight * 0.9;\n }\n this._animateImageIn();\n // Handle Exit triggers\n window.addEventListener('scroll', this._handleWindowScroll, { passive: true });\n window.addEventListener('resize', this._handleWindowResize, { passive: true });\n window.addEventListener('keyup', this._handleWindowEscape);\n };\n\n /**\n * Close lightbox.\n */\n close = () => {\n this._updateVars();\n this.doneAnimating = false;\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function')\n this.options.onCloseStart.call(this, this.el);\n //anim.remove(this.el);\n //anim.remove(this._overlay);\n //if (this.caption !== '') anim.remove(this._photoCaption);\n // disable exit handlers\n window.removeEventListener('scroll', this._handleWindowScroll);\n window.removeEventListener('resize', this._handleWindowResize);\n window.removeEventListener('keyup', this._handleWindowEscape);\n this._removeOverlay();\n this._animateImageOut();\n if (this.caption !== '') this._removeCaption();\n };\n}\n", "import { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\n// Obsolete for versions > 2.1.1\n\nexport interface ModalOptions extends BaseOptions {\n opacity: number;\n inDuration: number;\n outDuration: number;\n preventScrolling: boolean;\n onOpenStart: (this: Modal, el: HTMLElement) => void;\n onOpenEnd: (this: Modal, el: HTMLElement) => void;\n onCloseStart: (el: HTMLElement) => void;\n onCloseEnd: (el: HTMLElement) => void;\n dismissible: boolean;\n startingTop: string;\n endingTop: string;\n}\n\nconst _defaults = {\n opacity: 0.5,\n inDuration: 250,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n preventScrolling: true,\n dismissible: true,\n startingTop: '4%',\n endingTop: '10%'\n};\n\nexport class Modal extends Component<ModalOptions> {\n constructor(el: HTMLElement, options: Partial<ModalOptions>) {\n super(el, options, Modal);\n this.el['Expressive_Modal'] = this;\n this.options = {\n ...Modal.defaults,\n ...options\n };\n this.el.tabIndex = 0;\n this._setupEventHandlers();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<ModalOptions>): Modal;\n static init(els: InitElements<MElement>, options?: Partial<ModalOptions>): Modal[];\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ModalOptions> = {}\n ): Modal | Modal[] {\n return super.init(els, options, Modal);\n }\n\n static getInstance(el: HTMLElement): Modal {\n return el['Expressive_Modal'];\n }\n\n destroy() {}\n _setupEventHandlers() {}\n _removeEventHandlers() {}\n _handleTriggerClick() {}\n _handleOverlayClick() {}\n _handleModalCloseClick() {}\n _handleKeydown() {}\n _handleFocus() {}\n open() {\n return this;\n }\n close() {\n return this;\n }\n\n // Experimental!\n\n static #createHtml(config: ModalCreateConfig) {\n const title = config.header\n ? `<h2>${typeof config.header === 'string' ? config.header : ''}</h2>`\n : '';\n const actions = config.footer\n ? `<form method=\"dialog\">${typeof config.footer === 'string' ? config.footer : ''}</form>`\n : '';\n return `<dialog id=\"${config.id}\">\n ${title}\n <div>${typeof config.content === 'string' ? config.content : ''}</div>\n ${actions}\n </dialog>`;\n }\n\n static #createHtmlElement(config: ModalCreateConfig) {\n const dialog = document.createElement('dialog');\n dialog.id = config.id;\n return dialog;\n }\n\n static create(config) {\n const isServer = false;\n if (isServer) return this.#createHtml(config);\n return this.#createHtmlElement(config);\n }\n\n static {}\n}\n\ninterface ModalCreateConfig {\n id: string;\n header: string | HTMLElement;\n content: string | HTMLElement;\n footer: string | HTMLElement;\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface ParallaxOptions extends BaseOptions {\n /**\n * The minimum width of the screen, in pixels, where the parallax functionality starts working.\n * @default 0\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: ParallaxOptions = {\n responsiveThreshold: 0 // breakpoint for swipeable\n};\n\nexport class Parallax extends Component<ParallaxOptions> {\n private _enabled: boolean;\n private _img: HTMLImageElement;\n static _parallaxes: Parallax[] = [];\n static _handleWindowResizeThrottled: (...args: unknown[]) => void;\n private static _scrollFrame: number = null;\n\n constructor(el: HTMLElement, options: Partial<ParallaxOptions>) {\n super(el, options, Parallax);\n this.el['Expressive_Parallax'] = this;\n\n this.options = {\n ...Parallax.defaults,\n ...options\n };\n\n this._enabled = window.innerWidth > this.options.responsiveThreshold;\n this._img = this.el.querySelector('img');\n if (!this._img) {\n console.error('Parallax: no <img> to move inside the .parallax element');\n return;\n }\n this._updateParallax();\n this._setupEventHandlers();\n this._setupStyles();\n Parallax._parallaxes.push(this);\n }\n\n static get defaults(): ParallaxOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Parallax.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ParallaxOptions>): Parallax;\n /**\n * Initializes instances of Parallax.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<ParallaxOptions>): Parallax[];\n /**\n * Initializes instances of Parallax.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ParallaxOptions> = {}\n ): Parallax | Parallax[] {\n return super.init(els, options, Parallax);\n }\n\n static getInstance(el: HTMLElement): Parallax {\n return el['Expressive_Parallax'];\n }\n\n destroy() {\n const index = Parallax._parallaxes.indexOf(this);\n if (index >= 0) Parallax._parallaxes.splice(index, 1);\n if (this._img) this._img.style.transform = '';\n this._removeEventHandlers();\n this.el['Expressive_Parallax'] = undefined;\n }\n\n static _handleScroll() {\n for (let i = 0; i < Parallax._parallaxes.length; i++) {\n const parallaxInstance = Parallax._parallaxes[i];\n parallaxInstance._updateParallax.call(parallaxInstance);\n }\n }\n\n /**\n * Coalesce scroll events onto animation frames.\n *\n * The handler reads layout and then writes a transform, so running it more\n * than once per frame is wasted work - and the 5ms throttle it replaces was\n * short enough to let several run per frame anyway.\n */\n static _requestScrollUpdate = () => {\n if (Parallax._scrollFrame !== null) return;\n Parallax._scrollFrame = requestAnimationFrame(() => {\n Parallax._scrollFrame = null;\n Parallax._handleScroll();\n });\n };\n\n static _handleWindowResize() {\n for (let i = 0; i < Parallax._parallaxes.length; i++) {\n const parallaxInstance = Parallax._parallaxes[i];\n parallaxInstance._enabled = window.innerWidth > parallaxInstance.options.responsiveThreshold;\n }\n }\n\n _setupEventHandlers() {\n this._img?.addEventListener('load', this._handleImageLoad);\n if (Parallax._parallaxes.length === 0) {\n if (!Parallax._handleWindowResizeThrottled) {\n Parallax._handleWindowResizeThrottled = Utils.throttle(Parallax._handleWindowResize, 100);\n }\n window.addEventListener('scroll', Parallax._requestScrollUpdate, { passive: true });\n window.addEventListener('resize', Parallax._handleWindowResizeThrottled, { passive: true });\n }\n }\n\n _removeEventHandlers() {\n this._img?.removeEventListener('load', this._handleImageLoad);\n if (Parallax._parallaxes.length === 0) {\n window.removeEventListener('scroll', Parallax._requestScrollUpdate);\n window.removeEventListener('resize', Parallax._handleWindowResizeThrottled);\n if (Parallax._scrollFrame !== null) {\n cancelAnimationFrame(Parallax._scrollFrame);\n Parallax._scrollFrame = null;\n }\n }\n }\n\n _setupStyles() {\n if (this._img) this._img.style.opacity = '1';\n }\n\n _handleImageLoad = () => {\n this._updateParallax();\n };\n\n _updateParallax() {\n // Runs for every parallax element on every scroll tick, so it reads\n // layout once: one rect for the element, reused for the height check and\n // both offsets.\n const rect = this.el.getBoundingClientRect();\n const containerHeight = rect.height > 0 ? this.el.parentElement.offsetHeight : 500;\n const imgHeight = this._img.offsetHeight;\n const parallaxDist = imgHeight - containerHeight;\n const top = rect.top + window.scrollY - document.documentElement.clientTop;\n const bottom = top + containerHeight;\n const scrollTop = Utils.getDocumentScrollTop();\n const windowHeight = window.innerHeight;\n const windowBottom = scrollTop + windowHeight;\n const percentScrolled = (windowBottom - top) / (containerHeight + windowHeight);\n const parallax = parallaxDist * percentScrolled;\n\n if (!this._enabled) {\n this._img.style.transform = '';\n } else if (bottom > scrollTop && top < scrollTop + windowHeight) {\n this._img.style.transform = `translate3D(-50%, ${parallax}px, 0)`;\n }\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface PushpinOptions extends BaseOptions {\n /**\n * The distance in pixels from the top of the page where\n * the element becomes fixed.\n * @default 0\n */\n top: number;\n /**\n * The distance in pixels from the top of the page where\n * the elements stops being fixed.\n * @default Infinity\n */\n bottom: number;\n /**\n * The offset from the top the element will be fixed at.\n * @default 0\n */\n offset: number;\n /**\n * Callback function called when pushpin position changes.\n * You are provided with a position string.\n * @default null\n */\n onPositionChange: (position: 'pinned' | 'pin-top' | 'pin-bottom') => void;\n}\n\nconst _defaults = {\n top: 0,\n bottom: Infinity,\n offset: 0,\n onPositionChange: null\n};\n\nexport class Pushpin extends Component<PushpinOptions> {\n static _pushpins: Pushpin[];\n originalOffset: number;\n\n constructor(el: HTMLElement, options: Partial<PushpinOptions>) {\n super(el, options, Pushpin);\n this.el['Expressive_Pushpin'] = this;\n\n this.options = {\n ...Pushpin.defaults,\n ...options\n };\n\n this.originalOffset = (this.el as HTMLElement).offsetTop;\n Pushpin._pushpins.push(this);\n this._setupEventHandlers();\n this._updatePosition();\n }\n\n static get defaults(): PushpinOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Pushpin.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<PushpinOptions>): Pushpin;\n /**\n * Initializes instances of Pushpin.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<PushpinOptions>): Pushpin[];\n /**\n * Initializes instances of Pushpin.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<PushpinOptions> = {}\n ): Pushpin | Pushpin[] {\n return super.init(els, options, Pushpin);\n }\n\n static getInstance(el: HTMLElement): Pushpin {\n return el['Expressive_Pushpin'];\n }\n\n destroy() {\n (this.el as HTMLElement).style.top = null;\n this._removePinClasses();\n // Remove pushpin Inst\n const index = Pushpin._pushpins.indexOf(this);\n Pushpin._pushpins.splice(index, 1);\n if (Pushpin._pushpins.length === 0) {\n this._removeEventHandlers();\n }\n this.el['Expressive_Pushpin'] = undefined;\n }\n\n static _updateElements() {\n for (let i = 0; i < Pushpin._pushpins.length; i++) {\n Pushpin._pushpins[i]._updatePosition();\n }\n }\n\n _setupEventHandlers() {\n document.addEventListener('scroll', Pushpin._updateElements, { passive: true });\n }\n\n _removeEventHandlers() {\n document.removeEventListener('scroll', Pushpin._updateElements);\n }\n\n _updatePosition() {\n const scrolled = Utils.getDocumentScrollTop() + this.options.offset;\n\n if (\n this.options.top <= scrolled &&\n this.options.bottom >= scrolled &&\n !this.el.classList.contains('pinned')\n ) {\n this._removePinClasses();\n (this.el as HTMLElement).style.top = `${this.options.offset}px`;\n this.el.classList.add('pinned');\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pinned');\n }\n }\n\n // Add pin-top (when scrolled position is above top)\n if (scrolled < this.options.top && !this.el.classList.contains('pin-top')) {\n this._removePinClasses();\n (this.el as HTMLElement).style.top = '0';\n this.el.classList.add('pin-top');\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pin-top');\n }\n }\n\n // Add pin-bottom (when scrolled position is below bottom)\n if (scrolled > this.options.bottom && !this.el.classList.contains('pin-bottom')) {\n this._removePinClasses();\n this.el.classList.add('pin-bottom');\n (this.el as HTMLElement).style.top = `${this.options.bottom - this.originalOffset}px`;\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pin-bottom');\n }\n }\n }\n\n _removePinClasses() {\n this.el.classList.remove('pin-top', 'pinned', 'pin-bottom');\n }\n\n static {\n Pushpin._pushpins = [];\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface ScrollSpyOptions extends BaseOptions {\n /**\n * Throttle of scroll handler.\n * @default 100\n */\n throttle: number;\n /**\n * Offset for centering element when scrolled to.\n * @default 200\n */\n scrollOffset: number;\n /**\n * Class applied to active elements.\n * @default 'active'\n */\n activeClass: string;\n /**\n * Used to find active element.\n * @default id => 'a[href=\"#' + id + '\"]'\n */\n getActiveElement: (id: string) => string;\n /**\n * Used to keep last top element active even if\n * scrollbar goes outside of scrollspy elements.\n *\n * If there is no last top element,\n * then the active one will be the first element.\n *\n * @default false\n */\n keepTopElementActive: boolean;\n /**\n * Used to set scroll animation duration in milliseconds.\n * @default null (browser's native animation implementation/duration)\n */\n animationDuration: number | null;\n}\n\nconst _defaults: ScrollSpyOptions = {\n throttle: 100,\n scrollOffset: 200, // offset - 200 allows elements near bottom of page to scroll\n activeClass: 'active',\n getActiveElement: (id: string): string => {\n return 'a[href=\"#' + id + '\"]';\n },\n keepTopElementActive: false,\n animationDuration: null\n};\n\nexport class ScrollSpy extends Component<ScrollSpyOptions> {\n static _elements: ScrollSpy[];\n static _count: number;\n static _increment: number;\n static _elementsInView: ScrollSpy[];\n static _visibleElements: HTMLElement[];\n static _ticks: number;\n static _keptTopActiveElement: HTMLElement | null = null;\n // The document-level listeners are shared by every instance, so the\n // references they are registered with have to be shared too - registering\n // with one instance's bound handler and unregistering with another's is a\n // silent no-op that leaves the listener attached forever.\n private static _throttledScroll: (...args: unknown[]) => void = null;\n private static _throttledResize: (...args: unknown[]) => void = null;\n\n private tickId: number;\n private id: string;\n\n constructor(el: HTMLElement, options: Partial<ScrollSpyOptions>) {\n super(el, options, ScrollSpy);\n this.el['Expressive_ScrollSpy'] = this;\n\n this.options = {\n ...ScrollSpy.defaults,\n ...options\n };\n\n ScrollSpy._elements.push(this);\n ScrollSpy._count++;\n ScrollSpy._increment++;\n this.tickId = -1;\n this.id = ScrollSpy._increment.toString();\n this._setupEventHandlers();\n ScrollSpy._handleWindowScroll();\n }\n\n static get defaults(): ScrollSpyOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of ScrollSpy.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ScrollSpyOptions>): ScrollSpy;\n /**\n * Initializes instances of ScrollSpy.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<ScrollSpyOptions>): ScrollSpy[];\n /**\n * Initializes instances of ScrollSpy.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ScrollSpyOptions> = {}\n ): ScrollSpy | ScrollSpy[] {\n return super.init(els, options, ScrollSpy);\n }\n\n static getInstance(el: HTMLElement): ScrollSpy {\n return el['Expressive_ScrollSpy'];\n }\n\n destroy() {\n const elementIndex = ScrollSpy._elements.indexOf(this);\n if (elementIndex >= 0) ScrollSpy._elements.splice(elementIndex, 1);\n const inViewIndex = ScrollSpy._elementsInView.indexOf(this);\n if (inViewIndex >= 0) ScrollSpy._elementsInView.splice(inViewIndex, 1);\n const visibleIndex = ScrollSpy._visibleElements.indexOf(this.el);\n if (visibleIndex >= 0) ScrollSpy._visibleElements.splice(visibleIndex, 1);\n ScrollSpy._count--;\n this._removeEventHandlers();\n // Optional: the trigger may already be gone from the DOM, and throwing\n // here would abort the rest of the teardown.\n const actElem = document.querySelector(this.options.getActiveElement(this.el.id));\n actElem?.classList.remove(this.options.activeClass);\n this.el['Expressive_ScrollSpy'] = undefined;\n }\n\n _setupEventHandlers() {\n if (ScrollSpy._count === 1) {\n // Honour the documented `throttle` option - the scroll handler reads\n // layout for every spied element, so running it on every scroll event\n // was the single most expensive thing this component did.\n ScrollSpy._throttledScroll = Utils.throttle(ScrollSpy._handleWindowScroll, this.options.throttle);\n ScrollSpy._throttledResize = Utils.throttle(ScrollSpy._handleWindowScroll, 200);\n window.addEventListener('scroll', ScrollSpy._throttledScroll, { passive: true });\n window.addEventListener('resize', ScrollSpy._throttledResize, { passive: true });\n document.body.addEventListener('click', ScrollSpy._handleTriggerClick);\n }\n }\n\n _removeEventHandlers() {\n if (ScrollSpy._count === 0) {\n window.removeEventListener('scroll', ScrollSpy._throttledScroll);\n window.removeEventListener('resize', ScrollSpy._throttledResize);\n document.body.removeEventListener('click', ScrollSpy._handleTriggerClick);\n ScrollSpy._throttledScroll = null;\n ScrollSpy._throttledResize = null;\n }\n }\n\n static _handleTriggerClick = (e: MouseEvent) => {\n const trigger = e.target;\n for (let i = ScrollSpy._elements.length - 1; i >= 0; i--) {\n const scrollspy = ScrollSpy._elements[i];\n const x = document.querySelector('a[href=\"#' + scrollspy.el.id + '\"]');\n if (trigger === x) {\n e.preventDefault();\n\n if (scrollspy.el['Expressive_ScrollSpy'].options.animationDuration) {\n ScrollSpy._smoothScrollIntoView(\n scrollspy.el,\n scrollspy.el['Expressive_ScrollSpy'].options.animationDuration\n );\n } else {\n scrollspy.el.scrollIntoView({ behavior: 'smooth' });\n }\n break;\n }\n }\n };\n\n static _handleWindowScroll = () => {\n // unique tick id\n ScrollSpy._ticks++;\n\n // viewport rectangle\n const top = Utils.getDocumentScrollTop(),\n left = Utils.getDocumentScrollLeft(),\n right = left + window.innerWidth,\n bottom = top + window.innerHeight;\n\n // determine which elements are in view\n const intersections = ScrollSpy._findElements(top, right, bottom, left);\n for (let i = 0; i < intersections.length; i++) {\n const scrollspy = intersections[i];\n const lastTick = scrollspy.tickId;\n if (lastTick < 0) {\n // entered into view\n scrollspy._enter();\n }\n\n // update tick id\n scrollspy.tickId = ScrollSpy._ticks;\n }\n\n for (let i = 0; i < ScrollSpy._elementsInView.length; i++) {\n const scrollspy = ScrollSpy._elementsInView[i];\n const lastTick = scrollspy.tickId;\n if (lastTick >= 0 && lastTick !== ScrollSpy._ticks) {\n // exited from view\n scrollspy._exit();\n scrollspy.tickId = -1;\n }\n }\n // remember elements in view for next tick\n ScrollSpy._elementsInView = intersections;\n if (ScrollSpy._elements.length) {\n const options = ScrollSpy._elements[0].el['Expressive_ScrollSpy'].options;\n if (options.keepTopElementActive && ScrollSpy._visibleElements.length === 0) {\n ScrollSpy._resetKeptTopActiveElement(options.activeClass);\n // Measure once per element, then sort on the numbers. Reading the\n // distance inside the comparator meant O(n log n) forced layouts.\n const topElements = ScrollSpy._elements\n .map((value) => ({ value, distance: ScrollSpy._getDistanceToViewport(value.el) }))\n .filter((entry) => entry.distance <= 0)\n .sort((a, b) => a.distance - b.distance)\n .map((entry) => entry.value);\n const nearestTopElement = topElements.length\n ? topElements[topElements.length - 1]\n : ScrollSpy._elements[0];\n const actElem = document.querySelector(options.getActiveElement(nearestTopElement.el.id));\n actElem?.classList.add(options.activeClass);\n ScrollSpy._keptTopActiveElement = actElem as HTMLElement;\n }\n }\n };\n\n static _findElements(top: number, right: number, bottom: number, left: number): ScrollSpy[] {\n const hits = [];\n // Hoisted out of the loop: these are per-document, not per-element, and\n // reading them inside would force a layout flush on every iteration.\n const docElem = document.documentElement;\n const clientTop = docElem.clientTop;\n const clientLeft = docElem.clientLeft;\n const scrollY = window.scrollY;\n const scrollX = window.scrollX;\n\n for (let i = 0; i < ScrollSpy._elements.length; i++) {\n const scrollspy = ScrollSpy._elements[i];\n const currTop = top + scrollspy.options.scrollOffset || 200;\n\n // One rect per element per tick. This used to take five - a height\n // check, two _offset() calls that each built their own rect, and two\n // more reads for width and height - and it runs for every spied element\n // on every scroll tick.\n const box = scrollspy.el.getBoundingClientRect();\n if (box.height > 0) {\n const elTop = box.top + scrollY - clientTop,\n elLeft = box.left + scrollX - clientLeft,\n elRight = elLeft + box.width,\n elBottom = elTop + box.height;\n\n const isIntersect = !(\n elLeft > right ||\n elRight < left ||\n elTop > bottom ||\n elBottom < currTop\n );\n\n if (isIntersect) {\n hits.push(scrollspy);\n }\n }\n }\n return hits;\n }\n\n _enter() {\n ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(\n (value) => value.getBoundingClientRect().height !== 0\n );\n\n if (ScrollSpy._visibleElements[0]) {\n const actElem = document.querySelector(\n this.options.getActiveElement(ScrollSpy._visibleElements[0].id)\n );\n actElem?.classList.remove(this.options.activeClass);\n\n if (\n ScrollSpy._visibleElements[0]['Expressive_ScrollSpy'] &&\n this.id < ScrollSpy._visibleElements[0]['Expressive_ScrollSpy'].id\n ) {\n ScrollSpy._visibleElements.unshift(this.el);\n } else {\n ScrollSpy._visibleElements.push(this.el);\n }\n } else {\n ScrollSpy._visibleElements.push(this.el);\n }\n ScrollSpy._resetKeptTopActiveElement(this.options.activeClass);\n const selector = this.options.getActiveElement(ScrollSpy._visibleElements[0].id);\n document.querySelector(selector)?.classList.add(this.options.activeClass);\n }\n\n _exit() {\n ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(\n (value) => value.getBoundingClientRect().height !== 0\n );\n\n if (ScrollSpy._visibleElements[0]) {\n const actElem = document.querySelector(\n this.options.getActiveElement(ScrollSpy._visibleElements[0].id)\n );\n actElem?.classList.remove(this.options.activeClass);\n\n ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter((x) => x.id != this.el.id);\n\n if (ScrollSpy._visibleElements[0]) {\n // Check if empty\n const selector = this.options.getActiveElement(ScrollSpy._visibleElements[0].id);\n document.querySelector(selector)?.classList.add(this.options.activeClass);\n ScrollSpy._resetKeptTopActiveElement(this.options.activeClass);\n }\n }\n }\n\n private static _resetKeptTopActiveElement(activeClass: string) {\n if (ScrollSpy._keptTopActiveElement) {\n ScrollSpy._keptTopActiveElement.classList.remove(activeClass);\n ScrollSpy._keptTopActiveElement = null;\n }\n }\n\n private static _getDistanceToViewport(element) {\n const rect = element.getBoundingClientRect();\n const distance = rect.top;\n return distance;\n }\n\n private static _smoothScrollIntoView(element, duration = 300) {\n const targetPosition =\n element.getBoundingClientRect().top + (window.scrollY || window.pageYOffset);\n const startPosition = window.scrollY || window.pageYOffset;\n const distance = targetPosition - startPosition;\n const startTime = performance.now();\n\n function scrollStep(currentTime) {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const scrollY = startPosition + distance * progress;\n\n if (progress < 1) {\n window.scrollTo(0, scrollY);\n requestAnimationFrame(scrollStep);\n } else {\n window.scrollTo(0, targetPosition);\n }\n }\n requestAnimationFrame(scrollStep);\n }\n\n static {\n ScrollSpy._elements = [];\n ScrollSpy._elementsInView = [];\n ScrollSpy._visibleElements = []; // Array.<cash>\n ScrollSpy._count = 0;\n ScrollSpy._increment = 0;\n ScrollSpy._ticks = 0;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface SidenavOptions extends BaseOptions {\n /**\n * Side of screen on which Sidenav appears.\n * @default 'left'\n */\n edge: 'left' | 'right';\n /**\n * Allow swipe gestures to open/close Sidenav.\n * @default true\n */\n draggable: boolean;\n /**\n * Width of the area where you can start dragging.\n * @default '10px'\n */\n dragTargetWidth: string;\n /**\n * Length in ms of enter transition.\n * @default 250\n */\n inDuration: number;\n /**\n * Length in ms of exit transition.\n * @default 200\n */\n outDuration: number;\n /**\n * Prevent page from scrolling while sidenav is open.\n * @default true\n */\n preventScrolling: boolean;\n /**\n * Function called when sidenav starts entering.\n */\n onOpenStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes entering.\n */\n onOpenEnd: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav starts exiting.\n */\n onCloseStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes exiting.\n */\n onCloseEnd: (elem: HTMLElement) => void;\n}\n\nconst _defaults: SidenavOptions = {\n edge: 'left',\n draggable: true,\n dragTargetWidth: '10px',\n inDuration: 250,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n preventScrolling: true\n};\n\nexport class Sidenav extends Component<SidenavOptions> implements Openable {\n id: string;\n /** Describes open/close state of Sidenav. */\n isOpen: boolean;\n /** Describes if sidenav is fixed. */\n isFixed: boolean;\n /** Describes if Sidenav is being dragged. */\n isDragged: boolean;\n lastWindowWidth: number;\n lastWindowHeight: number;\n static _sidenavs: Sidenav[];\n private _overlay: HTMLElement;\n dragTarget: Element;\n private _startingXpos: number;\n private _xPos: number;\n private _time: number;\n private _width: number;\n private _initialScrollTop: number;\n private _verticallyScrolling: boolean;\n private deltaX: number;\n private velocityX: number;\n private percentOpen: number;\n\n constructor(el: HTMLElement, options: Partial<SidenavOptions>) {\n super(el, options, Sidenav);\n this.el['Expressive_Sidenav'] = this;\n\n this.options = {\n ...Sidenav.defaults,\n ...options\n };\n\n this.id = this.el.id;\n this.isOpen = false;\n this.isFixed = this.el.classList.contains('sidenav-fixed');\n this.isDragged = false;\n // Window size variables for window resize checks\n this.lastWindowWidth = window.innerWidth;\n this.lastWindowHeight = window.innerHeight;\n this._createOverlay();\n this._createDragTarget();\n this._setupEventHandlers();\n this._setupClasses();\n this._setupFixed();\n Sidenav._sidenavs.push(this);\n }\n\n static get defaults(): SidenavOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Sidenav.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<SidenavOptions>): Sidenav;\n /**\n * Initializes instances of Sidenav.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<SidenavOptions>): Sidenav[];\n /**\n * Initializes instances of Sidenav.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<SidenavOptions> = {}\n ): Sidenav | Sidenav[] {\n return super.init(els, options, Sidenav);\n }\n\n static getInstance(el: HTMLElement): Sidenav {\n return el['Expressive_Sidenav'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._enableBodyScrolling();\n this._overlay.parentNode.removeChild(this._overlay);\n this.dragTarget.parentNode.removeChild(this.dragTarget);\n this.el['Expressive_Sidenav'] = undefined;\n this.el.style.transform = '';\n const index = Sidenav._sidenavs.indexOf(this);\n if (index >= 0) {\n Sidenav._sidenavs.splice(index, 1);\n }\n }\n\n private _createOverlay() {\n this._overlay = document.createElement('div');\n this._overlay.classList.add('sidenav-overlay');\n this._overlay.addEventListener('click', this.close);\n document.body.appendChild(this._overlay);\n }\n\n private _setupEventHandlers() {\n if (Sidenav._sidenavs.length === 0) {\n document.body.addEventListener('click', this._handleTriggerClick);\n }\n // The drag handlers only set transforms and opacity - none of them calls\n // preventDefault - so they can be passive and stay off the scroll path.\n const passive = { passive: true } as const;\n this.dragTarget.addEventListener('touchmove', this._handleDragTargetDrag, passive);\n this.dragTarget.addEventListener('touchend', this._handleDragTargetRelease);\n this._overlay.addEventListener('touchmove', this._handleCloseDrag, passive);\n this._overlay.addEventListener('touchend', this._handleCloseRelease);\n this.el.addEventListener('touchmove', this._handleCloseDrag, passive);\n this.el.addEventListener('touchend', this._handleCloseRelease);\n this.el.addEventListener('click', this._handleCloseTriggerClick);\n // Add resize for side nav fixed\n if (this.isFixed) {\n window.addEventListener('resize', this._handleWindowResize, passive);\n }\n /* Set aria-hidden state */\n this._setAriaHidden();\n this._setTabIndex();\n }\n\n private _removeEventHandlers() {\n if (Sidenav._sidenavs.length === 1) {\n document.body.removeEventListener('click', this._handleTriggerClick);\n }\n this.dragTarget.removeEventListener('touchmove', this._handleDragTargetDrag);\n this.dragTarget.removeEventListener('touchend', this._handleDragTargetRelease);\n this._overlay.removeEventListener('touchmove', this._handleCloseDrag);\n this._overlay.removeEventListener('touchend', this._handleCloseRelease);\n this.el.removeEventListener('touchmove', this._handleCloseDrag);\n this.el.removeEventListener('touchend', this._handleCloseRelease);\n this.el.removeEventListener('click', this._handleCloseTriggerClick);\n\n // Remove resize for side nav fixed\n if (this.isFixed) {\n window.removeEventListener('resize', this._handleWindowResize);\n }\n }\n\n private _handleTriggerClick(e) {\n const trigger = e.target.closest('.sidenav-trigger');\n if (e.target && trigger) {\n const sidenavId = Utils.getIdFromTrigger(trigger);\n // The trigger can name an id that is not in the document.\n const sidenavInstance = document.getElementById(sidenavId)?.['Expressive_Sidenav'];\n if (sidenavInstance) {\n sidenavInstance.open();\n }\n e.preventDefault();\n }\n }\n\n // Set variables needed at the beginning of drag and stop any current transition.\n private _startDrag(e) {\n const clientX = e.targetTouches[0].clientX;\n this.isDragged = true;\n this._startingXpos = clientX;\n this._xPos = this._startingXpos;\n this._time = Date.now();\n this._width = this.el.getBoundingClientRect().width;\n this._overlay.style.display = 'block';\n this._initialScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this._verticallyScrolling = false;\n }\n\n //Set variables needed at each drag move update tick\n private _dragMoveUpdate(e) {\n const clientX = e.targetTouches[0].clientX;\n const currentScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this.deltaX = Math.abs(this._xPos - clientX);\n this._xPos = clientX;\n this.velocityX = this.deltaX / (Date.now() - this._time);\n this._time = Date.now();\n if (this._initialScrollTop !== currentScrollTop) {\n this._verticallyScrolling = true;\n }\n }\n\n private _handleDragTargetDrag = (e) => {\n // Check if draggable\n if (!this._isDraggable()) return;\n let totalDeltaX = this._calculateDelta(e);\n const dragDirection = totalDeltaX > 0 ? 'right' : 'left';\n // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction\n totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));\n if (this.options.edge === dragDirection) {\n totalDeltaX = 0;\n }\n /**\n * transformX is the drag displacement\n * transformPrefix is the initial transform placement\n * Invert values if Sidenav is right edge\n */\n let transformX = totalDeltaX;\n let transformPrefix = 'translateX(-100%)';\n if (this.options.edge === 'right') {\n transformPrefix = 'translateX(100%)';\n transformX = -transformX;\n }\n // Calculate open/close percentage of sidenav, with open = 1 and close = 0\n this.percentOpen = Math.min(1, totalDeltaX / this._width);\n // Set transform and opacity styles\n this.el.style.transform = `${transformPrefix} translateX(${transformX}px)`;\n this._overlay.style.opacity = this.percentOpen.toString();\n };\n\n private _handleDragTargetRelease = () => {\n if (this.isDragged) {\n if (this.percentOpen > 0.2) {\n this.open();\n } else {\n this._animateOut();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n }\n };\n\n private _handleCloseDrag = (e) => {\n // Check if open and draggable\n if (!this.isOpen || !this._isDraggable()) return;\n let totalDeltaX = this._calculateDelta(e);\n // dragDirection is the attempted user drag direction\n const dragDirection = totalDeltaX > 0 ? 'right' : 'left';\n totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));\n if (this.options.edge !== dragDirection) {\n totalDeltaX = 0;\n }\n let transformX = -totalDeltaX;\n if (this.options.edge === 'right') {\n transformX = -transformX;\n }\n // Calculate open/close percentage of sidenav, with open = 1 and close = 0\n this.percentOpen = Math.min(1, 1 - totalDeltaX / this._width);\n // Set transform and opacity styles\n this.el.style.transform = `translateX(${transformX}px)`;\n this._overlay.style.opacity = this.percentOpen.toString();\n };\n\n private _calculateDelta = (e) => {\n // If not being dragged, set initial drag start variables\n if (!this.isDragged) {\n this._startDrag(e);\n }\n // Run touchmove updates\n this._dragMoveUpdate(e);\n // Calculate raw deltaX\n return this._xPos - this._startingXpos;\n };\n\n private _handleCloseRelease = () => {\n if (this.isOpen && this.isDragged) {\n if (this.percentOpen > 0.8) {\n this._animateIn();\n } else {\n this.close();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n }\n };\n\n // Handles closing of Sidenav when element with class .sidenav-close\n private _handleCloseTriggerClick = (e) => {\n const closeTrigger = e.target.closest('.sidenav-close');\n if (closeTrigger && !this._isCurrentlyFixed()) {\n this.close();\n }\n };\n\n private _handleWindowResize = () => {\n // Only handle horizontal resizes\n if (this.lastWindowWidth !== window.innerWidth) {\n if (window.innerWidth > 992) {\n this.open();\n } else {\n this.close();\n }\n }\n this.lastWindowWidth = window.innerWidth;\n this.lastWindowHeight = window.innerHeight;\n };\n\n private _setupClasses() {\n if (this.options.edge === 'right') {\n this.el.classList.add('right-aligned');\n this.dragTarget.classList.add('right-aligned');\n }\n }\n\n private _removeClasses() {\n this.el.classList.remove('right-aligned');\n this.dragTarget.classList.remove('right-aligned');\n }\n\n private _setupFixed() {\n if (this._isCurrentlyFixed()) this.open();\n }\n\n private _isDraggable() {\n return this.options.draggable && !this._isCurrentlyFixed() && !this._verticallyScrolling;\n }\n\n private _isCurrentlyFixed() {\n return this.isFixed && window.innerWidth > 992;\n }\n\n private _createDragTarget() {\n const dragTarget = document.createElement('div');\n dragTarget.classList.add('drag-target');\n dragTarget.style.width = this.options.dragTargetWidth;\n document.body.appendChild(dragTarget);\n this.dragTarget = dragTarget;\n }\n\n private _preventBodyScrolling() {\n document.body.style.overflow = 'hidden';\n }\n\n private _enableBodyScrolling() {\n document.body.style.overflow = '';\n }\n\n /**\n * Opens Sidenav.\n */\n open = () => {\n if (this.isOpen === true) return;\n this.isOpen = true;\n // Run onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n // Handle fixed Sidenav\n if (this._isCurrentlyFixed()) {\n // Show if fixed\n this.el.style.transform = 'translateX(0)';\n this._enableBodyScrolling();\n this._overlay.style.display = 'none';\n }\n // Handle non-fixed Sidenav\n else {\n if (this.options.preventScrolling) this._preventBodyScrolling();\n if (!this.isDragged || this.percentOpen != 1) this._animateIn();\n /* Set aria-hidden state */\n this._setAriaHidden();\n this._setTabIndex();\n }\n };\n\n /**\n * Closes Sidenav.\n */\n close = () => {\n if (this.isOpen === false) return;\n this.isOpen = false;\n // Run onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n // Handle fixed Sidenav\n if (this._isCurrentlyFixed()) {\n const transformX = this.options.edge === 'left' ? '-105%' : '105%';\n this.el.style.transform = `translateX(${transformX})`;\n }\n // Handle non-fixed Sidenav\n else {\n this._enableBodyScrolling();\n if (!this.isDragged || this.percentOpen != 0) {\n this._animateOut();\n } else {\n this._overlay.style.display = 'none';\n }\n /* Set aria-hidden state */\n this._setAriaHidden();\n this._setTabIndex();\n }\n };\n\n private _animateIn() {\n this._animateSidenavIn();\n this._animateOverlayIn();\n }\n\n private _animateOut() {\n this._animateSidenavOut();\n this._animateOverlayOut();\n }\n\n private _animateSidenavIn() {\n let slideOutPercent = this.options.edge === 'left' ? -1 : 1;\n if (this.isDragged) {\n slideOutPercent =\n this.options.edge === 'left'\n ? slideOutPercent + this.percentOpen\n : slideOutPercent - this.percentOpen;\n }\n const duration = this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.transform = 'translateX(' + slideOutPercent * 100 + '%)';\n setTimeout(() => {\n this.el.style.transition = `transform ${duration}ms ease`; // easeOutQuad\n // to\n this.el.style.transform = 'translateX(0)';\n }, 1);\n setTimeout(() => {\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n private _animateSidenavOut() {\n const endPercent = this.options.edge === 'left' ? -1 : 1;\n // let slideOutPercent = 0;\n // if (this.isDragged) {\n // // @todo unused variable\n // slideOutPercent =\n // this.options.edge === 'left'\n // ? endPercent + this.percentOpen\n // : endPercent - this.percentOpen;\n // }\n\n const duration = this.options.outDuration;\n this.el.style.transition = `transform ${duration}ms ease`; // easeOutQuad\n // to\n this.el.style.transform = 'translateX(' + endPercent * 100 + '%)';\n setTimeout(() => {\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _animateOverlayIn() {\n let start = 0;\n if (this.isDragged) start = this.percentOpen;\n else this._overlay.style.display = 'block';\n // Animation\n const duration = this.options.inDuration;\n // from\n this._overlay.style.transition = 'none';\n this._overlay.style.opacity = start.toString();\n // easeOutQuad\n setTimeout(() => {\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n // to\n this._overlay.style.opacity = '1';\n }, 1);\n }\n\n private _animateOverlayOut() {\n const duration = this.options.outDuration;\n // easeOutQuad\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n // to\n this._overlay.style.opacity = '0';\n setTimeout(() => {\n this._overlay.style.display = 'none';\n }, duration);\n }\n\n private _setAriaHidden = () => {\n this.el.ariaHidden = this.isOpen ? 'false' : 'true';\n const navWrapper = document.querySelector('.nav-wrapper ul') as HTMLUListElement;\n if (navWrapper) navWrapper.ariaHidden = this.isOpen.toString();\n };\n\n private _setTabIndex = () => {\n const navLinks = document.querySelectorAll('.nav-wrapper ul li a');\n const sideNavLinks = document.querySelectorAll('.sidenav li a');\n if (navLinks)\n navLinks.forEach((navLink: HTMLAnchorElement) => {\n navLink.tabIndex = this.isOpen ? -1 : 0;\n });\n if (sideNavLinks)\n sideNavLinks.forEach((sideNavLink: HTMLAnchorElement) => {\n sideNavLink.tabIndex = this.isOpen ? 0 : -1;\n });\n };\n\n static {\n Sidenav._sidenavs = [];\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface SliderOptions extends BaseOptions {\n /**\n * Set to false to hide slide indicators.\n * @default true\n */\n indicators: boolean;\n /**\n * Set height of slider.\n * @default 400\n */\n height: number;\n /**\n * Set the duration of the transition animation in ms.\n * @default 500\n */\n duration: number;\n /**\n * Set the duration between transitions in ms.\n * @default 6000\n */\n interval: number;\n /**\n * If slider should pause when keyboard focus is received.\n * @default true\n */\n pauseOnFocus: boolean;\n /**\n * If slider should pause when is hovered by a pointer.\n * @default true\n */\n pauseOnHover: boolean;\n /**\n * Optional function used to generate ARIA label to indicators (for accessibility purposes).\n * @param index Current index, starting from \"1\".\n * @param current A which indicates whether it is the current element or not\n * @returns a string to be used as label indicator.\n * @default null\n */\n indicatorLabelFunc: (index: number, current: boolean) => string;\n}\n\nconst _defaults: SliderOptions = {\n indicators: true,\n height: 400,\n duration: 500,\n interval: 6000,\n pauseOnFocus: true,\n pauseOnHover: true,\n indicatorLabelFunc: null // Function which will generate a label for the indicators (ARIA)\n};\n\nexport class Slider extends Component<SliderOptions> {\n /** Index of current slide. */\n activeIndex: number;\n interval: ReturnType<typeof setTimeout>;\n eventPause: boolean;\n _slider: HTMLUListElement;\n _slides: HTMLLIElement[];\n _activeSlide: HTMLLIElement;\n _indicators: HTMLLIElement[];\n _hovered: boolean;\n _focused: boolean;\n _focusCurrent: boolean;\n _sliderId: string;\n\n constructor(el: HTMLElement, options: Partial<SliderOptions>) {\n super(el, options, Slider);\n this.el['Expressive_Slider'] = this;\n\n this.options = {\n ...Slider.defaults,\n ...options\n };\n\n // init props\n this.interval = null;\n this.eventPause = false;\n this._hovered = false;\n this._focused = false;\n this._focusCurrent = false;\n\n // setup\n this._slider = this.el.querySelector('.slides');\n this._slides = Array.from(this._slider.querySelectorAll('li'));\n this.activeIndex = this._slides.findIndex((li) => li.classList.contains('active'));\n\n if (this.activeIndex !== -1) {\n this._activeSlide = this._slides[this.activeIndex];\n }\n\n this._setSliderHeight();\n\n // Sets element id if it does not have one\n if (this._slider.hasAttribute('id')) this._sliderId = this._slider.getAttribute('id');\n else {\n this._sliderId = 'slider-' + Utils.guid();\n this._slider.setAttribute('id', this._sliderId);\n }\n\n const placeholderBase64 =\n 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n // Set initial positions of captions\n this._slides.forEach((slide) => {\n // Caption\n //const caption = <HTMLElement|null>slide.querySelector('.caption');\n //if (caption) this._animateCaptionIn(caption, 0);\n // Set Images as Background Images\n const img = slide.querySelector('img');\n if (img) {\n if (img.src !== placeholderBase64) {\n img.style.backgroundImage = 'url(' + img.src + ')';\n img.src = placeholderBase64;\n }\n }\n // Sets slide as focusable by code\n if (!slide.hasAttribute('tabindex')) slide.setAttribute('tabindex', '-1');\n // Removes initial visibility from \"inactive\" slides\n slide.style.visibility = 'hidden';\n });\n\n this._setupIndicators();\n\n // Show active slide\n if (this._activeSlide) {\n this._activeSlide.style.display = 'block';\n this._activeSlide.style.visibility = 'visible';\n } else {\n this.activeIndex = 0;\n this._slides[0].classList.add('active');\n this._slides[0].style.visibility = 'visible';\n this._activeSlide = this._slides[0];\n this._animateSlide(this._slides[0], true);\n // Update indicators\n if (this.options.indicators) {\n this._indicators[this.activeIndex].children[0].classList.add('active');\n }\n }\n this._setupEventHandlers();\n // auto scroll\n this.start();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Slider.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<SliderOptions>): Slider;\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<SliderOptions>): Slider[];\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<SliderOptions> = {}\n ): Slider | Slider[] {\n return super.init(els, options, Slider);\n }\n\n static getInstance(el: HTMLElement): Slider {\n return el['Expressive_Slider'];\n }\n\n destroy() {\n this.pause();\n this._removeIndicators();\n this._removeEventHandlers();\n this.el['Expressive_Slider'] = undefined;\n }\n\n private _setupEventHandlers() {\n if (this.options.pauseOnFocus) {\n this.el.addEventListener('focusin', this._handleAutoPauseFocus);\n this.el.addEventListener('focusout', this._handleAutoStartFocus);\n }\n if (this.options.pauseOnHover) {\n this.el.addEventListener('mouseenter', this._handleAutoPauseHover);\n this.el.addEventListener('mouseleave', this._handleAutoStartHover);\n }\n if (this.options.indicators) {\n this._indicators.forEach((el) => {\n el.addEventListener('click', this._handleIndicatorClick);\n });\n }\n document.addEventListener('visibilitychange', this._handleVisibilityChange);\n }\n\n private _removeEventHandlers() {\n if (this.options.pauseOnFocus) {\n this.el.removeEventListener('focusin', this._handleAutoPauseFocus);\n this.el.removeEventListener('focusout', this._handleAutoStartFocus);\n }\n if (this.options.pauseOnHover) {\n this.el.removeEventListener('mouseenter', this._handleAutoPauseHover);\n this.el.removeEventListener('mouseleave', this._handleAutoStartHover);\n }\n if (this.options.indicators) {\n this._indicators.forEach((el) => {\n el.removeEventListener('click', this._handleIndicatorClick);\n });\n }\n document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n }\n\n // Nobody is watching a backgrounded tab. Browsers clamp the timer rather\n // than stopping it, so without this the slider keeps cycling slides - and\n // running their transitions - out of sight.\n private _handleVisibilityChange = () => {\n if (document.hidden) {\n if (this.interval != null) this._pause(true);\n } else if (\n this.eventPause &&\n !(this.options.pauseOnHover && this._hovered) &&\n !(this.options.pauseOnFocus && this._focused)\n ) {\n this.start();\n }\n };\n\n private _handleIndicatorClick = (e: MouseEvent) => {\n const el = (<HTMLElement>e.target).parentElement;\n const currIndex = [...el.parentNode.children].indexOf(el);\n this._focusCurrent = true;\n this.set(currIndex);\n };\n\n private _handleAutoPauseHover = () => {\n this._hovered = true;\n if (this.interval != null) {\n this._pause(true);\n }\n };\n\n private _handleAutoPauseFocus = () => {\n this._focused = true;\n if (this.interval != null) {\n this._pause(true);\n }\n };\n\n private _handleAutoStartHover = () => {\n this._hovered = false;\n if (!(this.options.pauseOnFocus && this._focused) && this.eventPause) {\n this.start();\n }\n };\n\n private _handleAutoStartFocus = () => {\n this._focused = false;\n if (!(this.options.pauseOnHover && this._hovered) && this.eventPause) {\n this.start();\n }\n };\n\n private _handleInterval = () => {\n const activeElem = this._slider.querySelector('.active');\n let newActiveIndex = [...activeElem.parentNode.children].indexOf(activeElem);\n if (this._slides.length === newActiveIndex + 1)\n newActiveIndex = 0; // loop to start\n else newActiveIndex += 1;\n this.set(newActiveIndex);\n };\n\n private _animateSlide(slide: HTMLElement, isDirectionIn: boolean): void {\n let dx = 0,\n dy = 0;\n // from\n slide.style.opacity = isDirectionIn ? '0' : '1';\n setTimeout(() => {\n slide.style.transition = `opacity ${this.options.duration}ms ease`;\n // to\n slide.style.opacity = isDirectionIn ? '1' : '0';\n }, 1);\n // Caption\n const caption: HTMLElement = slide.querySelector('.caption');\n if (!caption) return;\n if (caption.classList.contains('center-align')) dy = -100;\n else if (caption.classList.contains('right-align')) dx = 100;\n else if (caption.classList.contains('left-align')) dx = -100;\n // from\n caption.style.opacity = isDirectionIn ? '0' : '1';\n caption.style.transform = isDirectionIn ? `translate(${dx}px, ${dy}px)` : `translate(0, 0)`;\n setTimeout(() => {\n caption.style.transition = `opacity ${this.options.duration}ms ease, transform ${this.options.duration}ms ease`;\n // to\n caption.style.opacity = isDirectionIn ? '1' : '0';\n caption.style.transform = isDirectionIn ? `translate(0, 0)` : `translate(${dx}px, ${dy}px)`;\n }, this.options.duration); // delay\n }\n\n private _setSliderHeight() {\n // If fullscreen, do nothing\n if (!this.el.classList.contains('fullscreen')) {\n if (this.options.indicators) {\n // Add height if indicators are present\n this.el.style.height = this.options.height + 40 + 'px'; //.css('height', this.options.height + 40 + 'px');\n } else {\n this.el.style.height = this.options.height + 'px';\n }\n this._slider.style.height = this.options.height + 'px';\n }\n }\n\n private _setupIndicators() {\n if (this.options.indicators) {\n const ul = document.createElement('ul');\n ul.classList.add('indicators');\n\n const arrLi = [];\n this._slides.forEach((el, i) => {\n const label = this.options.indicatorLabelFunc\n ? this.options.indicatorLabelFunc.call(this, i + 1, i === 0)\n : `${i + 1}`;\n const li = document.createElement('li');\n li.classList.add('indicator-item');\n // setAttribute, not an interpolated attribute in markup: the label\n // comes from indicatorLabelFunc and a quote in it would break out.\n const button = document.createElement('button');\n button.type = 'button';\n button.classList.add('indicator-item-btn');\n button.setAttribute('aria-label', label);\n button.setAttribute('aria-controls', this._sliderId);\n li.appendChild(button);\n arrLi.push(li);\n ul.append(li);\n });\n\n this.el.append(ul);\n this._indicators = arrLi;\n }\n }\n\n private _removeIndicators() {\n this.el.querySelector('ul.indicators').remove(); //find('ul.indicators').remove();\n }\n\n set(index: number) {\n // Wrap around indices.\n if (index >= this._slides.length) index = 0;\n else if (index < 0) index = this._slides.length - 1;\n\n // Only do if index changes\n if (this.activeIndex === index) return;\n\n this._activeSlide = this._slides[this.activeIndex];\n const _caption = <HTMLElement | null>this._activeSlide.querySelector('.caption');\n\n this._activeSlide.classList.remove('active');\n // Enables every slide\n this._slides.forEach((slide) => (slide.style.visibility = 'visible'));\n\n //--- Hide active Slide + Caption\n this._activeSlide.style.opacity = '0';\n setTimeout(() => {\n this._slides.forEach((slide) => {\n if (slide.classList.contains('active')) return;\n slide.style.opacity = '0';\n slide.style.transform = 'translate(0, 0)';\n // Disables invisible slides (for assistive technologies)\n slide.style.visibility = 'hidden';\n });\n }, this.options.duration);\n\n // Hide active Caption - a slide is not required to have one.\n //this._animateCaptionIn(_caption, this.options.duration);\n if (_caption) _caption.style.opacity = '0';\n\n // Update indicators\n if (this.options.indicators) {\n const activeIndicator = this._indicators[this.activeIndex].children[0];\n const nextIndicator = this._indicators[index].children[0];\n activeIndicator.classList.remove('active');\n nextIndicator.classList.add('active');\n if (typeof this.options.indicatorLabelFunc === 'function') {\n activeIndicator.ariaLabel = this.options.indicatorLabelFunc.call(\n this,\n this.activeIndex,\n false\n );\n nextIndicator.ariaLabel = this.options.indicatorLabelFunc.call(this, index, true);\n }\n }\n\n //--- Show new Slide + Caption\n this._animateSlide(this._slides[index], true);\n this._slides[index].classList.add('active');\n this.activeIndex = index;\n\n // Reset interval, if allowed. This check prevents autostart\n // when slider is paused, since it can be changed though indicators.\n if (this.interval != null) {\n this.start();\n }\n }\n\n _pause(fromEvent: boolean) {\n clearInterval(this.interval);\n this.eventPause = fromEvent;\n this.interval = null;\n }\n\n /**\n * Pause slider autoslide.\n */\n pause = () => {\n this._pause(false);\n };\n\n /**\n * Start slider autoslide.\n */\n start = () => {\n clearInterval(this.interval);\n this.interval = setInterval(\n this._handleInterval,\n this.options.duration + this.options.interval\n );\n this.eventPause = false;\n };\n\n /**\n * Move to next slider.\n */\n next = () => {\n let newIndex = this.activeIndex + 1;\n // Wrap around indices.\n if (newIndex >= this._slides.length) newIndex = 0;\n else if (newIndex < 0) newIndex = this._slides.length - 1;\n this.set(newIndex);\n };\n\n /**\n * Move to prev slider.\n */\n prev = () => {\n let newIndex = this.activeIndex - 1;\n // Wrap around indices.\n if (newIndex >= this._slides.length) newIndex = 0;\n else if (newIndex < 0) newIndex = this._slides.length - 1;\n this.set(newIndex);\n };\n}\n", "import { Carousel } from './carousel';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 300\n */\n duration: number;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to enable swipeable tabs.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: TabsOptions = {\n duration: 300,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _tabsCarousel: Carousel;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options, Tabs);\n this.el['Expressive_Tabs'] = this;\n\n this.options = {\n ...Tabs.defaults,\n ...options\n };\n\n this._tabLinks = this._queryTabLinks();\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tabs.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TabsOptions>): Tabs;\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<TabsOptions>): Tabs[];\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<TabsOptions> = {}\n ): Tabs | Tabs[] {\n return super.init(els, options, Tabs);\n }\n\n static getInstance(el: HTMLElement): Tabs {\n return el['Expressive_Tabs'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._indicator.parentNode.removeChild(this._indicator);\n if (this.options.swipeable) {\n this._teardownSwipeableTabs();\n } else {\n this._teardownNormalTabs();\n }\n this.el['Expressive_Tabs'] = undefined;\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n window.addEventListener('resize', this._handleWindowResize);\n this.el.addEventListener('click', this._handleTabClick);\n }\n\n _removeEventHandlers() {\n window.removeEventListener('resize', this._handleWindowResize);\n this.el.removeEventListener('click', this._handleTabClick);\n }\n\n _handleWindowResize = () => {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) {\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n };\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(\n ':scope > a, :scope > .tab > a, :scope > li.tab > a'\n );\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a') as HTMLAnchorElement | null;\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const tab = tabLink.parentElement;\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true' ||\n tab?.classList.contains('disabled');\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n // Make the old tab inactive.\n this._activeTabLink.classList.remove('active');\n const _oldContent = this._content;\n // Update the variables with the new link and content\n\n this._activeTabLink = tabLink;\n if (tabLink.hash) this._content = document.querySelector(tabLink.hash);\n this._tabLinks = this._queryTabLinks();\n // Make the tab active\n this._activeTabLink.classList.add('active');\n const prevIndex = this._index;\n this._index = Math.max(Array.from(this._tabLinks).indexOf(tabLink), 0);\n\n // Swap content\n if (this.options.swipeable) {\n if (this._tabsCarousel) {\n this._tabsCarousel.set(this._index, () => {\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n });\n }\n } else {\n if (this._content) {\n this._content.style.display = 'block';\n this._content.classList.add('active');\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n if (_oldContent && _oldContent !== this._content) {\n _oldContent.style.display = 'none';\n _oldContent.classList.remove('active');\n }\n }\n }\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n e.preventDefault();\n };\n\n _createIndicator() {\n const tag = this.el.tagName === 'UL' || this.el.tagName === 'OL' ? 'li' : 'span';\n const indicator = document.createElement(tag);\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n this._activeTabLink = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === location.hash\n );\n // If no match is found, use the first link or any with class 'active' as the initial active tab.\n if (!this._activeTabLink) {\n let activeTabLink = this.el.querySelector('a.active');\n if (!activeTabLink) {\n activeTabLink = this._tabLinks[0];\n }\n this._activeTabLink = activeTabLink as HTMLAnchorElement;\n }\n Array.from(this._tabLinks).forEach((a: HTMLAnchorElement) => a.classList.remove('active'));\n this._activeTabLink.classList.add('active');\n\n this._index = Math.max(Array.from(this._tabLinks).indexOf(this._activeTabLink), 0);\n if (this._activeTabLink && this._activeTabLink.hash) {\n this._content = document.querySelector(this._activeTabLink.hash);\n if (this._content) this._content.classList.add('active');\n }\n }\n\n _setupSwipeableTabs() {\n // Change swipeable according to responsive threshold\n if (window.innerWidth > this.options.responsiveThreshold) this.options.swipeable = false;\n\n const tabsContent = [];\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash);\n currContent.classList.add('carousel-item');\n tabsContent.push(currContent);\n }\n });\n\n // Create Carousel-Wrapper around Tab-Contents\n const tabsWrapper = document.createElement('div');\n tabsWrapper.classList.add('tabs-content', 'carousel', 'carousel-slider');\n\n // Wrap around\n tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);\n tabsContent.forEach((tabContent) => {\n tabsWrapper.appendChild(tabContent);\n tabContent.style.display = '';\n });\n\n this._tabsCarousel = Carousel.init(tabsWrapper, {\n fullWidth: true,\n noWrap: true,\n onCycleTo: (item) => {\n const prevIndex = this._index;\n this._index = Array.from(item.parentNode.children).indexOf(item);\n this._activeTabLink.classList.remove('active');\n this._activeTabLink = Array.from(this._tabLinks)[this._index];\n this._activeTabLink.classList.add('active');\n this._animateIndicator(prevIndex);\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n }\n });\n // Set initial carousel slide to active tab\n this._tabsCarousel.set(this._index);\n }\n\n _teardownSwipeableTabs() {\n const tabsWrapper = this._tabsCarousel.el;\n this._tabsCarousel.destroy();\n // Unwrap\n tabsWrapper.append(tabsWrapper.parentElement);\n tabsWrapper.remove();\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink) return;\n if ((<HTMLAnchorElement>a).hash) {\n const currContent = document.querySelector((<HTMLAnchorElement>a).hash);\n if (currContent) (<HTMLElement>currContent).style.display = 'none';\n }\n });\n }\n\n _teardownNormalTabs() {\n // show Tabs Content\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash) as HTMLElement;\n if (currContent) currContent.style.display = '';\n }\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el) {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el) {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex) {\n let leftDelay = 0,\n rightDelay = 0;\n\n const isMovingLeftOrStaying = this._index - prevIndex >= 0;\n if (isMovingLeftOrStaying) leftDelay = 90;\n else rightDelay = 90;\n\n // in v1: easeOutQuad\n this._indicator.style.transition = `\n left ${this.options.duration}ms ease-out ${leftDelay}ms,\n right ${this.options.duration}ms ease-out ${rightDelay}ms`;\n\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === '#' + tabId\n );\n if (tab) (<HTMLAnchorElement>tab).click();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface TapTargetOptions extends BaseOptions {\n /**\n * Callback function called when Tap Target is opened.\n * @default null\n */\n onOpen: (origin: HTMLElement) => void;\n /**\n * Callback function called when Tap Target is closed.\n * @default null\n */\n onClose: (origin: HTMLElement) => void;\n}\n\nconst _defaults: TapTargetOptions = {\n onOpen: null,\n onClose: null\n};\n\nexport class TapTarget extends Component<TapTargetOptions> implements Openable {\n /**\n * If the tap target is open.\n */\n isOpen: boolean;\n\n static _taptargets: TapTarget[];\n private wrapper: HTMLElement;\n // private _origin: HTMLElement;\n private originEl: HTMLElement;\n private waveEl: HTMLElement & Element & Node;\n private contentEl: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<TapTargetOptions>) {\n super(el, options, TapTarget);\n this.el['Expressive_TapTarget'] = this;\n\n this.options = {\n ...TapTarget.defaults,\n ...options\n };\n\n this.isOpen = false;\n // setup\n // getElementById, not a `#${...}` selector: data-target is author content\n // and anything that is not a bare identifier either threw a SyntaxError\n // here or steered the query somewhere else.\n this.originEl = el.dataset.target ? document.getElementById(el.dataset.target) : null;\n if (!this.originEl) {\n console.error(`TapTarget: no element with id \"${el.dataset.target ?? ''}\" to attach to`);\n return;\n }\n this.originEl.tabIndex = 0;\n\n this._setup();\n this._calculatePositioning();\n this._setupEventHandlers();\n\n TapTarget._taptargets.push(this);\n }\n\n static get defaults(): TapTargetOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of TapTarget.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TapTargetOptions>): TapTarget;\n /**\n * Initializes instances of TapTarget.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<TapTargetOptions>): TapTarget[];\n /**\n * Initializes instances of TapTarget.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<TapTargetOptions> = {}\n ): TapTarget | TapTarget[] {\n return super.init(els, options, TapTarget);\n }\n\n static getInstance(el: HTMLElement): TapTarget {\n return el['Expressive_TapTarget'];\n }\n\n destroy() {\n // close() detaches the document-level handlers registered by open(); they\n // are not covered by _removeEventHandlers and would otherwise survive.\n this.close();\n this._removeEventHandlers();\n this.el['Expressive_TapTarget'] = undefined;\n const index = TapTarget._taptargets.indexOf(this);\n if (index >= 0) {\n TapTarget._taptargets.splice(index, 1);\n }\n }\n\n _setupEventHandlers() {\n if (!this.originEl) return; // constructor bailed: nothing was ever wired up\n this.originEl.addEventListener('click', this._handleTargetToggle);\n this.originEl.addEventListener('keypress', this._handleKeyboardInteraction, true);\n // this.originEl.addEventListener('click', this._handleOriginClick);\n // Resize\n window.addEventListener('resize', this._handleThrottledResize);\n }\n\n _removeEventHandlers() {\n if (!this.originEl) return;\n this.originEl.removeEventListener('click', this._handleTargetToggle);\n this.originEl.removeEventListener('keypress', this._handleKeyboardInteraction, true);\n // this.originEl.removeEventListener('click', this._handleOriginClick);\n window.removeEventListener('resize', this._handleThrottledResize);\n }\n\n // Built once per instance; see the note in carousel.ts - the previous form\n // returned a new throttled function on every resize and never invoked it.\n _handleThrottledResize = Utils.throttle(() => this._handleResize(), 200);\n\n _handleKeyboardInteraction = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleTargetToggle();\n }\n };\n\n _handleTargetToggle = () => {\n if (!this.isOpen) this.open();\n else this.close();\n };\n\n /*_handleOriginClick = () => {\n this.close();\n }*/\n\n _handleResize = () => {\n this._calculatePositioning();\n };\n\n _handleDocumentClick = (e: MouseEvent | TouchEvent | KeyboardEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n // \"outside the origin and outside the tap target\" - expressed against the\n // elements themselves rather than by rebuilding a selector from\n // data-target on every document click.\n if (!this.originEl.contains(target) && !target.closest('.tap-target-wrapper')) {\n this.close();\n // e.preventDefault();\n // e.stopPropagation();\n }\n };\n\n _setup() {\n // Creating tap target\n this.wrapper = this.el.parentElement;\n this.waveEl = this.wrapper.querySelector('.tap-target-wave');\n this.el.parentElement.ariaExpanded = 'false';\n this.originEl.style.zIndex = '1002';\n // this.originEl = this.wrapper.querySelector('.tap-target-origin');\n this.contentEl = this.el.querySelector('.tap-target-content');\n // Creating wrapper\n if (!this.wrapper.classList.contains('.tap-target-wrapper')) {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('tap-target-wrapper');\n this.el.before(this.wrapper);\n this.wrapper.append(this.el);\n }\n // Creating content\n if (!this.contentEl) {\n this.contentEl = document.createElement('div');\n this.contentEl.classList.add('tap-target-content');\n this.el.append(this.contentEl);\n }\n // Creating foreground wave\n if (!this.waveEl) {\n this.waveEl = document.createElement('div');\n this.waveEl.classList.add('tap-target-wave');\n // Creating origin\n /*if (!this.originEl) {\n this.originEl = <HTMLElement>this._origin.cloneNode(true); // .clone(true, true);\n this.originEl.classList.add('tap-target-origin');\n this.originEl.removeAttribute('id');\n this.originEl.removeAttribute('style');\n this.waveEl.append(this.originEl);\n }*/\n this.wrapper.append(this.waveEl);\n }\n }\n\n private _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.pageYOffset - docElem.clientTop,\n left: box.left + window.pageXOffset - docElem.clientLeft\n };\n }\n\n _calculatePositioning() {\n // Element or parent is fixed position?\n let isFixed = getComputedStyle(this.originEl).position === 'fixed';\n if (!isFixed) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let currentElem: any = this.originEl;\n const parents = [];\n while ((currentElem = currentElem.parentNode) && currentElem !== document)\n parents.push(currentElem);\n\n for (let i = 0; i < parents.length; i++) {\n isFixed = getComputedStyle(parents[i]).position === 'fixed';\n if (isFixed) break;\n }\n }\n // Calculating origin - one rect, reused for both axes and both branches.\n const originWidth = this.originEl.offsetWidth;\n const originHeight = this.originEl.offsetHeight;\n const originOffset = this._offset(this.originEl);\n const originTop = isFixed\n ? originOffset.top - Utils.getDocumentScrollTop()\n : originOffset.top;\n const originLeft = isFixed\n ? originOffset.left - Utils.getDocumentScrollLeft()\n : originOffset.left;\n\n // Calculating screen\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const scrollBarWidth = windowWidth - document.documentElement.clientWidth;\n const centerX = windowWidth / 2;\n const centerY = windowHeight / 2;\n const isLeft = originLeft <= centerX;\n const isRight = originLeft > centerX;\n const isTop = originTop <= centerY;\n const isBottom = originTop > centerY;\n const isCenterX = originLeft >= windowWidth * 0.25 && originLeft <= windowWidth * 0.75;\n\n // Calculating tap target\n const tapTargetWidth = this.el.offsetWidth;\n const tapTargetHeight = this.el.offsetHeight;\n const tapTargetTop = originTop + originHeight / 2 - tapTargetHeight / 2;\n const tapTargetLeft = originLeft + originWidth / 2 - tapTargetWidth / 2;\n const tapTargetPosition = isFixed ? 'fixed' : 'absolute';\n\n // Calculating content\n const tapTargetTextWidth = isCenterX ? tapTargetWidth : tapTargetWidth / 2 + originWidth;\n const tapTargetTextHeight = tapTargetHeight / 2;\n const tapTargetTextTop = isTop ? tapTargetHeight / 2 : 0;\n const tapTargetTextBottom = 0;\n const tapTargetTextLeft = isLeft && !isCenterX ? tapTargetWidth / 2 - originWidth : 0;\n const tapTargetTextRight = 0;\n const tapTargetTextPadding = originWidth;\n const tapTargetTextAlign = isBottom ? 'bottom' : 'top';\n\n // Calculating wave\n const tapTargetWaveWidth = originWidth > originHeight ? originWidth * 2 : originWidth * 2;\n const tapTargetWaveHeight = tapTargetWaveWidth;\n const tapTargetWaveTop = tapTargetHeight / 2 - tapTargetWaveHeight / 2;\n const tapTargetWaveLeft = tapTargetWidth / 2 - tapTargetWaveWidth / 2;\n\n // Setting tap target\n this.wrapper.style.top = isTop ? tapTargetTop + 'px' : '';\n this.wrapper.style.right = isRight\n ? windowWidth - tapTargetLeft - tapTargetWidth - scrollBarWidth + 'px'\n : '';\n this.wrapper.style.bottom = isBottom\n ? windowHeight - tapTargetTop - tapTargetHeight + 'px'\n : '';\n this.wrapper.style.left = isLeft ? tapTargetLeft + 'px' : '';\n this.wrapper.style.position = tapTargetPosition;\n\n // Setting content\n this.contentEl.style.width = tapTargetTextWidth + 'px';\n this.contentEl.style.height = tapTargetTextHeight + 'px';\n this.contentEl.style.top = tapTargetTextTop + 'px';\n this.contentEl.style.right = tapTargetTextRight + 'px';\n this.contentEl.style.bottom = tapTargetTextBottom + 'px';\n this.contentEl.style.left = tapTargetTextLeft + 'px';\n this.contentEl.style.padding = tapTargetTextPadding + 'px';\n this.contentEl.style.verticalAlign = tapTargetTextAlign;\n\n // Setting wave\n this.waveEl.style.top = tapTargetWaveTop + 'px';\n this.waveEl.style.left = tapTargetWaveLeft + 'px';\n this.waveEl.style.width = tapTargetWaveWidth + 'px';\n this.waveEl.style.height = tapTargetWaveHeight + 'px';\n }\n\n /**\n * Open Tap Target.\n */\n open = () => {\n if (this.isOpen) return;\n // onOpen callback\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen.call(this, this.originEl);\n }\n this.isOpen = true;\n this.wrapper.classList.add('open');\n this.wrapper.ariaExpanded = 'true';\n document.body.addEventListener('click', this._handleDocumentClick, true);\n document.body.addEventListener('keypress', this._handleDocumentClick, true);\n document.body.addEventListener('touchend', this._handleDocumentClick);\n };\n\n /**\n * Close Tap Target.\n */\n close = () => {\n if (!this.isOpen) return;\n // onClose callback\n if (typeof this.options.onClose === 'function') {\n this.options.onClose.call(this, this.originEl);\n }\n this.isOpen = false;\n this.wrapper.classList.remove('open');\n this.wrapper.ariaExpanded = 'false';\n document.body.removeEventListener('click', this._handleDocumentClick, true);\n document.body.removeEventListener('keypress', this._handleDocumentClick, true);\n document.body.removeEventListener('touchend', this._handleDocumentClick);\n };\n\n static {\n TapTarget._taptargets = [];\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, I18nOptions } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport type Views = 'hours' | 'minutes';\n\nexport interface TimepickerOptions extends BaseOptions {\n /**\n * Dial radius.\n * @default 135\n */\n dialRadius: number;\n /**\n * Outer radius.\n * @default 105\n */\n outerRadius: number;\n /**\n * Inner radius.\n * @default 70\n */\n innerRadius: number;\n /**\n * Tick radius.\n * @default 20\n */\n tickRadius: number;\n /**\n * Duration of the transition from/to the hours/minutes view.\n * @default 350\n */\n duration: number;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the time picker in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the Timepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit timepicker selection to input field\n * @default true\n */\n autoSubmit: true;\n /**\n * Default time to set on the timepicker 'now' or '13:14'.\n * @default 'now';\n */\n defaultTime: string;\n /**\n * Millisecond offset from the defaultTime.\n * @default 0\n */\n fromNow: number;\n /**\n * Internationalization options.\n */\n i18n: Partial<I18nOptions>;\n /**\n * Use 12 hour AM/PM clock instead of 24 hour clock.\n * @default true\n */\n twelveHour: boolean;\n /**\n * Vibrate device when dragging clock hand.\n * @default true\n */\n vibrate: boolean;\n /**\n * Callback function when a time is selected.\n * @default null\n */\n onSelect: (hour: number, minute: number) => void;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for done.\n * @default null\n */\n onDone: (() => void) | null;\n /**\n * Callback function for cancel.\n * @default null\n */\n onCancel: (() => void) | null;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: TimepickerOptions = {\n dialRadius: 135,\n outerRadius: 105,\n innerRadius: 70,\n tickRadius: 20,\n duration: 350,\n container: null,\n defaultTime: 'now', // default time, 'now' or '13:14' e.g.\n fromNow: 0, // Millisecond offset from the defaultTime\n showClearBtn: false,\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok'\n },\n twelveHour: true, // change to 12 hour AM/PM clock from 24 hour\n vibrate: true, // vibrate the device when dragging clock hand\n // Callbacks\n onSelect: null,\n onInputInteraction: null,\n onDone: null,\n onCancel: null,\n displayPlugin: null,\n displayPluginOptions: null,\n};\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport class Timepicker extends Component<TimepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n containerEl: HTMLElement;\n plate: HTMLElement;\n digitalClock: HTMLElement;\n inputHours: HTMLInputElement;\n inputMinutes: HTMLInputElement;\n x0: number;\n y0: number;\n moved: boolean;\n dx: number;\n dy: number;\n /**\n * Current view on the timepicker.\n * @default 'hours'\n */\n currentView: Views;\n hand: SVGElement;\n minutesView: HTMLElement;\n hours: number;\n minutes: number;\n /** The selected time. */\n time: string;\n /**\n * If the time is AM or PM on twelve-hour clock.\n * @default 'PM'\n */\n amOrPm: 'AM' | 'PM';\n static _template;\n /** Whether this device exposes the Vibration API at all. */\n canVibrate: boolean;\n _canvas: HTMLElement;\n hoursView: HTMLElement;\n spanAmPm: HTMLSpanElement;\n footer: HTMLElement;\n private _amBtn: HTMLElement;\n private _pmBtn: HTMLElement;\n bg: Element;\n bearing: Element;\n g: Element;\n toggleViewTimer: ReturnType<typeof setTimeout>;\n vibrateTimer: ReturnType<typeof setTimeout>;\n private displayPlugin: DockedDisplayPlugin;\n /** Whether the dial (ticks + SVG + AM/PM buttons) has been built yet. */\n private _clockBuilt = false;\n\n constructor(el: HTMLInputElement, options: Partial<TimepickerOptions>) {\n super(el, options, Timepicker);\n this.el['Expressive_Timepicker'] = this;\n this.options = {\n ...Timepicker.defaults,\n ...options\n };\n this.id = Utils.guid();\n this._insertHTMLIntoDOM();\n this._setupVariables();\n this._setupEventHandlers();\n // The dial is ~40 elements (12 or 24 hour ticks, 12 minute ticks, the SVG\n // hand and the AM/PM buttons) and is built by _ensureClockBuilt() rather\n // than here - see _pickerSetup for when that first happens.\n this._pickerSetup();\n\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults(): TimepickerOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Timepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<TimepickerOptions>): Timepicker;\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<TimepickerOptions>\n ): Timepicker[];\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<TimepickerOptions> = {}\n ): Timepicker | Timepicker[] {\n return super.init(els, options, Timepicker);\n }\n\n static _addLeadingZero(num: number) {\n return (num < 10 ? '0' : '') + num;\n }\n\n static _createSVGEl(name: string) {\n const svgNS = 'http://www.w3.org/2000/svg';\n return document.createElementNS(svgNS, name);\n }\n\n static _Pos(e: TouchEvent | MouseEvent): Point {\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return {\n x: (e as TouchEvent).targetTouches[0].clientX,\n y: (e as TouchEvent).targetTouches[0].clientY\n };\n }\n // mouse event\n return { x: (e as MouseEvent).clientX, y: (e as MouseEvent).clientY };\n }\n\n static getInstance(el: HTMLElement): Timepicker {\n return el['Expressive_Timepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.el['Expressive_Timepicker'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.plate.addEventListener('mousedown', this._handleClockClickStart);\n this.plate.addEventListener('touchstart', this._handleClockClickStart);\n this.digitalClock.addEventListener('keyup', this._inputFromTextField);\n this.inputHours.addEventListener('focus', () => this.showView('hours'));\n this.inputHours.addEventListener('focusout', () => this.formatHours());\n this.inputMinutes.addEventListener('focus', () => this.showView('minutes'));\n this.inputMinutes.addEventListener('focusout', () => this.formatMinutes());\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n // Drag handlers live on the document while the clock hand is held; if the\n // component is destroyed mid-drag they would otherwise outlive it.\n document.removeEventListener('mousemove', this._handleDocumentClickMove);\n document.removeEventListener('touchmove', this._handleDocumentClickMove);\n document.removeEventListener('mouseup', this._handleDocumentClickEnd);\n document.removeEventListener('touchend', this._handleDocumentClickEnd);\n }\n\n _handleInputClick = () => {\n // Before focus(): focusing inputHours fires the handler that calls\n // showView, and an already-focused input fires nothing at all.\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n }\n };\n\n _handleTimeInputEnterKey = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._inputFromTextField();\n }\n };\n\n _handleClockClickStart = (e) => {\n e.preventDefault();\n this._ensureClockBuilt();\n const clockPlateBR = this.plate.getBoundingClientRect();\n const offset = { x: clockPlateBR.left, y: clockPlateBR.top };\n\n this.x0 = offset.x + this.options.dialRadius;\n this.y0 = offset.y + this.options.dialRadius;\n this.moved = false;\n const clickPos = Timepicker._Pos(e);\n this.dx = clickPos.x - this.x0;\n this.dy = clickPos.y - this.y0;\n\n // Set clock hands\n this.setHand(this.dx, this.dy, false);\n // Mousemove on document\n document.addEventListener('mousemove', this._handleDocumentClickMove);\n document.addEventListener('touchmove', this._handleDocumentClickMove);\n // Mouseup on document\n document.addEventListener('mouseup', this._handleDocumentClickEnd);\n document.addEventListener('touchend', this._handleDocumentClickEnd);\n };\n\n _handleDocumentClickMove = (e) => {\n e.preventDefault();\n const clickPos = Timepicker._Pos(e);\n const x = clickPos.x - this.x0;\n const y = clickPos.y - this.y0;\n this.moved = true;\n this.setHand(x, y, false);\n };\n\n _handleDocumentClickEnd = (e) => {\n e.preventDefault();\n document.removeEventListener('mouseup', this._handleDocumentClickEnd);\n document.removeEventListener('touchend', this._handleDocumentClickEnd);\n const clickPos = Timepicker._Pos(e);\n const x = clickPos.x - this.x0;\n const y = clickPos.y - this.y0;\n if (this.moved && x === this.dx && y === this.dy) {\n this.setHand(x, y);\n }\n\n if (this.currentView === 'hours') {\n this.inputMinutes.focus();\n this.showView('minutes', this.options.duration / 2);\n } else {\n // this.minutesView.classList.add('timepicker-dial-out');\n setTimeout(() => {\n if (this.options.autoSubmit) this.done();\n }, this.options.duration / 2);\n }\n\n if (typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, this.hours, this.minutes);\n }\n // Unbind mousemove event\n document.removeEventListener('mousemove', this._handleDocumentClickMove);\n document.removeEventListener('touchmove', this._handleDocumentClickMove);\n };\n\n _insertHTMLIntoDOM() {\n const template = document.createElement('template');\n template.innerHTML = Timepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n this.containerEl.id = 'container-' + this.id;\n\n // Append popover to input by default\n const optEl = this.options.container;\n const containerEl = optEl instanceof HTMLElement ? optEl : document.querySelector(optEl);\n\n if (this.options.container && !!containerEl) {\n containerEl.append(this.containerEl);\n } else {\n this.el.parentElement.appendChild(this.containerEl);\n }\n }\n\n _setupVariables() {\n this.currentView = 'hours';\n // `navigator.webkitVibrate` never shipped in any browser - the probe it\n // came from was folklore. A plain feature check is the whole of it.\n this.canVibrate = typeof navigator.vibrate === 'function';\n this._canvas = this.containerEl.querySelector('.timepicker-canvas');\n this.plate = this.containerEl.querySelector('.timepicker-plate');\n this.digitalClock = this.containerEl.querySelector('.timepicker-display-column');\n this.hoursView = this.containerEl.querySelector('.timepicker-hours');\n this.minutesView = this.containerEl.querySelector('.timepicker-minutes');\n this.inputHours = this.containerEl.querySelector('.timepicker-input-hours');\n this.inputMinutes = this.containerEl.querySelector('.timepicker-input-minutes');\n this.spanAmPm = this.containerEl.querySelector('.timepicker-span-am-pm');\n this.footer = this.containerEl.querySelector('.timepicker-footer');\n this.amOrPm = 'PM';\n }\n\n /*private _createButton(text: string, visibility: string): HTMLButtonElement {\n const button = document.createElement('button');\n button.classList.add('btn', 'waves-effect', 'text');\n button.style.visibility = visibility;\n button.type = 'button';\n button.tabIndex = -1;\n button.innerText = text;\n return button;\n }*/\n\n _pickerSetup() {\n // clearButton.classList.add('timepicker-clear');\n // clearButton.addEventListener('click', this.clear);\n // this.footer.appendChild(clearButton);\n Utils.createButton(\n this.footer,\n this.options.i18n.clear,\n ['timepicker-clear'],\n this.options.showClearBtn,\n this.clear\n );\n\n if (!this.options.autoSubmit) {\n /*const confirmationBtnsContainer = document.createElement('div');\n confirmationBtnsContainer.classList.add('confirmation-btns');\n this.footer.append(confirmationBtnsContainer);\n\n const cancelButton = this._createButton(this.options.i18n.cancel, '');\n cancelButton.classList.add('timepicker-close');\n cancelButton.addEventListener('click', this.close);\n confirmationBtnsContainer.appendChild(cancelButton);\n\n const doneButton = this._createButton(this.options.i18n.done, '');\n doneButton.classList.add('timepicker-close');\n //doneButton.addEventListener('click', this._finishSelection);\n confirmationBtnsContainer.appendChild(doneButton);*/\n Utils.createConfirmationContainer(\n this.footer,\n this.options.i18n.done,\n this.options.i18n.cancel,\n this.confirm,\n this.cancel\n );\n }\n\n this._updateTimeFromInput();\n\n // With a docked display the container is `visibility: hidden` until\n // show(), so the dial can wait for the first interaction. Without one it\n // is on screen from the moment it is inserted and has to be ready now.\n if (!this.options.displayPlugin) this.showView('hours');\n }\n\n /**\n * Build the dial, once. Cheap to call repeatedly - every entry point that\n * touches the clock calls it first, so the picker cannot be interacted with\n * before it exists.\n */\n private _ensureClockBuilt() {\n if (this._clockBuilt) return;\n this._clockBuilt = true;\n this._clockSetup();\n // Applies the AM/PM state _updateTimeFromInput worked out before the\n // buttons existed.\n this._updateAmPmView();\n }\n\n _clockSetup() {\n if (this.options.twelveHour) {\n // AM Button\n this._amBtn = document.createElement('div');\n this._amBtn.classList.add('am-btn', 'btn');\n this._amBtn.innerText = 'AM';\n this._amBtn.tabIndex = 0;\n this._amBtn.addEventListener('click', this._handleAmPmClick);\n this._amBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._amBtn);\n // PM Button\n this._pmBtn = document.createElement('div');\n this._pmBtn.classList.add('pm-btn', 'btn');\n this._pmBtn.innerText = 'PM';\n this._pmBtn.tabIndex = 0;\n this._pmBtn.addEventListener('click', this._handleAmPmClick);\n this._pmBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._pmBtn);\n }\n this._buildHoursView();\n this._buildMinutesView();\n this._buildSVGClock();\n }\n\n _buildSVGClock() {\n // Draw clock hands and others\n const dialRadius = this.options.dialRadius;\n const tickRadius = this.options.tickRadius;\n const diameter = dialRadius * 2;\n const svg = Timepicker._createSVGEl('svg');\n svg.setAttribute('class', 'timepicker-svg');\n svg.setAttribute('width', diameter.toString());\n svg.setAttribute('height', diameter.toString());\n const g = Timepicker._createSVGEl('g');\n g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');\n const bearing = Timepicker._createSVGEl('circle');\n bearing.setAttribute('class', 'timepicker-canvas-bearing');\n bearing.setAttribute('cx', '0');\n bearing.setAttribute('cy', '0');\n bearing.setAttribute('r', '4');\n const hand = Timepicker._createSVGEl('line');\n hand.setAttribute('x1', '0');\n hand.setAttribute('y1', '0');\n const bg = Timepicker._createSVGEl('circle');\n bg.setAttribute('class', 'timepicker-canvas-bg');\n bg.setAttribute('r', tickRadius.toString());\n g.appendChild(hand);\n g.appendChild(bg);\n g.appendChild(bearing);\n svg.appendChild(g);\n this._canvas.appendChild(svg);\n this.hand = hand;\n this.bg = bg;\n this.bearing = bearing;\n this.g = g;\n }\n\n _buildHoursView() {\n // const $tick = document.createElement('div');\n // $tick.classList.add('timepicker-tick');\n // Hours view\n if (this.options.twelveHour) {\n for (let i = 1; i < 13; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const radius = this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n } else {\n for (let i = 0; i < 24; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const inner = i > 0 && i < 13;\n const radius = inner ? this.options.innerRadius : this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n }\n }\n\n _buildHoursTick(i: number, radian: number, radius: number) {\n const tick = document.createElement('div');\n tick.classList.add('timepicker-tick');\n tick.style.left =\n this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px';\n tick.style.top =\n this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px';\n tick.textContent = i === 0 ? '00' : i.toString();\n this.hoursView.appendChild(tick);\n }\n\n _buildMinutesView() {\n const _tick = document.createElement('div');\n _tick.classList.add('timepicker-tick');\n // Minutes view\n for (let i = 0; i < 60; i += 5) {\n const tick = <HTMLElement>_tick.cloneNode(true);\n const radian = (i / 30) * Math.PI;\n tick.style.left =\n this.options.dialRadius +\n Math.sin(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.style.top =\n this.options.dialRadius -\n Math.cos(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.textContent = Timepicker._addLeadingZero(i);\n this.minutesView.appendChild(tick);\n }\n }\n\n _handleAmPmClick = (e: MouseEvent) => {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n };\n\n _handleAmPmKeypress = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n }\n };\n\n _handleAmPmInteraction = (e: HTMLElement) => {\n this.amOrPm = e.classList.contains('am-btn') ? 'AM' : 'PM';\n this._updateAmPmView();\n }\n\n _updateAmPmView() {\n // _updateTimeFromInput settles amOrPm before the dial is built; the\n // buttons pick the state up in _ensureClockBuilt.\n if (!this._amBtn || !this._pmBtn) return;\n if (this.options.twelveHour) {\n if (this.amOrPm === 'PM') {\n this._amBtn.classList.remove('filled');\n this._pmBtn.classList.add('filled');\n } else if (this.amOrPm === 'AM') {\n this._amBtn.classList.add('filled');\n this._pmBtn.classList.remove('filled');\n }\n }\n }\n\n _updateTimeFromInput() {\n // Get the time\n let value = ((this.el.value || this.options.defaultTime || '') + '').split(':');\n if (this.options.twelveHour && !(typeof value[1] === 'undefined')) {\n if (value[1].toUpperCase().indexOf('AM') > 0) {\n this.amOrPm = 'AM';\n } else {\n this.amOrPm = 'PM';\n }\n value[1] = value[1].replace('AM', '').replace('PM', '');\n }\n if (value[0] === 'now') {\n const now = new Date(+new Date() + this.options.fromNow);\n value = [now.getHours().toString(), now.getMinutes().toString()];\n if (this.options.twelveHour) {\n this.amOrPm = parseInt(value[0]) >= 12 && parseInt(value[0]) < 24 ? 'PM' : 'AM';\n }\n }\n this.hours = +value[0] || 0;\n this.minutes = +value[1] || 0;\n this.inputHours.value = Timepicker._addLeadingZero(this.hours);\n this.inputMinutes.value = Timepicker._addLeadingZero(this.minutes);\n\n this._updateAmPmView();\n }\n\n /**\n * Show hours or minutes view on timepicker.\n * @param view The name of the view you want to switch to, 'hours' or 'minutes'.\n * @param delay\n */\n showView = (view: Views, delay: number = null) => {\n this._ensureClockBuilt();\n if (view === 'minutes' && getComputedStyle(this.hoursView).visibility === 'visible') {\n // raiseCallback(this.options.beforeHourSelect);\n }\n const isHours = view === 'hours',\n nextView = isHours ? this.hoursView : this.minutesView,\n hideView = isHours ? this.minutesView : this.hoursView;\n this.currentView = view;\n\n /*if (isHours) {\n this.inputHours.classList.add('text-primary');\n this.inputMinutes.classList.remove('text-primary');\n } else {\n this.inputHours.classList.remove('text-primary');\n this.inputMinutes.classList.add('text-primary');\n }*/\n\n // Transition view\n hideView.classList.add('timepicker-dial-out');\n\n nextView.style.visibility = 'visible';\n nextView.classList.remove('timepicker-dial-out');\n\n // Reset clock hand\n this.resetClock(delay);\n // After transitions ended\n clearTimeout(this.toggleViewTimer);\n this.toggleViewTimer = setTimeout(() => {\n hideView.style.visibility = 'hidden';\n }, this.options.duration);\n };\n\n resetClock(delay) {\n const view = this.currentView,\n value = this[view],\n isHours = view === 'hours',\n unit = Math.PI / (isHours ? 6 : 30),\n radian = value * unit,\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius,\n x = Math.sin(radian) * radius,\n y = -Math.cos(radian) * radius;\n\n if (delay) {\n this._canvas?.classList.add('timepicker-canvas-out');\n setTimeout(() => {\n this._canvas?.classList.remove('timepicker-canvas-out');\n this.setHand(x, y);\n }, delay);\n } else {\n this.setHand(x, y);\n }\n }\n\n _inputFromTextField = () => {\n const isHours = this.currentView === 'hours';\n if (isHours && this.inputHours.value !== '') {\n const value = parseInt(this.inputHours.value);\n if (value > 0 && value < (this.options.twelveHour ? 13 : 24)) {\n this.hours = value;\n } else {\n this.setHoursDefault();\n }\n this.drawClockFromTimeInput(this.hours, isHours);\n } else if (!isHours && this.inputMinutes.value !== '') {\n const value = parseInt(this.inputMinutes.value);\n if (value >= 0 && value < 60) {\n this.minutes = value;\n } else {\n this.minutes = new Date().getMinutes();\n this.inputMinutes.value = this.minutes.toString();\n }\n this.drawClockFromTimeInput(this.minutes, isHours);\n }\n };\n\n drawClockFromTimeInput(value, isHours) {\n const unit = Math.PI / (isHours ? 6 : 30);\n const radian = value * unit;\n let radius;\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n } else {\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius;\n }\n this.setClockAttributes(radian, radius);\n }\n\n setHand(x, y, roundBy5: boolean = false) {\n const isHours = this.currentView === 'hours',\n unit = Math.PI / (isHours || roundBy5 ? 6 : 30),\n z = Math.sqrt(x * x + y * y),\n inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2;\n let radian = Math.atan2(x, -y),\n radius = inner ? this.options.innerRadius : this.options.outerRadius;\n\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n }\n\n // Radian should in range [0, 2PI]\n if (radian < 0) {\n radian = Math.PI * 2 + radian;\n }\n\n // Get the round value\n let value = Math.round(radian / unit);\n\n // Get the round radian\n radian = value * unit;\n\n // Correct the hours or minutes\n if (this.options.twelveHour) {\n if (isHours) {\n if (value === 0) value = 12;\n } else {\n if (roundBy5) value *= 5;\n if (value === 60) value = 0;\n }\n } else {\n if (isHours) {\n if (value === 12) {\n value = 0;\n }\n value = inner ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;\n } else {\n if (roundBy5) {\n value *= 5;\n }\n if (value === 60) {\n value = 0;\n }\n }\n }\n\n // Once hours or minutes changed, vibrate the device\n if (this[this.currentView] !== value) {\n if (this.canVibrate && this.options.vibrate) {\n // Do not vibrate too frequently\n if (!this.vibrateTimer) {\n navigator.vibrate(10);\n this.vibrateTimer = setTimeout(() => {\n this.vibrateTimer = null;\n }, 100);\n }\n }\n }\n\n this[this.currentView] = value;\n if (isHours) {\n this.inputHours.value = Timepicker._addLeadingZero(value);\n } else {\n this.inputMinutes.value = Timepicker._addLeadingZero(value);\n }\n\n // Set clock hand and others' position\n this.setClockAttributes(radian, radius);\n }\n\n setClockAttributes(radian: number, radius: number) {\n // Nothing to point at until the SVG exists.\n if (!this.hand || !this.bg) return;\n const cx1 = Math.sin(radian) * (radius - this.options.tickRadius),\n cy1 = -Math.cos(radian) * (radius - this.options.tickRadius),\n cx2 = Math.sin(radian) * radius,\n cy2 = -Math.cos(radian) * radius;\n this.hand.setAttribute('x2', cx1.toString());\n this.hand.setAttribute('y2', cy1.toString());\n this.bg.setAttribute('cx', cx2.toString());\n this.bg.setAttribute('cy', cy2.toString());\n }\n\n formatHours() {\n if (this.inputHours.value == '') this.setHoursDefault();\n this.inputHours.value = Timepicker._addLeadingZero(Number(this.inputHours.value));\n }\n\n formatMinutes() {\n if (this.inputMinutes.value == '') this.minutes = new Date().getMinutes();\n this.inputMinutes.value = Timepicker._addLeadingZero(Number(this.inputMinutes.value));\n }\n\n setHoursDefault() {\n this.hours = new Date().getHours();\n this.inputHours.value = (this.hours % (this.options.twelveHour ? 12 : 24)).toString();\n }\n\n done = (clearValue = null) => {\n // Set input value\n const last = this.el.value;\n let value = clearValue\n ? ''\n : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes);\n this.time = value;\n if (!clearValue && this.options.twelveHour) {\n value = `${value} ${this.amOrPm}`;\n }\n this.el.value = value;\n // Trigger change event\n if (value !== last) {\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n };\n\n confirm = () => {\n this.done();\n if (typeof this.options.onDone === 'function') this.options.onDone.call(this);\n }\n\n cancel = () => {\n // not logical clearing the input field on cancel, since the end user might want to make use of the previously submitted value\n // this.clear();\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n }\n\n clear = () => {\n this.done(true);\n };\n\n // deprecated\n open() {\n console.warn(\n 'Timepicker.close() is deprecated. Remove this method and wrap in modal yourself.'\n );\n return this;\n }\n\n close() {\n console.warn(\n 'Timepicker.close() is deprecated. Remove this method and wrap in modal yourself.'\n );\n return this;\n }\n\n static {\n Timepicker._template = `<div class=\"timepicker-container\">\n <div class=\"timepicker-digital-display\">\n <div class=\"timepicker-text-container\">\n <div class=\"timepicker-display-column timepicker-display-digital-clock\">\n <div class=\"timepicker-input-hours-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-hours text-primary\" />\n </div>\n <div class=\"timepicker-input-divider-wrapper\">\n <span class=\"timepicker-input-divider\">:</span>\n </div>\n <div class=\"timepicker-input-minutes-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-minutes\" />\n </div>\n </div>\n <div class=\"timepicker-display-column timepicker-display-am-pm\">\n <div class=\"timepicker-span-am-pm\"></div>\n </div>\n </div>\n </div>\n <div class=\"timepicker-analog-display\">\n <div class=\"timepicker-plate\">\n <div class=\"timepicker-canvas\"></div>\n <div class=\"timepicker-dial timepicker-hours\"></div>\n <div class=\"timepicker-dial timepicker-minutes timepicker-dial-out\"></div>\n </div>\n <div class=\"timepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n", "import { BaseOptions } from '../core/component';\n\nexport interface ToastOptions extends BaseOptions {\n /**\n * The content of the Toast.\n * @default \"\"\n */\n text: string;\n /**\n * Optional action label. Rendered as a trailing text button.\n * @default \"\"\n */\n action: string;\n /**\n * Called when the action button is pressed. The toast still dismisses.\n * @default null\n */\n onAction: () => void;\n /**\n * Show a trailing close icon button.\n * @default false\n */\n dismissible: boolean;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n toastId?: string;\n /**\n * Length in ms the Toast stays before dismissal.\n * @default 4000\n */\n displayLength: number;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 375\n */\n outDuration: number;\n /**\n * Classes to be added to the toast element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when toast is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the toast's width it takes fora drag\n * to dismiss a Toast.\n * @default 0.8\n */\n activationPercent: number;\n}\n\nconst _defaults: ToastOptions = {\n text: '',\n action: '',\n onAction: null,\n dismissible: false,\n displayLength: 4000,\n inDuration: 300,\n outDuration: 375,\n classes: '',\n completeCallback: null,\n activationPercent: 0.8\n};\n\nexport class Toast {\n /** The toast element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the toast\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Toast.\n */\n panning: boolean;\n options: ToastOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the toast is due to dismiss, for pause/resume. */\n private _deadline: number;\n wasSwiped: boolean;\n startingXPos: number;\n xPos: number;\n time: number;\n deltaX: number;\n velocityX: number;\n\n static _toasts: Toast[];\n static _container: HTMLElement;\n static _draggedToast: Toast;\n\n constructor(options: Partial<ToastOptions>) {\n this.options = {\n ...Toast.defaults,\n ...options\n };\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n if (Toast._toasts.length === 0) {\n Toast._createContainer();\n }\n // Create new toast\n Toast._toasts.push(this);\n const toastElement = this._createToast();\n toastElement['Expressive_Toast'] = this;\n this.el = toastElement;\n this._animateIn();\n this._setTimer();\n }\n\n static get defaults(): ToastOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Toast {\n return el['Expressive_Toast'];\n }\n\n static _createContainer() {\n const container = document.createElement('div');\n container.setAttribute('id', 'toast-container');\n // Add event handler\n container.addEventListener('touchstart', Toast._onDragStart);\n container.addEventListener('touchmove', Toast._onDragMove);\n container.addEventListener('touchend', Toast._onDragEnd);\n container.addEventListener('mousedown', Toast._onDragStart);\n document.addEventListener('mousemove', Toast._onDragMove);\n document.addEventListener('mouseup', Toast._onDragEnd);\n document.body.appendChild(container);\n Toast._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('mousemove', Toast._onDragMove);\n document.removeEventListener('mouseup', Toast._onDragEnd);\n Toast._container.remove();\n Toast._container = null;\n }\n\n static _onDragStart(e: TouchEvent | MouseEvent) {\n const target = e.target as HTMLElement | null;\n // Don't start a swipe from the action or close \u2014 those are buttons.\n if (target && !target.closest('button, a') && target.closest('.toast, .snackbar')) {\n const toastElem = target.closest('.toast, .snackbar') as HTMLElement;\n const toast: Toast = toastElem['Expressive_Toast'];\n if (!toast) return;\n toast.panning = true;\n toast._pauseTimer();\n Toast._draggedToast = toast;\n toast.el.classList.add('panning');\n toast.el.style.transition = '';\n toast.startingXPos = Toast._xPos(e);\n toast.time = Date.now();\n toast.xPos = Toast._xPos(e);\n }\n }\n\n static _onDragMove(e: TouchEvent | MouseEvent) {\n if (!!Toast._draggedToast) {\n e.preventDefault();\n const toast = Toast._draggedToast;\n toast.deltaX = Math.abs(toast.xPos - Toast._xPos(e));\n toast.xPos = Toast._xPos(e);\n toast.velocityX = toast.deltaX / (Date.now() - toast.time);\n toast.time = Date.now();\n\n const totalDeltaX = toast.xPos - toast.startingXPos;\n const activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n toast.el.style.transform = `translateX(${totalDeltaX}px)`;\n toast.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd() {\n if (!!Toast._draggedToast) {\n const toast = Toast._draggedToast;\n toast.panning = false;\n toast.el.classList.remove('panning');\n\n const totalDeltaX = toast.xPos - toast.startingXPos;\n const activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || toast.velocityX > 1;\n\n // Remove toast\n if (shouldBeDismissed) {\n toast.wasSwiped = true;\n toast.dismiss();\n // Animate toast back to original position\n } else {\n toast.el.style.transition = 'transform .2s, opacity .2s';\n toast.el.style.transform = '';\n toast.el.style.opacity = '';\n toast._resumeTimer();\n }\n Toast._draggedToast = null;\n }\n }\n\n static _xPos(e: TouchEvent | MouseEvent) {\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return (e as TouchEvent).targetTouches[0].clientX;\n }\n // mouse event\n return (e as MouseEvent).clientX;\n }\n\n /**\n * dismiss all toasts.\n */\n static dismissAll() {\n // Copy first: dismiss() splices the list it is iterating.\n for (const toast of [...Toast._toasts]) {\n toast.dismiss();\n }\n }\n\n _createToast() {\n let toast: HTMLElement = this.options.toastId\n ? document.getElementById(this.options.toastId)\n : document.createElement('div');\n if (toast instanceof HTMLTemplateElement) {\n const node = (toast as HTMLTemplateElement).content.cloneNode(true);\n toast = (node as HTMLElement).firstElementChild as HTMLElement;\n }\n toast.classList.add('toast', 'snackbar');\n toast.setAttribute('role', 'status');\n toast.setAttribute('aria-live', 'polite');\n toast.setAttribute('aria-atomic', 'true');\n // Add custom classes onto toast\n if (this.options.classes.length > 0) {\n toast.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n if (this.message) {\n const text = document.createElement('p');\n text.textContent = this.message;\n toast.replaceChildren(text);\n }\n if (this.options.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.textContent = this.options.action;\n action.addEventListener('click', (e) => {\n e.stopPropagation();\n if (typeof this.options.onAction === 'function') {\n this.options.onAction();\n }\n this.dismiss();\n });\n toast.appendChild(action);\n }\n if (this.options.dismissible) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'circle';\n close.setAttribute('aria-label', 'Dismiss');\n const icon = document.createElement('i');\n icon.className = 'material-icons';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = 'close';\n close.appendChild(icon);\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dismiss();\n });\n toast.appendChild(close);\n }\n Toast._container.appendChild(toast);\n return toast;\n }\n\n _animateIn() {\n // Animate toast in\n this.el.style.display = '';\n this.el.style.opacity = '0';\n // easeOutCubic\n this.el.style.transition = `\n top ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n setTimeout(() => {\n this.el.style.top = '0';\n this.el.style.opacity = '1';\n }, 1);\n }\n\n /**\n * Arm the dismissal timer.\n *\n * One timeout, not a 20ms interval ticking a counter down: the old form woke\n * the page up 50 times a second per toast purely to subtract 20 from a\n * number. Dragging pauses the countdown via _pauseTimer/_resumeTimer instead.\n */\n _setTimer() {\n if (this.timeRemaining === Infinity) return;\n this._deadline = Date.now() + this.timeRemaining;\n this.counterTimeout = setTimeout(() => this.dismiss(), this.timeRemaining);\n }\n\n /** Stop the countdown, banking the time that was left on it. */\n _pauseTimer() {\n if (this.counterTimeout == null) return;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this.timeRemaining = Math.max(0, this._deadline - Date.now());\n }\n\n /** Restart a countdown stopped by {@link _pauseTimer}. */\n _resumeTimer() {\n if (this.counterTimeout != null) return;\n this._setTimer();\n }\n\n /**\n * Dismiss toast with animation.\n */\n dismiss() {\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n const activationDistance = this.el.offsetWidth * this.options.activationPercent;\n\n if (this.wasSwiped) {\n this.el.style.transition = 'transform .05s, opacity .05s';\n this.el.style.transform = `translateX(${activationDistance}px)`;\n this.el.style.opacity = '0';\n }\n\n // easeOutExpo\n this.el.style.transition = `\n margin ${this.options.outDuration}ms ease,\n opacity ${this.options.outDuration}ms ease`;\n\n setTimeout(() => {\n this.el.style.opacity = '0';\n this.el.style.marginTop = '-40px';\n }, 1);\n\n setTimeout(() => {\n // Call the optional callback\n if (typeof this.options.completeCallback === 'function') {\n this.options.completeCallback();\n }\n // Remove toast from DOM\n if (this.el.id != this.options.toastId) {\n this.el.remove();\n // Guarded: splice(-1, 1) on an already-removed toast would drop an\n // unrelated one off the end of the list.\n const index = Toast._toasts.indexOf(this);\n if (index >= 0) Toast._toasts.splice(index, 1);\n if (Toast._toasts.length === 0 && Toast._container) {\n Toast._removeContainer();\n }\n }\n }, this.options.outDuration);\n }\n\n static {\n Toast._toasts = [];\n Toast._container = null;\n Toast._draggedToast = null;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Bounding } from '../core/bounding';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface TooltipOptions extends BaseOptions {\n /**\n * Delay time before tooltip disappears.\n * @default 200\n */\n exitDelay: number;\n /**\n * Delay time before tooltip appears.\n * @default 0\n */\n enterDelay: number;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n tooltipId?: string;\n /**\n * Text string for the tooltip.\n * @default \"\"\n */\n text: string;\n /**\n * Set distance tooltip appears away from its activator\n * excluding transitionMovement.\n * @default 4\n */\n margin: number;\n /**\n * Enter transition duration.\n * @default 300\n */\n inDuration: number;\n /**\n * Opacity of the tooltip.\n * @default 1\n */\n opacity: number;\n /**\n * Exit transition duration.\n * @default 250\n */\n outDuration: number;\n /**\n * Set the direction of the tooltip.\n * @default 'bottom'\n */\n position: TooltipPosition;\n /**\n * Amount in px that the tooltip moves during its transition.\n * @default 10\n */\n transitionMovement: number;\n}\n\nconst _defaults: TooltipOptions = {\n exitDelay: 200,\n enterDelay: 0,\n text: '',\n margin: 4,\n inDuration: 250,\n outDuration: 200,\n position: 'bottom' as TooltipPosition,\n transitionMovement: 10,\n opacity: 1\n};\n\nexport class Tooltip extends Component<TooltipOptions> {\n /**\n * If tooltip is open.\n */\n isOpen: boolean;\n /**\n * If tooltip is hovered.\n */\n isHovered: boolean;\n /**\n * If tooltip is focused.\n */\n isFocused: boolean;\n tooltipEl: HTMLElement;\n private _exitDelayTimeout: ReturnType<typeof setTimeout>;\n private _enterDelayTimeout: ReturnType<typeof setTimeout>;\n xMovement: number;\n yMovement: number;\n\n constructor(el: HTMLElement, options: Partial<TooltipOptions>) {\n super(el, options, Tooltip);\n this.el['Expressive_Tooltip'] = this;\n\n this.options = {\n ...Tooltip.defaults,\n ...this._getAttributeOptions(),\n ...options\n };\n\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n this._appendTooltipEl();\n this._setupEventHandlers();\n }\n\n static get defaults(): TooltipOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tooltip.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TooltipOptions>): Tooltip;\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<TooltipOptions>): Tooltip[];\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<TooltipOptions> = {}\n ): Tooltip | Tooltip[] {\n return super.init(els, options, Tooltip);\n }\n\n static getInstance(el: HTMLElement): Tooltip {\n return el['Expressive_Tooltip'];\n }\n\n destroy() {\n if (this.el.getAttribute('aria-describedby') === this.tooltipEl.id) {\n this.el.removeAttribute('aria-describedby');\n }\n this.tooltipEl.remove();\n this._removeEventHandlers();\n this.el['Expressive_Tooltip'] = undefined;\n }\n\n _appendTooltipEl() {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.classList.add('tooltip', 'material-tooltip');\n this.tooltipEl.id = `tooltip-${Utils.guid()}`;\n this.tooltipEl.setAttribute('role', 'tooltip');\n this.el.setAttribute('aria-describedby', this.tooltipEl.id);\n\n const tooltipContentEl = this.options.tooltipId\n ? document.getElementById(this.options.tooltipId)\n : document.createElement('div');\n if (this.options.tooltipId) {\n this.tooltipEl.classList.add('rich');\n }\n tooltipContentEl.style.display = '';\n tooltipContentEl.classList.add('tooltip-content');\n this._setTooltipContent(tooltipContentEl);\n this.tooltipEl.appendChild(tooltipContentEl);\n document.body.appendChild(this.tooltipEl);\n }\n\n _setTooltipContent(tooltipContentEl: HTMLElement) {\n if (this.options.tooltipId) return;\n tooltipContentEl.innerText = this.options.text;\n }\n\n _updateTooltipContent() {\n this._setTooltipContent(this.tooltipEl.querySelector('.tooltip-content'));\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.el.addEventListener('focus', this._handleFocus, true);\n this.el.addEventListener('blur', this._handleBlur, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.el.removeEventListener('focus', this._handleFocus, true);\n this.el.removeEventListener('blur', this._handleBlur, true);\n }\n\n /**\n * Show tooltip.\n */\n open = (isManual: boolean) => {\n if (this.isOpen) return;\n isManual = isManual === undefined ? true : undefined; // Default value true\n this.isOpen = true;\n // Update tooltip content with HTML attribute options\n this.options = { ...this.options, ...this._getAttributeOptions() };\n this._updateTooltipContent();\n this._setEnterDelayTimeout(isManual);\n };\n\n /**\n * Hide tooltip.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isHovered = false;\n this.isFocused = false;\n this.isOpen = false;\n this._setExitDelayTimeout();\n };\n\n _setExitDelayTimeout() {\n clearTimeout(this._exitDelayTimeout);\n this._exitDelayTimeout = setTimeout(() => {\n if (this.isHovered || this.isFocused) return;\n this._animateOut();\n }, this.options.exitDelay);\n }\n\n _setEnterDelayTimeout(isManual) {\n clearTimeout(this._enterDelayTimeout);\n this._enterDelayTimeout = setTimeout(() => {\n if (!this.isHovered && !this.isFocused && !isManual) return;\n this._animateIn();\n }, this.options.enterDelay);\n }\n\n _positionTooltip() {\n const tooltip: HTMLElement = this.tooltipEl;\n const origin = this.el as HTMLElement,\n originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n tooltipHeight = tooltip.offsetHeight,\n tooltipWidth = tooltip.offsetWidth,\n margin = this.options.margin;\n\n this.xMovement = 0;\n this.yMovement = 0;\n\n const originRect = origin.getBoundingClientRect();\n let targetTop = originRect.top + Utils.getDocumentScrollTop();\n let targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n if (this.options.position === 'top') {\n targetTop += -tooltipHeight - margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = -this.options.transitionMovement;\n } else if (this.options.position === 'right') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += originWidth + margin;\n this.xMovement = this.options.transitionMovement;\n } else if (this.options.position === 'left') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += -tooltipWidth - margin;\n this.xMovement = -this.options.transitionMovement;\n } else {\n targetTop += originHeight + margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = this.options.transitionMovement;\n }\n\n const newCoordinates = this._repositionWithinScreen(\n targetLeft,\n targetTop,\n tooltipWidth,\n tooltipHeight\n );\n\n tooltip.style.top = newCoordinates.y + 'px';\n tooltip.style.left = newCoordinates.x + 'px';\n }\n\n _repositionWithinScreen(x: number, y: number, width: number, height: number) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding: Bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n const offset = this.options.margin + this.options.transitionMovement;\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n\n _animateIn() {\n this._positionTooltip();\n this.tooltipEl.style.visibility = 'visible';\n const duration = this.options.inDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(${this.xMovement}px) translateY(${this.yMovement}px)`;\n this.tooltipEl.style.opacity = (this.options.opacity || 1).toString();\n }, 1);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(0px) translateY(0px)`;\n this.tooltipEl.style.opacity = '0';\n }, 1);\n /*\n anim.remove(this.tooltipEl);\n anim({\n targets: this.tooltipEl,\n opacity: 0,\n translateX: 0,\n translateY: 0,\n duration: this.options.outDuration,\n easing: 'easeOutCubic'\n });\n */\n }\n\n _handleMouseEnter = () => {\n this.isHovered = true;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.open(false);\n };\n\n _handleMouseLeave = () => {\n this.isHovered = false;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.close();\n };\n\n _handleFocus = () => {\n if (Utils.tabPressed) {\n this.isFocused = true;\n this.open(false);\n }\n };\n\n _handleBlur = () => {\n this.isFocused = false;\n this.close();\n };\n\n _getAttributeOptions(): Partial<TooltipOptions> {\n const attributeOptions: Partial<TooltipOptions> = {};\n const tooltipTextOption = this.el.getAttribute('data-tooltip');\n const tooltipId = this.el.getAttribute('data-tooltip-id');\n const positionOption = this.el.getAttribute('data-position');\n if (tooltipTextOption) {\n attributeOptions.text = tooltipTextOption;\n }\n if (positionOption) {\n attributeOptions.position = positionOption as TooltipPosition;\n }\n if (tooltipId) {\n attributeOptions.tooltipId = tooltipId;\n }\n\n return attributeOptions;\n }\n}\n", "import { InitElements, MElement } from '../core/component';\nimport * as Components from './index';\nimport { CARDS_SELECTOR } from './cards';\n\n/**\n * The components `AutoInit()` starts, in initialization order, with the\n * selector each one claims.\n *\n * This table is the single source of truth: the options type below and the\n * init calls in `AutoInit()` are both derived from it, so wiring up a new\n * auto-initialized component means adding one line here (plus its export in\n * ./index.ts) - not four hand-synchronized edits that fail silently when one\n * is forgotten.\n *\n * A component that should only ever be constructed explicitly (Toast,\n * CharacterCounter, Range, ...) simply stays out of this table.\n */\nexport const AUTO_INIT_COMPONENTS = {\n Autocomplete: { component: Components.Autocomplete, selector: '.autocomplete' },\n // Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read\n // '.cards', which no card markup uses.\n Cards: { component: Components.Cards, selector: CARDS_SELECTOR },\n Carousel: { component: Components.Carousel, selector: '.carousel' },\n Chips: { component: Components.Chips, selector: '.chips' },\n Collapsible: { component: Components.Collapsible, selector: '.collapsible' },\n Datepicker: { component: Components.Datepicker, selector: '.datepicker' },\n Dropdown: { component: Components.Dropdown, selector: '.dropdown-trigger' },\n Lightbox: { component: Components.Lightbox, selector: '.lightboxed' },\n Modal: { component: Components.Modal, selector: '.modal' },\n Parallax: { component: Components.Parallax, selector: '.parallax' },\n Pushpin: { component: Components.Pushpin, selector: '.pushpin' },\n ScrollSpy: { component: Components.ScrollSpy, selector: '.scrollspy' },\n FormSelect: { component: Components.FormSelect, selector: 'select' },\n Sidenav: { component: Components.Sidenav, selector: '.sidenav' },\n Tabs: { component: Components.Tabs, selector: '.tabs' },\n TapTarget: { component: Components.TapTarget, selector: '.tap-target' },\n Timepicker: { component: Components.Timepicker, selector: '.timepicker' },\n Tooltip: { component: Components.Tooltip, selector: '.tooltipped' },\n FloatingActionButton: {\n component: Components.FloatingActionButton,\n selector: '.fixed-action-btn'\n }\n};\n\ntype Registry = typeof AUTO_INIT_COMPONENTS;\n\n/**\n * Per-component options accepted by {@link AutoInit}, derived from the table\n * above - each key takes that component's own options type.\n */\nexport type AutoInitOptions = {\n [K in keyof Registry]?: Partial<InstanceType<Registry[K]['component']>['options']>;\n};\n\n/** The shape every entry in the table satisfies; see the cast in AutoInit. */\ntype AutoInitable = {\n init(els: InitElements<MElement>, options: Partial<object>): unknown;\n};\n\n/**\n * Automatically initialize components.\n * @param context Root element to initialize. Defaults to `document.body`.\n * @param options Options for each component.\n */\nexport function AutoInit(\n context: HTMLElement = document.body,\n options?: Partial<AutoInitOptions>\n) {\n for (const name of Object.keys(AUTO_INIT_COMPONENTS) as (keyof Registry)[]) {\n const { component, selector } = AUTO_INIT_COMPONENTS[name];\n // `:is()` so that `:not(.no-autoinit)` applies to the whole selector. A\n // bare `${selector}:not(...)` binds the negation to the last alternative\n // only, which would silently break the opt-out for any comma-separated\n // entry (Cards is the first).\n const els = context.querySelectorAll(`:is(${selector}):not(.no-autoinit)`);\n // Each component's static `init` is overloaded; indexing the table widens\n // it to a union TypeScript cannot call, so narrow it once, here.\n (component as unknown as AutoInitable).init(els, options?.[name] ?? {});\n }\n}\n", "// Public entry point of the bundle.\n//\n// Layout:\n// core/ Component base class, Utils, shared types\n// components/ per-element widgets (+ index.ts barrel, registry.ts)\n// behaviors/ document-level enhancers, started below at import time\n// plugins/ helpers that are not Components\n//\n// See src/ts/README.md before adding anything.\n\nimport { Utils } from './core/utils';\nimport { Cards } from './components/cards';\nimport { Chips } from './components/chips';\nimport { Range } from './components/range';\nimport { Dialogs } from './behaviors/dialogs';\nimport { Forms } from './behaviors/forms';\nimport { Waves } from './behaviors/waves';\n\nexport * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { Forms } from './behaviors/forms';\nexport { Waves } from './behaviors/waves';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.2.0';\n\n// Side effects: importing the bundle wires up the document-level behaviors and\n// the delegated listeners the components below rely on. Order is preserved from\n// the original bundle - do not reorder without checking the event handlers.\n\nif (typeof document !== 'undefined') {\n document.addEventListener('keydown', Utils.docHandleKeydown, true);\n document.addEventListener('keyup', Utils.docHandleKeyup, true);\n document.addEventListener('focus', Utils.docHandleFocus, true);\n document.addEventListener('blur', Utils.docHandleBlur, true);\n}\nForms.Init();\nChips.Init();\nWaves.Init();\nRange.Init();\nCards.Init();\nDialogs.Init();\n"],
5
- "mappings": "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",
6
- "names": ["el", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "li", "index", "el", "_defaults", "value", "realOption", "li", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults"]
4
+ "sourcesContent": ["import { Edges } from './edges';\nimport { Bounding } from './bounding';\n\n/**\n * Class with utilitary functions for global usage.\n */\nexport class Utils {\n /** Specifies wether tab is pressed or not. */\n static tabPressed: boolean = false;\n /** Specifies wether there is a key pressed. */\n static keyDown: boolean = false;\n\n /**\n * Key maps.\n */\n static keys = {\n TAB: ['Tab'],\n ENTER: ['Enter'],\n ESC: ['Escape', 'Esc'],\n BACKSPACE: ['Backspace'],\n ARROW_UP: ['ArrowUp', 'Up'],\n ARROW_DOWN: ['ArrowDown', 'Down'],\n ARROW_LEFT: ['ArrowLeft', 'Left'],\n ARROW_RIGHT: ['ArrowRight', 'Right'],\n DELETE: ['Delete', 'Del']\n };\n\n /**\n * Keys that count as keyboard navigation, precomputed.\n *\n * These handlers run at capture phase on the document for every keystroke on\n * the page, and used to rebuild three arrays and spread them into a fourth\n * on each one.\n */\n private static _navigationKeys = new Set([\n ...Utils.keys.TAB,\n ...Utils.keys.ARROW_DOWN,\n ...Utils.keys.ARROW_UP\n ]);\n\n /**\n * Detects when a key is pressed.\n * @param e Event instance.\n */\n static docHandleKeydown(e: KeyboardEvent) {\n Utils.keyDown = true;\n if (Utils._navigationKeys.has(e.key)) {\n Utils.tabPressed = true;\n }\n }\n\n /**\n * Detects when a key is released.\n * @param e Event instance.\n */\n static docHandleKeyup(e: KeyboardEvent) {\n Utils.keyDown = false;\n if (Utils._navigationKeys.has(e.key)) {\n Utils.tabPressed = false;\n }\n }\n\n /**\n * Detects when document is focused.\n * @param e Event instance.\n */\n /* eslint-disabled as of required event type condition check */\n /* eslint-disable-next-line */\n static docHandleFocus(e: FocusEvent) {\n if (Utils.keyDown) {\n document.body.classList.add('keyboard-focused');\n }\n }\n\n /**\n * Detects when document is not focused.\n * @param e Event instance.\n */\n /* eslint-disabled as of required event type condition check */\n /* eslint-disable-next-line */\n static docHandleBlur(e: FocusEvent) {\n document.body.classList.remove('keyboard-focused');\n }\n\n /**\n * Run `callback` once the document is parsed.\n *\n * The document-level behaviors all used a bare DOMContentLoaded listener,\n * which never fires if the bundle is loaded after that event - an async or\n * deferred script tag, or a dynamic import. Checking readyState first covers\n * both orders.\n */\n static onDocumentReady(callback: () => void): void {\n if (typeof document === 'undefined') return;\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', callback, { once: true });\n } else {\n callback();\n }\n }\n\n /**\n * Generates a unique string identifier.\n */\n static guid(): string {\n const s4 = (): string => {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n };\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n }\n\n /**\n * Checks for exceeded edges\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkWithinContainer(container: HTMLElement, bounding: Bounding, offset: number): Edges {\n const edges = {\n top: false,\n right: false,\n bottom: false,\n left: false\n };\n\n const containerRect = container.getBoundingClientRect();\n // If body element is smaller than viewport, use viewport height instead.\n const containerBottom =\n container === document.body\n ? Math.max(containerRect.bottom, window.innerHeight)\n : containerRect.bottom;\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledY = bounding.top - scrollTop;\n\n // Check for container and viewport for each edge\n if (scrolledX < containerRect.left + offset || scrolledX < offset) {\n edges.left = true;\n }\n\n if (\n scrolledX + bounding.width > containerRect.right - offset ||\n scrolledX + bounding.width > window.innerWidth - offset\n ) {\n edges.right = true;\n }\n\n if (scrolledY < containerRect.top + offset || scrolledY < offset) {\n edges.top = true;\n }\n\n if (\n scrolledY + bounding.height > containerBottom - offset ||\n scrolledY + bounding.height > window.innerHeight - offset\n ) {\n edges.bottom = true;\n }\n\n return edges;\n }\n\n /**\n * Checks if element can be aligned in multiple directions.\n * @param el Element to be inspected.\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkPossibleAlignments(\n el: HTMLElement,\n container: HTMLElement,\n bounding: Bounding,\n offset: number\n ) {\n const canAlign: {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n spaceOnTop: number;\n spaceOnRight: number;\n spaceOnBottom: number;\n spaceOnLeft: number;\n } = {\n top: true,\n right: true,\n bottom: true,\n left: true,\n spaceOnTop: null,\n spaceOnRight: null,\n spaceOnBottom: null,\n spaceOnLeft: null\n };\n\n const containerAllowsOverflow = getComputedStyle(container).overflow === 'visible';\n const containerRect = container.getBoundingClientRect();\n const containerHeight = Math.min(containerRect.height, window.innerHeight);\n const containerWidth = Math.min(containerRect.width, window.innerWidth);\n const elOffsetRect = el.getBoundingClientRect();\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledYTopEdge = bounding.top - scrollTop;\n const scrolledYBottomEdge = bounding.top + elOffsetRect.height - scrollTop;\n\n // Check for container and viewport for left\n canAlign.spaceOnRight = !containerAllowsOverflow\n ? containerWidth - (scrolledX + bounding.width)\n : window.innerWidth - (elOffsetRect.left + bounding.width);\n if (canAlign.spaceOnRight < 0) {\n canAlign.left = false;\n }\n\n // Check for container and viewport for Right\n canAlign.spaceOnLeft = !containerAllowsOverflow\n ? scrolledX - bounding.width + elOffsetRect.width\n : elOffsetRect.right - bounding.width;\n if (canAlign.spaceOnLeft < 0) {\n canAlign.right = false;\n }\n\n // Check for container and viewport for Top\n canAlign.spaceOnBottom = !containerAllowsOverflow\n ? containerHeight - (scrolledYTopEdge + bounding.height + offset)\n : window.innerHeight - (elOffsetRect.top + bounding.height + offset);\n if (canAlign.spaceOnBottom < 0) {\n canAlign.top = false;\n }\n\n // Check for container and viewport for Bottom\n canAlign.spaceOnTop = !containerAllowsOverflow\n ? scrolledYBottomEdge - (bounding.height - offset)\n : elOffsetRect.bottom - (bounding.height + offset);\n if (canAlign.spaceOnTop < 0) {\n canAlign.bottom = false;\n }\n\n return canAlign;\n }\n\n /**\n * Retrieves target element id from trigger.\n * @param trigger Trigger element.\n */\n static getIdFromTrigger(trigger: HTMLElement): string {\n let id = trigger.dataset.target;\n if (!id) {\n id = trigger.getAttribute('href');\n return id ? id.slice(1) : '';\n }\n return id;\n }\n\n /**\n * Retrieves document scroll postion from top.\n */\n static getDocumentScrollTop(): number {\n return window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0;\n }\n\n /**\n * Retrieves document scroll postion from left.\n */\n static getDocumentScrollLeft(): number {\n return window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft || 0;\n }\n\n /**\n * Fires the given function after a certain ammount of time.\n * @param func Function to be fired.\n * @param wait Wait time.\n * @param options Additional options.\n */\n static throttle(\n func: (...args: unknown[]) => void,\n wait: number,\n options: Partial<{ leading: boolean; trailing: boolean }> = {}\n ) {\n // `options` is nullable because callers pass an explicit null.\n let lastArgs: unknown[] = null,\n result,\n timeout = null,\n previous = 0;\n\n const later = () => {\n previous = options?.leading === false ? 0 : Date.now();\n timeout = null;\n // The trailing call replays the most recent arguments; without this it\n // used to fire with none at all.\n result = func(...(lastArgs ?? []));\n lastArgs = null;\n };\n\n return (...args: unknown[]) => {\n const now = Date.now();\n if (!previous && options?.leading === false) previous = now;\n const remaining = wait - (now - previous);\n lastArgs = args;\n if (remaining <= 0) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n lastArgs = null;\n result = func(...args);\n } else if (!timeout && options?.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n }\n\n /**\n * Renders confirm/close buttons with callback function\n */\n static createConfirmationContainer(\n container: HTMLElement,\n confirmText: string,\n cancelText: string,\n onConfirm: (Function: object) => void,\n onCancel: (Function: object) => void\n ): void {\n const confirmationButtonsContainer = document.createElement('div');\n confirmationButtonsContainer.classList.add('confirmation-btns');\n container.append(confirmationButtonsContainer);\n\n this.createButton(confirmationButtonsContainer, cancelText, ['btn-cancel'], true, onCancel);\n this.createButton(confirmationButtonsContainer, confirmText, ['btn-confirm'], true, onConfirm);\n }\n\n /**\n * Renders a button with optional callback function\n */\n static createButton(\n container: HTMLElement,\n text: string,\n className: string[] = [],\n visibility: boolean = true,\n callback: (Function: object) => void = null\n ): void {\n className = className.concat(['btn', 'waves-effect', 'text']);\n const button = document.createElement('button');\n button.className = className.join(' ');\n button.style.visibility = visibility ? 'visible' : 'hidden';\n button.type = 'button';\n button.tabIndex = !!visibility ? 0 : -1;\n button.innerText = text;\n // The keypress handler used to call `callback` unconditionally, so a\n // button created without one threw on Enter.\n if (typeof callback === 'function') {\n button.addEventListener('click', callback);\n button.addEventListener('keypress', (e) => {\n if (Utils.keys.ENTER.includes(e.key)) callback(e);\n });\n }\n container.append(button);\n }\n\n static _setAbsolutePosition(\n origin: HTMLElement,\n container: HTMLElement,\n position: string,\n margin: number,\n transitionMovement: number,\n align: string = 'center'\n ) {\n const originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n containerHeight = container.offsetHeight,\n containerWidth = container.offsetWidth,\n originRect = origin.getBoundingClientRect(); // one rect, read twice below\n let xMovement = 0,\n yMovement = 0,\n targetTop = originRect.top + Utils.getDocumentScrollTop(),\n targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n\n if (position === 'top') {\n targetTop += -containerHeight - margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = -transitionMovement;\n } else if (position === 'right') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = originWidth + margin;\n xMovement = transitionMovement;\n } else if (position === 'left') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = -containerWidth - margin;\n xMovement = -transitionMovement;\n } else {\n targetTop += originHeight + margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = transitionMovement;\n }\n if (align === 'right') {\n targetLeft += originWidth - containerWidth - margin;\n }\n\n const newCoordinates = Utils._repositionWithinScreen(\n targetLeft,\n targetTop,\n containerWidth,\n containerHeight,\n margin,\n transitionMovement,\n align\n );\n\n container.style.top = newCoordinates.y + 'px';\n container.style.left = newCoordinates.x + 'px';\n\n return {x: xMovement, y: yMovement};\n }\n\n static _repositionWithinScreen(\n x: number,\n y: number,\n width: number,\n height: number,\n margin: number,\n transitionMovement: number,\n align: string\n ) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding: Bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n let offset: number;\n if (align === 'left' || align == 'center') {\n offset = margin + transitionMovement;\n } else if (align === 'right') {\n offset = margin - transitionMovement;\n }\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n}\n", "/**\n * Base options for component initialization.\n */\nexport interface BaseOptions {}\n\nexport type MElement = HTMLElement | Element;\nexport type InitElements<T extends MElement> = NodeListOf<T> | HTMLCollectionOf<T>;\ntype ComponentConstructor<T extends Component<O>, O extends BaseOptions> = {\n new (el: HTMLElement, options: Partial<O>): T;\n};\ntype ComponentType<C extends Component<O>, O extends BaseOptions> = ComponentConstructor<C, O> &\n typeof Component<O>;\n\nexport interface I18nOptions {\n cancel: string;\n clear: string;\n done: string;\n}\n\nexport interface Openable {\n isOpen: boolean;\n open(): void;\n close(): void;\n}\n\n/**\n * Base class implementation for Expressive components.\n */\nexport class Component<O extends BaseOptions> {\n /**\n * The DOM element the plugin was initialized with.\n */\n el: HTMLElement;\n /**\n * The options the instance was initialized with.\n */\n options: O;\n\n /**\n * Constructs component instance and set everything up.\n */\n constructor(el: HTMLElement, options: Partial<O>, classDef: ComponentType<Component<O>, O>) {\n // Display error if el is not a valid HTML Element\n if (!(el instanceof HTMLElement)) {\n console.error(Error(el + ' is not an HTML Element'));\n }\n // If exists, destroy and reinitialize in child\n const ins = classDef.getInstance(el);\n if (!!ins) {\n ins.destroy();\n }\n this.el = el;\n }\n\n /**\n * Initializes component instance.\n * @param el HTML element.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends HTMLElement, O extends BaseOptions, C extends Component<O>>(\n el: I,\n options: O,\n classDef: ComponentType<C, O>\n ): C;\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends MElement, O extends BaseOptions, C extends Component<O>>(\n els: InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends MElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends MElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[] {\n let instances = null;\n if (els instanceof Element) {\n instances = new classDef(<HTMLElement>els, options);\n } else if (!!els && els.length) {\n instances = [];\n for (let i = 0; i < els.length; i++) {\n instances.push(new classDef(<HTMLElement>els[i], options));\n }\n }\n return instances;\n }\n\n /**\n * @returns default options for component instance.\n */\n static get defaults(): BaseOptions {\n return {};\n }\n\n /**\n * Retrieves component instance for the given element.\n * @param el Associated HTML Element.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static getInstance(el: HTMLElement): Component<BaseOptions> {\n throw new Error('This method must be implemented.');\n }\n\n /**\n * Destroy plugin instance and teardown.\n */\n destroy(): void {\n throw new Error('This method must be implemented.');\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface CardsOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n inDuration: number;\n outDuration: number;\n}\n\nconst _defaults: CardsOptions = {\n onOpen: null,\n onClose: null,\n inDuration: 225,\n outDuration: 300\n};\n\n/**\n * What counts as a card.\n *\n * Shared with `components/registry.ts` rather than written out twice: the\n * registry used to claim `.cards`, which matches nothing this component\n * actually initializes, so the AutoInit entry was dead while `Cards.Init()`\n * quietly did the work through the selector below.\n */\nexport const CARDS_SELECTOR = '.card, article:has(> aside), article:has(.card-reveal)';\n\nexport class Cards extends Component<CardsOptions> implements Openable {\n isOpen: boolean = false;\n private readonly cardReveal: HTMLElement | null;\n private readonly initialOverflow: string;\n private _activators: HTMLElement[] | null;\n private cardRevealClose: HTMLElement | null;\n\n constructor(el: HTMLElement, options: Partial<CardsOptions>) {\n super(el, options, Cards);\n this.el['Expressive_Cards'] = this;\n\n this.options = {\n ...Cards.defaults,\n ...options\n };\n\n this._activators = [];\n\n this.cardReveal = this.el.querySelector(':scope > aside, .card-reveal');\n if (this.cardReveal) {\n this.initialOverflow = getComputedStyle(this.el).overflow;\n this._activators = Array.from(this.el.querySelectorAll('.activator'));\n this._activators.forEach((el: HTMLElement) => {\n if (el) el.tabIndex = 0;\n });\n\n this.cardRevealClose = this.cardReveal.querySelector(\n '.card-title, :scope > :is(h1, h2, h3, h4, h5, h6)'\n );\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n\n this.cardReveal.ariaExpanded = 'false';\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): CardsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Cards.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CardsOptions>): Cards;\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<CardsOptions>): Cards[];\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options?: Partial<CardsOptions>\n ): Cards | Cards[] {\n return super.init(els, options, Cards);\n }\n\n static getInstance(el: HTMLElement): Cards {\n return el['Expressive_Cards'];\n }\n\n /**\n * {@inheritDoc}\n */\n destroy() {\n this._removeEventHandlers();\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n this._activators = [];\n this.el['Expressive_Cards'] = undefined;\n }\n\n _setupEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.addEventListener('click', this._handleClickInteraction);\n el.addEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _removeEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.removeEventListener('click', this._handleClickInteraction);\n el.removeEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _handleClickInteraction = () => {\n this._handleRevealEvent();\n };\n\n _handleKeypressEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleRevealEvent();\n }\n };\n\n _handleRevealEvent = () => {\n // Reveal Card\n this._activators.forEach((el: HTMLElement) => (el.tabIndex = -1));\n this.open();\n };\n\n _setupRevealCloseEventHandlers = () => {\n this.cardRevealClose.addEventListener('click', this.close);\n this.cardRevealClose.addEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _removeRevealCloseEventHandlers = () => {\n this.cardRevealClose.removeEventListener('click', this.close);\n this.cardRevealClose.removeEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _handleKeypressCloseEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this.close();\n }\n };\n\n /**\n * Show card reveal.\n */\n open: () => void = () => {\n if (this.isOpen) return;\n this.isOpen = true;\n this.el.style.overflow = 'hidden';\n this.cardReveal.style.display = 'block';\n this.cardReveal.ariaExpanded = 'true';\n // A reveal without a title has no close affordance; that is allowed.\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = 0;\n setTimeout(() => {\n this.cardReveal.style.transition = `transform ${this.options.outDuration}ms ease`; //easeInOutQuad\n this.cardReveal.style.transform = 'translateY(-100%)';\n }, 1);\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen.call(this);\n }\n if (this.cardRevealClose) this._setupRevealCloseEventHandlers();\n };\n\n /**\n * Hide card reveal.\n */\n close: () => void = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.cardReveal.style.transition = `transform ${this.options.inDuration}ms ease`; //easeInOutQuad\n this.cardReveal.style.transform = 'translateY(0)';\n setTimeout(() => {\n this.cardReveal.style.display = 'none';\n this.cardReveal.ariaExpanded = 'false';\n this._activators.forEach((el: HTMLElement) => (el.tabIndex = 0));\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n this.el.style.overflow = this.initialOverflow;\n }, this.options.inDuration);\n if (typeof this.options.onClose === 'function') {\n this.options.onClose.call(this);\n }\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n };\n\n static Init() {\n // Handle initialization of static cards.\n Utils.onDocumentReady(() => {\n const cards = document.querySelectorAll(CARDS_SELECTOR);\n cards.forEach((el) => {\n if (el && el['Expressive_Cards'] == undefined) this.init(el as HTMLElement);\n });\n });\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface DropdownOptions extends BaseOptions {\n /**\n * Defines the edge the menu is aligned to.\n * @default 'left'\n */\n alignment: 'left' | 'right';\n /**\n * If true, automatically focus dropdown el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the dropdown activator.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the dropdown.\n * @default null\n */\n container: Element;\n /**\n * If false, the dropdown will show below the trigger.\n * @default true\n */\n coverTrigger: boolean;\n /**\n * If true, close dropdown on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the dropdown will open on hover.\n * @default false\n */\n hover: boolean;\n /**\n * The duration of the transition enter in milliseconds.\n * @default 150\n */\n inDuration: number;\n /**\n * The duration of the transition out in milliseconds.\n * @default 250\n */\n outDuration: number;\n /**\n * Function called when dropdown starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when dropdown finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when dropdown starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when dropdown finishes exiting.\n * @default null\n */\n onCloseEnd: (el: HTMLElement) => void;\n /**\n * Function called when item is clicked.\n * @default null\n */\n onItemClick: (el: HTMLLIElement) => void;\n}\n\nconst _defaults: DropdownOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: true,\n closeOnClick: true,\n hover: false,\n inDuration: 150,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n onItemClick: null\n};\n\nexport class Dropdown extends Component<DropdownOptions> implements Openable {\n static _dropdowns: Dropdown[] = [];\n /** ID of the dropdown element. */\n id: string;\n /** The DOM element of the dropdown. */\n dropdownEl: HTMLElement;\n /** If the dropdown is open. */\n isOpen: boolean;\n /** If the dropdown content is scrollable. */\n isScrollable: boolean;\n isTouchMoving: boolean;\n /** The index of the item focused. */\n focusedIndex: number;\n filterQuery: string[];\n filterTimeout: ReturnType<typeof setTimeout>;\n\n constructor(el: HTMLElement, options: Partial<DropdownOptions>) {\n super(el, options, Dropdown);\n this.el['Expressive_Dropdown'] = this;\n\n Dropdown._dropdowns.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.dropdownEl = document.getElementById(this.id);\n this.dropdownEl?.classList.add('dropdown-content');\n\n this.options = {\n ...Dropdown.defaults,\n ...options\n };\n\n this.isOpen = false;\n this.isScrollable = false;\n this.isTouchMoving = false;\n this.focusedIndex = -1;\n this.filterQuery = [];\n this.el.ariaExpanded = 'false';\n\n // Move dropdown-content after dropdown-trigger\n this._moveDropdownToElement();\n this._makeDropdownFocusable();\n this._setupEventHandlers();\n }\n\n static get defaults(): DropdownOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Dropdown.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<DropdownOptions>): Dropdown;\n /**\n * Initializes instances of Dropdown.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<DropdownOptions>): Dropdown[];\n /**\n * Initializes instances of Dropdown.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<DropdownOptions> = {}\n ): Dropdown | Dropdown[] {\n return super.init(els, options, Dropdown);\n }\n\n static getInstance(el: HTMLElement): Dropdown {\n return el['Expressive_Dropdown'];\n }\n\n destroy() {\n clearTimeout(this.filterTimeout);\n this._resetDropdownStyles();\n this._removeEventHandlers();\n // Temporary handlers only exist while open, but removing them is a no-op\n // otherwise and leaving them attached leaks the instance.\n this._removeTemporaryEventHandlers();\n const index = Dropdown._dropdowns.indexOf(this);\n if (index >= 0) Dropdown._dropdowns.splice(index, 1);\n this.el['Expressive_Dropdown'] = undefined;\n }\n\n _setupEventHandlers() {\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown);\n // Item click handler\n this.dropdownEl?.addEventListener('click', this._handleDropdownClick);\n // Hover event handlers\n if (this.options.hover) {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.dropdownEl.addEventListener('mouseleave', this._handleMouseLeave);\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick);\n }\n }\n\n _removeEventHandlers() {\n // `dropdownEl` is optional-chained on the way in (the trigger may point at\n // an id that does not resolve); it has to be here too, or destroy() throws\n // before it can detach anything else.\n this.el.removeEventListener('keydown', this._handleTriggerKeydown);\n this.dropdownEl?.removeEventListener('click', this._handleDropdownClick);\n if (this.options.hover) {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.dropdownEl?.removeEventListener('mouseleave', this._handleMouseLeave);\n } else {\n this.el.removeEventListener('click', this._handleClick);\n }\n }\n\n _setupTemporaryEventHandlers() {\n document.body.addEventListener('click', this._handleDocumentClick);\n document.body.addEventListener('touchmove', this._handleDocumentTouchmove, { passive: true });\n this.dropdownEl?.addEventListener('keydown', this._handleDropdownKeydown);\n window.addEventListener('resize', this._handleWindowResize);\n }\n\n _removeTemporaryEventHandlers() {\n document.body.removeEventListener('click', this._handleDocumentClick);\n document.body.removeEventListener('touchmove', this._handleDocumentTouchmove);\n this.dropdownEl?.removeEventListener('keydown', this._handleDropdownKeydown);\n window.removeEventListener('resize', this._handleWindowResize);\n }\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n //this._moveDropdown((<HTMLElement>e.target).closest('li'));\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n //this._moveDropdown((<HTMLElement>e.target).closest('li'));\n this.open();\n };\n\n _handleMouseLeave = (e: MouseEvent) => {\n const toEl = e.relatedTarget as HTMLElement;\n // relatedTarget is null when the pointer leaves the window entirely.\n if (!toEl) {\n this.close();\n return;\n }\n const leaveToDropdownContent = !!toEl.closest('.dropdown-content, menu');\n let leaveToActiveDropdownTrigger = false;\n const closestTrigger = toEl.closest('.dropdown-trigger');\n if (closestTrigger && !!closestTrigger['Expressive_Dropdown'] && closestTrigger['Expressive_Dropdown'].isOpen) {\n leaveToActiveDropdownTrigger = true;\n }\n // Close hover dropdown if mouse did not leave to either active dropdown-trigger or dropdown-content\n if (!leaveToActiveDropdownTrigger && !leaveToDropdownContent) {\n this.close();\n }\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n if (this.options.closeOnClick && target.closest('.dropdown-content, menu') && !this.isTouchMoving) {\n // isTouchMoving to check if scrolling on mobile.\n this.close();\n } else if (!target.closest('.dropdown-content, menu')) {\n // Do this one frame later so that if the element clicked also triggers _handleClick\n // For example, if a label for a select was clicked, that we don't close/open the dropdown\n setTimeout(() => {\n if (this.isOpen) {\n this.close();\n }\n }, 0);\n }\n this.isTouchMoving = false;\n };\n\n _handleTriggerKeydown = (e: KeyboardEvent) => {\n // ARROW DOWN OR ENTER WHEN SELECT IS CLOSED - open Dropdown\n const arrowDownOrEnter =\n Utils.keys.ARROW_DOWN.includes(e.key) || Utils.keys.ENTER.includes(e.key);\n if (arrowDownOrEnter && !this.isOpen) {\n e.preventDefault();\n this.open();\n }\n };\n\n _handleDocumentTouchmove = (e: TouchEvent) => {\n const target = <HTMLElement>e.target;\n if (target.closest('.dropdown-content, menu')) {\n this.isTouchMoving = true;\n }\n };\n\n _handleDropdownClick = (e: MouseEvent) => {\n // onItemClick callback\n if (typeof this.options.onItemClick === 'function') {\n const itemEl = (<HTMLElement>e.target).closest('li');\n this.options.onItemClick.call(this, itemEl);\n }\n };\n\n _handleDropdownKeydown = (e: KeyboardEvent) => {\n const arrowUpOrDown =\n Utils.keys.ARROW_DOWN.includes(e.key) || Utils.keys.ARROW_UP.includes(e.key);\n if (Utils.keys.TAB.includes(e.key)) {\n e.preventDefault();\n this.close();\n }\n // Navigate down dropdown list\n else if (arrowUpOrDown && this.isOpen) {\n e.preventDefault();\n const direction = Utils.keys.ARROW_DOWN.includes(e.key) ? 1 : -1;\n let newFocusedIndex = this.focusedIndex;\n let hasFoundNewIndex = false;\n do {\n newFocusedIndex = newFocusedIndex + direction;\n if (\n !!this.dropdownEl.children[newFocusedIndex] &&\n (<HTMLLIElement>this.dropdownEl.children[newFocusedIndex]).tabIndex !== -1\n ) {\n hasFoundNewIndex = true;\n break;\n }\n } while (newFocusedIndex < this.dropdownEl.children.length && newFocusedIndex >= 0);\n\n if (hasFoundNewIndex) {\n // Remove active class from old element\n if (this.focusedIndex >= 0)\n this.dropdownEl.children[this.focusedIndex].classList.remove('active');\n this.focusedIndex = newFocusedIndex;\n this._focusFocusedItem();\n }\n }\n // ENTER selects choice on focused item\n else if (Utils.keys.ENTER.includes(e.key) && this.isOpen) {\n // Search for <a> and <button>\n const focusedElement = this.dropdownEl.children[this.focusedIndex];\n const activatableElement = <HTMLElement>focusedElement?.querySelector('a, button');\n // Click a or button tag if exists, otherwise click li tag\n if (!!activatableElement) {\n activatableElement.click();\n } else if (!!focusedElement) {\n if (focusedElement instanceof HTMLElement) {\n focusedElement.click();\n }\n }\n }\n // Close dropdown on ESC\n else if (Utils.keys.ESC.includes(e.key) && this.isOpen) {\n e.preventDefault();\n this.close();\n }\n\n // CASE WHEN USER TYPE LTTERS\n const keyText = e.key.toLowerCase();\n const isLetter = /[a-zA-Z0-9-_]/.test(keyText);\n const specialKeys = [\n ...Utils.keys.ARROW_DOWN,\n ...Utils.keys.ARROW_UP,\n ...Utils.keys.ENTER,\n ...Utils.keys.ESC,\n ...Utils.keys.TAB\n ];\n if (isLetter && !specialKeys.includes(e.key)) {\n this.filterQuery.push(keyText);\n const string = this.filterQuery.join('');\n // textContent rather than innerText: this scans every item on every\n // keystroke, and innerText forces a layout flush per item.\n const newOptionEl = Array.from(this.dropdownEl.querySelectorAll('li')).find(\n (el) => el.textContent.trim().toLowerCase().indexOf(string) === 0\n );\n if (newOptionEl) {\n this.focusedIndex = [...newOptionEl.parentNode.children].indexOf(newOptionEl);\n this._focusFocusedItem();\n }\n }\n // Re-arm rather than stack: without the clear, every keystroke left a live\n // timer behind and the query could reset while the user was still typing.\n clearTimeout(this.filterTimeout);\n this.filterTimeout = setTimeout(this._resetFilterQuery, 1000);\n };\n\n _handleWindowResize = () => {\n // Only re-place the dropdown if it's still visible\n // Accounts for elements hiding via media queries\n if (this.el.offsetParent) {\n this.recalculateDimensions();\n }\n };\n\n _resetFilterQuery = () => {\n this.filterQuery = [];\n };\n\n _resetDropdownStyles() {\n this.dropdownEl.style.display = '';\n this._resetDropdownPositioningStyles();\n this.dropdownEl.style.transform = '';\n this.dropdownEl.style.opacity = '';\n }\n\n _resetDropdownPositioningStyles() {\n this.dropdownEl.style.width = '';\n this.dropdownEl.style.height = '';\n this.dropdownEl.style.left = '';\n this.dropdownEl.style.top = '';\n this.dropdownEl.style.transformOrigin = '';\n }\n\n _moveDropdownToElement(containerEl: HTMLElement = null) {\n if (this.options.container) {\n this.options.container.append(this.dropdownEl);\n return;\n }\n if (containerEl) {\n if (!containerEl.contains(this.dropdownEl)) containerEl.append(this.dropdownEl);\n return;\n }\n this.el.after(this.dropdownEl);\n }\n\n _makeDropdownFocusable() {\n if (!this.dropdownEl) return;\n this.dropdownEl.popover = '';\n // Needed for arrow key navigation\n this.dropdownEl.tabIndex = 0;\n // Only set tabindex if it hasn't been set by user\n Array.from(this.dropdownEl.children).forEach((el) => {\n if (el instanceof HTMLHRElement || el.classList.contains('divider')) {\n el.setAttribute('tabindex', '-1');\n return;\n }\n if (!el.getAttribute('tabindex')) el.setAttribute('tabindex', '0');\n });\n }\n\n _focusFocusedItem() {\n if (\n this.focusedIndex >= 0 &&\n this.focusedIndex < this.dropdownEl.children.length &&\n this.options.autoFocus\n ) {\n (this.dropdownEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.dropdownEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n _getDropdownPosition(closestOverflowParent: HTMLElement) {\n // const offsetParentBRect = this.el.offsetParent.getBoundingClientRect();\n const triggerBRect = this.el.getBoundingClientRect();\n const dropdownBRect = this.dropdownEl.getBoundingClientRect();\n\n let idealHeight = dropdownBRect.height;\n let idealWidth = dropdownBRect.width;\n let idealXPos = triggerBRect.left - dropdownBRect.left;\n let idealYPos = triggerBRect.top - dropdownBRect.top;\n\n const dropdownBounds = {\n left: idealXPos,\n top: idealYPos,\n height: idealHeight,\n width: idealWidth\n };\n\n const alignments = Utils.checkPossibleAlignments(\n this.el,\n closestOverflowParent,\n dropdownBounds,\n this.options.coverTrigger ? 0 : triggerBRect.height\n );\n\n let verticalAlignment = 'top';\n let horizontalAlignment = this.options.alignment;\n idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n // Reset isScrollable\n this.isScrollable = false;\n\n if (!alignments.top) {\n if (alignments.bottom) {\n verticalAlignment = 'bottom';\n\n if (!this.options.coverTrigger) {\n idealYPos -= triggerBRect.height;\n }\n } else {\n this.isScrollable = true;\n\n // Determine which side has most space and cutoff at correct height\n idealHeight -= 20; // Add padding when cutoff\n if (alignments.spaceOnTop > alignments.spaceOnBottom) {\n verticalAlignment = 'bottom';\n idealHeight += alignments.spaceOnTop;\n idealYPos -= this.options.coverTrigger\n ? alignments.spaceOnTop - 20\n : alignments.spaceOnTop - 20 + triggerBRect.height;\n } else {\n idealHeight += alignments.spaceOnBottom;\n }\n }\n }\n\n // If preferred horizontal alignment is possible\n if (!alignments[horizontalAlignment]) {\n const oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n if (alignments[oppositeAlignment]) {\n horizontalAlignment = oppositeAlignment;\n } else {\n // Determine which side has most space and cutoff at correct height\n if (alignments.spaceOnLeft > alignments.spaceOnRight) {\n horizontalAlignment = 'right';\n idealWidth += alignments.spaceOnLeft;\n idealXPos -= alignments.spaceOnLeft;\n } else {\n horizontalAlignment = 'left';\n idealWidth += alignments.spaceOnRight;\n }\n }\n }\n\n if (verticalAlignment === 'bottom') {\n idealYPos =\n idealYPos - dropdownBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - dropdownBRect.width + triggerBRect.width;\n }\n return {\n x: idealXPos,\n y: idealYPos,\n verticalAlignment: verticalAlignment,\n horizontalAlignment: horizontalAlignment,\n height: idealHeight,\n width: idealWidth\n };\n }\n\n _animateIn() {\n const duration = this.options.inDuration;\n this.dropdownEl.style.transition = 'none';\n // from\n this.dropdownEl.style.opacity = '0';\n this.dropdownEl.style.transform = 'scale(0.3, 0.3)';\n setTimeout(() => {\n // easeOutQuad (opacity) & easeOutQuint\n this.dropdownEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.dropdownEl.style.opacity = '1';\n this.dropdownEl.style.transform = 'scale(1, 1)';\n }, 1);\n setTimeout(() => {\n if (this.options.autoFocus) this.dropdownEl.focus();\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutQuad (opacity) & easeOutQuint\n this.dropdownEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.dropdownEl.style.opacity = '0';\n this.dropdownEl.style.transform = 'scale(0.3, 0.3)';\n setTimeout(() => {\n this._resetDropdownStyles();\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _getClosestAncestor(el: HTMLElement, condition: (Function) => boolean): HTMLElement {\n let ancestor = el.parentNode;\n while (ancestor !== null && ancestor !== document) {\n if (condition(ancestor)) {\n return <HTMLElement>ancestor;\n }\n ancestor = ancestor.parentElement;\n }\n return null;\n }\n\n _placeDropdown() {\n // Container here will be closest ancestor with overflow: hidden\n let closestOverflowParent: HTMLElement = this._getClosestAncestor(\n this.dropdownEl,\n (ancestor: HTMLElement) => {\n return (\n !['HTML', 'BODY'].includes(ancestor.tagName) &&\n getComputedStyle(ancestor).overflow !== 'visible'\n );\n }\n );\n // Fallback\n if (!closestOverflowParent) {\n closestOverflowParent = <HTMLElement>(\n (!!this.dropdownEl.offsetParent ? this.dropdownEl.offsetParent : this.dropdownEl.parentNode)\n );\n }\n\n if (getComputedStyle(closestOverflowParent).position === 'static')\n closestOverflowParent.style.position = 'relative';\n\n //this._moveDropdown(closestOverflowParent);\n\n // Set width before calculating positionInfo\n const idealWidth = this.options.constrainWidth\n ? this.el.getBoundingClientRect().width\n : this.dropdownEl.getBoundingClientRect().width;\n this.dropdownEl.style.width = idealWidth + 'px';\n\n const positionInfo = this._getDropdownPosition(closestOverflowParent);\n this.dropdownEl.style.left = positionInfo.x + 'px';\n this.dropdownEl.style.top = positionInfo.y + 'px';\n this.dropdownEl.style.height = positionInfo.height + 'px';\n this.dropdownEl.style.width = positionInfo.width + 'px';\n this.dropdownEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /**\n * Open dropdown.\n */\n open = () => {\n if (this.isOpen) return;\n this.isOpen = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n // Reset styles\n this._resetDropdownStyles();\n this.dropdownEl.style.display = 'block';\n this._placeDropdown();\n this._animateIn();\n // Do this one frame later so that we don't bind an event handler that's immediately\n // called when the event bubbles up to the document and closes the dropdown\n setTimeout(() => this._setupTemporaryEventHandlers(), 0);\n this.el.ariaExpanded = 'true';\n };\n\n /**\n * Close dropdown.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.focusedIndex = -1;\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this._animateOut();\n this._removeTemporaryEventHandlers();\n if (this.options.autoFocus) {\n this.el.focus();\n }\n this.el.ariaExpanded = 'false';\n };\n\n /**\n * While dropdown is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetDropdownPositioningStyles();\n this._placeDropdown();\n }\n };\n}\n", "import { Utils } from '../core/utils';\nimport { Dropdown, DropdownOptions } from './dropdown';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface AutocompleteData {\n /**\n * A primitive value that can be converted to string.\n * If \"text\" is not provided, it will also be used as \"option text\" as well\n */\n id: string | number;\n /**\n * This optional attribute is used as \"display value\" for the current entry.\n * When provided, it will also be taken into consideration by the standard search function.\n */\n text?: string;\n /**\n * This optional attribute is used to provide a valid image URL to the current option.\n */\n image?: string;\n /**\n * Optional attributes which describes the option.\n */\n description?: string;\n}\n\nexport interface AutocompleteOptions extends BaseOptions {\n /**\n * Data object defining autocomplete options with\n * optional icon strings.\n */\n data: AutocompleteData[];\n /**\n * Flag which can be set if multiple values can be selected. The Result will be an Array.\n * @default false\n */\n isMultiSelect: boolean;\n /**\n * Callback for when autocompleted.\n */\n onAutocomplete: (entries: AutocompleteData[]) => void;\n /**\n * Minimum number of characters before autocomplete starts.\n * @default 1\n */\n minLength: number;\n /**\n * The height of the Menu which can be set via css-property.\n * @default '300px'\n */\n maxDropDownHeight: string;\n /**\n * Function is called when the input text is altered and data can also be loaded asynchronously.\n * If the results are collected the items in the list can be updated via the function setMenuItems(collectedItems).\n * @param text Searched text.\n * @param autocomplete Current autocomplete instance.\n */\n onSearch: (text: string, autocomplete: Autocomplete) => void;\n /**\n * If true will render the key from each item directly as HTML.\n * User input MUST be properly sanitized first.\n * @default false\n */\n allowUnsafeHTML: boolean;\n /**\n * Pass options object to select dropdown initialization.\n * @default {}\n */\n dropdownOptions: Partial<DropdownOptions>;\n /**\n * Predefined selected values\n */\n selected: number[] | string[];\n}\n\nconst _defaults: AutocompleteOptions = {\n data: [], // Autocomplete data set\n onAutocomplete: null, // Callback for when autocompleted\n dropdownOptions: {\n // Default dropdown options\n autoFocus: false,\n closeOnClick: false,\n coverTrigger: false\n },\n minLength: 1, // Min characters before autocomplete starts\n isMultiSelect: false,\n onSearch: (text: string, autocomplete: Autocomplete) => {\n const normSearch = text.toLocaleLowerCase();\n autocomplete.setMenuItems(\n\n autocomplete.options.data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n\n )\n );\n },\n maxDropDownHeight: '300px',\n allowUnsafeHTML: false,\n selected: []\n};\n\nexport class Autocomplete extends Component<AutocompleteOptions> {\n declare el: HTMLInputElement;\n /** If the autocomplete is open. */\n isOpen: boolean;\n /** Number of matching autocomplete options. */\n count: number;\n /** Index of the current selected option. */\n activeIndex: number;\n private oldVal: string;\n private $active: HTMLElement | null;\n private _mousedown: boolean;\n container: HTMLElement;\n /** Instance of the dropdown plugin for this autocomplete. */\n dropdown: Dropdown;\n static _keydown: boolean;\n selectedValues: AutocompleteData[];\n menuItems: AutocompleteData[];\n\n constructor(el: HTMLInputElement, options: Partial<AutocompleteOptions>) {\n super(el, options, Autocomplete);\n this.el['Expressive_Autocomplete'] = this;\n\n this.options = {\n ...Autocomplete.defaults,\n ...options\n };\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n this.selectedValues = this.selectedValues || this.options.selected.map((value) => <AutocompleteData>{ id: value }) || [];\n this.menuItems = this.options.data || [];\n this.$active = null;\n this._mousedown = false;\n this._setupDropdown();\n this._setupEventHandlers();\n }\n\n static get defaults(): AutocompleteOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Autocomplete.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<AutocompleteOptions>): Autocomplete;\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<AutocompleteOptions>\n ): Autocomplete[];\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<AutocompleteOptions> = {}\n ): Autocomplete | Autocomplete[] {\n return super.init(els, options, Autocomplete);\n }\n\n static getInstance(el: HTMLElement): Autocomplete {\n return el['Expressive_Autocomplete'];\n }\n\n /**\n * The three-dot loading indicator, parsed once and cloned thereafter.\n *\n * It is shown on every input change, and it used to be assigned as an\n * innerHTML string each time - re-running the HTML parser over the same\n * fixed markup on every keystroke.\n */\n private static _loadingTemplate: HTMLElement = null;\n\n private static _loadingIndicator(): HTMLElement {\n if (!Autocomplete._loadingTemplate) {\n const template = document.createElement('template');\n template.innerHTML = `<div style=\"height:100%;width:50px;\"><svg version=\"1.1\" id=\"L4\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 0 0\" xml:space=\"preserve\">\n <circle fill=\"#888c\" stroke=\"none\" cx=\"6\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.1\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"26\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.2\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"46\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.3\"/></circle>\n </svg></div>`;\n Autocomplete._loadingTemplate = template.content.firstElementChild as HTMLElement;\n }\n return Autocomplete._loadingTemplate.cloneNode(true) as HTMLElement;\n }\n\n destroy() {\n this._removeEventHandlers();\n this._removeDropdown();\n this.el['Expressive_Autocomplete'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('blur', this._handleInputBlur);\n this.el.addEventListener('keyup', this._handleInputKeyup);\n this.el.addEventListener('focus', this._handleInputFocus);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('click', this._handleInputClick);\n this.container.addEventListener('mousedown', this._handleContainerMousedownAndTouchstart);\n this.container.addEventListener('mouseup', this._handleContainerMouseupAndTouchend);\n if (typeof window.ontouchstart !== 'undefined') {\n this.container.addEventListener('touchstart', this._handleContainerMousedownAndTouchstart);\n this.container.addEventListener('touchend', this._handleContainerMouseupAndTouchend);\n }\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('blur', this._handleInputBlur);\n this.el.removeEventListener('keyup', this._handleInputKeyup);\n this.el.removeEventListener('focus', this._handleInputFocus);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('click', this._handleInputClick);\n this.container.removeEventListener('mousedown', this._handleContainerMousedownAndTouchstart);\n this.container.removeEventListener('mouseup', this._handleContainerMouseupAndTouchend);\n\n if (typeof window.ontouchstart !== 'undefined') {\n this.container.removeEventListener('touchstart', this._handleContainerMousedownAndTouchstart);\n this.container.removeEventListener('touchend', this._handleContainerMouseupAndTouchend);\n }\n }\n\n _setupDropdown() {\n this.container = document.createElement('ul');\n this.container.style.maxHeight = this.options.maxDropDownHeight;\n this.container.id = `autocomplete-options-${Utils.guid()}`;\n this.container.classList.add('autocomplete-content', 'dropdown-content');\n this.container.ariaExpanded = 'true';\n this.el.setAttribute('data-target', this.container.id);\n\n this.menuItems.forEach((menuItem) => {\n const itemElement = this._createDropdownItem(menuItem);\n this.container.append(itemElement);\n });\n\n // ! Issue in Component Dropdown: _placeDropdown moves dom-position\n this.el.parentElement.appendChild(this.container);\n\n // Initialize dropdown\n const dropdownOptions = {\n ...Autocomplete.defaults.dropdownOptions,\n ...this.options.dropdownOptions\n };\n // @todo shouldn't we conditionally check if dropdownOptions.onItemClick is set in first place?\n const userOnItemClick = dropdownOptions.onItemClick;\n // Ensuring the select Option call when user passes custom onItemClick function to dropdown\n dropdownOptions.onItemClick = (li) => {\n if (!li) return;\n const entryID = li.getAttribute('data-id');\n this.selectOption(entryID);\n // Handle user declared onItemClick if needed\n if (userOnItemClick && typeof userOnItemClick === 'function')\n userOnItemClick.call(this.dropdown, this.el);\n };\n this.dropdown = Dropdown.init(this.el, dropdownOptions);\n\n // ! Workaround for Label: move label up again\n // TODO: Just use PopperJS in future!\n const label = this.el.parentElement.querySelector('label');\n if (label) this.el.after(label);\n\n // Sketchy removal of dropdown click handler\n this.el.removeEventListener('click', this.dropdown._handleClick);\n if(!this.options.isMultiSelect && !(this.options.selected.length === 0)) {\n const selectedValue = this.menuItems.filter((value) => value.id === this.selectedValues[0].id);\n this.el.value = selectedValue[0].text;\n }\n // Set Value if already set in HTML\n if (this.el.value) this.selectOption(this.el.value);\n // Add StatusInfo\n const div = document.createElement('div');\n div.classList.add('status-info');\n div.setAttribute('style', 'position: absolute;right:0;top:0;');\n this.el.parentElement.appendChild(div);\n this._updateSelectedInfo();\n }\n\n _removeDropdown() {\n this.container.ariaExpanded = 'false';\n this.container.parentNode.removeChild(this.container);\n }\n\n _handleInputBlur = () => {\n if (!this._mousedown) {\n this.close();\n this._resetAutocomplete();\n }\n };\n\n _handleInputKeyup = (e: KeyboardEvent) => {\n if (e.type === 'keyup') Autocomplete._keydown = false;\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n // Don't capture enter or arrow key usage.\n if (\n Utils.keys.ENTER.includes(e.key) ||\n Utils.keys.ARROW_UP.includes(e.key) ||\n Utils.keys.ARROW_DOWN.includes(e.key)\n )\n return;\n // Check if the input isn't empty\n // Check if focus triggered by tab\n if (this.oldVal !== actualValue && Utils.tabPressed) {\n this.open();\n }\n this._inputChangeDetection(actualValue);\n };\n\n _handleInputFocus = () => {\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n this._inputChangeDetection(actualValue);\n };\n\n _inputChangeDetection = (value: string) => {\n // Value has changed!\n if (this.oldVal !== value) {\n this._setStatusLoading();\n this.options.onSearch(this.el.value, this);\n }\n // Reset Single-Select when Input cleared\n if (!this.options.isMultiSelect && this.el.value.length === 0) {\n this.selectedValues = [];\n this._triggerChanged();\n }\n this.oldVal = value;\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Autocomplete._keydown = true;\n // Arrow keys and enter key usage\n const numItems = this.container.querySelectorAll('li').length;\n // select element on Enter\n if (Utils.keys.ENTER.includes(e.key) && this.activeIndex >= 0) {\n const liElement = this.container.querySelectorAll('li')[this.activeIndex];\n if (liElement) {\n this.selectOption(liElement.getAttribute('data-id'));\n e.preventDefault();\n }\n return;\n }\n // Capture up and down key\n if (Utils.keys.ARROW_UP.includes(e.key) || Utils.keys.ARROW_DOWN.includes(e.key)) {\n e.preventDefault();\n if (Utils.keys.ARROW_UP.includes(e.key) && this.activeIndex > 0) this.activeIndex--;\n if (Utils.keys.ARROW_DOWN.includes(e.key) && this.activeIndex < numItems - 1)\n this.activeIndex++;\n this.$active?.classList.remove('active');\n if (this.activeIndex >= 0) {\n this.$active = this.container.querySelectorAll('li')[this.activeIndex];\n this.$active?.classList.add('active');\n // Focus selected\n this.container.children[this.activeIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n };\n\n _handleInputClick = () => {\n this.open();\n };\n\n _handleContainerMousedownAndTouchstart = () => {\n this._mousedown = true;\n };\n\n _handleContainerMouseupAndTouchend = () => {\n this._mousedown = false;\n };\n\n _resetCurrentElementPosition() {\n this.activeIndex = -1;\n this.$active?.classList.remove('active');\n }\n\n _resetAutocomplete() {\n this.container.replaceChildren();\n this._resetCurrentElementPosition();\n this.oldVal = null;\n this.isOpen = false;\n this._mousedown = false;\n }\n\n _highlightPartialText(input: string, label: string) {\n const start = label.toLocaleLowerCase().indexOf('' + input.toLocaleLowerCase() + '');\n const end = start + input.length - 1;\n //custom filters may return results where the string does not match any part\n if (start == -1 || end == -1) {\n return [label, '', ''];\n }\n return [label.slice(0, start), label.slice(start, end + 1), label.slice(end + 1)];\n }\n\n _createDropdownItem(entry: AutocompleteData) {\n const item = document.createElement('li');\n item.setAttribute('data-id', <string>entry.id);\n item.setAttribute(\n 'style',\n 'display:grid; grid-auto-flow: column; user-select: none; align-items: center;'\n );\n item.tabIndex = 0;\n // Checkbox\n if (this.options.isMultiSelect) {\n const selection = document.createElement('div');\n selection.classList.add('item-selection');\n selection.style.textAlign = 'center';\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = this.selectedValues.some((sel) => sel.id === entry.id);\n const spacer = document.createElement('span');\n spacer.style.paddingLeft = '21px';\n selection.append(checkbox, spacer);\n item.appendChild(selection);\n }\n // Image\n if (entry.image) {\n const img = document.createElement('img');\n img.classList.add('circle');\n img.src = entry.image;\n item.appendChild(img);\n }\n\n // Text\n const inputText = this.el.value.toLocaleLowerCase();\n const parts = this._highlightPartialText(inputText, (entry.text || entry.id).toString());\n const div = document.createElement('div');\n div.setAttribute('style', 'line-height:1.2;font-weight:500;');\n if (this.options.allowUnsafeHTML) {\n div.innerHTML = parts[0] + '<span class=\"highlight\">' + parts[1] + '</span>' + parts[2];\n } else {\n div.appendChild(document.createTextNode(parts[0]));\n if (parts[1]) {\n const highlight = document.createElement('span');\n highlight.textContent = parts[1];\n highlight.classList.add('highlight');\n div.appendChild(highlight);\n div.appendChild(document.createTextNode(parts[2]));\n }\n }\n\n const itemText = document.createElement('div');\n itemText.classList.add('item-text');\n itemText.setAttribute('style', 'padding:5px;overflow:hidden;');\n item.appendChild(itemText);\n item.querySelector('.item-text').appendChild(div);\n // Description\n if (\n typeof entry.description === 'string' ||\n (typeof entry.description === 'number' && !isNaN(entry.description))\n ) {\n const description = document.createElement('small');\n description.setAttribute(\n 'style',\n 'line-height:1.3;color:grey;white-space:nowrap;text-overflow:ellipsis;display:block;width:90%;overflow:hidden;'\n );\n description.innerText = entry.description;\n item.querySelector('.item-text').appendChild(description);\n }\n // Set Grid\n const getGridConfig = () => {\n if (this.options.isMultiSelect) {\n if (entry.image) return '40px min-content auto'; // cb-img-txt\n return '40px auto'; // cb-txt\n }\n if (entry.image) return 'min-content auto'; // img-txt\n return 'auto'; // txt\n };\n item.style.gridTemplateColumns = getGridConfig();\n return item;\n }\n\n _renderDropdown() {\n this._resetAutocomplete();\n // Check if Data is empty\n if (this.menuItems.length === 0) {\n this.menuItems = this.selectedValues; // Show selected Items\n }\n for (let i = 0; i < this.menuItems.length; i++) {\n const item = this._createDropdownItem(this.menuItems[i]);\n this.container.append(item);\n }\n }\n\n _setStatusLoading() {\n const statusElement = this.el.parentElement.querySelector('.status-info');\n if (statusElement) statusElement.replaceChildren(Autocomplete._loadingIndicator());\n }\n\n _updateSelectedInfo() {\n const statusElement = this.el.parentElement.querySelector('.status-info');\n if (statusElement) {\n if (this.options.isMultiSelect)\n statusElement.textContent = this.selectedValues.length.toString();\n else statusElement.replaceChildren();\n }\n }\n\n _refreshInputText() {\n if (this.selectedValues.length === 1) {\n const entry = this.selectedValues[0];\n this.el.value = entry.text || <string>entry.id; // Write Text to Input\n }\n }\n\n _triggerChanged() {\n this.el.dispatchEvent(new Event('change'));\n // Trigger Autocomplete Event\n if (typeof this.options.onAutocomplete === 'function')\n this.options.onAutocomplete.call(this, this.selectedValues);\n }\n\n /**\n * Show autocomplete.\n */\n open = () => {\n const inputText = this.el.value.toLocaleLowerCase();\n this._resetAutocomplete();\n if (inputText.length >= this.options.minLength) {\n this.isOpen = true;\n this._renderDropdown();\n }\n // Open dropdown\n if (!this.dropdown.isOpen) {\n setTimeout(() => {\n this.dropdown.open();\n }, 0); // TODO: why?\n } else this.dropdown.recalculateDimensions(); // Recalculate dropdown when its already open\n };\n\n /**\n * Hide autocomplete.\n */\n close = () => {\n this.dropdown.close();\n };\n\n /**\n * Updates the visible or selectable items shown in the menu.\n * @param menuItems Items to be available.\n * @param selected Selected item ids\n * @param open Option to conditionally open dropdown\n */\n setMenuItems(menuItems: AutocompleteData[], selected: number[] | string[] = null, open: boolean = true) {\n this.menuItems = menuItems;\n this.options.data = menuItems;\n if (selected) {\n this.selectedValues = this.menuItems.filter(\n (item) => !(selected.indexOf(<never>item.id) === -1)\n );\n }\n if (this.options.isMultiSelect) {\n this._renderDropdown();\n } else {\n this._refreshInputText();\n }\n if (open) this.open();\n this._updateSelectedInfo();\n this._triggerChanged();\n }\n\n /**\n * Sets selected values.\n * @deprecated @see https://github.com/materializecss/materialize/issues/552\n * @param entries\n */\n setValues(entries: AutocompleteData[]) {\n this.selectedValues = entries;\n this._updateSelectedInfo();\n if (!this.options.isMultiSelect) {\n this._refreshInputText();\n }\n this._triggerChanged();\n }\n\n /**\n * Select a specific autocomplete option via id-property.\n * @param id The id of a data-entry.\n */\n selectOption(id: number | string) {\n const entry = this.menuItems.find((item) => item.id == id);\n if (!entry) return;\n // Toggle Checkbox\n /* const li = this.container.querySelector('li[data-id=\"' + id + '\"]');\n if (!li) return;*/\n if (this.options.isMultiSelect) {\n /* const checkbox = <HTMLInputElement | null>li.querySelector('input[type=\"checkbox\"]');\n checkbox.checked = !checkbox.checked;*/\n if (!(this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id === entry.id\n ).length >= 1)) this.selectedValues.push(entry);\n else this.selectedValues = this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id !== entry.id\n );\n this._renderDropdown();\n this.el.focus();\n } else {\n // Single-Select\n this.selectedValues = [entry];\n this._refreshInputText();\n this._resetAutocomplete();\n this.close();\n }\n this._updateSelectedInfo();\n this._triggerChanged();\n }\n\n selectOptions(ids: []) {\n const entries = this.menuItems.filter(\n (item) => !(ids.indexOf(<never>item.id) === -1)\n );\n if (!entries) return;\n this.selectedValues = entries;\n this._renderDropdown();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Autocomplete, AutocompleteOptions } from './autocomplete';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface ChipData {\n /**\n * Unique identifier.\n */\n id: number | string;\n /**\n * Chip text. If not specified, \"id\" will be used.\n */\n text?: string;\n /**\n * Chip image (URL).\n */\n image?: string;\n}\n\nexport interface ChipsOptions extends BaseOptions {\n /**\n * Set the chip data.\n * @default []\n */\n data: ChipData[];\n /**\n * Set first placeholder when there are no tags.\n * @default \"\"\n */\n placeholder: string;\n /**\n * Set second placeholder when adding additional tags.\n * @default \"\"\n */\n secondaryPlaceholder: string;\n /**\n * Set autocomplete options.\n * @default {}\n */\n autocompleteOptions: Partial<AutocompleteOptions>;\n /**\n * Toggles abililty to add custom value not in autocomplete list.\n * @default false\n */\n autocompleteOnly: boolean;\n /**\n * Set chips limit.\n * @default Infinity\n */\n limit: number;\n /**\n * Specifies class to be used in \"close\" button.\n * @default 'material-symbols'\n */\n closeIconClass: string;\n /**\n * Specifies option to render user input field\n * @default false;\n */\n allowUserInput: boolean;\n /**\n * Callback for chip add.\n * @default null\n */\n onChipAdd: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip select.\n * @default null\n */\n onChipSelect: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip delete.\n * @default null\n */\n onChipDelete: (element: HTMLElement, chip: HTMLElement) => void;\n}\n\nconst _defaults: ChipsOptions = {\n data: [],\n placeholder: '',\n secondaryPlaceholder: '',\n closeIconClass: 'material-symbols',\n autocompleteOptions: {},\n autocompleteOnly: false,\n limit: Infinity,\n allowUserInput: false,\n onChipAdd: null,\n onChipSelect: null,\n onChipDelete: null\n};\n\nexport class Chips extends Component<ChipsOptions> {\n /** Array of the current chips data. */\n chipsData: ChipData[];\n /** If the chips has autocomplete enabled. */\n hasAutocomplete: boolean;\n /** Autocomplete instance, if any. */\n autocomplete: Autocomplete;\n _input: HTMLInputElement;\n _label: HTMLLabelElement;\n _chips: HTMLElement[];\n static _keydown: boolean;\n private _selectedChip: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<ChipsOptions>) {\n super(el, options, Chips);\n this.el['Expressive_Chips'] = this;\n\n this.options = {\n ...Chips.defaults,\n ...options\n };\n\n this.el.classList.add('chips');\n this.chipsData = [];\n this._chips = [];\n\n // Render initial chips\n if (this.options.data.length) {\n this.chipsData = this.options.data;\n this._renderChips();\n }\n\n // Render input element, setup event handlers\n if (this.options.allowUserInput) {\n this.el.classList.add('input-field');\n this._setupInput();\n this._setupEventHandlers();\n // move input to end\n this.el.append(this._input);\n }\n // After _setupInput: the label points at the input's id, which is only\n // assigned there. Running this first threw on any .chips with a <label>.\n this._setupLabel();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Chips.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ChipsOptions>): Chips;\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<ChipsOptions>): Chips[];\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ChipsOptions> = {}\n ): Chips | Chips[] {\n return super.init(els, options, Chips);\n }\n\n static getInstance(el: HTMLElement): Chips {\n return el['Expressive_Chips'];\n }\n\n getData() {\n return this.chipsData;\n }\n\n destroy() {\n if (this.options.allowUserInput) {\n this._removeEventHandlers();\n }\n this._chips.forEach((c) => c.remove());\n this._chips = [];\n this.el['Expressive_Chips'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleChipClick);\n // @todo why do we need this as document event listener, shouldn't we apply it to the element wrapper itself?\n document.addEventListener('keydown', Chips._handleChipsKeydown);\n document.addEventListener('keyup', Chips._handleChipsKeyup);\n this.el.addEventListener('blur', Chips._handleChipsBlur, true);\n this._input.addEventListener('focus', this._handleInputFocus);\n this._input.addEventListener('blur', this._handleInputBlur);\n this._input.addEventListener('keydown', this._handleInputKeydown);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleChipClick);\n document.removeEventListener('keydown', Chips._handleChipsKeydown);\n document.removeEventListener('keyup', Chips._handleChipsKeyup);\n this.el.removeEventListener('blur', Chips._handleChipsBlur, true);\n this._input.removeEventListener('focus', this._handleInputFocus);\n this._input.removeEventListener('blur', this._handleInputBlur);\n this._input.removeEventListener('keydown', this._handleInputKeydown);\n }\n\n _handleChipClick = (e: MouseEvent) => {\n const _chip = (<HTMLElement>e.target).closest('.chip');\n const clickedClose = (<HTMLElement>e.target).classList.contains('close');\n if (_chip) {\n // Index into the chip list, not into the container's children: the\n // container also holds the label and the input, so counting children\n // gave an index that did not line up with chipsData.\n const index = this._chips.indexOf(_chip as HTMLElement);\n if (index < 0) return;\n if (clickedClose) {\n this.deleteChip(index);\n this._input.focus();\n } else {\n this.selectChip(index);\n }\n // Default handle click to focus on input\n } else {\n this._input.focus();\n }\n };\n\n static _handleChipsKeydown(e: KeyboardEvent) {\n Chips._keydown = true;\n const chips = (<HTMLElement>e.target).closest('.chips');\n const chipsKeydown = e.target && chips;\n\n // Don't handle keydown inputs on input and textarea\n const tag = (<HTMLElement>e.target).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || !chipsKeydown) return;\n\n const currChips: Chips = chips['Expressive_Chips'];\n if (!currChips) return; // .chips markup without an instance behind it\n\n if (Utils.keys.BACKSPACE.includes(e.key) || Utils.keys.DELETE.includes(e.key)) {\n e.preventDefault();\n let selectIndex = currChips.chipsData.length;\n if (currChips._selectedChip) {\n const index = currChips._chips.indexOf(currChips._selectedChip);\n currChips.deleteChip(index);\n currChips._selectedChip = null;\n // Make sure selectIndex doesn't go negative\n selectIndex = Math.max(index - 1, 0);\n }\n if (currChips.chipsData.length) currChips.selectChip(selectIndex);\n else currChips._input.focus();\n } else if (Utils.keys.ARROW_LEFT.includes(e.key)) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) - 1;\n if (selectIndex < 0) return;\n currChips.selectChip(selectIndex);\n }\n } else if (Utils.keys.ARROW_RIGHT.includes(e.key)) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) + 1;\n if (selectIndex >= currChips.chipsData.length) currChips._input.focus();\n else currChips.selectChip(selectIndex);\n }\n }\n }\n\n static _handleChipsKeyup() {\n Chips._keydown = false;\n }\n\n static _handleChipsBlur(e: Event) {\n if (!Chips._keydown && document.hidden) {\n const chips = (<HTMLElement>e.target).closest('.chips');\n const currChips: Chips = chips?.['Expressive_Chips'];\n if (currChips) currChips._selectedChip = null;\n }\n }\n\n _handleInputFocus = () => {\n this.el.classList.add('focus');\n };\n\n _handleInputBlur = () => {\n this.el.classList.remove('focus');\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Chips._keydown = true;\n if (Utils.keys.ENTER.includes(e.key)) {\n // Override enter if autocompleting.\n if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {\n return;\n }\n e.preventDefault();\n if (!this.hasAutocomplete || (this.hasAutocomplete && !this.options.autocompleteOnly)) {\n this.addChip({ id: this._input.value });\n }\n this._input.value = '';\n } else if (\n (Utils.keys.BACKSPACE.includes(e.key) || Utils.keys.ARROW_LEFT.includes(e.key)) &&\n this._input.value === '' &&\n this.chipsData.length\n ) {\n e.preventDefault();\n this.selectChip(this.chipsData.length - 1);\n }\n };\n\n _renderChip(chip: ChipData): HTMLDivElement {\n if (!chip.id) return;\n const renderedChip = document.createElement('div');\n renderedChip.classList.add('chip');\n renderedChip.innerText = chip.text || <string>chip.id;\n // attach image if needed\n if (chip.image) {\n const img = document.createElement('img');\n img.setAttribute('src', chip.image);\n renderedChip.insertBefore(img, renderedChip.firstChild);\n }\n if (this.options.allowUserInput) {\n renderedChip.setAttribute('tabindex', '0');\n const closeIcon = document.createElement('i');\n closeIcon.classList.add(this.options.closeIconClass, 'close');\n closeIcon.innerText = 'close';\n renderedChip.appendChild(closeIcon);\n }\n return renderedChip;\n }\n\n _renderChips() {\n this._chips = []; //.remove();\n for (let i = 0; i < this.chipsData.length; i++) {\n const chipElem = this._renderChip(this.chipsData[i]);\n this.el.appendChild(chipElem);\n this._chips.push(chipElem);\n }\n }\n\n _setupAutocomplete() {\n this.options.autocompleteOptions.onAutocomplete = (items) => {\n if (items.length > 0)\n this.addChip({\n id: items[0].id,\n text: items[0].text,\n image: items[0].image\n });\n this._input.value = '';\n this._input.focus();\n };\n this.autocomplete = Autocomplete.init(this._input, this.options.autocompleteOptions);\n }\n\n _setupInput() {\n this._input = this.el.querySelector('input');\n if (!this._input) {\n this._input = document.createElement('input');\n this.el.append(this._input);\n }\n this._input.classList.add('input');\n this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;\n // Setup autocomplete if needed\n if (this.hasAutocomplete) this._setupAutocomplete();\n this._setPlaceholder();\n // Set input id\n if (!this._input.getAttribute('id')) this._input.setAttribute('id', Utils.guid());\n }\n\n _setupLabel() {\n this._label = this.el.querySelector('label');\n // No input to point at when allowUserInput is off.\n if (this._label && this._input) this._label.setAttribute('for', this._input.getAttribute('id'));\n }\n\n _setPlaceholder() {\n if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {\n this._input.placeholder = this.options.placeholder;\n } else if (\n (this.chipsData === undefined || !!this.chipsData.length) &&\n this.options.secondaryPlaceholder\n ) {\n this._input.placeholder = this.options.secondaryPlaceholder;\n }\n }\n\n _isValidAndNotExist(chip: ChipData) {\n const isValid = !!chip.id;\n const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);\n return isValid && doesNotExist;\n }\n\n /**\n * Add chip to input.\n * @param chip Chip data object\n */\n addChip(chip: ChipData) {\n if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;\n const renderedChip = this._renderChip(chip);\n this._chips.push(renderedChip);\n this.chipsData.push(chip);\n //$(this._input).before(renderedChip);\n this._input.before(renderedChip);\n this._setPlaceholder();\n // fire chipAdd callback\n if (typeof this.options.onChipAdd === 'function') {\n this.options.onChipAdd(this.el, renderedChip);\n }\n }\n\n /**\n * Delete nth chip.\n * @param chipIndex Index of chip\n */\n deleteChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n chip.remove();\n this._chips.splice(chipIndex, 1);\n this.chipsData.splice(chipIndex, 1);\n this._setPlaceholder();\n // fire chipDelete callback\n if (typeof this.options.onChipDelete === 'function') {\n this.options.onChipDelete(this.el, chip);\n }\n }\n\n /**\n * Select nth chip.\n * @param chipIndex Index of chip\n */\n selectChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n this._selectedChip = chip;\n chip.focus();\n // fire chipSelect callback\n if (typeof this.options.onChipSelect === 'function') {\n this.options.onChipSelect(this.el, chip);\n }\n }\n\n static Init() {\n // Handle removal of static chips - markup written by hand, with no Chips\n // instance behind it. Where there *is* an instance, _handleChipClick owns\n // the close button: removing the node here as well left chipsData holding\n // an entry whose element was gone.\n Utils.onDocumentReady(() => {\n const chips = document.querySelectorAll('.chips');\n chips.forEach((el) => {\n el.addEventListener('click', (e) => {\n if (el['Expressive_Chips']) return;\n if ((<HTMLElement>e.target).classList.contains('close')) {\n const chip = (<HTMLElement>e.target).closest('.chip');\n if (chip) chip.remove();\n }\n });\n });\n });\n }\n\n static {\n Chips._keydown = false;\n }\n}\n", "import { Component, BaseOptions, InitElements, MElement } from '../core/component';\nimport { Utils } from '../core/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface RangeOptions extends BaseOptions {}\n\nconst _defaults: RangeOptions = {};\n\nexport class Range extends Component<RangeOptions> {\n declare el: HTMLInputElement;\n private _mousedown: boolean;\n value: HTMLElement;\n thumb: HTMLElement;\n\n constructor(el: HTMLInputElement, options: Partial<RangeOptions>) {\n super(el, options, Range);\n this.el['Expressive_Range'] = this;\n\n this.options = {\n ...Range.defaults,\n ...options\n };\n\n this._mousedown = false;\n this._setupThumb();\n this._sync();\n this._setupEventHandlers();\n }\n\n static get defaults(): RangeOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Range.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<RangeOptions>): Range;\n /**\n * Initializes instances of Range.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<RangeOptions>\n ): Range[];\n /**\n * Initializes instances of Range.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<RangeOptions> = {}\n ): Range | Range[] {\n return super.init(els, options, Range);\n }\n\n static getInstance(el: HTMLInputElement): Range {\n return el['Expressive_Range'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._removeThumb();\n this.el['Expressive_Range'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('change', this._handleRangeChange);\n this.el.addEventListener('mousedown', this._handleRangeMousedownTouchstart);\n this.el.addEventListener('touchstart', this._handleRangeMousedownTouchstart);\n this.el.addEventListener('input', this._handleRangeInputMousemoveTouchmove);\n this.el.addEventListener('mousemove', this._handleRangeInputMousemoveTouchmove);\n // Never calls preventDefault, so it does not need to block scrolling.\n this.el.addEventListener('touchmove', this._handleRangeInputMousemoveTouchmove, {\n passive: true\n });\n this.el.addEventListener('mouseup', this._handleRangeMouseupTouchend);\n this.el.addEventListener('touchend', this._handleRangeMouseupTouchend);\n this.el.addEventListener('blur', this._handleRangeBlurMouseoutTouchleave);\n this.el.addEventListener('mouseout', this._handleRangeBlurMouseoutTouchleave);\n this.el.addEventListener('touchleave', this._handleRangeBlurMouseoutTouchleave);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('change', this._handleRangeChange);\n this.el.removeEventListener('mousedown', this._handleRangeMousedownTouchstart);\n this.el.removeEventListener('touchstart', this._handleRangeMousedownTouchstart);\n this.el.removeEventListener('input', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('mousemove', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('touchmove', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('mouseup', this._handleRangeMouseupTouchend);\n this.el.removeEventListener('touchend', this._handleRangeMouseupTouchend);\n this.el.removeEventListener('blur', this._handleRangeBlurMouseoutTouchleave);\n this.el.removeEventListener('mouseout', this._handleRangeBlurMouseoutTouchleave);\n this.el.removeEventListener('touchleave', this._handleRangeBlurMouseoutTouchleave);\n }\n\n _handleRangeChange = () => {\n this._sync();\n this.thumb.classList.add('active');\n };\n\n _handleRangeMousedownTouchstart = (e: MouseEvent | TouchEvent) => {\n this._mousedown = true;\n this.el.classList.add('active');\n this._sync();\n if (e.type !== 'input') {\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangeInputMousemoveTouchmove = () => {\n if (this._mousedown) {\n this._sync();\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangeMouseupTouchend = () => {\n this._mousedown = false;\n this.el.classList.remove('active');\n };\n\n _handleRangeBlurMouseoutTouchleave = () => {\n if (!this._mousedown) {\n this.thumb.classList.remove('active');\n }\n };\n\n _setupThumb() {\n this.thumb = document.createElement('span');\n this.value = document.createElement('span');\n this.thumb.classList.add('thumb');\n this.value.classList.add('value');\n this.thumb.append(this.value);\n this.el.after(this.thumb);\n }\n\n _removeThumb() {\n this.thumb.remove();\n }\n\n _isVertical(): boolean {\n return !!this.el.closest('.vertical');\n }\n\n _sync() {\n const max = parseFloat(this.el.getAttribute('max')) || 100;\n const min = parseFloat(this.el.getAttribute('min')) || 0;\n const val = parseFloat(this.el.value) || 0;\n const percent = max === min ? 0 : (val - min) / (max - min);\n\n // Read before writing. This runs on every pointer move during a drag, and\n // setting the custom property first made each of the four offset reads\n // below flush a fresh layout.\n const left = this.el.offsetLeft;\n const top = this.el.offsetTop;\n const width = this.el.offsetWidth;\n const height = this.el.offsetHeight;\n\n this.el.style.setProperty('--md-comp-slider-active-fraction', `${percent * 100}%`);\n this.value.textContent = this.el.value;\n if (this._isVertical()) {\n this.thumb.style.left = `${left + width / 2}px`;\n this.thumb.style.top = `${top + (1 - percent) * height}px`;\n } else {\n this.thumb.style.left = `${left + percent * width}px`;\n this.thumb.style.top = `${top}px`;\n }\n }\n\n /**\n * Initializes every range input in the current document.\n */\n static Init() {\n // Deferred like every other Init(): this ran at import time, so a bundle\n // loaded in <head> found no inputs at all.\n Utils.onDocumentReady(() => {\n Range.init(document.querySelectorAll('input[type=range]') as NodeListOf<HTMLInputElement>, {});\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\ntype ClosedBy = 'any' | 'closerequest' | 'none';\n\n/**\n * Light-dismiss for native `<dialog>` elements.\n *\n * `showModal()` does not close on a backdrop tap. A naive `click` listener\n * on the dialog (where `::backdrop` events retarget) also fires when the\n * user starts a gesture on the dialog and releases on the scrim \u2014 selecting\n * text, missing a button, dragging a thumb. Both ends of the pointer\n * gesture must land outside the dialog's border box.\n *\n * Default is on. Opt out with `closedby=\"none\"` or `closedby=\"closerequest\"`.\n * If the browser already honours `closedby=\"any\"`, we leave that alone.\n */\nexport class Dialogs {\n private static _down: { dialog: HTMLDialogElement; pointerId: number } | null = null;\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('pointerdown', Dialogs._onPointerDown, { passive: true });\n document.addEventListener('pointerup', Dialogs._onPointerUp, { passive: true });\n document.addEventListener('pointercancel', Dialogs._onPointerCancel, { passive: true });\n });\n }\n\n static _onPointerDown(event: PointerEvent) {\n if (!Dialogs._isPrimaryPress(event)) {\n Dialogs._down = null;\n return;\n }\n const dialog = Dialogs._backdropDialog(event);\n if (!dialog || !Dialogs._lightDismissible(dialog) || !Dialogs._outside(event, dialog)) {\n Dialogs._down = null;\n return;\n }\n Dialogs._down = { dialog, pointerId: event.pointerId };\n }\n\n static _onPointerUp(event: PointerEvent) {\n const started = Dialogs._down;\n Dialogs._down = null;\n if (!started || started.pointerId !== event.pointerId) return;\n if (!event.isPrimary) return;\n if (!started.dialog.isConnected || !started.dialog.open) return;\n if (!Dialogs._lightDismissible(started.dialog)) return;\n if (Dialogs._backdropDialog(event) !== started.dialog) return;\n if (Dialogs._outside(event, started.dialog)) {\n started.dialog.close();\n }\n }\n\n static _onPointerCancel() {\n Dialogs._down = null;\n }\n\n /** Backdrop hits retarget to the dialog itself, never a child. */\n private static _backdropDialog(event: Event): HTMLDialogElement | null {\n const target = event.target;\n if (!(target instanceof HTMLDialogElement) || !target.open) return null;\n return target;\n }\n\n private static _outside(event: PointerEvent, dialog: HTMLDialogElement): boolean {\n const rect = dialog.getBoundingClientRect();\n return (\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n );\n }\n\n private static _isPrimaryPress(event: PointerEvent): boolean {\n if (!event.isPrimary) return false;\n return event.pointerType !== 'mouse' || event.button === 0;\n }\n\n private static _lightDismissible(dialog: HTMLDialogElement): boolean {\n const value = Dialogs._closedBy(dialog);\n if (value === 'none' || value === 'closerequest') return false;\n // Native closedby=\"any\" already light-dismisses with the same\n // \"both ends outside\" rule. Don't race it.\n if (value === 'any' && 'closedBy' in HTMLDialogElement.prototype) return false;\n return true;\n }\n\n // Read the attribute only. The IDL default for an unset closedby is\n // \"closerequest\" (Escape, no light dismiss) \u2014 treating that as an\n // author opt-out made every dialog undismissable from the scrim.\n private static _closedBy(dialog: HTMLDialogElement): ClosedBy | null {\n const attr = dialog.getAttribute('closedby');\n if (attr === 'any' || attr === 'closerequest' || attr === 'none') return attr;\n return null;\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport class Forms {\n /**\n * Checks if the label has validation and apply\n * the correct class and styles\n * @param textfield\n */\n static validateField(textfield: HTMLInputElement) {\n if (!textfield) {\n console.error('No text field element found');\n return;\n }\n\n const hasLength = textfield.getAttribute('data-length') !== null;\n const lenAttr = parseInt(textfield.getAttribute('data-length'));\n const len = textfield.value.length;\n\n if (\n len === 0 &&\n textfield.validity.badInput === false &&\n !textfield.required &&\n textfield.classList.contains('validate')\n ) {\n textfield.classList.remove('invalid');\n } else if (textfield.classList.contains('validate')) {\n // Check for character counter attributes\n if (\n (textfield.validity.valid && hasLength && len <= lenAttr) ||\n (textfield.validity.valid && !hasLength)\n ) {\n textfield.classList.remove('invalid');\n } else {\n textfield.classList.add('invalid');\n }\n }\n }\n\n /**\n * Resizes the given TextArea after updating the\n * value content dynamically.\n * @param e EventTarget\n */\n static textareaAutoResize(e: EventTarget) {\n const textarea = e as HTMLTextAreaElement;\n if (!textarea) return;\n\n // Measure the textarea against itself: collapse it to its natural height,\n // then read the content height back. `.expressive-textarea` is\n // `overflow-y: hidden`, so scrollHeight is the full content height and\n // offsetHeight - clientHeight is exactly the borders (no scrollbar to\n // account for) - which border-box sizing needs added back.\n //\n // This replaces a mirror div that the value was copied into via\n // `innerHTML = innerHTML.replace(...)` - a full serialize and reparse of\n // the text on every keystroke, plus getComputedStyle and seven style\n // writes, run twice per keystroke because it was bound to keydown and\n // keyup both.\n if (!textarea.hasAttribute('original-height')) {\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n }\n const originalHeight = parseInt(textarea.getAttribute('original-height'));\n if (isNaN(originalHeight)) return;\n\n textarea.style.height = 'auto';\n // Three reads after a single write: one layout flush for the whole resize.\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const contentHeight = textarea.scrollHeight + borders;\n textarea.style.height = Math.max(originalHeight, contentHeight) + 'px';\n }\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('change', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n if (target instanceof HTMLInputElement) {\n // The sibling-label loop that used to live here compared\n // `tagName == 'label'` (tagName is uppercase) so it never matched,\n // and no rule in the Sass styles `label.active` anyway - the\n // floating label is driven by CSS, not by a class from here.\n Forms.validateField(target);\n }\n });\n\n document.addEventListener('keyup', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n // Radio and Checkbox focus class\n if (target instanceof HTMLInputElement && ['radio', 'checkbox'].includes(target.type)) {\n // TAB, check if tabbing to radio or checkbox.\n if (Utils.keys.TAB.includes(e.key)) {\n target.classList.add('tabbed');\n target.addEventListener('blur', () => target.classList.remove('tabbed'), {\n once: true\n });\n }\n }\n });\n\n document.querySelectorAll('.expressive-textarea').forEach((textArea: HTMLTextAreaElement) => {\n Forms.InitTextarea(textArea);\n });\n\n // File Input Path\n document\n .querySelectorAll('.file-field input[type=\"file\"]')\n .forEach((fileInput: HTMLInputElement) => {\n Forms.InitFileInputPath(fileInput);\n });\n });\n }\n\n static InitTextarea(textarea: HTMLTextAreaElement) {\n // Save Data in Element\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n Forms.textareaAutoResize(textarea);\n // `input` rather than keydown + keyup: it fires once per actual value\n // change and also covers paste, drag-drop and IME composition, which the\n // key events missed.\n textarea.addEventListener('input', (e) => Forms.textareaAutoResize(e.target));\n }\n\n static InitFileInputPath(fileInput: HTMLInputElement) {\n fileInput.addEventListener('change', () => {\n const fileField = fileInput.closest('.file-field');\n const pathInput = <HTMLInputElement>fileField.querySelector('input.file-path');\n const files = fileInput.files;\n const filenames = [];\n for (let i = 0; i < files.length; i++) {\n filenames.push(files[i].name);\n }\n pathInput.value = filenames.join(', ');\n pathInput.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\ntype RGBColor = {\n r: number;\n g: number;\n b: number;\n};\n\ntype Position = {\n x: number;\n y: number;\n};\n\nexport class Waves {\n private static _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.pageYOffset - docElem.clientTop,\n left: box.left + window.pageXOffset - docElem.clientLeft\n };\n }\n\n // https://phoenix-dx.com/css-techniques-for-material-ripple-effect/\n\n static renderWaveEffect(\n targetElement: HTMLElement,\n position: Position | null = null,\n color: RGBColor | null = null\n ): void {\n const isCentered = position === null;\n const duration = 500;\n let animationFrame: number, animationStart: number;\n const animationStep = function (timestamp: number) {\n if (!animationStart) {\n animationStart = timestamp;\n }\n const frame = timestamp - animationStart;\n if (frame < duration) {\n const easing = (frame / duration) * (2 - frame / duration);\n const circle = isCentered\n ? 'circle at 50% 50%'\n : `circle at ${position.x}px ${position.y}px`;\n const waveColor = `rgba(${color?.r || 0}, ${color?.g || 0}, ${color?.b || 0}, ${0.3 * (1 - easing)})`;\n const stop = 90 * easing + '%';\n targetElement.style.backgroundImage =\n 'radial-gradient(' +\n circle +\n ', ' +\n waveColor +\n ' ' +\n stop +\n ', transparent ' +\n stop +\n ')';\n animationFrame = window.requestAnimationFrame(animationStep);\n } else {\n targetElement.style.backgroundImage = 'none';\n window.cancelAnimationFrame(animationFrame);\n }\n };\n animationFrame = window.requestAnimationFrame(animationStep);\n }\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.body.addEventListener('click', (e) => {\n const trigger = <HTMLElement>e.target;\n const el = <HTMLElement>trigger.closest('.waves-effect');\n if (el && el.contains(trigger)) {\n const isCircular = el.classList.contains('waves-circle');\n const offset = Waves._offset(el); // one rect, not one per axis\n const x = e.pageX - offset.left;\n const y = e.pageY - offset.top;\n\n let color = null;\n if (el.classList.contains('waves-light')) color = { r: 255, g: 255, b: 255 };\n\n Waves.renderWaveEffect(el, isCircular ? null : { x, y }, color);\n }\n });\n });\n }\n}\n", "import { Component, BaseOptions, InitElements, MElement, Openable } from \"../core/component\";\nimport { Utils } from '../core/utils';\n\nexport interface FloatingActionButtonOptions extends BaseOptions {\n /**\n * Direction FAB menu opens.\n * @default \"top\"\n */\n direction: 'top' | 'right' | 'bottom' | 'left';\n /**\n * true: FAB menu appears on hover (CSS, when the pointer can hover).\n * false: FAB menu toggles on click. `.click-to-toggle` is the markup switch.\n * @default true\n */\n hoverEnabled: boolean;\n /**\n * Expand the FAB into a toolbar on click. Prefer a hover or click menu.\n * `.toolbar` on the element is the markup switch.\n * @default false\n */\n toolbarEnabled: boolean;\n}\n\nconst _defaults: FloatingActionButtonOptions = {\n direction: 'top',\n hoverEnabled: true,\n toolbarEnabled: false\n};\n\n/**\n * Speed dial around a FAB. Open/close is the `.active` class; motion is\n * CSS. Hover is CSS (`:hover` when the pointer can hover). This class\n * toggles the class, wires keyboard / click-outside, and stamps direction.\n */\nexport class FloatingActionButton\n extends Component<FloatingActionButtonOptions>\n implements Openable\n{\n isOpen: boolean;\n\n private _anchor: HTMLElement | null;\n private _menu: HTMLElement | null;\n\n constructor(el: HTMLElement, options: Partial<FloatingActionButtonOptions>) {\n super(el, options, FloatingActionButton);\n this.el['Expressive_FloatingActionButton'] = this;\n\n const fromMarkup = this._directionFromClass();\n const toolbar = el.classList.contains('toolbar') || options.toolbarEnabled === true;\n const clickToToggle =\n el.classList.contains('click-to-toggle') || options.hoverEnabled === false;\n\n this.options = {\n ...FloatingActionButton.defaults,\n ...options,\n direction: options.direction ?? fromMarkup ?? FloatingActionButton.defaults.direction,\n hoverEnabled: !clickToToggle,\n toolbarEnabled: toolbar\n };\n\n this.isOpen = false;\n this._anchor = this.el.querySelector(':scope > a, :scope > button');\n this._menu = this.el.querySelector('ul, menu');\n\n this.el.classList.add(`direction-${this.options.direction}`);\n if (clickToToggle) this.el.classList.add('click-to-toggle');\n if (toolbar) this.el.classList.add('toolbar');\n\n if (this._anchor) {\n this._anchor.setAttribute('aria-haspopup', 'menu');\n this._anchor.setAttribute('aria-expanded', 'false');\n if (\n this._anchor instanceof HTMLAnchorElement &&\n !this._anchor.hasAttribute('href') &&\n this._anchor.tabIndex < 0\n ) {\n this._anchor.tabIndex = 0;\n }\n }\n if (this._menu) this._menu.setAttribute('role', 'menu');\n\n this._setupEventHandlers();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static init(\n el: HTMLElement,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton;\n static init(\n els: InitElements<MElement>,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton[];\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<FloatingActionButtonOptions> = {}\n ): FloatingActionButton | FloatingActionButton[] {\n return super.init(els, options, FloatingActionButton);\n }\n\n static getInstance(el: HTMLElement): FloatingActionButton {\n return el['Expressive_FloatingActionButton'];\n }\n\n destroy() {\n this.close();\n this._removeEventHandlers();\n this.el['Expressive_FloatingActionButton'] = undefined;\n }\n\n /**\n * Open FAB.\n */\n open = (): void => {\n if (this.isOpen) return;\n this.isOpen = true;\n this.el.classList.add('active');\n this._anchor?.setAttribute('aria-expanded', 'true');\n // The trigger click is stopPropagation'd, so it is not also an outside click.\n document.addEventListener('click', this._handleDocumentClick);\n document.addEventListener('keydown', this._handleDocumentKeydown);\n };\n\n /**\n * Close FAB.\n */\n close = (): void => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.el.classList.remove('active');\n this._anchor?.setAttribute('aria-expanded', 'false');\n document.removeEventListener('click', this._handleDocumentClick);\n document.removeEventListener('keydown', this._handleDocumentKeydown);\n };\n\n private _directionFromClass(): FloatingActionButtonOptions['direction'] | null {\n const match = [...this.el.classList].find((c) => c.startsWith('direction-'));\n const value = match?.slice('direction-'.length);\n if (value === 'top' || value === 'right' || value === 'bottom' || value === 'left') {\n return value;\n }\n return null;\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleFABClick);\n if (this._anchor instanceof HTMLAnchorElement && !this._anchor.hasAttribute('href')) {\n this._anchor.addEventListener('keydown', this._handleAnchorKeydown);\n }\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleFABClick);\n this._anchor?.removeEventListener('keydown', this._handleAnchorKeydown);\n }\n\n private _handleFABClick = (e: MouseEvent) => {\n e.stopPropagation();\n this._toggle();\n };\n\n private _handleAnchorKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key) || e.key === ' ') {\n e.preventDefault();\n this._toggle();\n }\n };\n\n private _handleDocumentKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ESC.includes(e.key)) this.close();\n };\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Node) || this.el.contains(target)) return;\n this.close();\n };\n\n private _toggle() {\n if (this.isOpen) this.close();\n else this.open();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface CarouselOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds (coverflow). Snap mode uses CSS.\n * @default 200\n */\n duration: number;\n /**\n * Perspective zoom. If 0, all items are the same size. Coverflow only.\n * @default -100\n */\n dist: number;\n /**\n * Extra spacing on the center item. Coverflow only.\n * @default 0\n */\n shift: number;\n /**\n * Padding between items that are not in the center. Coverflow only.\n * @default 0\n */\n padding: number;\n /**\n * How many items stay visible. Coverflow only.\n * @default 5\n */\n numVisible: number;\n /**\n * Linear snap track instead of 3D coverflow.\n * Also implied by `.flat` / `.carousel-slider`.\n * @default false\n */\n fullWidth: boolean;\n /**\n * Show paging dots. Only drawn when there is more than one item.\n * @default false\n */\n indicators: boolean;\n /**\n * Stop at the first and last items instead of wrapping. Coverflow only.\n * Snap tracks do not wrap.\n * @default false\n */\n noWrap: boolean;\n /**\n * Called when a new item becomes the center.\n * @default null\n */\n onCycleTo: (current: Element, dragged: boolean) => void;\n}\n\nconst _defaults: CarouselOptions = {\n duration: 200,\n dist: -100,\n shift: 0,\n padding: 0,\n numVisible: 5,\n fullWidth: false,\n indicators: false,\n noWrap: false,\n onCycleTo: null\n};\n\nexport class Carousel extends Component<CarouselOptions> {\n hasMultipleSlides: boolean;\n showIndicators: boolean;\n noWrap: boolean;\n pressed: boolean;\n dragged: boolean;\n offset: number;\n target: number;\n images: HTMLElement[];\n itemWidth: number;\n itemHeight: number;\n dim: number;\n _indicators: HTMLUListElement | HTMLElement;\n count: number;\n verticalDragged: boolean;\n reference: number;\n referenceY: number;\n velocity: number;\n frame: number;\n timestamp: number;\n amplitude: number;\n center: number = 0;\n imageHeight: number;\n scrollingTimeout: ReturnType<typeof setTimeout>;\n oneTimeCallback: (current: Element, dragged: boolean) => void | null;\n\n private _flat: boolean;\n private _ownIndicators: boolean = false;\n private _trackEl: HTMLElement | null = null;\n private _ignoreScroll: boolean = false;\n private _trackRaf: number = null;\n private _started: boolean = false;\n\n private get _scroller(): HTMLElement {\n return this._trackEl ?? this.el;\n }\n\n private static _live = new Set<Carousel>();\n private static _resizeListening = false;\n private static _onResize = Utils.throttle(() => {\n Carousel._live.forEach((c) => c._handleResize());\n }, 200);\n\n constructor(el: HTMLElement, options: Partial<CarouselOptions>) {\n super(el, options, Carousel);\n this.el['Expressive_Carousel'] = this;\n\n this.options = {\n ...Carousel.defaults,\n ...options\n };\n\n this._flat =\n this.options.fullWidth ||\n this.el.classList.contains('flat') ||\n this.el.classList.contains('carousel-slider');\n if (this._flat) {\n this.el.classList.add('flat');\n this.options.fullWidth = true;\n this.options.dist = 0;\n }\n\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n this.options.duration = 1;\n if (!this._flat) this.options.dist = 0;\n }\n\n this.pressed = false;\n this.dragged = false;\n this.offset = this.target = 0;\n this.images = this._collectItems();\n if (!this.images.length) {\n console.error('Carousel: no .carousel-item elements to show');\n return;\n }\n\n this.hasMultipleSlides = this.images.length > 1;\n this.showIndicators = this.options.indicators && this.hasMultipleSlides;\n this.noWrap = this.options.noWrap || !this.hasMultipleSlides || this._flat;\n this.count = this.images.length;\n this.options.numVisible = Math.min(this.count, this.options.numVisible);\n\n this.images.forEach((item) => item.classList.add('carousel-item'));\n if (this._flat) this._wrapTrack();\n\n const firstItem = this.images[0];\n this.itemWidth = firstItem.clientWidth || this.el.clientWidth || 1;\n this.itemHeight = firstItem.clientHeight || this.el.clientHeight || 1;\n this.dim = this.itemWidth * 2 + this.options.padding || 1;\n\n if (this.showIndicators) this._setupIndicators();\n\n this.el.tabIndex = this.el.tabIndex >= 0 ? this.el.tabIndex : 0;\n this.el.setAttribute('aria-roledescription', 'carousel');\n\n this._setupEventHandlers();\n this._started = true;\n\n if (this._flat) {\n const start = Math.max(\n 0,\n this.images.findIndex((el) => el.classList.contains('active'))\n );\n this.center = start;\n this._syncActive(start, false);\n this._scrollToIndex(start, false);\n } else {\n this._scroll(this.offset);\n }\n }\n\n static get defaults(): CarouselOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<CarouselOptions>): Carousel;\n static init(els: InitElements<MElement>, options?: Partial<CarouselOptions>): Carousel[];\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<CarouselOptions> = {}\n ): Carousel | Carousel[] {\n return super.init(els, options, Carousel);\n }\n\n static getInstance(el: HTMLElement): Carousel {\n return el['Expressive_Carousel'];\n }\n\n destroy() {\n if (this._started) this._teardown();\n this.el['Expressive_Carousel'] = undefined;\n }\n\n private _collectItems(): HTMLElement[] {\n const explicit = Array.from(this.el.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.classList.contains('carousel-item')\n );\n if (explicit.length) return explicit;\n return Array.from(this.el.children).filter((el): el is HTMLElement => {\n if (!(el instanceof HTMLElement)) return false;\n if (el.classList.contains('indicators') || el.classList.contains('carousel-fixed-item')) {\n return false;\n }\n return el.tagName !== 'NAV';\n });\n }\n\n private _setupIndicators() {\n const existing = Array.from(this.el.children).find(\n (el): el is HTMLElement => el instanceof HTMLElement && el.classList.contains('indicators')\n );\n this._indicators = existing ?? document.createElement('nav');\n this._ownIndicators = !existing;\n this._indicators.classList.add('indicators');\n this._indicators.setAttribute('aria-label', 'Slides');\n this._indicators.replaceChildren();\n\n this.images.forEach((_, i) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.classList.add('indicator-item');\n if (i === 0) {\n button.classList.add('active');\n button.setAttribute('aria-current', 'true');\n }\n button.setAttribute('aria-label', `Slide ${i + 1}`);\n this._indicators.appendChild(button);\n });\n\n if (this._ownIndicators) this.el.appendChild(this._indicators);\n if (this._flat) {\n this.el.querySelector('.carousel-fixed-item')?.classList.add('with-indicators');\n }\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('keydown', this._handleKeydown);\n if (this.showIndicators && this._indicators) {\n this._indicators.addEventListener('click', this._handleIndicatorClick);\n }\n Carousel._live.add(this);\n if (!Carousel._resizeListening) {\n window.addEventListener('resize', Carousel._onResize, { passive: true });\n Carousel._resizeListening = true;\n }\n\n if (this._flat) {\n this._scroller.addEventListener('scroll', this._handleFlatScroll, { passive: true });\n return;\n }\n\n this.el.addEventListener('pointerdown', this._handleCarouselTap);\n this.el.addEventListener('pointermove', this._handleCarouselDrag);\n this.el.addEventListener('pointerup', this._handleCarouselRelease);\n this.el.addEventListener('pointercancel', this._handleCarouselRelease);\n this.el.addEventListener('click', this._handleCarouselClick);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('keydown', this._handleKeydown);\n if (this._indicators) {\n this._indicators.removeEventListener('click', this._handleIndicatorClick);\n }\n this._scroller.removeEventListener('scroll', this._handleFlatScroll);\n this.el.removeEventListener('pointerdown', this._handleCarouselTap);\n this.el.removeEventListener('pointermove', this._handleCarouselDrag);\n this.el.removeEventListener('pointerup', this._handleCarouselRelease);\n this.el.removeEventListener('pointercancel', this._handleCarouselRelease);\n this.el.removeEventListener('click', this._handleCarouselClick);\n\n Carousel._live.delete(this);\n if (Carousel._live.size === 0 && Carousel._resizeListening) {\n window.removeEventListener('resize', Carousel._onResize);\n Carousel._resizeListening = false;\n }\n }\n\n private _teardown() {\n this._removeEventHandlers();\n if (this._trackRaf !== null) cancelAnimationFrame(this._trackRaf);\n window.clearTimeout(this.scrollingTimeout);\n if (this._ownIndicators) this._indicators?.remove();\n this._unwrapTrack();\n this.images.forEach((el) => {\n el.style.transform = '';\n el.style.zIndex = '';\n el.style.opacity = '';\n el.style.visibility = '';\n });\n }\n\n _handleThrottledResize = Utils.throttle(() => this._handleResize(), 200);\n\n _handleCarouselTap = (e: PointerEvent) => {\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n if (e.target instanceof HTMLElement && e.target.tagName === 'IMG') {\n e.preventDefault();\n }\n this.pressed = true;\n this.dragged = false;\n this.verticalDragged = false;\n this.reference = e.clientX;\n this.referenceY = e.clientY;\n this.velocity = this.amplitude = 0;\n this.frame = this.offset;\n this.timestamp = Date.now();\n try {\n this.el.setPointerCapture(e.pointerId);\n } catch {\n // capture is optional\n }\n if (this._trackRaf !== null) cancelAnimationFrame(this._trackRaf);\n const loop = () => {\n this._track();\n if (this.pressed) this._trackRaf = requestAnimationFrame(loop);\n else this._trackRaf = null;\n };\n this._trackRaf = requestAnimationFrame(loop);\n };\n\n _handleCarouselDrag = (e: PointerEvent) => {\n if (!this.pressed) return;\n const delta = this.reference - e.clientX;\n const deltaY = Math.abs(this.referenceY - e.clientY);\n if (deltaY < 30 && !this.verticalDragged) {\n if (delta > 2 || delta < -2) {\n this.dragged = true;\n this.reference = e.clientX;\n this._scroll(this.offset + delta);\n }\n } else if (this.dragged) {\n e.preventDefault();\n } else {\n this.verticalDragged = true;\n }\n if (this.dragged) e.preventDefault();\n };\n\n _handleCarouselRelease = (e: PointerEvent) => {\n if (!this.pressed) return;\n this.pressed = false;\n if (this._trackRaf !== null) {\n cancelAnimationFrame(this._trackRaf);\n this._trackRaf = null;\n }\n try {\n this.el.releasePointerCapture(e.pointerId);\n } catch {\n // already released\n }\n this.target = this.offset;\n if (this.velocity > 10 || this.velocity < -10) {\n this.amplitude = 0.9 * this.velocity;\n this.target = this.offset + this.amplitude;\n }\n this.target = Math.round(this.target / this.dim) * this.dim;\n if (this.noWrap) {\n if (this.target >= this.dim * (this.count - 1)) {\n this.target = this.dim * (this.count - 1);\n } else if (this.target < 0) {\n this.target = 0;\n }\n }\n this.amplitude = this.target - this.offset;\n this.timestamp = Date.now();\n requestAnimationFrame(this._autoScroll);\n if (this.dragged) e.preventDefault();\n };\n\n _handleCarouselClick = (e: MouseEvent) => {\n if (this.dragged) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n const clickedElem = (e.target as HTMLElement).closest('.carousel-item');\n if (!clickedElem || !this.el.contains(clickedElem)) return;\n const clickedIndex = this.images.indexOf(clickedElem as HTMLElement);\n const diff = this._wrap(this.center) - clickedIndex;\n if (diff !== 0) {\n e.preventDefault();\n e.stopPropagation();\n }\n if (clickedIndex < 0) {\n if (e.clientX - (e.target as HTMLElement).getBoundingClientRect().left > this.el.clientWidth / 2) {\n this.next();\n } else {\n this.prev();\n }\n } else {\n this._cycleTo(clickedIndex);\n }\n };\n\n _handleIndicatorClick = (e: Event) => {\n e.stopPropagation();\n const indicator = (e.target as HTMLElement).closest('.indicator-item');\n if (!indicator || !this._indicators.contains(indicator)) return;\n const index = [...this._indicators.children].indexOf(indicator);\n if (index < 0) return;\n this._cycleTo(index);\n };\n\n _handleKeydown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if (target.closest('input, textarea, select, [contenteditable=\"true\"]')) return;\n if (Utils.keys.ARROW_RIGHT.includes(e.key)) {\n e.preventDefault();\n this.next();\n } else if (Utils.keys.ARROW_LEFT.includes(e.key)) {\n e.preventDefault();\n this.prev();\n }\n };\n\n _handleFlatScroll = () => {\n if (this._ignoreScroll) return;\n const index = this._nearestIndex();\n if (index !== this.center) this._syncActive(index, this.dragged);\n };\n\n _handleResize = () => {\n if (!this.images.length) return;\n if (this._flat) {\n this._scrollToIndex(this.center, false);\n return;\n }\n if (this.options.fullWidth) {\n const firstItem = this.images[0];\n if (!firstItem) return;\n this.itemWidth = firstItem.clientWidth;\n this.dim = this.itemWidth * 2 + this.options.padding;\n this.offset = this.center * 2 * this.itemWidth;\n this.target = this.offset;\n } else {\n this._scroll();\n }\n };\n\n _xpos(e: PointerEvent | MouseEvent | TouchEvent) {\n if ('clientX' in e) return e.clientX;\n return 0;\n }\n\n _ypos(e: PointerEvent | MouseEvent | TouchEvent) {\n if ('clientY' in e) return e.clientY;\n return 0;\n }\n\n _wrap(x: number) {\n return x >= this.count ? x % this.count : x < 0 ? this._wrap(this.count + (x % this.count)) : x;\n }\n\n _track = () => {\n const now = Date.now();\n const elapsed = now - this.timestamp;\n const delta = this.offset - this.frame;\n const v = (1000 * delta) / (1 + elapsed);\n this.timestamp = now;\n this.frame = this.offset;\n this.velocity = 0.8 * v + 0.2 * this.velocity;\n };\n\n _autoScroll = () => {\n if (!this.amplitude) return;\n const elapsed = Date.now() - this.timestamp;\n const delta = this.amplitude * Math.exp(-elapsed / this.options.duration);\n if (delta > 2 || delta < -2) {\n this._scroll(this.target - delta);\n requestAnimationFrame(this._autoScroll);\n } else {\n this._scroll(this.target);\n }\n };\n\n _scroll(x: number = 0) {\n if (!this.el.classList.contains('scrolling')) {\n this.el.classList.add('scrolling');\n }\n window.clearTimeout(this.scrollingTimeout);\n this.scrollingTimeout = setTimeout(() => {\n this.el.classList.remove('scrolling');\n }, this.options.duration);\n\n this.offset = typeof x === 'number' ? x : this.offset;\n this.center = Math.floor((this.offset + this.dim / 2) / this.dim);\n\n const half = this.count >> 1;\n const delta = this.offset - this.center * this.dim;\n const dir = delta < 0 ? 1 : -1;\n const tween = (-dir * delta * 2) / this.dim;\n const lastCenter = this.center;\n const numVisibleOffset = 1 / this.options.numVisible;\n\n let alignment: string;\n let centerTweenedOpacity: number;\n if (this.options.fullWidth) {\n alignment = 'translateX(0)';\n centerTweenedOpacity = 1;\n } else {\n alignment = 'translateX(' + (this.el.clientWidth - this.itemWidth) / 2 + 'px) ';\n alignment += 'translateY(' + (this.el.clientHeight - this.itemHeight) / 2 + 'px)';\n centerTweenedOpacity = 1 - numVisibleOffset * tween;\n }\n\n this._paintIndicators(this.center);\n\n if (!this.noWrap || (this.center >= 0 && this.center < this.count)) {\n const el = this.images[this._wrap(this.center)];\n if (el && !el.classList.contains('active')) {\n this.el.querySelector('.carousel-item.active')?.classList.remove('active');\n el.classList.add('active');\n }\n }\n\n for (let i = 1; i <= half; ++i) {\n let zTranslation: number;\n let tweenedOpacity: number;\n if (this.options.fullWidth) {\n zTranslation = this.options.dist;\n tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1;\n } else {\n zTranslation = this.options.dist * (i * 2 + tween * dir);\n tweenedOpacity = 1 - numVisibleOffset * (i * 2 + tween * dir);\n }\n if (!this.noWrap || this.center + i < this.count) {\n const el = this.images[this._wrap(this.center + i)];\n const transformString = `${alignment} translateX(${\n this.options.shift + (this.dim * i - delta) / 2\n }px) translateZ(${zTranslation}px)`;\n this._updateItemStyle(el, tweenedOpacity, -i, transformString);\n }\n if (this.options.fullWidth) {\n zTranslation = this.options.dist;\n tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1;\n } else {\n zTranslation = this.options.dist * (i * 2 - tween * dir);\n tweenedOpacity = 1 - numVisibleOffset * (i * 2 - tween * dir);\n }\n if (!this.noWrap || this.center - i >= 0) {\n const el = this.images[this._wrap(this.center - i)];\n const transformString = `${alignment} translateX(${\n -this.options.shift + (-this.dim * i - delta) / 2\n }px) translateZ(${zTranslation}px)`;\n this._updateItemStyle(el, tweenedOpacity, -i, transformString);\n }\n }\n\n if (!this.noWrap || (this.center >= 0 && this.center < this.count)) {\n const el = this.images[this._wrap(this.center)];\n const transformString = `${alignment} translateX(${-delta / 2}px) translateX(${\n dir * this.options.shift * tween\n }px) translateZ(${this.options.dist * tween}px)`;\n this._updateItemStyle(el, centerTweenedOpacity, 0, transformString);\n }\n\n const currItem = this.images[this._wrap(this.center)];\n this._syncA11y(this._wrap(this.center));\n\n if (lastCenter !== this.center && typeof this.options.onCycleTo === 'function') {\n this.options.onCycleTo.call(this, currItem, this.dragged);\n }\n if (typeof this.oneTimeCallback === 'function') {\n this.oneTimeCallback.call(this, currItem, this.dragged);\n this.oneTimeCallback = null;\n }\n }\n\n _updateItemStyle(el: HTMLElement, opacity: number, zIndex: number, transform: string) {\n if (!el) return;\n el.style.transform = transform;\n el.style.zIndex = zIndex.toString();\n el.style.opacity = opacity.toString();\n el.style.visibility = 'visible';\n }\n\n private _paintIndicators(center: number) {\n if (!this.showIndicators || !this._indicators) return;\n const pos = ((center % this.count) + this.count) % this.count;\n this._indicators.querySelectorAll('.indicator-item').forEach((el, i) => {\n const on = i === pos;\n el.classList.toggle('active', on);\n if (on) el.setAttribute('aria-current', 'true');\n else el.removeAttribute('aria-current');\n });\n }\n\n private _syncA11y(index: number) {\n this.images.forEach((el, i) => {\n if (i === index) el.removeAttribute('aria-hidden');\n else el.setAttribute('aria-hidden', 'true');\n });\n }\n\n private _syncActive(index: number, dragged: boolean) {\n const prev = this.center;\n this.center = index;\n this.images.forEach((el, i) => el.classList.toggle('active', i === index));\n this._paintIndicators(index);\n this._syncA11y(index);\n const curr = this.images[index];\n if (prev !== index && typeof this.options.onCycleTo === 'function') {\n this.options.onCycleTo.call(this, curr, dragged);\n }\n if (typeof this.oneTimeCallback === 'function') {\n this.oneTimeCallback.call(this, curr, dragged);\n this.oneTimeCallback = null;\n }\n }\n\n private _wrapTrack() {\n const track = document.createElement('div');\n track.className = 'carousel-track';\n this.images[0].before(track);\n this.images.forEach((el) => track.appendChild(el));\n this._trackEl = track;\n }\n\n private _unwrapTrack() {\n if (!this._trackEl) return;\n this.images.forEach((el) => this.el.insertBefore(el, this._trackEl));\n this._trackEl.remove();\n this._trackEl = null;\n }\n\n private _nearestIndex(): number {\n const left = this._scroller.scrollLeft;\n let best = 0;\n let bestDist = Infinity;\n this.images.forEach((el, i) => {\n const dist = Math.abs(el.offsetLeft - left);\n if (dist < bestDist) {\n bestDist = dist;\n best = i;\n }\n });\n return best;\n }\n\n private _scrollToIndex(n: number, smooth = true) {\n const el = this.images[n];\n if (!el) return;\n const left = el.offsetLeft;\n if (Math.abs(this._scroller.scrollLeft - left) < 1) {\n this._syncActive(n, false);\n return;\n }\n this._ignoreScroll = true;\n this._scroller.scrollTo({ left, behavior: smooth ? 'smooth' : 'auto' });\n const done = () => {\n this._ignoreScroll = false;\n };\n this._scroller.addEventListener('scrollend', done, { once: true });\n window.setTimeout(done, this.options.duration + 350);\n }\n\n _cycleTo(n: number, callback: CarouselOptions['onCycleTo'] = null) {\n if (this._flat) {\n if (typeof callback === 'function') this.oneTimeCallback = callback;\n this._syncActive(n, false);\n this._scrollToIndex(n);\n return;\n }\n let diff = (this.center % this.count) - n;\n if (!this.noWrap) {\n if (diff < 0) {\n if (Math.abs(diff + this.count) < Math.abs(diff)) {\n diff += this.count;\n }\n } else if (diff > 0) {\n if (Math.abs(diff - this.count) < diff) {\n diff -= this.count;\n }\n }\n }\n this.target = this.dim * Math.round(this.offset / this.dim);\n if (diff < 0) {\n this.target += this.dim * Math.abs(diff);\n } else if (diff > 0) {\n this.target -= this.dim * diff;\n }\n if (typeof callback === 'function') {\n this.oneTimeCallback = callback;\n }\n if (this.offset !== this.target) {\n this.amplitude = this.target - this.offset;\n this.timestamp = Date.now();\n requestAnimationFrame(this._autoScroll);\n }\n }\n\n next(n: number = 1) {\n if (n === undefined || isNaN(n)) n = 1;\n let index = this.center + n;\n if (index >= this.count || index < 0) {\n if (this.noWrap) return;\n index = this._wrap(index);\n }\n this._cycleTo(index);\n }\n\n prev(n: number = 1) {\n if (n === undefined || isNaN(n)) n = 1;\n let index = this.center - n;\n if (index >= this.count || index < 0) {\n if (this.noWrap) return;\n index = this._wrap(index);\n }\n this._cycleTo(index);\n }\n\n set(n: number, callback?: CarouselOptions['onCycleTo']) {\n if (n === undefined || isNaN(n)) n = 0;\n if (n > this.count || n < 0) {\n if (this.noWrap) return;\n n = this._wrap(n);\n }\n this._cycleTo(n, callback);\n }\n}\n", "import { Component, InitElements, MElement } from '../core/component';\n\nexport interface BaseOptions {}\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<object> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, {}, CharacterCounter);\n this.el['Expressive_CharacterCounter'] = this;\n\n this.options = {\n ...CharacterCounter.defaults,\n ...options\n };\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of CharacterCounter.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: InputElement, options?: Partial<BaseOptions>): CharacterCounter;\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InputElement | MElement>,\n options?: Partial<BaseOptions>\n ): CharacterCounter[];\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InputElement | InitElements<InputElement | MElement>,\n options: Partial<BaseOptions> = {}\n ): CharacterCounter | CharacterCounter[] {\n return super.init(els, options, CharacterCounter);\n }\n\n static getInstance(el: InputElement): CharacterCounter {\n return el['Expressive_CharacterCounter'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_CharacterCounter'] = undefined;\n this._removeCounter();\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('focus', this.updateCounter, true);\n this.el.addEventListener('input', this.updateCounter, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('focus', this.updateCounter, true);\n this.el.removeEventListener('input', this.updateCounter, true);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n this.counterEl.style.float = 'right';\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = (this.el as HTMLInputElement).value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface CollapsibleOptions extends BaseOptions {\n /**\n * If accordion versus collapsible. When omitted, `.expandable` on the\n * element turns accordion off. `<details>` with the same `name` already\n * exclusive-open in the browser; this option is the switch for the\n * `<ul>/<li>` alias and assigns `name` when it is missing.\n * @default true\n */\n accordion: boolean;\n /**\n * @deprecated Duration is CSS (`--md-comp-collapsible-duration`).\n * Accepted so existing init calls keep compiling, and ignored.\n * @default 300\n */\n inDuration: number;\n /**\n * @deprecated Duration is CSS (`--md-comp-collapsible-duration`).\n * Accepted so existing init calls keep compiling, and ignored.\n * @default 300\n */\n outDuration: number;\n /**\n * Callback function called before collapsible is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after collapsible is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before collapsible is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after collapsible is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: CollapsibleOptions = {\n accordion: true,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n inDuration: 300,\n outDuration: 300\n};\n\n/**\n * Collapsible. Open/close is HTML (`<details>` / `[open]`, or `.active` on\n * the `<li>` alias). Height is CSS. This class is the public API, accordion\n * for the alias, and aria on non-native headers.\n */\nexport class Collapsible extends Component<CollapsibleOptions> {\n private _items: HTMLElement[] = [];\n private _groupName: string;\n private _endTimers: number[] = [];\n private _wrappedBodies: HTMLElement[] = [];\n\n constructor(el: HTMLElement, options: Partial<CollapsibleOptions>) {\n super(el, options, Collapsible);\n this.el['Expressive_Collapsible'] = this;\n\n const accordion =\n options.accordion !== undefined\n ? options.accordion\n : !el.classList.contains('expandable');\n\n this.options = {\n ...Collapsible.defaults,\n ...options,\n accordion\n };\n\n this._groupName = el.id ? `collapsible-${el.id}` : `collapsible-${Utils.guid()}`;\n this._items = this._collectItems();\n this._wrapDetailsBodies();\n this._setupItems();\n this._setupEventHandlers();\n }\n\n static get defaults(): CollapsibleOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Collapsible.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CollapsibleOptions>): Collapsible;\n /**\n * Initializes instances of Collapsible.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<CollapsibleOptions>): Collapsible[];\n /**\n * Initializes instances of Collapsible.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<CollapsibleOptions> = {}\n ): Collapsible | Collapsible[] {\n return super.init(els, options, Collapsible);\n }\n\n static getInstance(el: HTMLElement): Collapsible {\n return el['Expressive_Collapsible'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._endTimers.forEach((id) => clearTimeout(id));\n this._endTimers = [];\n this._unwrapDetailsBodies();\n this.el['Expressive_Collapsible'] = undefined;\n }\n\n /**\n * Open collapsible section.\n * @param index 0-based index of the section to open.\n */\n open = (index: number) => {\n const item = this._items[index];\n if (!item || this._isOpen(item)) return;\n\n if (this.options.accordion) {\n this._items.forEach((other, i) => {\n if (i !== index && this._isOpen(other)) this.close(i);\n });\n }\n\n this._setOpen(item, true);\n };\n\n /**\n * Close collapsible section.\n * @param index 0-based index of the section to close.\n */\n close = (index: number) => {\n const item = this._items[index];\n if (!item || !this._isOpen(item)) return;\n this._setOpen(item, false);\n };\n\n private _collectItems(): HTMLElement[] {\n const details = Array.from(this.el.querySelectorAll(':scope > details')) as HTMLElement[];\n if (details.length) return details;\n return Array.from(this.el.children).filter((c) => c.tagName === 'LI') as HTMLElement[];\n }\n\n private _setupItems() {\n if (this.options.accordion) {\n this._items.forEach((item) => {\n if (item instanceof HTMLDetailsElement && !item.getAttribute('name')) {\n item.setAttribute('name', this._groupName);\n }\n });\n }\n\n const opened = this._items.filter((item) => this._isOpen(item));\n if (this.options.accordion && opened.length > 1) {\n opened.slice(1).forEach((item) => {\n if (item instanceof HTMLDetailsElement) item.open = false;\n else item.classList.remove('active');\n });\n }\n\n this._items.forEach((item) => this._syncAria(item));\n }\n\n private _isOpen(item: HTMLElement): boolean {\n if (item instanceof HTMLDetailsElement) return item.open;\n return item.classList.contains('active');\n }\n\n private _setOpen(item: HTMLElement, open: boolean) {\n if (item instanceof HTMLDetailsElement) {\n item.open = open;\n return;\n }\n item.classList.toggle('active', open);\n this._syncAria(item);\n this._notify(item, open);\n }\n\n private _headerOf(item: HTMLElement): HTMLElement | null {\n if (item instanceof HTMLDetailsElement) {\n return item.querySelector(':scope > summary');\n }\n return item.querySelector(':scope > .collapsible-header');\n }\n\n private _wrapDetailsBodies() {\n this._items.forEach((item) => {\n if (!(item instanceof HTMLDetailsElement)) return;\n if (item.querySelector(':scope > .collapsible-body')) return;\n const body = document.createElement('div');\n body.className = 'collapsible-body';\n Array.from(item.childNodes).forEach((node) => {\n if (node instanceof HTMLElement && node.tagName === 'SUMMARY') return;\n body.appendChild(node);\n });\n item.appendChild(body);\n this._wrappedBodies.push(body);\n });\n }\n\n private _unwrapDetailsBodies() {\n this._wrappedBodies.forEach((body) => {\n const parent = body.parentNode;\n if (!parent) return;\n while (body.firstChild) parent.insertBefore(body.firstChild, body);\n body.remove();\n });\n this._wrappedBodies = [];\n }\n\n private _bodyOf(item: HTMLElement): HTMLElement | null {\n return item.querySelector(':scope > .collapsible-body');\n }\n\n private _syncAria(item: HTMLElement) {\n if (item instanceof HTMLDetailsElement) return;\n const header = this._headerOf(item);\n const body = this._bodyOf(item);\n if (!header) return;\n\n header.setAttribute('aria-expanded', String(this._isOpen(item)));\n if (body) {\n if (!body.id) body.id = `collapsible-body-${Utils.guid()}`;\n header.setAttribute('aria-controls', body.id);\n }\n if (!header.matches('a, button, summary')) {\n header.setAttribute('role', 'button');\n if (header.tabIndex < 0) header.tabIndex = 0;\n }\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleClick);\n this.el.addEventListener('keydown', this._handleKeydown);\n this.el.addEventListener('toggle', this._handleToggle, true);\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleClick);\n this.el.removeEventListener('keydown', this._handleKeydown);\n this.el.removeEventListener('toggle', this._handleToggle, true);\n }\n\n private _handleClick = (e: MouseEvent) => {\n const header = (e.target as HTMLElement).closest('.collapsible-header');\n if (!header || header.closest('.collapsible') !== this.el) return;\n if (header.closest('details')) return;\n\n const item = header.closest('li');\n if (!item) return;\n const index = this._items.indexOf(item as HTMLElement);\n if (index < 0) return;\n\n if (this._isOpen(item as HTMLElement)) this.close(index);\n else this.open(index);\n };\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (!Utils.keys.ENTER.includes(e.key) && e.key !== ' ') return;\n const header = (e.target as HTMLElement).closest('.collapsible-header');\n if (!header || header.closest('.collapsible') !== this.el) return;\n if (header.closest('details')) return;\n if (header.matches('a, button')) return;\n\n e.preventDefault();\n const item = header.closest('li');\n if (!item) return;\n const index = this._items.indexOf(item as HTMLElement);\n if (index < 0) return;\n\n if (this._isOpen(item as HTMLElement)) this.close(index);\n else this.open(index);\n };\n\n private _handleToggle = (e: Event) => {\n const item = e.target as HTMLElement;\n if (!(item instanceof HTMLDetailsElement)) return;\n if (!this._items.includes(item)) return;\n this._notify(item, item.open);\n };\n\n private _notify(item: HTMLElement, opening: boolean) {\n const start = opening ? this.options.onOpenStart : this.options.onCloseStart;\n if (typeof start === 'function') start.call(this, item);\n\n const end = opening ? this.options.onOpenEnd : this.options.onCloseEnd;\n if (typeof end !== 'function') return;\n\n const target = this._bodyOf(item) ?? item;\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n target.removeEventListener('transitionend', onEnd);\n end.call(this, item);\n };\n const onEnd = (ev: TransitionEvent) => {\n if (ev.target !== target) return;\n finish();\n };\n target.addEventListener('transitionend', onEnd);\n this._endTimers.push(window.setTimeout(finish, this._durationMs() + 50));\n }\n\n private _durationMs(): number {\n const raw = getComputedStyle(this.el)\n .getPropertyValue('--md-comp-collapsible-duration')\n .trim();\n if (!raw) return 500;\n if (raw.endsWith('ms')) return parseFloat(raw);\n if (raw.endsWith('s')) return parseFloat(raw) * 1000;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : 500;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Dropdown, DropdownOptions } from './dropdown';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select dropdown initialization.\n * @default {}\n */\n dropdownOptions: Partial<DropdownOptions>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n dropdownOptions: {}\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** Dropdown UL element. */\n dropdownOptions: HTMLUListElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the dropdown plugin for this select. */\n dropdown: Dropdown;\n /** The select wrapper element. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n private _values: ValueStruct[];\n nativeTabIndex: number;\n\n constructor(el: HTMLSelectElement, options: FormSelectOptions) {\n super(el, options, FormSelect);\n if (this.el.classList.contains('browser-default')) return;\n this.el['Expressive_FormSelect'] = this;\n\n this.options = {\n ...FormSelect.defaults,\n ...options\n };\n\n this.isMultiple = this.el.multiple;\n this.nativeTabIndex = this.el.tabIndex ?? -1;\n this.el.tabIndex = -1;\n this._values = [];\n this._setupDropdown();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of FormSelect.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLSelectElement, options?: Partial<FormSelectOptions>): FormSelect;\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLSelectElement | MElement>,\n options?: Partial<FormSelectOptions>\n ): FormSelect[];\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLSelectElement | InitElements<HTMLSelectElement | MElement>,\n options: Partial<FormSelectOptions> = {}\n ): FormSelect | FormSelect[] {\n return super.init(els, options, FormSelect);\n }\n\n static getInstance(el: HTMLElement): FormSelect {\n return el['Expressive_FormSelect'];\n }\n\n destroy() {\n this._removeEventHandlers();\n // The Dropdown holds itself in the static Dropdown._dropdowns registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.dropdown?.destroy();\n this._removeDropdown();\n this.el['Expressive_FormSelect'] = undefined;\n }\n\n /**\n * Re-read the native `<select>` and update the generated dropdown to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Call this after mutating the underlying select programmatically.\n */\n refresh() {\n this._setValueToInput();\n this._setSelectedStates();\n }\n\n _setupEventHandlers() {\n this.dropdownOptions.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick);\n el.addEventListener('keydown', this._handleOptionKeydown);\n });\n this.el.addEventListener('change', this._handleSelectChange);\n this.input.addEventListener('click', this._handleInputClick);\n }\n\n _removeEventHandlers() {\n this.dropdownOptions.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.removeEventListener('click', this._handleOptionClick);\n el.removeEventListener('keydown', this._handleOptionKeydown);\n });\n this.el.removeEventListener('change', this._handleSelectChange);\n this.input.removeEventListener('click', this._handleInputClick);\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n };\n\n // Named rather than inline so that _removeEventHandlers can actually detach\n // it - an anonymous listener per option was unremovable.\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n _arraysEqual<T, E>(a: T[], b: (E | T)[]) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; ++i) if (a[i] !== b[i]) return false;\n return true;\n }\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n const previousSelectedValues = this.getSelectedValues();\n if (this.isMultiple) {\n // Multi-Select\n this._toggleEntryFromArray(value);\n } else {\n // Single-Select\n this._deselectAll();\n this._selectValue(value);\n }\n // Refresh Input-Text\n this._setValueToInput();\n // Trigger Change-Event only when data is different\n const actualSelectedValues = this.getSelectedValues();\n const selectionHasChanged = !this._arraysEqual(previousSelectedValues, actualSelectedValues);\n if (selectionHasChanged)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n ); // trigger('change');\n }\n if (!this.isMultiple) this.dropdown.close();\n }\n\n _handleInputClick = () => {\n if (this.dropdown && this.dropdown.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n _setupDropdown() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('select-wrapper', 'input-field');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n this.el.before(this.wrapper);\n\n // Move actual select element into overflow hidden wrapper\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n this.wrapper.append(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n\n if (this.el.disabled) this.wrapper.classList.add('disabled');\n\n this.selectOptions = <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n\n // Create dropdown\n this.dropdownOptions = document.createElement('ul');\n this.dropdownOptions.id = `select-options-${Utils.guid()}`;\n this.dropdownOptions.setAttribute('popover', 'auto');\n this.dropdownOptions.classList.add('dropdown-content', 'select-dropdown');\n this.dropdownOptions.setAttribute('role', 'listbox');\n this.dropdownOptions.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.dropdownOptions.classList.add('multiple-select-dropdown');\n\n // Create dropdown structure\n if (this.selectOptions.length > 0) {\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n // Option\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._addOptionToValues(realOption as HTMLOptionElement, virtualOption);\n } else if (realOption.tagName === 'OPTGROUP') {\n // Optgroup\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this.dropdownOptions.append(groupParent);\n\n const groupChildren = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((realOption) => {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n 'optgroup-option'\n );\n const childId = 'opt-child-' + Utils.guid();\n virtualOption.id = childId;\n groupChildren.push(childId);\n this._addOptionToValues(realOption, virtualOption);\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n this.wrapper.append(this.dropdownOptions);\n\n // Add input dropdown\n this.input = document.createElement('input');\n this.input.id = 'm_select-input-' + Utils.guid();\n this.input.classList.add('select-dropdown', 'dropdown-trigger');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.dropdownOptions.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString(); //setAttribute(\"aria-required\", this.el.hasAttribute(\"required\"));\n if (this.el.disabled) this.input.disabled = true; // 'true');\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n // Adds aria-attributes to input element\n this.input.setAttribute('role', 'combobox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-owns', this.dropdownOptions.id);\n this.input.setAttribute('aria-controls', this.dropdownOptions.id);\n this.input.placeholder = ' ';\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n\n // Add caret\n const dropdownIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); //document.createElement('svg')\n dropdownIcon.classList.add('caret');\n dropdownIcon.setAttribute('height', '24');\n dropdownIcon.setAttribute('width', '24');\n dropdownIcon.setAttribute('viewBox', '0 0 24 24');\n dropdownIcon.ariaHidden = 'true';\n dropdownIcon.innerHTML = `<path d=\"M7 10l5 5 5-5z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/>`;\n this.wrapper.prepend(dropdownIcon);\n\n // Initialize dropdown\n if (!this.el.disabled) {\n const dropdownOptions = { ...this.options.dropdownOptions };\n dropdownOptions.coverTrigger = false;\n const userOnOpenEnd = dropdownOptions.onOpenEnd;\n const userOnCloseEnd = dropdownOptions.onCloseEnd;\n // Add callback for centering selected option when dropdown content is scrollable\n dropdownOptions.onOpenEnd = () => {\n const selectedOption = this.dropdownOptions.querySelector('.selected');\n if (selectedOption) {\n // Focus selected option in dropdown\n Utils.keyDown = true;\n this.dropdown.focusedIndex = [...selectedOption.parentNode.children].indexOf(\n selectedOption\n );\n this.dropdown._focusFocusedItem();\n Utils.keyDown = false;\n // Handle scrolling to selected option\n if (this.dropdown.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n (this.dropdownOptions as HTMLElement).getBoundingClientRect().top; // scroll to selected option\n scrollOffset -= this.dropdownOptions.clientHeight / 2; // center in dropdown\n this.dropdownOptions.scrollTop = scrollOffset;\n }\n }\n this.input.ariaExpanded = 'true';\n // Handle user declared onOpenEnd if needed\n if (userOnOpenEnd && typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.dropdown, this.el);\n };\n // Add callback for reseting \"expanded\" state\n dropdownOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n // Handle user declared onOpenEnd if needed\n if (userOnCloseEnd && typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.dropdown, this.el);\n };\n // Prevent dropdown from closing too early\n dropdownOptions.closeOnClick = false;\n this.dropdown = Dropdown.init(this.input, dropdownOptions);\n }\n // Add initial selections\n this._setSelectedStates();\n // move label\n if (this.labelEl) this.input.after(this.labelEl);\n }\n\n _addOptionToValues(realOption: HTMLOptionElement, virtualOption: HTMLElement) {\n this._values.push({ el: realOption, optionEl: virtualOption });\n }\n\n _removeDropdown() {\n this.wrapper.querySelector('.caret').remove();\n this.input.remove();\n this.dropdownOptions.remove();\n this.wrapper.before(this.el);\n this.wrapper.remove();\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.setAttribute('role', 'option');\n if (realOption.disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !realOption.disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n // add Icon\n const iconUrl = realOption.getAttribute('data-icon');\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (iconUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = iconUrl;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n // Check for multiple type\n this.dropdownOptions.append(li);\n return li;\n }\n\n _selectValue(value: ValueStruct) {\n value.el.selected = true;\n value.optionEl.classList.add('selected');\n value.optionEl.ariaSelected = 'true'; // setAttribute(\"aria-selected\", true);\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = true;\n }\n\n _deselectValue(value: ValueStruct) {\n value.el.selected = false;\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false'; //setAttribute(\"aria-selected\", false);\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = false;\n }\n\n _deselectAll() {\n this._values.forEach((value) => this._deselectValue(value));\n }\n\n _isValueSelected(value: ValueStruct) {\n const realValues = this.getSelectedValues();\n return realValues.some((realValue) => realValue === value.el.value);\n }\n\n _toggleEntryFromArray(value: ValueStruct) {\n if (this._isValueSelected(value)) this._deselectValue(value);\n else this._selectValue(value);\n }\n\n _getSelectedOptions(): HTMLOptionElement[] {\n // remove null, false, ... values\n return Array.prototype.filter.call(\n this.el.selectedOptions,\n (realOption: HTMLOptionElement) => realOption\n );\n }\n\n _setValueToInput() {\n const selectedRealOptions = this._getSelectedOptions();\n const selectedOptionPairs = this._values.filter(\n (value) => selectedRealOptions.indexOf(value.el) >= 0\n );\n // Filter not disabled\n const notDisabledOptionPairs = selectedOptionPairs.filter((op) => !op.el.disabled);\n // textContent, not innerText: innerText is layout-dependent, so reading it\n // once per selected option forced a reflow each time.\n const texts = notDisabledOptionPairs.map((value) =>\n value.optionEl.querySelector('span').textContent.trim()\n );\n // Set input-text to first Option with empty value which indicates a description like \"choose your option\"\n if (texts.length === 0) {\n const firstDisabledOption = <HTMLOptionElement>this.el.querySelector('option:disabled');\n if (firstDisabledOption && firstDisabledOption.value === '') {\n this.input.value = firstDisabledOption.innerText;\n return;\n }\n }\n this.input.value = texts.join(', ');\n }\n\n _setSelectedStates() {\n this._values.forEach((value) => {\n const optionIsSelected = value.el.selected;\n const cb = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (cb) cb.checked = optionIsSelected;\n if (optionIsSelected) {\n this._activateOption(this.dropdownOptions, value.optionEl);\n } else {\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false'; // attr(\"aria-selected\", 'false');\n }\n });\n }\n\n _activateOption(ul: HTMLElement, li: HTMLElement) {\n if (!li) return;\n if (!this.isMultiple)\n ul.querySelectorAll('li.selected').forEach((li) => li.classList.remove('selected'));\n li.classList.add('selected');\n li.ariaSelected = 'true';\n }\n\n getSelectedValues() {\n return this._getSelectedOptions().map((realOption) => realOption.value);\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport interface DockedDisplayPluginOptions {\n /**\n * Margin between element and docked container\n */\n margin: number,\n /**\n * Transition movement\n */\n transition: number,\n /**\n * Transition duration\n */\n duration: number,\n /**\n * The alignment of the docked container\n */\n align: string\n}\n\nconst _defaults: DockedDisplayPluginOptions = {\n margin: 5,\n transition: 10,\n duration: 250,\n align: 'left'\n}\n\nexport class DockedDisplayPlugin {\n private readonly el: HTMLElement;\n private readonly container: HTMLDivElement;\n private options: Partial<DockedDisplayPluginOptions>;\n private visible: boolean;\n\n constructor(el: HTMLElement, container: HTMLElement, options: Partial<DockedDisplayPluginOptions>) {\n this.el = el;\n this.options = {\n ..._defaults,\n ...options\n };\n\n this.container = document.createElement('div');\n this.container.classList.add('display-docked');\n this.container.append(container);\n el.parentElement.append(this.container);\n\n document.addEventListener('click', this._handleDocumentClick);\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n if (this.visible && !(this.el === <HTMLElement>e.target) && !((<HTMLElement>e.target).closest('.display-docked'))) {\n this.hide();\n }\n };\n\n /**\n * Tears the plugin down. The document listener holds a reference to this\n * instance - and through it the whole picker subtree - so the owning\n * component must call this from its own destroy().\n */\n destroy = () => {\n document.removeEventListener('click', this._handleDocumentClick);\n this.container.remove();\n };\n\n /**\n * Initializes instance of DockedDisplayPlugin\n * @param el HTMLElement to position to\n * @param container HTMLElement to be positioned\n * @param options Plugin options\n */\n static init(el: HTMLElement, container: HTMLElement, options?: Partial<DockedDisplayPluginOptions>): DockedDisplayPlugin {\n return new DockedDisplayPlugin(el, container, options);\n }\n\n show = () => {\n if (this.visible) return;\n this.visible = true;\n const coordinates = Utils._setAbsolutePosition(this.el, this.container, 'bottom', this.options.margin, this.options.transition, this.options.align);\n\n // @todo move to Util? -> duplicate code fragment with tooltip\n // easeOutCubic\n this.container.style.visibility = 'visible';\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(${coordinates.x}px) translateY(${coordinates.y}px)`;\n this.container.style.opacity = (1).toString();\n }, 1);\n };\n\n hide = () => {\n if (!this.visible) return;\n this.visible = false;\n // @todo move to Util? -> duplicate code fragment with tooltip\n this.container.removeAttribute('style');\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(0px) translateY(0px)`;\n this.container.style.opacity = '0';\n }, 1);\n };\n}\n", "import { Utils } from '../core/utils';\nimport { FormSelect } from './select';\nimport { BaseOptions, Component, I18nOptions, InitElements, MElement } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport interface DateI18nOptions extends I18nOptions {\n previousMonth: string;\n nextMonth: string;\n months: string[];\n monthsShort: string[];\n weekdays: string[];\n weekdaysShort: string[];\n weekdaysAbbrev: string[];\n}\n\nexport interface DatepickerOptions extends BaseOptions {\n /**\n * The date output format for the input field value\n * or a function taking the date and outputting the\n * formatted date string.\n * @default 'mmm dd, yyyy'\n */\n format: string | ((d: Date) => string);\n /**\n * Used to create date object from current input string.\n * @default null\n */\n parse: ((value: string, format: string) => Date) | null;\n /**\n * The initial condition if the datepicker is based on date range.\n * @default false\n */\n isDateRange: boolean;\n /**\n * The selector of the user specified date range end element\n */\n dateRangeEndEl: string | null;\n /**\n * The initial condition if the datepicker is based on multiple date selection.\n * @default false\n */\n isMultipleSelection: boolean;\n /**\n * The initial date to view when first opened.\n * @default null\n */\n defaultDate: Date | null;\n /**\n * The initial end date to view when first opened.\n * @default null\n */\n defaultEndDate: Date | null;\n /**\n * Make the `defaultDate` the initial selected value.\n * @default false\n */\n setDefaultDate: boolean;\n /**\n * Make the `defaultEndDate` the initial selected value.\n * @default false\n */\n setDefaultEndDate: boolean;\n /**\n * Prevent selection of any date on the weekend.\n * @default false\n */\n disableWeekends: boolean;\n /**\n * Custom function to disable certain days.\n * @default null\n */\n disableDayFn: ((day: Date) => boolean) | null;\n /**\n * First day of week (0: Sunday, 1: Monday etc).\n * @default 0\n */\n firstDay: number;\n /**\n * The earliest date that can be selected.\n * @default null\n */\n minDate: Date | null;\n /**\n * The latest date that can be selected.\n * @default null\n */\n maxDate: Date | null;\n /**\n * Number of years either side, or array of upper/lower range.\n * @default 10\n */\n yearRange: number | number[];\n /**\n * Sort year range in reverse order.\n * @default false\n */\n yearRangeReverse: boolean;\n /**\n * Changes Datepicker to RTL.\n * @default false\n */\n isRTL: boolean;\n /**\n * Show month after year in Datepicker title.\n * @default false\n */\n showMonthAfterYear: boolean;\n /**\n * Render days of the calendar grid that fall in the next\n * or previous month.\n * @default false\n */\n showDaysInNextAndPreviousMonths: boolean;\n /**\n * Specify if the docked datepicker is in open state by default\n */\n openByDefault: boolean;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the calendar in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the datepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit calendar day select to input field\n * @default false\n */\n autoSubmit: true;\n /**\n * Internationalization options.\n */\n i18n: Partial<DateI18nOptions>;\n /**\n * An array of string returned by `Date.toDateString()`,\n * indicating there are events in the specified days.\n * @default []\n */\n events: string[];\n /**\n * Callback function when date is selected,\n * first parameter is the newly selected date.\n * @default null\n */\n onSelect: ((selectedDate: Date) => void) | null;\n /**\n * Callback function when Datepicker is closed.\n * @default null\n */\n //onClose: (() => void) | null; // TODO: Remove\n /**\n * Callback function when Datepicker HTML is refreshed.\n * @default null\n */\n onDraw: (() => void) | null;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for interaction with confirm button.\n * @default null\n */\n onConfirm: (() => void) | null;\n /**\n * Callback function for interaction with close button.\n * @default null\n */\n onCancel: (() => void) | null;\n\n /** Field used for internal calculations DO NOT CHANGE IT */\n minYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n minMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n startRange?: Date;\n /** Field used for internal calculations DO NOT CHANGE IT */\n endRange?: Date;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: DatepickerOptions = {\n // the default output format for the input field value\n format: 'mmm dd, yyyy',\n // Used to create date object from current input string\n parse: null,\n // The initial condition if the datepicker is based on date range\n isDateRange: false,\n // The selector of the user specified date range end element\n dateRangeEndEl: null,\n // The initial condition if the datepicker is based on multiple date selection\n isMultipleSelection: false,\n // The initial date to view when first opened\n defaultDate: null,\n // The initial end date to view when first opened\n defaultEndDate: null,\n // Make the `defaultDate` the initial selected value\n setDefaultDate: false,\n // Make the `defaultEndDate` the initial selected value\n setDefaultEndDate: false,\n disableWeekends: false,\n disableDayFn: null,\n // First day of week (0: Sunday, 1: Monday etc)\n firstDay: 0,\n // The earliest date that can be selected\n minDate: null,\n // Thelatest date that can be selected\n maxDate: null,\n // Number of years either side, or array of upper/lower range\n yearRange: 10,\n // used internally (don't config outside)\n minYear: 0,\n maxYear: 9999,\n minMonth: undefined,\n maxMonth: undefined,\n startRange: null,\n endRange: null,\n isRTL: false,\n yearRangeReverse: false,\n // Render the month after year in the calendar title\n showMonthAfterYear: false,\n // Render days of the calendar grid that fall in the next or previous month\n showDaysInNextAndPreviousMonths: false,\n // Specify if docked picker is in open state by default\n openByDefault: false,\n // Specify a DOM element to render the calendar in\n container: null,\n // Show clear button\n showClearBtn: false,\n // Autosubmit\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok',\n previousMonth: '\u2039',\n nextMonth: '\u203A',\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ],\n monthsShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n },\n // events array\n events: [],\n // callback function\n onSelect: null,\n onDraw: null,\n onInputInteraction: null,\n displayPlugin: null,\n displayPluginOptions: null,\n onConfirm: null,\n onCancel: null,\n};\n\nexport class Datepicker extends Component<DatepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n multiple: boolean = false;\n calendarEl: HTMLElement;\n\n /** CLEAR button instance. */\n // clearBtn: HTMLElement;\n /** DONE button instance */\n /*doneBtn: HTMLElement;\n cancelBtn: HTMLElement;*/\n\n containerEl: HTMLElement;\n yearTextEl: HTMLElement;\n dateTextEl: HTMLElement;\n endDateEl: HTMLInputElement;\n dateEls: HTMLInputElement[];\n /** The selected Date. */\n date: Date;\n endDate: null | Date;\n dates: Date[];\n formats: object;\n calendars: [{ month: number; year: number }];\n private _y: number;\n private _m: number;\n private displayPlugin: DockedDisplayPlugin;\n private footer: HTMLElement;\n /** Nesting depth of {@link _batchDraws}; > 0 means draws are being collected. */\n private _drawDepth = 0;\n /** Whether a draw was requested while batching. */\n private _drawDirty = false;\n /** Shape of the currently rendered controls; see {@link _controlsCacheKey}. */\n private _controlsKey: string = null;\n /** id linking the controls element to the table's aria-labelledby. */\n private _randId: string = null;\n static _template: string;\n\n constructor(el: HTMLInputElement, options: Partial<DatepickerOptions>) {\n super(el, options, Datepicker);\n this.el['Expressive_Datepicker'] = this;\n\n this.options = {\n ...Datepicker.defaults,\n ...options\n };\n\n // make sure i18n defaults are not lost when only few i18n option properties are passed\n if (!!options && options.hasOwnProperty('i18n') && typeof options.i18n === 'object') {\n this.options.i18n = { ...Datepicker.defaults.i18n, ...options.i18n };\n }\n\n // Remove time component from minDate and maxDate options\n if (this.options.minDate) this.options.minDate.setHours(0, 0, 0, 0);\n if (this.options.maxDate) this.options.maxDate.setHours(0, 0, 0, 0);\n\n this.id = Utils.guid();\n\n this._setupVariables();\n this._insertHTMLIntoDOM();\n this._setupEventHandlers();\n\n if (!this.options.defaultDate) {\n this.options.defaultDate = new Date(Date.parse(this.el.value));\n }\n\n const defDate = this.options.defaultDate;\n if (Datepicker._isDate(defDate)) {\n if (this.options.setDefaultDate) {\n this.setDate(defDate, true);\n this.setInputValue(this.el, defDate);\n } else {\n this.gotoDate(defDate);\n }\n } else {\n this.gotoDate(new Date());\n }\n if (this.options.isDateRange) {\n this.multiple = true;\n const defEndDate = this.options.defaultEndDate;\n if (Datepicker._isDate(defEndDate)) {\n if (this.options.setDefaultEndDate) {\n this.setDate(defEndDate, true, true);\n this.setInputValue(this.endDateEl, defEndDate);\n }\n }\n }\n if (this.options.isMultipleSelection) {\n this.multiple = true;\n this.dates = [];\n this.dateEls = [];\n this.dateEls.push(el);\n }\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Datepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<DatepickerOptions>): Datepicker;\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<DatepickerOptions>\n ): Datepicker[];\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<DatepickerOptions> = {}\n ): Datepicker | Datepicker[] {\n return super.init(els, options, Datepicker);\n }\n\n /**\n * Escape a value for interpolation into the calendar markup.\n *\n * `draw()` assembles the calendar as an HTML string, so every value that is\n * not a number this class computed itself has to go through here. In\n * practice that means the i18n strings: month and weekday names are the one\n * part of a datepicker that routinely comes from a translation file, and a\n * translation file is as trustworthy as whatever wrote it.\n */\n static _escape(value: unknown): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n static _isDate(obj) {\n return /Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n }\n\n static _isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n }\n\n /**\n * @deprecated as this function has no effect without any return statement or global parameter setter.\n */\n static _setToStartOfDay(date) {\n if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n }\n\n static _getDaysInMonth(year, month) {\n return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][\n month\n ];\n }\n\n static _isLeapYear(year) {\n // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n static _compareDates(a, b) {\n // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n return a.getTime() === b.getTime();\n }\n\n static _compareWithinRange(day: Date, date: Date, dateEnd: Date) {\n return day.getTime() > date.getTime() && day.getTime() < dateEnd.getTime();\n }\n\n static _comparePastDate(a: Date, b: Date) {\n return a.getTime() < b.getTime();\n }\n\n static getInstance(el: HTMLElement): Datepicker {\n return el['Expressive_Datepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.destroySelects();\n this.el['Expressive_Datepicker'] = undefined;\n }\n\n destroySelects() {\n const oldYearSelect = this.calendarEl.querySelector('.orig-select-year');\n if (oldYearSelect) {\n FormSelect.getInstance(oldYearSelect as HTMLElement).destroy();\n }\n const oldMonthSelect = this.calendarEl.querySelector('.orig-select-month');\n if (oldMonthSelect) {\n FormSelect.getInstance(oldMonthSelect as HTMLElement).destroy();\n }\n }\n\n _insertHTMLIntoDOM() {\n // HTML5 input date field support\n if (this.el.type == 'date') {\n this.el.classList.add('datepicker-date-input');\n }\n\n // `!x === null` is always false, so this never ran; _renderDateInputFormat\n // now no-ops on its own when there is no hint element to fill in.\n this._renderDateInputFormat(this.el);\n\n if (this.options.isDateRange) {\n this.containerEl.classList.add('daterange');\n if (!this.options.dateRangeEndEl) {\n this.endDateEl = this.createDateInput();\n this.endDateEl.classList.add('datepicker-end-date');\n } else {\n // querySelector returns null, never undefined: the old check compared\n // against undefined, so a miss skipped the warning and fell through to\n // dereferencing null.\n this.endDateEl = document.querySelector(this.options.dateRangeEndEl);\n if (!this.endDateEl) {\n console.warn('Specified date range end input element in dateRangeEndEl not found');\n } else {\n this._renderDateInputFormat(this.endDateEl);\n }\n }\n }\n\n /*if (this.options.showClearBtn) {\n this.clearBtn.style.visibility = '';\n this.clearBtn.innerText = this.options.i18n.clear;\n }\n this.doneBtn.innerText = this.options.i18n.done;\n this.cancelBtn.innerText = this.options.i18n.cancel;*/\n Utils.createButton(this.footer, this.options.i18n.clear, ['datepicker-clear'], this.options.showClearBtn, this._handleClearClick);\n\n if (!this.options.autoSubmit) {\n Utils.createConfirmationContainer(this.footer, this.options.i18n.done, this.options.i18n.cancel, this._confirm, this._cancel);\n }\n\n if (this.options.container) {\n const optEl = this.options.container;\n this.options.container =\n optEl instanceof HTMLElement ? optEl : (document.querySelector(optEl) as HTMLElement);\n this.options.container.append(this.containerEl);\n } else {\n //this.containerEl.before(this.el);\n const appendTo = !this.endDateEl ? this.el : this.endDateEl;\n if (!this.options.openByDefault) (this.containerEl as HTMLElement).setAttribute('style', 'display: none; visibility: hidden;');\n appendTo.parentElement.after(this.containerEl);\n }\n }\n\n /**\n * Renders the date input format into the optional `.datepicker-format` hint\n * next to the input, if the consumer provided one.\n */\n _renderDateInputFormat(el: HTMLInputElement) {\n const formatEl = el.parentElement?.querySelector('.datepicker-format');\n if (!formatEl) return;\n // textContent, and nothing at all for a function format: this used to be\n // `innerHTML = format.toString()`, which rendered a format string as\n // markup and dumped a function's entire source into the page.\n formatEl.textContent =\n typeof this.options.format === 'function' ? '' : String(this.options.format);\n }\n\n /**\n * Gets a string representation of the given date.\n */\n toString(date: Date = this.date, format: string | ((d: Date) => string) = null): string {\n format = format || this.options.format;\n if (typeof format === 'function') return format(date);\n if (!Datepicker._isDate(date)) return '';\n // String Format\n return this.formatDate(date, format);\n }\n\n /**\n * Returns the formatted date.\n */\n formatDate(date: Date, format: string) {\n const formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);\n return formatArray\n .map((label) => (this.formats[label] ? this.formats[label](date) : label))\n .join('');\n }\n\n /**\n * Sets date from input field.\n */\n setDateFromInput(el: HTMLInputElement) {\n const date = new Date(Date.parse(el.value));\n this.setDate(date, false, el == this.endDateEl, true);\n }\n\n /**\n * Set a date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param preventOnSelect Undocumented as of 5 March 2018.\n * @param isEndDate\n * @param fromUserInput\n */\n setDate(\n date: Date = null,\n preventOnSelect: boolean = false,\n isEndDate: boolean = false,\n fromUserInput: boolean = false\n ) {\n const selectedDate = this.validateDate(date);\n if (!selectedDate) {\n return;\n }\n if (!this.options.isMultipleSelection) this.setSingleDate(selectedDate, isEndDate);\n else if (!fromUserInput) this.setMultiDate(selectedDate);\n Datepicker._setToStartOfDay(selectedDate);\n this.gotoDate(selectedDate);\n if (!preventOnSelect && typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, selectedDate);\n }\n }\n\n validateDate(date: Date) {\n if (!date) {\n this._renderDateDisplay(date);\n return this.draw();\n }\n if (typeof date === 'string') {\n date = new Date(Date.parse(date));\n }\n if (!Datepicker._isDate(date)) {\n return;\n }\n const min = this.options.minDate,\n max = this.options.maxDate;\n if (Datepicker._isDate(min) && date < min) {\n date = min;\n } else if (Datepicker._isDate(max) && date > max) {\n date = max;\n }\n return new Date(date.getTime());\n }\n\n /**\n * Set a single date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param isEndDate\n */\n setSingleDate(date: Date, isEndDate: boolean) {\n if (!isEndDate) {\n this.date = date;\n } else if (isEndDate) {\n this.endDate = date;\n }\n }\n\n /**\n * Set a multi date on the datepicker.\n * @param date Date to set on the datepicker.\n */\n setMultiDate(date: Date) {\n const selectedDate = this.dates?.find((item) => {\n return item.getTime() === date.getTime() ? item : false;\n });\n if (!selectedDate) {\n this.dates.push(date);\n } else {\n this.dates.splice(this.dates.indexOf(selectedDate), 1);\n }\n this.dates.sort((a: Date, b: Date) => (a.getTime() < b.getTime() ? -1 : 0));\n }\n\n /**\n * Sets the data-date attribute on the date input field\n */\n setDataDate(el, date) {\n el.setAttribute('data-date', this.toString(date));\n }\n\n /**\n * Sets dates on the input values.\n */\n setInputValues() {\n if (!this.options?.isMultipleSelection) {\n this.setInputValue(this.el, this.date);\n if (this.options?.isDateRange) {\n this.setInputValue(this.endDateEl, this.endDate);\n }\n return;\n }\n this.setMultipleSelectionInputValues();\n }\n\n setMultipleSelectionInputValues() {\n const dateElsArr = Array.from(this.dateEls).filter((el, index) => {\n if (index > this.dates.length - 1) return el;\n });\n dateElsArr.forEach((el) => {\n el.remove();\n });\n this.dates.forEach((date: Date, index: number) => {\n if (Array.from(this.dateEls)[index]) {\n this.setInputValue(this.dateEls[index], date);\n return;\n }\n\n const dateEl = this.createDateInput();\n this.setInputValue(dateEl, date);\n this.dateEls.push(dateEl);\n });\n }\n\n /**\n * Sets given date as the input value on the given element.\n */\n setInputValue(el, date) {\n if (el.type == 'date') {\n this.setDataDate(el, date);\n el.value = this.formatDate(date, 'yyyy-mm-dd');\n } else {\n el.value = this.toString(date);\n }\n this.el.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { firedBy: this }\n })\n );\n }\n\n /**\n * Renders the date in the modal head section.\n */\n _renderDateDisplay(date: Date, endDate: Date = null) {\n const displayDate = Datepicker._isDate(date) ? date : new Date();\n // this.yearTextEl.innerHTML = displayDate.getFullYear().toString();\n // @todo should we include an option for date formatting by component options?\n // textContent: formatDate splices i18n month and weekday names in.\n if (!this.options.isDateRange) {\n this.dateTextEl.textContent = this.formatDate(displayDate, 'ddd, mmm d');\n } else {\n const displayEndDate = Datepicker._isDate(endDate) ? endDate : new Date();\n this.dateTextEl.textContent = `${this.formatDate(displayDate, 'mmm d')} - ${this.formatDate(displayEndDate, 'mmm d')}`;\n }\n }\n\n /**\n * Change date view to a specific date on the datepicker.\n * @param date Date to show on the datepicker.\n */\n gotoDate(date: Date) {\n let newCalendar = true;\n if (!Datepicker._isDate(date)) {\n return;\n }\n if (this.calendars) {\n const firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n lastVisibleDate = new Date(\n this.calendars[this.calendars.length - 1].year,\n this.calendars[this.calendars.length - 1].month,\n 1\n ),\n visibleDate = date.getTime();\n // get the end of the month\n lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);\n lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);\n newCalendar =\n visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;\n }\n if (newCalendar) {\n this.calendars = [\n {\n month: date.getMonth(),\n year: date.getFullYear()\n }\n ];\n }\n this.adjustCalendars();\n }\n\n adjustCalendars() {\n this.calendars[0] = this.adjustCalendar(this.calendars[0]);\n this.draw();\n }\n\n adjustCalendar(calendar) {\n if (calendar.month < 0) {\n calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);\n calendar.month += 12;\n }\n if (calendar.month > 11) {\n calendar.year += Math.floor(Math.abs(calendar.month) / 12);\n calendar.month -= 12;\n }\n return calendar;\n }\n\n nextMonth() {\n this.calendars[0].month++;\n this.adjustCalendars();\n }\n\n prevMonth() {\n this.calendars[0].month--;\n this.adjustCalendars();\n }\n\n render(year, month, randId) {\n const now = new Date(),\n days = Datepicker._getDaysInMonth(year, month),\n data = [];\n let before = new Date(year, month, 1).getDay(),\n row = [];\n Datepicker._setToStartOfDay(now);\n if (this.options.firstDay > 0) {\n before -= this.options.firstDay;\n if (before < 0) {\n before += 7;\n }\n }\n const previousMonth = month === 0 ? 11 : month - 1,\n nextMonth = month === 11 ? 0 : month + 1,\n yearOfPreviousMonth = month === 0 ? year - 1 : year,\n yearOfNextMonth = month === 11 ? year + 1 : year,\n daysInPreviousMonth = Datepicker._getDaysInMonth(yearOfPreviousMonth, previousMonth);\n let cells = days + before,\n after = cells;\n while (after > 7) {\n after -= 7;\n }\n cells += 7 - after;\n let isWeekSelected = false;\n for (let i = 0, r = 0; i < cells; i++) {\n const day = new Date(year, month, 1 + (i - before)),\n isToday = Datepicker._compareDates(day, now),\n hasEvent = this.options.events.indexOf(day.toDateString()) !== -1,\n isEmpty = i < before || i >= days + before,\n isStartRange =\n this.options.startRange && Datepicker._compareDates(this.options.startRange, day),\n isEndRange = this.options.endRange && Datepicker._compareDates(this.options.endRange, day),\n isInRange =\n this.options.startRange &&\n this.options.endRange &&\n this.options.startRange < day &&\n day < this.options.endRange,\n isDisabled =\n (this.options.minDate && day < this.options.minDate) ||\n (this.options.maxDate && day > this.options.maxDate) ||\n (this.options.disableWeekends && Datepicker._isWeekend(day)) ||\n (this.options.disableDayFn && this.options.disableDayFn(day)),\n isDateRangeStart = this.options.isDateRange && this.date && this.endDate && Datepicker._compareDates(this.date, day),\n isDateRangeEnd = this.options.isDateRange && this.endDate && Datepicker._compareDates(this.endDate, day),\n isDateRange =\n this.options.isDateRange &&\n Datepicker._isDate(this.endDate) &&\n Datepicker._compareWithinRange(day, this.date, this.endDate);\n let dayNumber = 1 + (i - before),\n monthNumber = month,\n yearNumber = year;\n\n let isSelected = false;\n if (Datepicker._isDate(this.date)) {\n isSelected = Datepicker._compareDates(day, this.date);\n }\n\n if (!isSelected && Datepicker._isDate(this.endDate)) {\n isSelected = Datepicker._compareDates(day, this.endDate);\n }\n\n if (\n this.options.isMultipleSelection &&\n this.dates?.some((item) => item.getTime() === day.getTime())\n ) {\n isSelected = true;\n }\n\n if (isEmpty) {\n if (i < before) {\n dayNumber = daysInPreviousMonth + dayNumber;\n monthNumber = previousMonth;\n yearNumber = yearOfPreviousMonth;\n } else {\n dayNumber = dayNumber - days;\n monthNumber = nextMonth;\n yearNumber = yearOfNextMonth;\n }\n }\n\n const dayConfig = {\n day: dayNumber,\n month: monthNumber,\n year: yearNumber,\n hasEvent: hasEvent,\n isSelected: isSelected,\n isToday: isToday,\n isDisabled: isDisabled,\n isEmpty: isEmpty,\n isStartRange: isStartRange,\n isEndRange: isEndRange,\n isInRange: isInRange,\n showDaysInNextAndPreviousMonths: this.options.showDaysInNextAndPreviousMonths,\n isDateRangeStart: isDateRangeStart,\n isDateRangeEnd: isDateRangeEnd,\n isDateRange: isDateRange\n };\n\n row.push(this.renderDay(dayConfig));\n\n if (++r === 7) {\n data.push(this.renderRow(row, this.options.isRTL, isWeekSelected));\n row = [];\n r = 0;\n isWeekSelected = false;\n }\n }\n return this.renderTable(this.options, data, randId);\n }\n\n renderDay(opts) {\n const classMap = {\n isDisabled: 'is-disabled',\n isToday: 'is-today',\n isSelected: 'is-selected',\n hasEvent: 'has-event',\n isInRange: 'is-inrange',\n isStartRange: 'is-startrange',\n isEndRange: 'is-endrange',\n isDateRangeStart: 'is-daterange-start',\n isDateRangeEnd: 'is-daterange-end',\n isDateRange: 'is-daterange'\n },\n ariaSelected = !(['isSelected', 'isDateRange'].filter((prop) => !!(opts.hasOwnProperty(prop) && opts[prop] === true)).length === 0),\n arr = ['datepicker-day'];\n\n if (opts.isEmpty) {\n if (opts.showDaysInNextAndPreviousMonths) {\n arr.push('is-outside-current-month');\n arr.push('is-selection-disabled');\n } else {\n return '<td class=\"is-empty\"></td>';\n }\n }\n\n for (const [property, className] of Object.entries(classMap)) {\n if (opts.hasOwnProperty(property) && opts[property]) {\n arr.push(className);\n }\n }\n\n return (\n `<td data-day=\"${opts.day}\" class=\"${arr.join(' ')}\" aria-selected=\"${ariaSelected}\">` +\n `<button class=\"datepicker-day-button\" type=\"button\" data-year=\"${opts.year}\" data-month=\"${opts.month}\" data-day=\"${opts.day}\">${opts.day}</button>` +\n '</td>'\n );\n }\n\n renderRow(days, isRTL, isRowSelected) {\n return (\n '<tr class=\"datepicker-row' +\n (isRowSelected ? ' is-selected' : '') +\n '\">' +\n (isRTL ? days.reverse() : days).join('') +\n '</tr>'\n );\n }\n\n renderTable(opts, data, randId) {\n return (\n '<div class=\"datepicker-table-wrapper\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"datepicker-table\" role=\"grid\" aria-labelledby=\"' +\n randId +\n '\">' +\n this.renderHead(opts) +\n this.renderBody(data) +\n '</table></div>'\n );\n }\n\n renderHead(opts) {\n const arr = [];\n let i;\n for (i = 0; i < 7; i++) {\n const full = Datepicker._escape(this.renderDayName(opts, i));\n const abbrev = Datepicker._escape(this.renderDayName(opts, i, true));\n arr.push(`<th scope=\"col\"><abbr title=\"${full}\">${abbrev}</abbr></th>`);\n }\n return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n }\n\n renderBody(rows) {\n return '<tbody>' + rows.join('') + '</tbody>';\n }\n\n /**\n * Whether each month arrow is usable at this position in the allowed range.\n *\n * Depends on the month, which is deliberately *not* part of the controls\n * cache key - so the reuse path has to recompute and reapply it.\n */\n private _arrowState(year: number, month: number) {\n const opts = this.options;\n const isMinYear = year === opts.minYear;\n const isMaxYear = year === opts.maxYear;\n return {\n prev: !(isMinYear && (month === 0 || opts.minMonth >= month)),\n next: !(isMaxYear && (month === 11 || opts.maxMonth <= month))\n };\n }\n\n /**\n * Identifies the *shape* of the controls - everything that changes which\n * options the month and year selects contain, as opposed to which one is\n * picked. While this is stable the two FormSelects can be left alone.\n *\n * `year` is in the key because a numeric `yearRange` centres the year list\n * on the displayed year, so paging across a year boundary does change it.\n */\n private _controlsCacheKey(year: number): string {\n const o = this.options;\n return [\n year,\n o.minYear,\n o.maxYear,\n o.minMonth,\n o.maxMonth,\n Array.isArray(o.yearRange) ? o.yearRange.join('-') : o.yearRange,\n o.yearRangeReverse,\n o.showMonthAfterYear\n ].join('|');\n }\n\n renderTitle(instance, c, year, month, refYear, randId) {\n const opts = this.options,\n isMinYear = year === opts.minYear,\n isMaxYear = year === opts.maxYear;\n let i,\n j,\n arr = [],\n html =\n '<div id=\"' +\n randId +\n '\" class=\"datepicker-controls\" role=\"heading\" aria-live=\"assertive\">';\n\n // Decided up front. These used to be computed *below* the month-prev\n // button that reads `prev`, so the previous arrow was never disabled at\n // the start of the allowed range.\n const { prev, next } = this._arrowState(year, month);\n\n for (i = 0; i < 12; i++) {\n arr.push(\n '<option value=\"' +\n (year === refYear ? i - c : 12 + i - c) +\n '\"' +\n (i === month ? ' selected=\"selected\"' : '') +\n ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth)\n ? 'disabled=\"disabled\"'\n : '') +\n '>' +\n Datepicker._escape(opts.i18n.months[i]) +\n '</option>'\n );\n }\n\n const monthHtml =\n '<select class=\"datepicker-select orig-select-month\" tabindex=\"-1\">' +\n arr.join('') +\n '</select>';\n\n if (Array.isArray(opts.yearRange)) {\n i = opts.yearRange[0];\n j = opts.yearRange[1] + 1;\n } else {\n i = year - opts.yearRange;\n j = 1 + year + opts.yearRange;\n }\n\n for (arr = []; i < j && i <= opts.maxYear; i++) {\n if (i >= opts.minYear) {\n arr.push(`<option value=\"${i}\" ${i === year ? 'selected=\"selected\"' : ''}>${i}</option>`);\n }\n }\n if (opts.yearRangeReverse) arr.reverse();\n\n const yearHtml = `<select class=\"datepicker-select orig-select-year\" tabindex=\"-1\">${arr.join('')}</select>`;\n\n const leftArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/><path d=\"M0-.5h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-prev${\n prev ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n } btn\" type=\"button\">${leftArrow}</button>`;\n\n html += '<div class=\"selects-container\">';\n if (opts.showMonthAfterYear) {\n html += yearHtml + monthHtml;\n } else {\n html += monthHtml + yearHtml;\n }\n html += '</div>';\n\n const rightArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/><path d=\"M0-.25h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-next${\n next ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n } btn\" type=\"button\">${rightArrow}</button>`;\n\n return (html += '</div>');\n }\n\n /**\n * Run `fn`, collapsing every draw it triggers into a single one at the end.\n *\n * A single input click reaches draw() three times - once through\n * setDateFromInput -> setDate -> gotoDate, once directly, and once through\n * the trailing gotoDate - and each one destroys two FormSelect instances,\n * reparses the calendar and builds two fresh FormSelects. The three calls\n * cannot simply be deleted: the direct draw() is what covers an empty input\n * (setDate bails before drawing when the value does not parse), and the\n * trailing gotoDate re-centres on a date validateDate may have clamped to\n * minDate/maxDate. So they are collected instead of removed.\n *\n * Deliberately synchronous: the constructor and callers read calendarEl\n * immediately after init(), which a microtask-deferred draw would leave\n * empty.\n */\n private _batchDraws(fn: () => void) {\n this._drawDepth++;\n try {\n fn();\n } finally {\n this._drawDepth--;\n if (this._drawDepth === 0 && this._drawDirty) {\n this._drawDirty = false;\n this.draw();\n }\n }\n }\n\n // refresh HTML\n draw() {\n // Inside a batch, note that a draw is due and let the batch do it once.\n if (this._drawDepth > 0) {\n this._drawDirty = true;\n return;\n }\n const opts = this.options,\n minYear = opts.minYear,\n maxYear = opts.maxYear,\n minMonth = opts.minMonth,\n maxMonth = opts.maxMonth;\n\n if (this._y <= minYear) {\n this._y = minYear;\n if (!isNaN(minMonth) && this._m < minMonth) {\n this._m = minMonth;\n }\n }\n if (this._y >= maxYear) {\n this._y = maxYear;\n if (!isNaN(maxMonth) && this._m > maxMonth) {\n this._m = maxMonth;\n }\n }\n\n const year = this.calendars[0].year;\n const month = this.calendars[0].month;\n\n if (!this.options.isDateRange) {\n this._renderDateDisplay(this.date);\n } else {\n this._renderDateDisplay(this.date, this.endDate);\n }\n\n // Only the day grid changes when you page within a year. Rebuilding the\n // controls as well meant tearing down and reconstructing two FormSelects -\n // each with its own <ul> of 12 or 21+ options, an input, a caret and a\n // Dropdown - on every single draw.\n const key = this._controlsCacheKey(year);\n if (key === this._controlsKey && this.calendarEl.querySelector('.datepicker-controls')) {\n this._reuseControls(year, month);\n } else {\n this._controlsKey = key;\n // Held across table re-renders: the table's aria-labelledby points at\n // the controls element's id.\n this._randId = 'datepicker-title-' + Utils.guid();\n this._rebuildControls(year, month);\n }\n this._renderCalendarTable(year, month);\n\n if (typeof this.options.onDraw === 'function') {\n this.options.onDraw.call(this);\n }\n }\n\n /** Tear down the two FormSelects and render the controls from scratch. */\n private _rebuildControls(year: number, month: number) {\n this.destroySelects();\n this.calendarEl.innerHTML = this.renderTitle(this, 0, year, month, year, this._randId);\n\n const yearSelect = this.calendarEl.querySelector('.orig-select-year') as HTMLSelectElement;\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n // @todo fix accessibility @see https://github.com/materializecss/materialize/issues/522\n FormSelect.init(yearSelect, {\n classes: 'select-year',\n dropdownOptions: { container: document.body, constrainWidth: false }\n });\n FormSelect.init(monthSelect, {\n classes: 'select-month',\n dropdownOptions: { container: document.body, constrainWidth: false }\n });\n\n // Add change handlers for select\n yearSelect.addEventListener('change', this._handleYearChange);\n monthSelect.addEventListener('change', this._handleMonthChange);\n }\n\n /**\n * Keep the existing controls and bring them up to date: the selected month,\n * and the arrow states, which depend on the month rather than on the key.\n */\n private _reuseControls(year: number, month: number) {\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n if (monthSelect && monthSelect.value !== month.toString()) {\n monthSelect.value = month.toString();\n // Assigning .value fires no change event, so the wrapper needs telling.\n FormSelect.getInstance(monthSelect)?.refresh();\n }\n\n const { prev, next } = this._arrowState(year, month);\n this.calendarEl.querySelector('.month-prev')?.classList.toggle('is-disabled', !prev);\n this.calendarEl.querySelector('.month-next')?.classList.toggle('is-disabled', !next);\n }\n\n /** Replace just the day grid, leaving the controls in place. */\n private _renderCalendarTable(year: number, month: number) {\n const html = this.render(year, month, this._randId);\n const existing = this.calendarEl.querySelector('.datepicker-table-wrapper');\n if (existing) existing.outerHTML = html;\n else this.calendarEl.insertAdjacentHTML('beforeend', html);\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('change', this._handleInputChange);\n this.calendarEl.addEventListener('click', this._handleCalendarClick);\n /* this.doneBtn.addEventListener('click', this._confirm);\n this.cancelBtn.addEventListener('click', this._cancel);\n\n if (this.options.showClearBtn) {\n this.clearBtn.addEventListener('click', this._handleClearClick);\n }*/\n }\n\n _setupVariables() {\n const template = document.createElement('template');\n template.innerHTML = Datepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n\n this.calendarEl = this.containerEl.querySelector('.datepicker-calendar');\n this.yearTextEl = this.containerEl.querySelector('.year-text');\n this.dateTextEl = this.containerEl.querySelector('.date-text');\n /* if (this.options.showClearBtn) {\n this.clearBtn = this.containerEl.querySelector('.datepicker-clear');\n }\n this.doneBtn = this.containerEl.querySelector('.datepicker-done');\n this.cancelBtn = this.containerEl.querySelector('.datepicker-cancel');*/\n this.footer = this.containerEl.querySelector('.datepicker-footer');\n\n this.formats = {\n d: (date: Date) => {\n return date.getDate();\n },\n dd: (date: Date) => {\n const d = date.getDate();\n return (d < 10 ? '0' : '') + d;\n },\n ddd: (date: Date) => {\n return this.options.i18n.weekdaysShort[date.getDay()];\n },\n dddd: (date: Date) => {\n return this.options.i18n.weekdays[date.getDay()];\n },\n m: (date: Date) => {\n return date.getMonth() + 1;\n },\n mm: (date: Date) => {\n const m = date.getMonth() + 1;\n return (m < 10 ? '0' : '') + m;\n },\n mmm: (date: Date) => {\n return this.options.i18n.monthsShort[date.getMonth()];\n },\n mmmm: (date: Date) => {\n return this.options.i18n.months[date.getMonth()];\n },\n yy: (date: Date) => {\n return ('' + date.getFullYear()).slice(2);\n },\n yyyy: (date: Date) => {\n return date.getFullYear();\n }\n };\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('change', this._handleInputChange);\n this.calendarEl.removeEventListener('click', this._handleCalendarClick);\n if (this.options.isDateRange && this.endDateEl) {\n this.endDateEl.removeEventListener('click', this._handleInputClick);\n this.endDateEl.removeEventListener('keypress', this._handleInputKeydown);\n this.endDateEl.removeEventListener('change', this._handleInputChange);\n }\n }\n\n _handleInputClick = (e) => {\n // Prevents default browser datepicker modal rendering\n if (e.type == 'date') {\n e.preventDefault();\n }\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n this.gotoDate(<HTMLElement>e.target === this.el ? this.date : this.endDate);\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n }\n };\n\n _handleCalendarClick = (e) => {\n const target = <HTMLElement>e.target;\n if (target.classList.contains('is-disabled')) return;\n\n this._batchDraws(() => {\n if (\n target.classList.contains('datepicker-day-button') &&\n !target.classList.contains('is-empty') &&\n !target.parentElement.classList.contains('is-disabled')\n ) {\n const selectedDate = new Date(\n e.target.getAttribute('data-year'),\n e.target.getAttribute('data-month'),\n e.target.getAttribute('data-day')\n );\n\n if (!this.multiple || (this.multiple && this.options.isMultipleSelection)) {\n this.setDate(selectedDate);\n }\n\n // Selecting a range end draws a second time on top of setDate's.\n if (this.options.isDateRange) {\n this._handleDateRangeCalendarClick(selectedDate);\n }\n\n if (this.options.autoSubmit) this._finishSelection();\n } else if (target.closest('.month-prev')) {\n this.prevMonth();\n } else if (target.closest('.month-next')) {\n this.nextMonth();\n }\n });\n };\n\n _handleDateRangeCalendarClick = (date: Date) => {\n if (this.endDate == null || !Datepicker._compareDates(date, this.endDate)) {\n if (Datepicker._isDate(this.date) && Datepicker._comparePastDate(date, this.date)) {\n return;\n }\n\n this.setDate(date, false, Datepicker._isDate(this.date));\n return;\n }\n\n this._clearDates();\n this.draw();\n };\n\n _handleClearClick = () => {\n this._clearDates();\n this.setInputValues();\n };\n\n _clearDates = () => {\n this.date = null;\n this.endDate = null;\n this.draw();\n };\n\n _handleMonthChange = (e) => {\n this.gotoMonth(e.target.value);\n };\n\n _handleYearChange = (e) => {\n this.gotoYear(e.target.value);\n };\n\n // change view to a specific month (zero-index, e.g. 0: January)\n gotoMonth(month) {\n if (!isNaN(month)) {\n this.calendars[0].month = parseInt(month, 10);\n this.adjustCalendars();\n }\n }\n\n // change view to a specific full year (e.g. \"2012\")\n gotoYear(year) {\n if (!isNaN(year)) {\n this.calendars[0].year = parseInt(year, 10);\n this.adjustCalendars();\n }\n }\n\n _handleInputChange = (e: Event) => {\n let date;\n const el = e.target as HTMLElement;\n // Prevent change event from being fired when triggered by the plugin\n if (e['detail']?.firedBy === this) return;\n // Prevent change event from being fired if an end date is set without a start date\n if (el == this.endDateEl && !this.date) return;\n if (this.options.parse) {\n date = this.options.parse(\n (e.target as HTMLInputElement).value,\n typeof this.options.format === 'function'\n ? this.options.format(new Date(this.el.value))\n : this.options.format\n );\n } else {\n date = new Date(Date.parse((e.target as HTMLInputElement).value));\n }\n if (Datepicker._isDate(date)) {\n this.setDate(date, false, el == this.endDateEl, true);\n if (e.type == 'date') {\n this.setDataDate(e, date);\n this.setInputValues();\n }\n }\n };\n\n renderDayName(opts, day, abbr: boolean = false) {\n day += opts.firstDay;\n while (day >= 7) {\n day -= 7;\n }\n return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];\n }\n\n createDateInput() {\n const dateInput = <HTMLInputElement>this.el.cloneNode(true);\n // cloneNode copies the id too, and two elements sharing one id break every\n // lookup that goes through it.\n dateInput.removeAttribute('id');\n dateInput.addEventListener('click', this._handleInputClick);\n dateInput.addEventListener('keypress', this._handleInputKeydown);\n dateInput.addEventListener('change', this._handleInputChange);\n this.el.parentElement.appendChild(dateInput);\n return dateInput;\n }\n\n // Set input value to the selected date and close Datepicker\n _finishSelection = () => {\n this.setInputValues();\n // Commented out because of function deprecations\n // this.close();\n };\n\n _confirm = () => {\n this._finishSelection();\n if (typeof this.options.onConfirm === 'function') this.options.onConfirm.call(this);\n }\n\n _cancel = () => {\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n };\n\n // deprecated\n open() {\n console.warn('Datepicker.open() is deprecated. Remove this method and wrap in modal yourself.');\n return this;\n }\n close() {\n console.warn(\n 'Datepicker.close() is deprecated. Remove this method and wrap in modal yourself.'\n );\n return this;\n }\n\n static {\n Datepicker._template = `\n <div class=\"datepicker-container\">\n <div class=\"datepicker-date-display\">\n <span class=\"year-text\"></span>\n <span class=\"date-text\"></span>\n </div>\n <div class=\"datepicker-calendar-container\">\n <div class=\"datepicker-calendar\"></div>\n <div class=\"datepicker-footer\">\n <!--<button class=\"btn-flat datepicker-clear waves-effect\" style=\"visibility: hidden;\" type=\"button\"></button>\n <div class=\"confirmation-btns\">\n <button class=\"btn-flat datepicker-cancel waves-effect\" type=\"button\"></button>\n <button class=\"btn-flat datepicker-done waves-effect\" type=\"button\"></button>\n </div>-->\n </div>\n </div>\n </div>`;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { BaseOptions, Component, InitElements, MElement } from '../core/component';\n\nexport interface LightboxOptions extends BaseOptions {\n /**\n * Transition in duration in milliseconds.\n * @default 275\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 200\n */\n outDuration: number;\n /**\n * Callback function called before lightbox is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before lightbox is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: LightboxOptions = {\n inDuration: 275,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nexport class Lightbox extends Component<LightboxOptions> {\n /** If the lightbox overlay is showing. */\n overlayActive: boolean;\n /** If the lightbox is no longer being animated. */\n doneAnimating: boolean;\n /** Caption, if specified. */\n caption: string;\n /** Original width of image. */\n originalWidth: number;\n /** Original height of image. */\n originalHeight: number;\n private originInlineStyles: string;\n private placeholder: HTMLElement;\n private _changedAncestorList: HTMLElement[];\n private newHeight: number;\n private newWidth: number;\n private windowWidth: number;\n private windowHeight: number;\n private attrWidth: string;\n private attrHeight: string;\n private _overlay: HTMLElement;\n private _photoCaption: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<LightboxOptions>) {\n super(el, options, Lightbox);\n this.el['Expressive_Lightbox'] = this;\n\n this.options = {\n ...Lightbox.defaults,\n ...options\n };\n\n this.overlayActive = false;\n this.doneAnimating = true;\n this.placeholder = document.createElement('div');\n this.placeholder.classList.add('material-placeholder');\n this.originalWidth = 0;\n this.originalHeight = 0;\n this.originInlineStyles = this.el.getAttribute('style');\n this.caption = this.el.getAttribute('data-caption') || '';\n this.el.tabIndex = 0;\n // Wrap\n this.el.before(this.placeholder);\n this.placeholder.append(this.el);\n this._setupEventHandlers();\n }\n\n static get defaults(): LightboxOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Lightbox.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<LightboxOptions>): Lightbox;\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<LightboxOptions>): Lightbox[];\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<LightboxOptions> = {}\n ): Lightbox | Lightbox[] {\n return super.init(els, options, Lightbox);\n }\n\n static getInstance(el: HTMLElement): Lightbox {\n return el['Expressive_Lightbox'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_Lightbox'] = undefined;\n // Unwrap image\n //this.placeholder.after(this.el).remove();\n this.placeholder.remove();\n this.el.removeAttribute('style');\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleLightboxClick);\n this.el.addEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleLightboxClick);\n this.el.removeEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _handleLightboxClick = () => {\n this._handleLightboxToggle();\n };\n\n private _handleLightboxKeypress = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleLightboxToggle();\n }\n };\n\n private _handleLightboxToggle = () => {\n // If already modal, return to original\n if (this.doneAnimating === false || (this.overlayActive && this.doneAnimating)) this.close();\n else this.open();\n };\n\n private _handleWindowScroll = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowResize = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowEscape = (e: KeyboardEvent) => {\n if (Utils.keys.ESC.includes(e.key) && this.doneAnimating && this.overlayActive) this.close();\n };\n\n private _makeAncestorsOverflowVisible() {\n this._changedAncestorList = [];\n let ancestor = this.placeholder.parentNode;\n while (ancestor !== null && ancestor !== document) {\n const curr = <HTMLElement>ancestor;\n if (curr.style.overflow !== 'visible') {\n curr.style.overflow = 'visible';\n this._changedAncestorList.push(curr);\n }\n ancestor = ancestor.parentNode;\n }\n }\n\n private _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.scrollY - docElem.clientTop,\n left: box.left + window.scrollX - docElem.clientLeft\n };\n }\n private _updateVars(): void {\n this.windowWidth = window.innerWidth;\n this.windowHeight = window.innerHeight;\n this.caption = this.el.getAttribute('data-caption') || '';\n }\n\n // Image\n private _animateImageIn(): void {\n this.el.style.maxHeight = this.newHeight.toString() + 'px';\n this.el.style.maxWidth = this.newWidth.toString() + 'px';\n const duration = this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.height = this.originalHeight + 'px';\n this.el.style.width = this.originalWidth + 'px';\n setTimeout(() => {\n // One offset for both axes, read before any of the writes below.\n const placeholderOffset = this._offset(this.placeholder);\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.newHeight + 'px';\n this.el.style.width = this.newWidth + 'px';\n this.el.style.left =\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n placeholderOffset.left -\n this.newWidth / 2 +\n 'px';\n\n this.el.style.top =\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n placeholderOffset.top -\n this.newHeight / 2 +\n 'px';\n }, 1);\n\n setTimeout(() => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n\n /*\n anim({\n targets: this.el, // image\n height: [this.originalHeight, this.newHeight],\n width: [this.originalWidth, this.newWidth],\n left:\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n this._offset(this.placeholder).left -\n this.newWidth / 2,\n top:\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n this._offset(this.placeholder).top -\n this.newHeight / 2,\n\n duration: this.options.inDuration,\n easing: 'easeOutQuad',\n complete: () => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }\n });\n */\n }\n private _animateImageOut(): void {\n const duration = this.options.outDuration;\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.originalHeight + 'px'; // was originalWidth\n this.el.style.width = this.originalWidth + 'px';\n this.el.style.left = '0';\n this.el.style.top = '0';\n setTimeout(() => {\n this.placeholder.style.height = '';\n this.placeholder.style.width = '';\n this.placeholder.style.position = '';\n this.placeholder.style.top = '';\n this.placeholder.style.left = '';\n // Revert to width or height attribute\n if (this.attrWidth) this.el.setAttribute('width', this.attrWidth.toString());\n if (this.attrHeight) this.el.setAttribute('height', this.attrHeight.toString());\n this.el.removeAttribute('style');\n if (this.originInlineStyles) this.el.setAttribute('style', this.originInlineStyles);\n // Remove class\n this.el.classList.remove('active');\n this.doneAnimating = true;\n // Remove overflow overrides on ancestors\n this._changedAncestorList.forEach((anchestor) => (anchestor.style.overflow = ''));\n // onCloseEnd callback\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n // Caption\n private _addCaption(): void {\n this._photoCaption = document.createElement('div');\n this._photoCaption.classList.add('lightbox-caption');\n this._photoCaption.innerText = this.caption;\n document.body.append(this._photoCaption);\n this._photoCaption.style.display = 'inline';\n // Animate\n this._photoCaption.style.transition = 'none';\n this._photoCaption.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '1';\n }, 1);\n }\n private _removeCaption(): void {\n const duration = this.options.outDuration;\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '0';\n setTimeout(() => {\n this._photoCaption.remove();\n }, duration);\n }\n\n // Overlay\n private _addOverlay(): void {\n this._overlay = document.createElement('div');\n this._overlay.id = 'lightbox-overlay';\n this._overlay.addEventListener(\n 'click',\n () => {\n if (this.doneAnimating) this.close();\n },\n { once: true }\n );\n\n // Put before in origin image to preserve z-index layering.\n this.el.before(this._overlay);\n\n // Set dimensions if needed\n const overlayOffset = this._overlay.getBoundingClientRect();\n this._overlay.style.width = this.windowWidth + 'px';\n this._overlay.style.height = this.windowHeight + 'px';\n this._overlay.style.left = -1 * overlayOffset.left + 'px';\n this._overlay.style.top = -1 * overlayOffset.top + 'px';\n\n // Animate\n this._overlay.style.transition = 'none';\n this._overlay.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '1';\n }, 1);\n }\n private _removeOverlay(): void {\n const duration = this.options.outDuration;\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '0';\n setTimeout(() => {\n this.overlayActive = false;\n this._overlay.remove();\n }, duration);\n }\n\n /**\n * Open lightbox.\n */\n open = () => {\n this._updateVars();\n // Both rects are read up front: measuring the placeholder after writing\n // its width forced a second layout for the height.\n const originRect = this.el.getBoundingClientRect();\n const placeholderRect = this.placeholder.getBoundingClientRect();\n this.originalWidth = originRect.width;\n this.originalHeight = originRect.height;\n // Set states\n this.doneAnimating = false;\n this.el.classList.add('active');\n this.overlayActive = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function')\n this.options.onOpenStart.call(this, this.el);\n // Set positioning for placeholder\n this.placeholder.style.width = placeholderRect.width + 'px';\n this.placeholder.style.height = placeholderRect.height + 'px';\n this.placeholder.style.position = 'relative';\n this.placeholder.style.top = '0';\n this.placeholder.style.left = '0';\n this._makeAncestorsOverflowVisible();\n // Set css on origin\n this.el.style.position = 'absolute';\n this.el.style.zIndex = '1000';\n this.el.style.willChange = 'left, top, width, height';\n // Change from width or height attribute to css\n this.attrWidth = this.el.getAttribute('width');\n this.attrHeight = this.el.getAttribute('height');\n if (this.attrWidth) {\n this.el.style.width = this.attrWidth + 'px';\n this.el.removeAttribute('width');\n }\n if (this.attrHeight) {\n this.el.style.height = this.attrHeight + 'px'; // was width, from the height attribute\n this.el.removeAttribute('height');\n }\n this._addOverlay();\n // Add and animate caption if it exists\n if (this.caption !== '') this._addCaption();\n // Resize Image\n const widthPercent = this.originalWidth / this.windowWidth;\n const heightPercent = this.originalHeight / this.windowHeight;\n this.newWidth = 0;\n this.newHeight = 0;\n if (widthPercent > heightPercent) {\n // Width first\n const ratio = this.originalHeight / this.originalWidth;\n this.newWidth = this.windowWidth * 0.9;\n this.newHeight = this.windowWidth * 0.9 * ratio;\n } else {\n // Height first\n const ratio = this.originalWidth / this.originalHeight;\n this.newWidth = this.windowHeight * 0.9 * ratio;\n this.newHeight = this.windowHeight * 0.9;\n }\n this._animateImageIn();\n // Handle Exit triggers\n window.addEventListener('scroll', this._handleWindowScroll, { passive: true });\n window.addEventListener('resize', this._handleWindowResize, { passive: true });\n window.addEventListener('keyup', this._handleWindowEscape);\n };\n\n /**\n * Close lightbox.\n */\n close = () => {\n this._updateVars();\n this.doneAnimating = false;\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function')\n this.options.onCloseStart.call(this, this.el);\n //anim.remove(this.el);\n //anim.remove(this._overlay);\n //if (this.caption !== '') anim.remove(this._photoCaption);\n // disable exit handlers\n window.removeEventListener('scroll', this._handleWindowScroll);\n window.removeEventListener('resize', this._handleWindowResize);\n window.removeEventListener('keyup', this._handleWindowEscape);\n this._removeOverlay();\n this._animateImageOut();\n if (this.caption !== '') this._removeCaption();\n };\n}\n", "import { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\n// Obsolete for versions > 2.1.1\n\nexport interface ModalOptions extends BaseOptions {\n opacity: number;\n inDuration: number;\n outDuration: number;\n preventScrolling: boolean;\n onOpenStart: (this: Modal, el: HTMLElement) => void;\n onOpenEnd: (this: Modal, el: HTMLElement) => void;\n onCloseStart: (el: HTMLElement) => void;\n onCloseEnd: (el: HTMLElement) => void;\n dismissible: boolean;\n startingTop: string;\n endingTop: string;\n}\n\nconst _defaults = {\n opacity: 0.5,\n inDuration: 250,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n preventScrolling: true,\n dismissible: true,\n startingTop: '4%',\n endingTop: '10%'\n};\n\nexport class Modal extends Component<ModalOptions> {\n constructor(el: HTMLElement, options: Partial<ModalOptions>) {\n super(el, options, Modal);\n this.el['Expressive_Modal'] = this;\n this.options = {\n ...Modal.defaults,\n ...options\n };\n this.el.tabIndex = 0;\n this._setupEventHandlers();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<ModalOptions>): Modal;\n static init(els: InitElements<MElement>, options?: Partial<ModalOptions>): Modal[];\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ModalOptions> = {}\n ): Modal | Modal[] {\n return super.init(els, options, Modal);\n }\n\n static getInstance(el: HTMLElement): Modal {\n return el['Expressive_Modal'];\n }\n\n destroy() {}\n _setupEventHandlers() {}\n _removeEventHandlers() {}\n _handleTriggerClick() {}\n _handleOverlayClick() {}\n _handleModalCloseClick() {}\n _handleKeydown() {}\n _handleFocus() {}\n open() {\n return this;\n }\n close() {\n return this;\n }\n\n // Experimental!\n\n static #createHtml(config: ModalCreateConfig) {\n const title = config.header\n ? `<h2>${typeof config.header === 'string' ? config.header : ''}</h2>`\n : '';\n const actions = config.footer\n ? `<form method=\"dialog\">${typeof config.footer === 'string' ? config.footer : ''}</form>`\n : '';\n return `<dialog id=\"${config.id}\">\n ${title}\n <div>${typeof config.content === 'string' ? config.content : ''}</div>\n ${actions}\n </dialog>`;\n }\n\n static #createHtmlElement(config: ModalCreateConfig) {\n const dialog = document.createElement('dialog');\n dialog.id = config.id;\n return dialog;\n }\n\n static create(config) {\n const isServer = false;\n if (isServer) return this.#createHtml(config);\n return this.#createHtmlElement(config);\n }\n\n static {}\n}\n\ninterface ModalCreateConfig {\n id: string;\n header: string | HTMLElement;\n content: string | HTMLElement;\n footer: string | HTMLElement;\n}\n", "import { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface ParallaxOptions extends BaseOptions {\n /**\n * @deprecated Motion is CSS (`animation-timeline: view()`). This value\n * is accepted so existing AutoInit calls keep compiling, and is ignored.\n * @default 0\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: ParallaxOptions = {\n responsiveThreshold: 0\n};\n\n/**\n * Parallax. The effect is CSS (see components/_parallax.scss). This class\n * exists so AutoInit / getInstance / destroy keep working; it does not\n * attach scroll or resize listeners.\n */\nexport class Parallax extends Component<ParallaxOptions> {\n constructor(el: HTMLElement, options: Partial<ParallaxOptions>) {\n super(el, options, Parallax);\n this.el['Expressive_Parallax'] = this;\n\n this.options = {\n ...Parallax.defaults,\n ...options\n };\n\n if (!this.el.querySelector('img, video')) {\n console.error('Parallax: no <img> or <video> to move inside the .parallax element');\n }\n }\n\n static get defaults(): ParallaxOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<ParallaxOptions>): Parallax;\n static init(els: InitElements<MElement>, options?: Partial<ParallaxOptions>): Parallax[];\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ParallaxOptions> = {}\n ): Parallax | Parallax[] {\n return super.init(els, options, Parallax);\n }\n\n static getInstance(el: HTMLElement): Parallax {\n return el['Expressive_Parallax'];\n }\n\n destroy() {\n this.el['Expressive_Parallax'] = undefined;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface PushpinOptions extends BaseOptions {\n /**\n * The distance in pixels from the top of the page where\n * the element becomes fixed.\n * @default 0\n */\n top: number;\n /**\n * The distance in pixels from the top of the page where\n * the elements stops being fixed.\n * @default Infinity\n */\n bottom: number;\n /**\n * The offset from the top the element will be fixed at.\n * @default 0\n */\n offset: number;\n /**\n * Callback function called when pushpin position changes.\n * You are provided with a position string.\n * @default null\n */\n onPositionChange: (position: 'pinned' | 'pin-top' | 'pin-bottom') => void;\n}\n\nconst _defaults = {\n top: 0,\n bottom: Infinity,\n offset: 0,\n onPositionChange: null\n};\n\nexport class Pushpin extends Component<PushpinOptions> {\n static _pushpins: Pushpin[];\n originalOffset: number;\n\n constructor(el: HTMLElement, options: Partial<PushpinOptions>) {\n super(el, options, Pushpin);\n this.el['Expressive_Pushpin'] = this;\n\n this.options = {\n ...Pushpin.defaults,\n ...options\n };\n\n this.originalOffset = (this.el as HTMLElement).offsetTop;\n Pushpin._pushpins.push(this);\n this._setupEventHandlers();\n this._updatePosition();\n }\n\n static get defaults(): PushpinOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Pushpin.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<PushpinOptions>): Pushpin;\n /**\n * Initializes instances of Pushpin.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<PushpinOptions>): Pushpin[];\n /**\n * Initializes instances of Pushpin.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<PushpinOptions> = {}\n ): Pushpin | Pushpin[] {\n return super.init(els, options, Pushpin);\n }\n\n static getInstance(el: HTMLElement): Pushpin {\n return el['Expressive_Pushpin'];\n }\n\n destroy() {\n (this.el as HTMLElement).style.top = null;\n this._removePinClasses();\n // Remove pushpin Inst\n const index = Pushpin._pushpins.indexOf(this);\n Pushpin._pushpins.splice(index, 1);\n if (Pushpin._pushpins.length === 0) {\n this._removeEventHandlers();\n }\n this.el['Expressive_Pushpin'] = undefined;\n }\n\n static _updateElements() {\n for (let i = 0; i < Pushpin._pushpins.length; i++) {\n Pushpin._pushpins[i]._updatePosition();\n }\n }\n\n _setupEventHandlers() {\n document.addEventListener('scroll', Pushpin._updateElements, { passive: true });\n }\n\n _removeEventHandlers() {\n document.removeEventListener('scroll', Pushpin._updateElements);\n }\n\n _updatePosition() {\n const scrolled = Utils.getDocumentScrollTop() + this.options.offset;\n\n if (\n this.options.top <= scrolled &&\n this.options.bottom >= scrolled &&\n !this.el.classList.contains('pinned')\n ) {\n this._removePinClasses();\n (this.el as HTMLElement).style.top = `${this.options.offset}px`;\n this.el.classList.add('pinned');\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pinned');\n }\n }\n\n // Add pin-top (when scrolled position is above top)\n if (scrolled < this.options.top && !this.el.classList.contains('pin-top')) {\n this._removePinClasses();\n (this.el as HTMLElement).style.top = '0';\n this.el.classList.add('pin-top');\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pin-top');\n }\n }\n\n // Add pin-bottom (when scrolled position is below bottom)\n if (scrolled > this.options.bottom && !this.el.classList.contains('pin-bottom')) {\n this._removePinClasses();\n this.el.classList.add('pin-bottom');\n (this.el as HTMLElement).style.top = `${this.options.bottom - this.originalOffset}px`;\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pin-bottom');\n }\n }\n }\n\n _removePinClasses() {\n this.el.classList.remove('pin-top', 'pinned', 'pin-bottom');\n }\n\n static {\n Pushpin._pushpins = [];\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface ScrollSpyOptions extends BaseOptions {\n /**\n * Throttle of scroll handler.\n * @default 100\n */\n throttle: number;\n /**\n * Offset for centering element when scrolled to.\n * @default 200\n */\n scrollOffset: number;\n /**\n * Class applied to active elements.\n * @default 'active'\n */\n activeClass: string;\n /**\n * Used to find active element.\n * @default id => 'a[href=\"#' + id + '\"]'\n */\n getActiveElement: (id: string) => string;\n /**\n * Used to keep last top element active even if\n * scrollbar goes outside of scrollspy elements.\n *\n * If there is no last top element,\n * then the active one will be the first element.\n *\n * @default false\n */\n keepTopElementActive: boolean;\n /**\n * Used to set scroll animation duration in milliseconds.\n * @default null (browser's native animation implementation/duration)\n */\n animationDuration: number | null;\n}\n\nconst _defaults: ScrollSpyOptions = {\n throttle: 100,\n scrollOffset: 200, // offset - 200 allows elements near bottom of page to scroll\n activeClass: 'active',\n getActiveElement: (id: string): string => {\n return 'a[href=\"#' + id + '\"]';\n },\n keepTopElementActive: false,\n animationDuration: null\n};\n\nexport class ScrollSpy extends Component<ScrollSpyOptions> {\n static _elements: ScrollSpy[];\n static _count: number;\n static _increment: number;\n static _elementsInView: ScrollSpy[];\n static _visibleElements: HTMLElement[];\n static _ticks: number;\n static _keptTopActiveElement: HTMLElement | null = null;\n // The document-level listeners are shared by every instance, so the\n // references they are registered with have to be shared too - registering\n // with one instance's bound handler and unregistering with another's is a\n // silent no-op that leaves the listener attached forever.\n private static _throttledScroll: (...args: unknown[]) => void = null;\n private static _throttledResize: (...args: unknown[]) => void = null;\n\n private tickId: number;\n private id: string;\n\n constructor(el: HTMLElement, options: Partial<ScrollSpyOptions>) {\n super(el, options, ScrollSpy);\n this.el['Expressive_ScrollSpy'] = this;\n\n this.options = {\n ...ScrollSpy.defaults,\n ...options\n };\n\n ScrollSpy._elements.push(this);\n ScrollSpy._count++;\n ScrollSpy._increment++;\n this.tickId = -1;\n this.id = ScrollSpy._increment.toString();\n this._setupEventHandlers();\n ScrollSpy._handleWindowScroll();\n }\n\n static get defaults(): ScrollSpyOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of ScrollSpy.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ScrollSpyOptions>): ScrollSpy;\n /**\n * Initializes instances of ScrollSpy.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<ScrollSpyOptions>): ScrollSpy[];\n /**\n * Initializes instances of ScrollSpy.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<ScrollSpyOptions> = {}\n ): ScrollSpy | ScrollSpy[] {\n return super.init(els, options, ScrollSpy);\n }\n\n static getInstance(el: HTMLElement): ScrollSpy {\n return el['Expressive_ScrollSpy'];\n }\n\n destroy() {\n const elementIndex = ScrollSpy._elements.indexOf(this);\n if (elementIndex >= 0) ScrollSpy._elements.splice(elementIndex, 1);\n const inViewIndex = ScrollSpy._elementsInView.indexOf(this);\n if (inViewIndex >= 0) ScrollSpy._elementsInView.splice(inViewIndex, 1);\n const visibleIndex = ScrollSpy._visibleElements.indexOf(this.el);\n if (visibleIndex >= 0) ScrollSpy._visibleElements.splice(visibleIndex, 1);\n ScrollSpy._count--;\n this._removeEventHandlers();\n // Optional: the trigger may already be gone from the DOM, and throwing\n // here would abort the rest of the teardown.\n const actElem = document.querySelector(this.options.getActiveElement(this.el.id));\n actElem?.classList.remove(this.options.activeClass);\n this.el['Expressive_ScrollSpy'] = undefined;\n }\n\n _setupEventHandlers() {\n if (ScrollSpy._count === 1) {\n // Honour the documented `throttle` option - the scroll handler reads\n // layout for every spied element, so running it on every scroll event\n // was the single most expensive thing this component did.\n ScrollSpy._throttledScroll = Utils.throttle(ScrollSpy._handleWindowScroll, this.options.throttle);\n ScrollSpy._throttledResize = Utils.throttle(ScrollSpy._handleWindowScroll, 200);\n window.addEventListener('scroll', ScrollSpy._throttledScroll, { passive: true });\n window.addEventListener('resize', ScrollSpy._throttledResize, { passive: true });\n document.body.addEventListener('click', ScrollSpy._handleTriggerClick);\n }\n }\n\n _removeEventHandlers() {\n if (ScrollSpy._count === 0) {\n window.removeEventListener('scroll', ScrollSpy._throttledScroll);\n window.removeEventListener('resize', ScrollSpy._throttledResize);\n document.body.removeEventListener('click', ScrollSpy._handleTriggerClick);\n ScrollSpy._throttledScroll = null;\n ScrollSpy._throttledResize = null;\n }\n }\n\n static _handleTriggerClick = (e: MouseEvent) => {\n const trigger = e.target;\n for (let i = ScrollSpy._elements.length - 1; i >= 0; i--) {\n const scrollspy = ScrollSpy._elements[i];\n const x = document.querySelector('a[href=\"#' + scrollspy.el.id + '\"]');\n if (trigger === x) {\n e.preventDefault();\n\n if (scrollspy.el['Expressive_ScrollSpy'].options.animationDuration) {\n ScrollSpy._smoothScrollIntoView(\n scrollspy.el,\n scrollspy.el['Expressive_ScrollSpy'].options.animationDuration\n );\n } else {\n scrollspy.el.scrollIntoView({ behavior: 'smooth' });\n }\n break;\n }\n }\n };\n\n static _handleWindowScroll = () => {\n // unique tick id\n ScrollSpy._ticks++;\n\n // viewport rectangle\n const top = Utils.getDocumentScrollTop(),\n left = Utils.getDocumentScrollLeft(),\n right = left + window.innerWidth,\n bottom = top + window.innerHeight;\n\n // determine which elements are in view\n const intersections = ScrollSpy._findElements(top, right, bottom, left);\n for (let i = 0; i < intersections.length; i++) {\n const scrollspy = intersections[i];\n const lastTick = scrollspy.tickId;\n if (lastTick < 0) {\n // entered into view\n scrollspy._enter();\n }\n\n // update tick id\n scrollspy.tickId = ScrollSpy._ticks;\n }\n\n for (let i = 0; i < ScrollSpy._elementsInView.length; i++) {\n const scrollspy = ScrollSpy._elementsInView[i];\n const lastTick = scrollspy.tickId;\n if (lastTick >= 0 && lastTick !== ScrollSpy._ticks) {\n // exited from view\n scrollspy._exit();\n scrollspy.tickId = -1;\n }\n }\n // remember elements in view for next tick\n ScrollSpy._elementsInView = intersections;\n if (ScrollSpy._elements.length) {\n const options = ScrollSpy._elements[0].el['Expressive_ScrollSpy'].options;\n if (options.keepTopElementActive && ScrollSpy._visibleElements.length === 0) {\n ScrollSpy._resetKeptTopActiveElement(options.activeClass);\n // Measure once per element, then sort on the numbers. Reading the\n // distance inside the comparator meant O(n log n) forced layouts.\n const topElements = ScrollSpy._elements\n .map((value) => ({ value, distance: ScrollSpy._getDistanceToViewport(value.el) }))\n .filter((entry) => entry.distance <= 0)\n .sort((a, b) => a.distance - b.distance)\n .map((entry) => entry.value);\n const nearestTopElement = topElements.length\n ? topElements[topElements.length - 1]\n : ScrollSpy._elements[0];\n const actElem = document.querySelector(options.getActiveElement(nearestTopElement.el.id));\n actElem?.classList.add(options.activeClass);\n ScrollSpy._keptTopActiveElement = actElem as HTMLElement;\n }\n }\n };\n\n static _findElements(top: number, right: number, bottom: number, left: number): ScrollSpy[] {\n const hits = [];\n // Hoisted out of the loop: these are per-document, not per-element, and\n // reading them inside would force a layout flush on every iteration.\n const docElem = document.documentElement;\n const clientTop = docElem.clientTop;\n const clientLeft = docElem.clientLeft;\n const scrollY = window.scrollY;\n const scrollX = window.scrollX;\n\n for (let i = 0; i < ScrollSpy._elements.length; i++) {\n const scrollspy = ScrollSpy._elements[i];\n const currTop = top + scrollspy.options.scrollOffset || 200;\n\n // One rect per element per tick. This used to take five - a height\n // check, two _offset() calls that each built their own rect, and two\n // more reads for width and height - and it runs for every spied element\n // on every scroll tick.\n const box = scrollspy.el.getBoundingClientRect();\n if (box.height > 0) {\n const elTop = box.top + scrollY - clientTop,\n elLeft = box.left + scrollX - clientLeft,\n elRight = elLeft + box.width,\n elBottom = elTop + box.height;\n\n const isIntersect = !(\n elLeft > right ||\n elRight < left ||\n elTop > bottom ||\n elBottom < currTop\n );\n\n if (isIntersect) {\n hits.push(scrollspy);\n }\n }\n }\n return hits;\n }\n\n _enter() {\n ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(\n (value) => value.getBoundingClientRect().height !== 0\n );\n\n if (ScrollSpy._visibleElements[0]) {\n const actElem = document.querySelector(\n this.options.getActiveElement(ScrollSpy._visibleElements[0].id)\n );\n actElem?.classList.remove(this.options.activeClass);\n\n if (\n ScrollSpy._visibleElements[0]['Expressive_ScrollSpy'] &&\n this.id < ScrollSpy._visibleElements[0]['Expressive_ScrollSpy'].id\n ) {\n ScrollSpy._visibleElements.unshift(this.el);\n } else {\n ScrollSpy._visibleElements.push(this.el);\n }\n } else {\n ScrollSpy._visibleElements.push(this.el);\n }\n ScrollSpy._resetKeptTopActiveElement(this.options.activeClass);\n const selector = this.options.getActiveElement(ScrollSpy._visibleElements[0].id);\n document.querySelector(selector)?.classList.add(this.options.activeClass);\n }\n\n _exit() {\n ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(\n (value) => value.getBoundingClientRect().height !== 0\n );\n\n if (ScrollSpy._visibleElements[0]) {\n const actElem = document.querySelector(\n this.options.getActiveElement(ScrollSpy._visibleElements[0].id)\n );\n actElem?.classList.remove(this.options.activeClass);\n\n ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter((x) => x.id != this.el.id);\n\n if (ScrollSpy._visibleElements[0]) {\n // Check if empty\n const selector = this.options.getActiveElement(ScrollSpy._visibleElements[0].id);\n document.querySelector(selector)?.classList.add(this.options.activeClass);\n ScrollSpy._resetKeptTopActiveElement(this.options.activeClass);\n }\n }\n }\n\n private static _resetKeptTopActiveElement(activeClass: string) {\n if (ScrollSpy._keptTopActiveElement) {\n ScrollSpy._keptTopActiveElement.classList.remove(activeClass);\n ScrollSpy._keptTopActiveElement = null;\n }\n }\n\n private static _getDistanceToViewport(element) {\n const rect = element.getBoundingClientRect();\n const distance = rect.top;\n return distance;\n }\n\n private static _smoothScrollIntoView(element, duration = 300) {\n const targetPosition =\n element.getBoundingClientRect().top + (window.scrollY || window.pageYOffset);\n const startPosition = window.scrollY || window.pageYOffset;\n const distance = targetPosition - startPosition;\n const startTime = performance.now();\n\n function scrollStep(currentTime) {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const scrollY = startPosition + distance * progress;\n\n if (progress < 1) {\n window.scrollTo(0, scrollY);\n requestAnimationFrame(scrollStep);\n } else {\n window.scrollTo(0, targetPosition);\n }\n }\n requestAnimationFrame(scrollStep);\n }\n\n static {\n ScrollSpy._elements = [];\n ScrollSpy._elementsInView = [];\n ScrollSpy._visibleElements = []; // Array.<cash>\n ScrollSpy._count = 0;\n ScrollSpy._increment = 0;\n ScrollSpy._ticks = 0;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface SidenavOptions extends BaseOptions {\n /**\n * Side of screen on which Sidenav appears.\n * @default 'left'\n */\n edge: 'left' | 'right';\n /**\n * Allow swipe gestures to open/close Sidenav.\n * @default true\n */\n draggable: boolean;\n /**\n * Width of the area where you can start dragging.\n * @default '10px'\n */\n dragTargetWidth: string;\n /**\n * Length in ms of enter transition.\n * @default 250\n */\n inDuration: number;\n /**\n * Length in ms of exit transition.\n * @default 200\n */\n outDuration: number;\n /**\n * Prevent page from scrolling while sidenav is open.\n * @default true\n */\n preventScrolling: boolean;\n /**\n * Function called when sidenav starts entering.\n */\n onOpenStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes entering.\n */\n onOpenEnd: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav starts exiting.\n */\n onCloseStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes exiting.\n */\n onCloseEnd: (elem: HTMLElement) => void;\n}\n\nconst _defaults: SidenavOptions = {\n edge: 'left',\n draggable: true,\n dragTargetWidth: '10px',\n inDuration: 250,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n preventScrolling: true\n};\n\nexport class Sidenav extends Component<SidenavOptions> implements Openable {\n id: string;\n /** Describes open/close state of Sidenav. */\n isOpen: boolean;\n /** Describes if sidenav is fixed. */\n isFixed: boolean;\n /** Describes if Sidenav is being dragged. */\n isDragged: boolean;\n lastWindowWidth: number;\n lastWindowHeight: number;\n static _sidenavs: Sidenav[];\n private _overlay: HTMLElement;\n dragTarget: Element;\n private _startingXpos: number;\n private _xPos: number;\n private _time: number;\n private _width: number;\n private _initialScrollTop: number;\n private _verticallyScrolling: boolean;\n private deltaX: number;\n private velocityX: number;\n private percentOpen: number;\n\n constructor(el: HTMLElement, options: Partial<SidenavOptions>) {\n super(el, options, Sidenav);\n this.el['Expressive_Sidenav'] = this;\n\n this.options = {\n ...Sidenav.defaults,\n ...options\n };\n\n this.id = this.el.id;\n this.isOpen = false;\n this.isFixed = this.el.classList.contains('sidenav-fixed');\n this.isDragged = false;\n // Window size variables for window resize checks\n this.lastWindowWidth = window.innerWidth;\n this.lastWindowHeight = window.innerHeight;\n this._createOverlay();\n this._createDragTarget();\n this._setupEventHandlers();\n this._setupClasses();\n this._setupFixed();\n Sidenav._sidenavs.push(this);\n }\n\n static get defaults(): SidenavOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Sidenav.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<SidenavOptions>): Sidenav;\n /**\n * Initializes instances of Sidenav.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<SidenavOptions>): Sidenav[];\n /**\n * Initializes instances of Sidenav.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<SidenavOptions> = {}\n ): Sidenav | Sidenav[] {\n return super.init(els, options, Sidenav);\n }\n\n static getInstance(el: HTMLElement): Sidenav {\n return el['Expressive_Sidenav'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._enableBodyScrolling();\n this._overlay.parentNode.removeChild(this._overlay);\n this.dragTarget.parentNode.removeChild(this.dragTarget);\n this.el['Expressive_Sidenav'] = undefined;\n this.el.style.transform = '';\n const index = Sidenav._sidenavs.indexOf(this);\n if (index >= 0) {\n Sidenav._sidenavs.splice(index, 1);\n }\n }\n\n private _createOverlay() {\n this._overlay = document.createElement('div');\n this._overlay.classList.add('sidenav-overlay');\n this._overlay.addEventListener('click', this.close);\n document.body.appendChild(this._overlay);\n }\n\n private _setupEventHandlers() {\n if (Sidenav._sidenavs.length === 0) {\n document.body.addEventListener('click', this._handleTriggerClick);\n }\n // The drag handlers only set transforms and opacity - none of them calls\n // preventDefault - so they can be passive and stay off the scroll path.\n const passive = { passive: true } as const;\n this.dragTarget.addEventListener('touchmove', this._handleDragTargetDrag, passive);\n this.dragTarget.addEventListener('touchend', this._handleDragTargetRelease);\n this._overlay.addEventListener('touchmove', this._handleCloseDrag, passive);\n this._overlay.addEventListener('touchend', this._handleCloseRelease);\n this.el.addEventListener('touchmove', this._handleCloseDrag, passive);\n this.el.addEventListener('touchend', this._handleCloseRelease);\n this.el.addEventListener('click', this._handleCloseTriggerClick);\n // Add resize for side nav fixed\n if (this.isFixed) {\n window.addEventListener('resize', this._handleWindowResize, passive);\n }\n /* Set aria-hidden state */\n this._setAriaHidden();\n this._setTabIndex();\n }\n\n private _removeEventHandlers() {\n if (Sidenav._sidenavs.length === 1) {\n document.body.removeEventListener('click', this._handleTriggerClick);\n }\n this.dragTarget.removeEventListener('touchmove', this._handleDragTargetDrag);\n this.dragTarget.removeEventListener('touchend', this._handleDragTargetRelease);\n this._overlay.removeEventListener('touchmove', this._handleCloseDrag);\n this._overlay.removeEventListener('touchend', this._handleCloseRelease);\n this.el.removeEventListener('touchmove', this._handleCloseDrag);\n this.el.removeEventListener('touchend', this._handleCloseRelease);\n this.el.removeEventListener('click', this._handleCloseTriggerClick);\n\n // Remove resize for side nav fixed\n if (this.isFixed) {\n window.removeEventListener('resize', this._handleWindowResize);\n }\n }\n\n private _handleTriggerClick(e) {\n const trigger = e.target.closest('.sidenav-trigger');\n if (e.target && trigger) {\n const sidenavId = Utils.getIdFromTrigger(trigger);\n // The trigger can name an id that is not in the document.\n const sidenavInstance = document.getElementById(sidenavId)?.['Expressive_Sidenav'];\n if (sidenavInstance) {\n sidenavInstance.open();\n }\n e.preventDefault();\n }\n }\n\n // Set variables needed at the beginning of drag and stop any current transition.\n private _startDrag(e) {\n const clientX = e.targetTouches[0].clientX;\n this.isDragged = true;\n this._startingXpos = clientX;\n this._xPos = this._startingXpos;\n this._time = Date.now();\n this._width = this.el.getBoundingClientRect().width;\n this._overlay.style.display = 'block';\n this._initialScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this._verticallyScrolling = false;\n }\n\n //Set variables needed at each drag move update tick\n private _dragMoveUpdate(e) {\n const clientX = e.targetTouches[0].clientX;\n const currentScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this.deltaX = Math.abs(this._xPos - clientX);\n this._xPos = clientX;\n this.velocityX = this.deltaX / (Date.now() - this._time);\n this._time = Date.now();\n if (this._initialScrollTop !== currentScrollTop) {\n this._verticallyScrolling = true;\n }\n }\n\n private _handleDragTargetDrag = (e) => {\n // Check if draggable\n if (!this._isDraggable()) return;\n let totalDeltaX = this._calculateDelta(e);\n const dragDirection = totalDeltaX > 0 ? 'right' : 'left';\n // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction\n totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));\n if (this.options.edge === dragDirection) {\n totalDeltaX = 0;\n }\n /**\n * transformX is the drag displacement\n * transformPrefix is the initial transform placement\n * Invert values if Sidenav is right edge\n */\n let transformX = totalDeltaX;\n let transformPrefix = 'translateX(-100%)';\n if (this.options.edge === 'right') {\n transformPrefix = 'translateX(100%)';\n transformX = -transformX;\n }\n // Calculate open/close percentage of sidenav, with open = 1 and close = 0\n this.percentOpen = Math.min(1, totalDeltaX / this._width);\n // Set transform and opacity styles\n this.el.style.transform = `${transformPrefix} translateX(${transformX}px)`;\n this._overlay.style.opacity = this.percentOpen.toString();\n };\n\n private _handleDragTargetRelease = () => {\n if (this.isDragged) {\n if (this.percentOpen > 0.2) {\n this.open();\n } else {\n this._animateOut();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n }\n };\n\n private _handleCloseDrag = (e) => {\n // Check if open and draggable\n if (!this.isOpen || !this._isDraggable()) return;\n let totalDeltaX = this._calculateDelta(e);\n // dragDirection is the attempted user drag direction\n const dragDirection = totalDeltaX > 0 ? 'right' : 'left';\n totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));\n if (this.options.edge !== dragDirection) {\n totalDeltaX = 0;\n }\n let transformX = -totalDeltaX;\n if (this.options.edge === 'right') {\n transformX = -transformX;\n }\n // Calculate open/close percentage of sidenav, with open = 1 and close = 0\n this.percentOpen = Math.min(1, 1 - totalDeltaX / this._width);\n // Set transform and opacity styles\n this.el.style.transform = `translateX(${transformX}px)`;\n this._overlay.style.opacity = this.percentOpen.toString();\n };\n\n private _calculateDelta = (e) => {\n // If not being dragged, set initial drag start variables\n if (!this.isDragged) {\n this._startDrag(e);\n }\n // Run touchmove updates\n this._dragMoveUpdate(e);\n // Calculate raw deltaX\n return this._xPos - this._startingXpos;\n };\n\n private _handleCloseRelease = () => {\n if (this.isOpen && this.isDragged) {\n if (this.percentOpen > 0.8) {\n this._animateIn();\n } else {\n this.close();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n }\n };\n\n // Handles closing of Sidenav when element with class .sidenav-close\n private _handleCloseTriggerClick = (e) => {\n const closeTrigger = e.target.closest('.sidenav-close');\n if (closeTrigger && !this._isCurrentlyFixed()) {\n this.close();\n }\n };\n\n private _handleWindowResize = () => {\n // Only handle horizontal resizes\n if (this.lastWindowWidth !== window.innerWidth) {\n if (window.innerWidth > 992) {\n this.open();\n } else {\n this.close();\n }\n }\n this.lastWindowWidth = window.innerWidth;\n this.lastWindowHeight = window.innerHeight;\n };\n\n private _setupClasses() {\n if (this.options.edge === 'right') {\n this.el.classList.add('right-aligned');\n this.dragTarget.classList.add('right-aligned');\n }\n }\n\n private _removeClasses() {\n this.el.classList.remove('right-aligned');\n this.dragTarget.classList.remove('right-aligned');\n }\n\n private _setupFixed() {\n if (this._isCurrentlyFixed()) this.open();\n }\n\n private _isDraggable() {\n return this.options.draggable && !this._isCurrentlyFixed() && !this._verticallyScrolling;\n }\n\n private _isCurrentlyFixed() {\n return this.isFixed && window.innerWidth > 992;\n }\n\n private _createDragTarget() {\n const dragTarget = document.createElement('div');\n dragTarget.classList.add('drag-target');\n dragTarget.style.width = this.options.dragTargetWidth;\n document.body.appendChild(dragTarget);\n this.dragTarget = dragTarget;\n }\n\n private _preventBodyScrolling() {\n document.body.style.overflow = 'hidden';\n }\n\n private _enableBodyScrolling() {\n document.body.style.overflow = '';\n }\n\n /**\n * Opens Sidenav.\n */\n open = () => {\n if (this.isOpen === true) return;\n this.isOpen = true;\n // Run onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n // Handle fixed Sidenav\n if (this._isCurrentlyFixed()) {\n // Show if fixed\n this.el.style.transform = 'translateX(0)';\n this._enableBodyScrolling();\n this._overlay.style.display = 'none';\n }\n // Handle non-fixed Sidenav\n else {\n if (this.options.preventScrolling) this._preventBodyScrolling();\n if (!this.isDragged || this.percentOpen != 1) this._animateIn();\n /* Set aria-hidden state */\n this._setAriaHidden();\n this._setTabIndex();\n }\n };\n\n /**\n * Closes Sidenav.\n */\n close = () => {\n if (this.isOpen === false) return;\n this.isOpen = false;\n // Run onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n // Handle fixed Sidenav\n if (this._isCurrentlyFixed()) {\n const transformX = this.options.edge === 'left' ? '-105%' : '105%';\n this.el.style.transform = `translateX(${transformX})`;\n }\n // Handle non-fixed Sidenav\n else {\n this._enableBodyScrolling();\n if (!this.isDragged || this.percentOpen != 0) {\n this._animateOut();\n } else {\n this._overlay.style.display = 'none';\n }\n /* Set aria-hidden state */\n this._setAriaHidden();\n this._setTabIndex();\n }\n };\n\n private _animateIn() {\n this._animateSidenavIn();\n this._animateOverlayIn();\n }\n\n private _animateOut() {\n this._animateSidenavOut();\n this._animateOverlayOut();\n }\n\n private _animateSidenavIn() {\n let slideOutPercent = this.options.edge === 'left' ? -1 : 1;\n if (this.isDragged) {\n slideOutPercent =\n this.options.edge === 'left'\n ? slideOutPercent + this.percentOpen\n : slideOutPercent - this.percentOpen;\n }\n const duration = this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.transform = 'translateX(' + slideOutPercent * 100 + '%)';\n setTimeout(() => {\n this.el.style.transition = `transform ${duration}ms ease`; // easeOutQuad\n // to\n this.el.style.transform = 'translateX(0)';\n }, 1);\n setTimeout(() => {\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n private _animateSidenavOut() {\n const endPercent = this.options.edge === 'left' ? -1 : 1;\n // let slideOutPercent = 0;\n // if (this.isDragged) {\n // // @todo unused variable\n // slideOutPercent =\n // this.options.edge === 'left'\n // ? endPercent + this.percentOpen\n // : endPercent - this.percentOpen;\n // }\n\n const duration = this.options.outDuration;\n this.el.style.transition = `transform ${duration}ms ease`; // easeOutQuad\n // to\n this.el.style.transform = 'translateX(' + endPercent * 100 + '%)';\n setTimeout(() => {\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _animateOverlayIn() {\n let start = 0;\n if (this.isDragged) start = this.percentOpen;\n else this._overlay.style.display = 'block';\n // Animation\n const duration = this.options.inDuration;\n // from\n this._overlay.style.transition = 'none';\n this._overlay.style.opacity = start.toString();\n // easeOutQuad\n setTimeout(() => {\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n // to\n this._overlay.style.opacity = '1';\n }, 1);\n }\n\n private _animateOverlayOut() {\n const duration = this.options.outDuration;\n // easeOutQuad\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n // to\n this._overlay.style.opacity = '0';\n setTimeout(() => {\n this._overlay.style.display = 'none';\n }, duration);\n }\n\n private _setAriaHidden = () => {\n this.el.ariaHidden = this.isOpen ? 'false' : 'true';\n const navWrapper = document.querySelector('.nav-wrapper ul') as HTMLUListElement;\n if (navWrapper) navWrapper.ariaHidden = this.isOpen.toString();\n };\n\n private _setTabIndex = () => {\n const navLinks = document.querySelectorAll('.nav-wrapper ul li a');\n const sideNavLinks = document.querySelectorAll('.sidenav li a');\n if (navLinks)\n navLinks.forEach((navLink: HTMLAnchorElement) => {\n navLink.tabIndex = this.isOpen ? -1 : 0;\n });\n if (sideNavLinks)\n sideNavLinks.forEach((sideNavLink: HTMLAnchorElement) => {\n sideNavLink.tabIndex = this.isOpen ? 0 : -1;\n });\n };\n\n static {\n Sidenav._sidenavs = [];\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface SliderOptions extends BaseOptions {\n /**\n * Set to false to hide slide indicators.\n * @default true\n */\n indicators: boolean;\n /**\n * Set height of slider.\n * @default 400\n */\n height: number;\n /**\n * Set the duration of the transition animation in ms.\n * @default 500\n */\n duration: number;\n /**\n * Set the duration between transitions in ms.\n * @default 6000\n */\n interval: number;\n /**\n * If slider should pause when keyboard focus is received.\n * @default true\n */\n pauseOnFocus: boolean;\n /**\n * If slider should pause when is hovered by a pointer.\n * @default true\n */\n pauseOnHover: boolean;\n /**\n * Optional function used to generate ARIA label to indicators (for accessibility purposes).\n * @param index Current index, starting from \"1\".\n * @param current A which indicates whether it is the current element or not\n * @returns a string to be used as label indicator.\n * @default null\n */\n indicatorLabelFunc: (index: number, current: boolean) => string;\n}\n\nconst _defaults: SliderOptions = {\n indicators: true,\n height: 400,\n duration: 500,\n interval: 6000,\n pauseOnFocus: true,\n pauseOnHover: true,\n indicatorLabelFunc: null // Function which will generate a label for the indicators (ARIA)\n};\n\nexport class Slider extends Component<SliderOptions> {\n /** Index of current slide. */\n activeIndex: number;\n interval: ReturnType<typeof setTimeout>;\n eventPause: boolean;\n _slider: HTMLUListElement;\n _slides: HTMLLIElement[];\n _activeSlide: HTMLLIElement;\n _indicators: HTMLLIElement[];\n _hovered: boolean;\n _focused: boolean;\n _focusCurrent: boolean;\n _sliderId: string;\n\n constructor(el: HTMLElement, options: Partial<SliderOptions>) {\n super(el, options, Slider);\n this.el['Expressive_Slider'] = this;\n\n this.options = {\n ...Slider.defaults,\n ...options\n };\n\n // init props\n this.interval = null;\n this.eventPause = false;\n this._hovered = false;\n this._focused = false;\n this._focusCurrent = false;\n\n // setup\n this._slider = this.el.querySelector('.slides');\n this._slides = Array.from(this._slider.querySelectorAll('li'));\n this.activeIndex = this._slides.findIndex((li) => li.classList.contains('active'));\n\n if (this.activeIndex !== -1) {\n this._activeSlide = this._slides[this.activeIndex];\n }\n\n this._setSliderHeight();\n\n // Sets element id if it does not have one\n if (this._slider.hasAttribute('id')) this._sliderId = this._slider.getAttribute('id');\n else {\n this._sliderId = 'slider-' + Utils.guid();\n this._slider.setAttribute('id', this._sliderId);\n }\n\n const placeholderBase64 =\n 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n // Set initial positions of captions\n this._slides.forEach((slide) => {\n // Caption\n //const caption = <HTMLElement|null>slide.querySelector('.caption');\n //if (caption) this._animateCaptionIn(caption, 0);\n // Set Images as Background Images\n const img = slide.querySelector('img');\n if (img) {\n if (img.src !== placeholderBase64) {\n img.style.backgroundImage = 'url(' + img.src + ')';\n img.src = placeholderBase64;\n }\n }\n // Sets slide as focusable by code\n if (!slide.hasAttribute('tabindex')) slide.setAttribute('tabindex', '-1');\n // Removes initial visibility from \"inactive\" slides\n slide.style.visibility = 'hidden';\n });\n\n this._setupIndicators();\n\n // Show active slide\n if (this._activeSlide) {\n this._activeSlide.style.display = 'block';\n this._activeSlide.style.visibility = 'visible';\n } else {\n this.activeIndex = 0;\n this._slides[0].classList.add('active');\n this._slides[0].style.visibility = 'visible';\n this._activeSlide = this._slides[0];\n this._animateSlide(this._slides[0], true);\n // Update indicators\n if (this.options.indicators) {\n this._indicators[this.activeIndex].children[0].classList.add('active');\n }\n }\n this._setupEventHandlers();\n // auto scroll\n this.start();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Slider.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<SliderOptions>): Slider;\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<SliderOptions>): Slider[];\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<SliderOptions> = {}\n ): Slider | Slider[] {\n return super.init(els, options, Slider);\n }\n\n static getInstance(el: HTMLElement): Slider {\n return el['Expressive_Slider'];\n }\n\n destroy() {\n this.pause();\n this._removeIndicators();\n this._removeEventHandlers();\n this.el['Expressive_Slider'] = undefined;\n }\n\n private _setupEventHandlers() {\n if (this.options.pauseOnFocus) {\n this.el.addEventListener('focusin', this._handleAutoPauseFocus);\n this.el.addEventListener('focusout', this._handleAutoStartFocus);\n }\n if (this.options.pauseOnHover) {\n this.el.addEventListener('mouseenter', this._handleAutoPauseHover);\n this.el.addEventListener('mouseleave', this._handleAutoStartHover);\n }\n if (this.options.indicators) {\n this._indicators.forEach((el) => {\n el.addEventListener('click', this._handleIndicatorClick);\n });\n }\n document.addEventListener('visibilitychange', this._handleVisibilityChange);\n }\n\n private _removeEventHandlers() {\n if (this.options.pauseOnFocus) {\n this.el.removeEventListener('focusin', this._handleAutoPauseFocus);\n this.el.removeEventListener('focusout', this._handleAutoStartFocus);\n }\n if (this.options.pauseOnHover) {\n this.el.removeEventListener('mouseenter', this._handleAutoPauseHover);\n this.el.removeEventListener('mouseleave', this._handleAutoStartHover);\n }\n if (this.options.indicators) {\n this._indicators.forEach((el) => {\n el.removeEventListener('click', this._handleIndicatorClick);\n });\n }\n document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n }\n\n // Nobody is watching a backgrounded tab. Browsers clamp the timer rather\n // than stopping it, so without this the slider keeps cycling slides - and\n // running their transitions - out of sight.\n private _handleVisibilityChange = () => {\n if (document.hidden) {\n if (this.interval != null) this._pause(true);\n } else if (\n this.eventPause &&\n !(this.options.pauseOnHover && this._hovered) &&\n !(this.options.pauseOnFocus && this._focused)\n ) {\n this.start();\n }\n };\n\n private _handleIndicatorClick = (e: MouseEvent) => {\n const el = (<HTMLElement>e.target).parentElement;\n const currIndex = [...el.parentNode.children].indexOf(el);\n this._focusCurrent = true;\n this.set(currIndex);\n };\n\n private _handleAutoPauseHover = () => {\n this._hovered = true;\n if (this.interval != null) {\n this._pause(true);\n }\n };\n\n private _handleAutoPauseFocus = () => {\n this._focused = true;\n if (this.interval != null) {\n this._pause(true);\n }\n };\n\n private _handleAutoStartHover = () => {\n this._hovered = false;\n if (!(this.options.pauseOnFocus && this._focused) && this.eventPause) {\n this.start();\n }\n };\n\n private _handleAutoStartFocus = () => {\n this._focused = false;\n if (!(this.options.pauseOnHover && this._hovered) && this.eventPause) {\n this.start();\n }\n };\n\n private _handleInterval = () => {\n const activeElem = this._slider.querySelector('.active');\n let newActiveIndex = [...activeElem.parentNode.children].indexOf(activeElem);\n if (this._slides.length === newActiveIndex + 1)\n newActiveIndex = 0; // loop to start\n else newActiveIndex += 1;\n this.set(newActiveIndex);\n };\n\n private _animateSlide(slide: HTMLElement, isDirectionIn: boolean): void {\n let dx = 0,\n dy = 0;\n // from\n slide.style.opacity = isDirectionIn ? '0' : '1';\n setTimeout(() => {\n slide.style.transition = `opacity ${this.options.duration}ms ease`;\n // to\n slide.style.opacity = isDirectionIn ? '1' : '0';\n }, 1);\n // Caption\n const caption: HTMLElement = slide.querySelector('.caption');\n if (!caption) return;\n if (caption.classList.contains('center-align')) dy = -100;\n else if (caption.classList.contains('right-align')) dx = 100;\n else if (caption.classList.contains('left-align')) dx = -100;\n // from\n caption.style.opacity = isDirectionIn ? '0' : '1';\n caption.style.transform = isDirectionIn ? `translate(${dx}px, ${dy}px)` : `translate(0, 0)`;\n setTimeout(() => {\n caption.style.transition = `opacity ${this.options.duration}ms ease, transform ${this.options.duration}ms ease`;\n // to\n caption.style.opacity = isDirectionIn ? '1' : '0';\n caption.style.transform = isDirectionIn ? `translate(0, 0)` : `translate(${dx}px, ${dy}px)`;\n }, this.options.duration); // delay\n }\n\n private _setSliderHeight() {\n // If fullscreen, do nothing\n if (!this.el.classList.contains('fullscreen')) {\n if (this.options.indicators) {\n // Add height if indicators are present\n this.el.style.height = this.options.height + 40 + 'px'; //.css('height', this.options.height + 40 + 'px');\n } else {\n this.el.style.height = this.options.height + 'px';\n }\n this._slider.style.height = this.options.height + 'px';\n }\n }\n\n private _setupIndicators() {\n if (this.options.indicators) {\n const ul = document.createElement('ul');\n ul.classList.add('indicators');\n\n const arrLi = [];\n this._slides.forEach((el, i) => {\n const label = this.options.indicatorLabelFunc\n ? this.options.indicatorLabelFunc.call(this, i + 1, i === 0)\n : `${i + 1}`;\n const li = document.createElement('li');\n li.classList.add('indicator-item');\n // setAttribute, not an interpolated attribute in markup: the label\n // comes from indicatorLabelFunc and a quote in it would break out.\n const button = document.createElement('button');\n button.type = 'button';\n button.classList.add('indicator-item-btn');\n button.setAttribute('aria-label', label);\n button.setAttribute('aria-controls', this._sliderId);\n li.appendChild(button);\n arrLi.push(li);\n ul.append(li);\n });\n\n this.el.append(ul);\n this._indicators = arrLi;\n }\n }\n\n private _removeIndicators() {\n this.el.querySelector('ul.indicators').remove(); //find('ul.indicators').remove();\n }\n\n set(index: number) {\n // Wrap around indices.\n if (index >= this._slides.length) index = 0;\n else if (index < 0) index = this._slides.length - 1;\n\n // Only do if index changes\n if (this.activeIndex === index) return;\n\n this._activeSlide = this._slides[this.activeIndex];\n const _caption = <HTMLElement | null>this._activeSlide.querySelector('.caption');\n\n this._activeSlide.classList.remove('active');\n // Enables every slide\n this._slides.forEach((slide) => (slide.style.visibility = 'visible'));\n\n //--- Hide active Slide + Caption\n this._activeSlide.style.opacity = '0';\n setTimeout(() => {\n this._slides.forEach((slide) => {\n if (slide.classList.contains('active')) return;\n slide.style.opacity = '0';\n slide.style.transform = 'translate(0, 0)';\n // Disables invisible slides (for assistive technologies)\n slide.style.visibility = 'hidden';\n });\n }, this.options.duration);\n\n // Hide active Caption - a slide is not required to have one.\n //this._animateCaptionIn(_caption, this.options.duration);\n if (_caption) _caption.style.opacity = '0';\n\n // Update indicators\n if (this.options.indicators) {\n const activeIndicator = this._indicators[this.activeIndex].children[0];\n const nextIndicator = this._indicators[index].children[0];\n activeIndicator.classList.remove('active');\n nextIndicator.classList.add('active');\n if (typeof this.options.indicatorLabelFunc === 'function') {\n activeIndicator.ariaLabel = this.options.indicatorLabelFunc.call(\n this,\n this.activeIndex,\n false\n );\n nextIndicator.ariaLabel = this.options.indicatorLabelFunc.call(this, index, true);\n }\n }\n\n //--- Show new Slide + Caption\n this._animateSlide(this._slides[index], true);\n this._slides[index].classList.add('active');\n this.activeIndex = index;\n\n // Reset interval, if allowed. This check prevents autostart\n // when slider is paused, since it can be changed though indicators.\n if (this.interval != null) {\n this.start();\n }\n }\n\n _pause(fromEvent: boolean) {\n clearInterval(this.interval);\n this.eventPause = fromEvent;\n this.interval = null;\n }\n\n /**\n * Pause slider autoslide.\n */\n pause = () => {\n this._pause(false);\n };\n\n /**\n * Start slider autoslide.\n */\n start = () => {\n clearInterval(this.interval);\n this.interval = setInterval(\n this._handleInterval,\n this.options.duration + this.options.interval\n );\n this.eventPause = false;\n };\n\n /**\n * Move to next slider.\n */\n next = () => {\n let newIndex = this.activeIndex + 1;\n // Wrap around indices.\n if (newIndex >= this._slides.length) newIndex = 0;\n else if (newIndex < 0) newIndex = this._slides.length - 1;\n this.set(newIndex);\n };\n\n /**\n * Move to prev slider.\n */\n prev = () => {\n let newIndex = this.activeIndex - 1;\n // Wrap around indices.\n if (newIndex >= this._slides.length) newIndex = 0;\n else if (newIndex < 0) newIndex = this._slides.length - 1;\n this.set(newIndex);\n };\n}\n", "import { Carousel } from './carousel';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 300\n */\n duration: number;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to enable swipeable tabs.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: TabsOptions = {\n duration: 300,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _tabsCarousel: Carousel;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options, Tabs);\n this.el['Expressive_Tabs'] = this;\n\n this.options = {\n ...Tabs.defaults,\n ...options\n };\n\n this._tabLinks = this._queryTabLinks();\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tabs.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TabsOptions>): Tabs;\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<TabsOptions>): Tabs[];\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<TabsOptions> = {}\n ): Tabs | Tabs[] {\n return super.init(els, options, Tabs);\n }\n\n static getInstance(el: HTMLElement): Tabs {\n return el['Expressive_Tabs'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._indicator.parentNode.removeChild(this._indicator);\n if (this.options.swipeable) {\n this._teardownSwipeableTabs();\n } else {\n this._teardownNormalTabs();\n }\n this.el['Expressive_Tabs'] = undefined;\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n window.addEventListener('resize', this._handleWindowResize);\n this.el.addEventListener('click', this._handleTabClick);\n }\n\n _removeEventHandlers() {\n window.removeEventListener('resize', this._handleWindowResize);\n this.el.removeEventListener('click', this._handleTabClick);\n }\n\n _handleWindowResize = () => {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) {\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n };\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(\n ':scope > a, :scope > .tab > a, :scope > li.tab > a'\n );\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a') as HTMLAnchorElement | null;\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const tab = tabLink.parentElement;\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true' ||\n tab?.classList.contains('disabled');\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n // Make the old tab inactive.\n this._activeTabLink.classList.remove('active');\n const _oldContent = this._content;\n // Update the variables with the new link and content\n\n this._activeTabLink = tabLink;\n if (tabLink.hash) this._content = document.querySelector(tabLink.hash);\n this._tabLinks = this._queryTabLinks();\n // Make the tab active\n this._activeTabLink.classList.add('active');\n const prevIndex = this._index;\n this._index = Math.max(Array.from(this._tabLinks).indexOf(tabLink), 0);\n\n // Swap content\n if (this.options.swipeable) {\n if (this._tabsCarousel) {\n this._tabsCarousel.set(this._index, () => {\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n });\n }\n } else {\n if (this._content) {\n this._content.style.display = 'block';\n this._content.classList.add('active');\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n if (_oldContent && _oldContent !== this._content) {\n _oldContent.style.display = 'none';\n _oldContent.classList.remove('active');\n }\n }\n }\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n e.preventDefault();\n };\n\n _createIndicator() {\n const tag = this.el.tagName === 'UL' || this.el.tagName === 'OL' ? 'li' : 'span';\n const indicator = document.createElement(tag);\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n this._activeTabLink = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === location.hash\n );\n // If no match is found, use the first link or any with class 'active' as the initial active tab.\n if (!this._activeTabLink) {\n let activeTabLink = this.el.querySelector('a.active');\n if (!activeTabLink) {\n activeTabLink = this._tabLinks[0];\n }\n this._activeTabLink = activeTabLink as HTMLAnchorElement;\n }\n Array.from(this._tabLinks).forEach((a: HTMLAnchorElement) => a.classList.remove('active'));\n this._activeTabLink.classList.add('active');\n\n this._index = Math.max(Array.from(this._tabLinks).indexOf(this._activeTabLink), 0);\n if (this._activeTabLink && this._activeTabLink.hash) {\n this._content = document.querySelector(this._activeTabLink.hash);\n if (this._content) this._content.classList.add('active');\n }\n }\n\n _setupSwipeableTabs() {\n // Change swipeable according to responsive threshold\n if (window.innerWidth > this.options.responsiveThreshold) this.options.swipeable = false;\n\n const tabsContent = [];\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash);\n currContent.classList.add('carousel-item');\n tabsContent.push(currContent);\n }\n });\n\n // Create Carousel-Wrapper around Tab-Contents\n const tabsWrapper = document.createElement('div');\n tabsWrapper.classList.add('tabs-content', 'carousel', 'carousel-slider');\n\n // Wrap around\n tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);\n tabsContent.forEach((tabContent) => {\n tabsWrapper.appendChild(tabContent);\n tabContent.style.display = '';\n });\n\n this._tabsCarousel = Carousel.init(tabsWrapper, {\n fullWidth: true,\n noWrap: true,\n onCycleTo: (item) => {\n const prevIndex = this._index;\n this._index = Array.from(item.parentNode.children).indexOf(item);\n this._activeTabLink.classList.remove('active');\n this._activeTabLink = Array.from(this._tabLinks)[this._index];\n this._activeTabLink.classList.add('active');\n this._animateIndicator(prevIndex);\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n }\n });\n // Set initial carousel slide to active tab\n this._tabsCarousel.set(this._index);\n }\n\n _teardownSwipeableTabs() {\n const tabsWrapper = this._tabsCarousel.el;\n this._tabsCarousel.destroy();\n // Unwrap\n tabsWrapper.append(tabsWrapper.parentElement);\n tabsWrapper.remove();\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink) return;\n if ((<HTMLAnchorElement>a).hash) {\n const currContent = document.querySelector((<HTMLAnchorElement>a).hash);\n if (currContent) (<HTMLElement>currContent).style.display = 'none';\n }\n });\n }\n\n _teardownNormalTabs() {\n // show Tabs Content\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash) as HTMLElement;\n if (currContent) currContent.style.display = '';\n }\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el) {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el) {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex) {\n let leftDelay = 0,\n rightDelay = 0;\n\n const isMovingLeftOrStaying = this._index - prevIndex >= 0;\n if (isMovingLeftOrStaying) leftDelay = 90;\n else rightDelay = 90;\n\n // in v1: easeOutQuad\n this._indicator.style.transition = `\n left ${this.options.duration}ms ease-out ${leftDelay}ms,\n right ${this.options.duration}ms ease-out ${rightDelay}ms`;\n\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === '#' + tabId\n );\n if (tab) (<HTMLAnchorElement>tab).click();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, Openable } from '../core/component';\n\nexport interface TapTargetOptions extends BaseOptions {\n /**\n * Callback function called when Tap Target is opened.\n * @default null\n */\n onOpen: (origin: HTMLElement) => void;\n /**\n * Callback function called when Tap Target is closed.\n * @default null\n */\n onClose: (origin: HTMLElement) => void;\n}\n\nconst _defaults: TapTargetOptions = {\n onOpen: null,\n onClose: null\n};\n\n/**\n * Tap target (Feature Discovery). Placement is CSS custom properties;\n * the wrapper is a popover when the platform has one. This class is\n * open/close, origin lookup, and the two geometry variables.\n */\nexport class TapTarget extends Component<TapTargetOptions> implements Openable {\n isOpen: boolean;\n originEl: HTMLElement | null;\n\n static _taptargets: TapTarget[];\n\n private wrapper: HTMLElement | null = null;\n private waveEl: HTMLElement | null = null;\n private contentEl: HTMLElement | null = null;\n private _createdWrapper = false;\n private _createdWave = false;\n private _usePopover = false;\n private _liftedStatic = false;\n private _opening = false;\n\n constructor(el: HTMLElement, options: Partial<TapTargetOptions>) {\n super(el, options, TapTarget);\n this.el['Expressive_TapTarget'] = this;\n\n this.options = {\n ...TapTarget.defaults,\n ...options\n };\n\n this.isOpen = false;\n // getElementById, not a `#${\u2026}` selector: data-target is author content\n // and anything that is not a bare identifier either threw a SyntaxError\n // here or steered the query somewhere else.\n this.originEl = el.dataset.target ? document.getElementById(el.dataset.target) : null;\n if (!this.originEl) {\n console.error(`TapTarget: no element with id \"${el.dataset.target ?? ''}\" to attach to`);\n return;\n }\n\n this._setup();\n this._calculatePositioning();\n this._setupEventHandlers();\n\n TapTarget._taptargets.push(this);\n }\n\n static get defaults(): TapTargetOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<TapTargetOptions>): TapTarget;\n static init(els: InitElements<MElement>, options?: Partial<TapTargetOptions>): TapTarget[];\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<TapTargetOptions> = {}\n ): TapTarget | TapTarget[] {\n return super.init(els, options, TapTarget);\n }\n\n static getInstance(el: HTMLElement): TapTarget {\n return el['Expressive_TapTarget'];\n }\n\n destroy() {\n this.close();\n this._removeEventHandlers();\n this._teardownDom();\n this.el['Expressive_TapTarget'] = undefined;\n const index = TapTarget._taptargets.indexOf(this);\n if (index >= 0) TapTarget._taptargets.splice(index, 1);\n }\n\n /**\n * Open Tap Target.\n */\n open = () => {\n if (this.isOpen || !this.originEl || !this.wrapper) return;\n\n TapTarget._taptargets.forEach((other) => {\n if (other !== this) other.close();\n });\n\n this._calculatePositioning();\n\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen.call(this, this.originEl);\n }\n\n this.isOpen = true;\n this.wrapper.classList.add('open');\n this.originEl.setAttribute('aria-expanded', 'true');\n\n if (!this._usePopover) {\n this.originEl.classList.add('tap-target-origin');\n if (getComputedStyle(this.originEl).position === 'static') {\n this.originEl.style.position = 'relative';\n this._liftedStatic = true;\n }\n }\n\n if (this._usePopover) {\n this._opening = true;\n try {\n this.wrapper.showPopover();\n } catch {\n // already open\n }\n requestAnimationFrame(() => {\n this._opening = false;\n });\n }\n };\n\n /**\n * Close Tap Target.\n */\n close = () => {\n if (!this.isOpen) return;\n\n if (typeof this.options.onClose === 'function' && this.originEl) {\n this.options.onClose.call(this, this.originEl);\n }\n\n this.isOpen = false;\n this.wrapper?.classList.remove('open');\n this.originEl?.setAttribute('aria-expanded', 'false');\n this.originEl?.classList.remove('tap-target-origin');\n if (this._liftedStatic && this.originEl) {\n this.originEl.style.position = '';\n this._liftedStatic = false;\n }\n\n if (this._usePopover && this.wrapper) {\n try {\n this.wrapper.hidePopover();\n } catch {\n // already closed\n }\n }\n };\n\n private _setup() {\n const parent = this.el.parentElement;\n if (parent?.classList.contains('tap-target-wrapper')) {\n this.wrapper = parent;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('tap-target-wrapper');\n this.el.before(this.wrapper);\n this.wrapper.append(this.el);\n this._createdWrapper = true;\n }\n\n this.contentEl = this.el.querySelector('.tap-target-content');\n if (!this.contentEl) {\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'tap-target-content';\n while (this.el.firstChild) this.contentEl.append(this.el.firstChild);\n this.el.append(this.contentEl);\n }\n\n this.waveEl =\n this.el.querySelector('.tap-target-wave') ??\n this.wrapper.querySelector('.tap-target-wave');\n if (!this.waveEl) {\n this.waveEl = document.createElement('div');\n this.waveEl.className = 'tap-target-wave';\n this._createdWave = true;\n }\n // Inside the circle, behind .tap-target-content \u2014 a sibling of the\n // circle paints over the copy.\n this.el.prepend(this.waveEl);\n\n this.el.setAttribute('role', 'dialog');\n this._labelFromHeading();\n\n const origin = this.originEl;\n origin.setAttribute('aria-expanded', 'false');\n origin.setAttribute('aria-controls', this.el.id || this._ensureId());\n\n this._usePopover = typeof this.wrapper.showPopover === 'function';\n if (this._usePopover) {\n this.wrapper.setAttribute('popover', 'auto');\n }\n }\n\n private _ensureId(): string {\n if (!this.el.id) this.el.id = `tap-target-${Utils.guid()}`;\n return this.el.id;\n }\n\n private _labelFromHeading() {\n const heading = this.contentEl?.querySelector('h1, h2, h3, h4, h5, h6');\n if (!heading) return;\n if (!heading.id) heading.id = `tap-target-title-${Utils.guid()}`;\n this.el.setAttribute('aria-labelledby', heading.id);\n }\n\n private _teardownDom() {\n if (this._createdWave) this.waveEl?.remove();\n if (this._createdWrapper && this.wrapper) {\n this.wrapper.before(this.el);\n this.wrapper.remove();\n }\n this.wrapper = null;\n this.waveEl = null;\n }\n\n private _setupEventHandlers() {\n if (!this.originEl) return;\n this.originEl.addEventListener('click', this._handleTargetToggle);\n if (!this.originEl.matches('button, a, [tabindex], .btn, [role=\"button\"]')) {\n this.originEl.tabIndex = 0;\n this.originEl.addEventListener('keydown', this._handleOriginKeydown);\n }\n this.wrapper?.addEventListener('toggle', this._handlePopoverToggle);\n window.addEventListener('resize', this._handleThrottledResize, { passive: true });\n }\n\n private _removeEventHandlers() {\n if (!this.originEl) return;\n this.originEl.removeEventListener('click', this._handleTargetToggle);\n this.originEl.removeEventListener('keydown', this._handleOriginKeydown);\n this.wrapper?.removeEventListener('toggle', this._handlePopoverToggle);\n window.removeEventListener('resize', this._handleThrottledResize);\n }\n\n // Built once per instance; a fresh throttle per event never fires.\n private _handleThrottledResize = Utils.throttle(() => this._handleResize(), 200);\n\n private _handleOriginKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key) || e.key === ' ') {\n e.preventDefault();\n this._handleTargetToggle();\n }\n };\n\n private _handleTargetToggle = () => {\n if (!this.isOpen) this.open();\n else this.close();\n };\n\n private _handleResize = () => {\n if (this.isOpen) this._calculatePositioning();\n };\n\n private _handlePopoverToggle = (e: Event) => {\n const state = 'newState' in e ? String((e as { newState: string }).newState) : '';\n if (state === 'open') return;\n if (this._opening) {\n try {\n this.wrapper?.showPopover();\n } catch {\n /* still opening */\n }\n return;\n }\n if (this.isOpen) this.close();\n };\n\n private _calculatePositioning() {\n if (!this.originEl || !this.wrapper) return;\n const rect = this.originEl.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = rect.top + rect.height / 2;\n const size = Math.max(rect.width, rect.height, 1);\n\n this.wrapper.style.setProperty('--md-comp-tap-target-x', `${x}px`);\n this.wrapper.style.setProperty('--md-comp-tap-target-y', `${y}px`);\n this.wrapper.style.setProperty('--md-comp-tap-target-origin-size', `${size}px`);\n\n const vertical = y <= window.innerHeight / 2 ? 'top' : 'bottom';\n const onCenter = x >= window.innerWidth * 0.25 && x <= window.innerWidth * 0.75;\n const horizontal = onCenter ? 'center' : x <= window.innerWidth / 2 ? 'left' : 'right';\n this.wrapper.dataset.edge = `${vertical}-${horizontal}`;\n }\n\n static {\n TapTarget._taptargets = [];\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, MElement, I18nOptions } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport type Views = 'hours' | 'minutes';\n\nexport interface TimepickerOptions extends BaseOptions {\n /**\n * Dial radius.\n * @default 135\n */\n dialRadius: number;\n /**\n * Outer radius.\n * @default 105\n */\n outerRadius: number;\n /**\n * Inner radius.\n * @default 70\n */\n innerRadius: number;\n /**\n * Tick radius.\n * @default 20\n */\n tickRadius: number;\n /**\n * Duration of the transition from/to the hours/minutes view.\n * @default 350\n */\n duration: number;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the time picker in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the Timepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit timepicker selection to input field\n * @default true\n */\n autoSubmit: true;\n /**\n * Default time to set on the timepicker 'now' or '13:14'.\n * @default 'now';\n */\n defaultTime: string;\n /**\n * Millisecond offset from the defaultTime.\n * @default 0\n */\n fromNow: number;\n /**\n * Internationalization options.\n */\n i18n: Partial<I18nOptions>;\n /**\n * Use 12 hour AM/PM clock instead of 24 hour clock.\n * @default true\n */\n twelveHour: boolean;\n /**\n * Vibrate device when dragging clock hand.\n * @default true\n */\n vibrate: boolean;\n /**\n * Callback function when a time is selected.\n * @default null\n */\n onSelect: (hour: number, minute: number) => void;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for done.\n * @default null\n */\n onDone: (() => void) | null;\n /**\n * Callback function for cancel.\n * @default null\n */\n onCancel: (() => void) | null;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: TimepickerOptions = {\n dialRadius: 135,\n outerRadius: 105,\n innerRadius: 70,\n tickRadius: 20,\n duration: 350,\n container: null,\n defaultTime: 'now', // default time, 'now' or '13:14' e.g.\n fromNow: 0, // Millisecond offset from the defaultTime\n showClearBtn: false,\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok'\n },\n twelveHour: true, // change to 12 hour AM/PM clock from 24 hour\n vibrate: true, // vibrate the device when dragging clock hand\n // Callbacks\n onSelect: null,\n onInputInteraction: null,\n onDone: null,\n onCancel: null,\n displayPlugin: null,\n displayPluginOptions: null,\n};\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport class Timepicker extends Component<TimepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n containerEl: HTMLElement;\n plate: HTMLElement;\n digitalClock: HTMLElement;\n inputHours: HTMLInputElement;\n inputMinutes: HTMLInputElement;\n x0: number;\n y0: number;\n moved: boolean;\n dx: number;\n dy: number;\n /**\n * Current view on the timepicker.\n * @default 'hours'\n */\n currentView: Views;\n hand: SVGElement;\n minutesView: HTMLElement;\n hours: number;\n minutes: number;\n /** The selected time. */\n time: string;\n /**\n * If the time is AM or PM on twelve-hour clock.\n * @default 'PM'\n */\n amOrPm: 'AM' | 'PM';\n static _template;\n /** Whether this device exposes the Vibration API at all. */\n canVibrate: boolean;\n _canvas: HTMLElement;\n hoursView: HTMLElement;\n spanAmPm: HTMLSpanElement;\n footer: HTMLElement;\n private _amBtn: HTMLElement;\n private _pmBtn: HTMLElement;\n bg: Element;\n bearing: Element;\n g: Element;\n toggleViewTimer: ReturnType<typeof setTimeout>;\n vibrateTimer: ReturnType<typeof setTimeout>;\n private displayPlugin: DockedDisplayPlugin;\n /** Whether the dial (ticks + SVG + AM/PM buttons) has been built yet. */\n private _clockBuilt = false;\n\n constructor(el: HTMLInputElement, options: Partial<TimepickerOptions>) {\n super(el, options, Timepicker);\n this.el['Expressive_Timepicker'] = this;\n this.options = {\n ...Timepicker.defaults,\n ...options\n };\n this.id = Utils.guid();\n this._insertHTMLIntoDOM();\n this._setupVariables();\n this._setupEventHandlers();\n // The dial is ~40 elements (12 or 24 hour ticks, 12 minute ticks, the SVG\n // hand and the AM/PM buttons) and is built by _ensureClockBuilt() rather\n // than here - see _pickerSetup for when that first happens.\n this._pickerSetup();\n\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults(): TimepickerOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Timepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<TimepickerOptions>): Timepicker;\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | MElement>,\n options?: Partial<TimepickerOptions>\n ): Timepicker[];\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | MElement>,\n options: Partial<TimepickerOptions> = {}\n ): Timepicker | Timepicker[] {\n return super.init(els, options, Timepicker);\n }\n\n static _addLeadingZero(num: number) {\n return (num < 10 ? '0' : '') + num;\n }\n\n static _createSVGEl(name: string) {\n const svgNS = 'http://www.w3.org/2000/svg';\n return document.createElementNS(svgNS, name);\n }\n\n static _Pos(e: TouchEvent | MouseEvent): Point {\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return {\n x: (e as TouchEvent).targetTouches[0].clientX,\n y: (e as TouchEvent).targetTouches[0].clientY\n };\n }\n // mouse event\n return { x: (e as MouseEvent).clientX, y: (e as MouseEvent).clientY };\n }\n\n static getInstance(el: HTMLElement): Timepicker {\n return el['Expressive_Timepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.el['Expressive_Timepicker'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.plate.addEventListener('mousedown', this._handleClockClickStart);\n this.plate.addEventListener('touchstart', this._handleClockClickStart);\n this.digitalClock.addEventListener('keyup', this._inputFromTextField);\n this.inputHours.addEventListener('focus', () => this.showView('hours'));\n this.inputHours.addEventListener('focusout', () => this.formatHours());\n this.inputMinutes.addEventListener('focus', () => this.showView('minutes'));\n this.inputMinutes.addEventListener('focusout', () => this.formatMinutes());\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n // Drag handlers live on the document while the clock hand is held; if the\n // component is destroyed mid-drag they would otherwise outlive it.\n document.removeEventListener('mousemove', this._handleDocumentClickMove);\n document.removeEventListener('touchmove', this._handleDocumentClickMove);\n document.removeEventListener('mouseup', this._handleDocumentClickEnd);\n document.removeEventListener('touchend', this._handleDocumentClickEnd);\n }\n\n _handleInputClick = () => {\n // Before focus(): focusing inputHours fires the handler that calls\n // showView, and an already-focused input fires nothing at all.\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n }\n };\n\n _handleTimeInputEnterKey = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._inputFromTextField();\n }\n };\n\n _handleClockClickStart = (e) => {\n e.preventDefault();\n this._ensureClockBuilt();\n const clockPlateBR = this.plate.getBoundingClientRect();\n const offset = { x: clockPlateBR.left, y: clockPlateBR.top };\n\n this.x0 = offset.x + this.options.dialRadius;\n this.y0 = offset.y + this.options.dialRadius;\n this.moved = false;\n const clickPos = Timepicker._Pos(e);\n this.dx = clickPos.x - this.x0;\n this.dy = clickPos.y - this.y0;\n\n // Set clock hands\n this.setHand(this.dx, this.dy, false);\n // Mousemove on document\n document.addEventListener('mousemove', this._handleDocumentClickMove);\n document.addEventListener('touchmove', this._handleDocumentClickMove);\n // Mouseup on document\n document.addEventListener('mouseup', this._handleDocumentClickEnd);\n document.addEventListener('touchend', this._handleDocumentClickEnd);\n };\n\n _handleDocumentClickMove = (e) => {\n e.preventDefault();\n const clickPos = Timepicker._Pos(e);\n const x = clickPos.x - this.x0;\n const y = clickPos.y - this.y0;\n this.moved = true;\n this.setHand(x, y, false);\n };\n\n _handleDocumentClickEnd = (e) => {\n e.preventDefault();\n document.removeEventListener('mouseup', this._handleDocumentClickEnd);\n document.removeEventListener('touchend', this._handleDocumentClickEnd);\n const clickPos = Timepicker._Pos(e);\n const x = clickPos.x - this.x0;\n const y = clickPos.y - this.y0;\n if (this.moved && x === this.dx && y === this.dy) {\n this.setHand(x, y);\n }\n\n if (this.currentView === 'hours') {\n this.inputMinutes.focus();\n this.showView('minutes', this.options.duration / 2);\n } else {\n // this.minutesView.classList.add('timepicker-dial-out');\n setTimeout(() => {\n if (this.options.autoSubmit) this.done();\n }, this.options.duration / 2);\n }\n\n if (typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, this.hours, this.minutes);\n }\n // Unbind mousemove event\n document.removeEventListener('mousemove', this._handleDocumentClickMove);\n document.removeEventListener('touchmove', this._handleDocumentClickMove);\n };\n\n _insertHTMLIntoDOM() {\n const template = document.createElement('template');\n template.innerHTML = Timepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n this.containerEl.id = 'container-' + this.id;\n\n // Append popover to input by default\n const optEl = this.options.container;\n const containerEl = optEl instanceof HTMLElement ? optEl : document.querySelector(optEl);\n\n if (this.options.container && !!containerEl) {\n containerEl.append(this.containerEl);\n } else {\n this.el.parentElement.appendChild(this.containerEl);\n }\n }\n\n _setupVariables() {\n this.currentView = 'hours';\n // `navigator.webkitVibrate` never shipped in any browser - the probe it\n // came from was folklore. A plain feature check is the whole of it.\n this.canVibrate = typeof navigator.vibrate === 'function';\n this._canvas = this.containerEl.querySelector('.timepicker-canvas');\n this.plate = this.containerEl.querySelector('.timepicker-plate');\n this.digitalClock = this.containerEl.querySelector('.timepicker-display-column');\n this.hoursView = this.containerEl.querySelector('.timepicker-hours');\n this.minutesView = this.containerEl.querySelector('.timepicker-minutes');\n this.inputHours = this.containerEl.querySelector('.timepicker-input-hours');\n this.inputMinutes = this.containerEl.querySelector('.timepicker-input-minutes');\n this.spanAmPm = this.containerEl.querySelector('.timepicker-span-am-pm');\n this.footer = this.containerEl.querySelector('.timepicker-footer');\n this.amOrPm = 'PM';\n }\n\n /*private _createButton(text: string, visibility: string): HTMLButtonElement {\n const button = document.createElement('button');\n button.classList.add('btn', 'waves-effect', 'text');\n button.style.visibility = visibility;\n button.type = 'button';\n button.tabIndex = -1;\n button.innerText = text;\n return button;\n }*/\n\n _pickerSetup() {\n // clearButton.classList.add('timepicker-clear');\n // clearButton.addEventListener('click', this.clear);\n // this.footer.appendChild(clearButton);\n Utils.createButton(\n this.footer,\n this.options.i18n.clear,\n ['timepicker-clear'],\n this.options.showClearBtn,\n this.clear\n );\n\n if (!this.options.autoSubmit) {\n /*const confirmationBtnsContainer = document.createElement('div');\n confirmationBtnsContainer.classList.add('confirmation-btns');\n this.footer.append(confirmationBtnsContainer);\n\n const cancelButton = this._createButton(this.options.i18n.cancel, '');\n cancelButton.classList.add('timepicker-close');\n cancelButton.addEventListener('click', this.close);\n confirmationBtnsContainer.appendChild(cancelButton);\n\n const doneButton = this._createButton(this.options.i18n.done, '');\n doneButton.classList.add('timepicker-close');\n //doneButton.addEventListener('click', this._finishSelection);\n confirmationBtnsContainer.appendChild(doneButton);*/\n Utils.createConfirmationContainer(\n this.footer,\n this.options.i18n.done,\n this.options.i18n.cancel,\n this.confirm,\n this.cancel\n );\n }\n\n this._updateTimeFromInput();\n\n // With a docked display the container is `visibility: hidden` until\n // show(), so the dial can wait for the first interaction. Without one it\n // is on screen from the moment it is inserted and has to be ready now.\n if (!this.options.displayPlugin) this.showView('hours');\n }\n\n /**\n * Build the dial, once. Cheap to call repeatedly - every entry point that\n * touches the clock calls it first, so the picker cannot be interacted with\n * before it exists.\n */\n private _ensureClockBuilt() {\n if (this._clockBuilt) return;\n this._clockBuilt = true;\n this._clockSetup();\n // Applies the AM/PM state _updateTimeFromInput worked out before the\n // buttons existed.\n this._updateAmPmView();\n }\n\n _clockSetup() {\n if (this.options.twelveHour) {\n // AM Button\n this._amBtn = document.createElement('div');\n this._amBtn.classList.add('am-btn', 'btn');\n this._amBtn.innerText = 'AM';\n this._amBtn.tabIndex = 0;\n this._amBtn.addEventListener('click', this._handleAmPmClick);\n this._amBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._amBtn);\n // PM Button\n this._pmBtn = document.createElement('div');\n this._pmBtn.classList.add('pm-btn', 'btn');\n this._pmBtn.innerText = 'PM';\n this._pmBtn.tabIndex = 0;\n this._pmBtn.addEventListener('click', this._handleAmPmClick);\n this._pmBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._pmBtn);\n }\n this._buildHoursView();\n this._buildMinutesView();\n this._buildSVGClock();\n }\n\n _buildSVGClock() {\n // Draw clock hands and others\n const dialRadius = this.options.dialRadius;\n const tickRadius = this.options.tickRadius;\n const diameter = dialRadius * 2;\n const svg = Timepicker._createSVGEl('svg');\n svg.setAttribute('class', 'timepicker-svg');\n svg.setAttribute('width', diameter.toString());\n svg.setAttribute('height', diameter.toString());\n const g = Timepicker._createSVGEl('g');\n g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');\n const bearing = Timepicker._createSVGEl('circle');\n bearing.setAttribute('class', 'timepicker-canvas-bearing');\n bearing.setAttribute('cx', '0');\n bearing.setAttribute('cy', '0');\n bearing.setAttribute('r', '4');\n const hand = Timepicker._createSVGEl('line');\n hand.setAttribute('x1', '0');\n hand.setAttribute('y1', '0');\n const bg = Timepicker._createSVGEl('circle');\n bg.setAttribute('class', 'timepicker-canvas-bg');\n bg.setAttribute('r', tickRadius.toString());\n g.appendChild(hand);\n g.appendChild(bg);\n g.appendChild(bearing);\n svg.appendChild(g);\n this._canvas.appendChild(svg);\n this.hand = hand;\n this.bg = bg;\n this.bearing = bearing;\n this.g = g;\n }\n\n _buildHoursView() {\n // const $tick = document.createElement('div');\n // $tick.classList.add('timepicker-tick');\n // Hours view\n if (this.options.twelveHour) {\n for (let i = 1; i < 13; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const radius = this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n } else {\n for (let i = 0; i < 24; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const inner = i > 0 && i < 13;\n const radius = inner ? this.options.innerRadius : this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n }\n }\n\n _buildHoursTick(i: number, radian: number, radius: number) {\n const tick = document.createElement('div');\n tick.classList.add('timepicker-tick');\n tick.style.left =\n this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px';\n tick.style.top =\n this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px';\n tick.textContent = i === 0 ? '00' : i.toString();\n this.hoursView.appendChild(tick);\n }\n\n _buildMinutesView() {\n const _tick = document.createElement('div');\n _tick.classList.add('timepicker-tick');\n // Minutes view\n for (let i = 0; i < 60; i += 5) {\n const tick = <HTMLElement>_tick.cloneNode(true);\n const radian = (i / 30) * Math.PI;\n tick.style.left =\n this.options.dialRadius +\n Math.sin(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.style.top =\n this.options.dialRadius -\n Math.cos(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.textContent = Timepicker._addLeadingZero(i);\n this.minutesView.appendChild(tick);\n }\n }\n\n _handleAmPmClick = (e: MouseEvent) => {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n };\n\n _handleAmPmKeypress = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n }\n };\n\n _handleAmPmInteraction = (e: HTMLElement) => {\n this.amOrPm = e.classList.contains('am-btn') ? 'AM' : 'PM';\n this._updateAmPmView();\n }\n\n _updateAmPmView() {\n // _updateTimeFromInput settles amOrPm before the dial is built; the\n // buttons pick the state up in _ensureClockBuilt.\n if (!this._amBtn || !this._pmBtn) return;\n if (this.options.twelveHour) {\n if (this.amOrPm === 'PM') {\n this._amBtn.classList.remove('filled');\n this._pmBtn.classList.add('filled');\n } else if (this.amOrPm === 'AM') {\n this._amBtn.classList.add('filled');\n this._pmBtn.classList.remove('filled');\n }\n }\n }\n\n _updateTimeFromInput() {\n // Get the time\n let value = ((this.el.value || this.options.defaultTime || '') + '').split(':');\n if (this.options.twelveHour && !(typeof value[1] === 'undefined')) {\n if (value[1].toUpperCase().indexOf('AM') > 0) {\n this.amOrPm = 'AM';\n } else {\n this.amOrPm = 'PM';\n }\n value[1] = value[1].replace('AM', '').replace('PM', '');\n }\n if (value[0] === 'now') {\n const now = new Date(+new Date() + this.options.fromNow);\n value = [now.getHours().toString(), now.getMinutes().toString()];\n if (this.options.twelveHour) {\n this.amOrPm = parseInt(value[0]) >= 12 && parseInt(value[0]) < 24 ? 'PM' : 'AM';\n }\n }\n this.hours = +value[0] || 0;\n this.minutes = +value[1] || 0;\n this.inputHours.value = Timepicker._addLeadingZero(this.hours);\n this.inputMinutes.value = Timepicker._addLeadingZero(this.minutes);\n\n this._updateAmPmView();\n }\n\n /**\n * Show hours or minutes view on timepicker.\n * @param view The name of the view you want to switch to, 'hours' or 'minutes'.\n * @param delay\n */\n showView = (view: Views, delay: number = null) => {\n this._ensureClockBuilt();\n if (view === 'minutes' && getComputedStyle(this.hoursView).visibility === 'visible') {\n // raiseCallback(this.options.beforeHourSelect);\n }\n const isHours = view === 'hours',\n nextView = isHours ? this.hoursView : this.minutesView,\n hideView = isHours ? this.minutesView : this.hoursView;\n this.currentView = view;\n\n /*if (isHours) {\n this.inputHours.classList.add('text-primary');\n this.inputMinutes.classList.remove('text-primary');\n } else {\n this.inputHours.classList.remove('text-primary');\n this.inputMinutes.classList.add('text-primary');\n }*/\n\n // Transition view\n hideView.classList.add('timepicker-dial-out');\n\n nextView.style.visibility = 'visible';\n nextView.classList.remove('timepicker-dial-out');\n\n // Reset clock hand\n this.resetClock(delay);\n // After transitions ended\n clearTimeout(this.toggleViewTimer);\n this.toggleViewTimer = setTimeout(() => {\n hideView.style.visibility = 'hidden';\n }, this.options.duration);\n };\n\n resetClock(delay) {\n const view = this.currentView,\n value = this[view],\n isHours = view === 'hours',\n unit = Math.PI / (isHours ? 6 : 30),\n radian = value * unit,\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius,\n x = Math.sin(radian) * radius,\n y = -Math.cos(radian) * radius;\n\n if (delay) {\n this._canvas?.classList.add('timepicker-canvas-out');\n setTimeout(() => {\n this._canvas?.classList.remove('timepicker-canvas-out');\n this.setHand(x, y);\n }, delay);\n } else {\n this.setHand(x, y);\n }\n }\n\n _inputFromTextField = () => {\n const isHours = this.currentView === 'hours';\n if (isHours && this.inputHours.value !== '') {\n const value = parseInt(this.inputHours.value);\n if (value > 0 && value < (this.options.twelveHour ? 13 : 24)) {\n this.hours = value;\n } else {\n this.setHoursDefault();\n }\n this.drawClockFromTimeInput(this.hours, isHours);\n } else if (!isHours && this.inputMinutes.value !== '') {\n const value = parseInt(this.inputMinutes.value);\n if (value >= 0 && value < 60) {\n this.minutes = value;\n } else {\n this.minutes = new Date().getMinutes();\n this.inputMinutes.value = this.minutes.toString();\n }\n this.drawClockFromTimeInput(this.minutes, isHours);\n }\n };\n\n drawClockFromTimeInput(value, isHours) {\n const unit = Math.PI / (isHours ? 6 : 30);\n const radian = value * unit;\n let radius;\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n } else {\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius;\n }\n this.setClockAttributes(radian, radius);\n }\n\n setHand(x, y, roundBy5: boolean = false) {\n const isHours = this.currentView === 'hours',\n unit = Math.PI / (isHours || roundBy5 ? 6 : 30),\n z = Math.sqrt(x * x + y * y),\n inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2;\n let radian = Math.atan2(x, -y),\n radius = inner ? this.options.innerRadius : this.options.outerRadius;\n\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n }\n\n // Radian should in range [0, 2PI]\n if (radian < 0) {\n radian = Math.PI * 2 + radian;\n }\n\n // Get the round value\n let value = Math.round(radian / unit);\n\n // Get the round radian\n radian = value * unit;\n\n // Correct the hours or minutes\n if (this.options.twelveHour) {\n if (isHours) {\n if (value === 0) value = 12;\n } else {\n if (roundBy5) value *= 5;\n if (value === 60) value = 0;\n }\n } else {\n if (isHours) {\n if (value === 12) {\n value = 0;\n }\n value = inner ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;\n } else {\n if (roundBy5) {\n value *= 5;\n }\n if (value === 60) {\n value = 0;\n }\n }\n }\n\n // Once hours or minutes changed, vibrate the device\n if (this[this.currentView] !== value) {\n if (this.canVibrate && this.options.vibrate) {\n // Do not vibrate too frequently\n if (!this.vibrateTimer) {\n navigator.vibrate(10);\n this.vibrateTimer = setTimeout(() => {\n this.vibrateTimer = null;\n }, 100);\n }\n }\n }\n\n this[this.currentView] = value;\n if (isHours) {\n this.inputHours.value = Timepicker._addLeadingZero(value);\n } else {\n this.inputMinutes.value = Timepicker._addLeadingZero(value);\n }\n\n // Set clock hand and others' position\n this.setClockAttributes(radian, radius);\n }\n\n setClockAttributes(radian: number, radius: number) {\n // Nothing to point at until the SVG exists.\n if (!this.hand || !this.bg) return;\n const cx1 = Math.sin(radian) * (radius - this.options.tickRadius),\n cy1 = -Math.cos(radian) * (radius - this.options.tickRadius),\n cx2 = Math.sin(radian) * radius,\n cy2 = -Math.cos(radian) * radius;\n this.hand.setAttribute('x2', cx1.toString());\n this.hand.setAttribute('y2', cy1.toString());\n this.bg.setAttribute('cx', cx2.toString());\n this.bg.setAttribute('cy', cy2.toString());\n }\n\n formatHours() {\n if (this.inputHours.value == '') this.setHoursDefault();\n this.inputHours.value = Timepicker._addLeadingZero(Number(this.inputHours.value));\n }\n\n formatMinutes() {\n if (this.inputMinutes.value == '') this.minutes = new Date().getMinutes();\n this.inputMinutes.value = Timepicker._addLeadingZero(Number(this.inputMinutes.value));\n }\n\n setHoursDefault() {\n this.hours = new Date().getHours();\n this.inputHours.value = (this.hours % (this.options.twelveHour ? 12 : 24)).toString();\n }\n\n done = (clearValue = null) => {\n // Set input value\n const last = this.el.value;\n let value = clearValue\n ? ''\n : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes);\n this.time = value;\n if (!clearValue && this.options.twelveHour) {\n value = `${value} ${this.amOrPm}`;\n }\n this.el.value = value;\n // Trigger change event\n if (value !== last) {\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n };\n\n confirm = () => {\n this.done();\n if (typeof this.options.onDone === 'function') this.options.onDone.call(this);\n }\n\n cancel = () => {\n // not logical clearing the input field on cancel, since the end user might want to make use of the previously submitted value\n // this.clear();\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n }\n\n clear = () => {\n this.done(true);\n };\n\n // deprecated\n open() {\n console.warn(\n 'Timepicker.close() is deprecated. Remove this method and wrap in modal yourself.'\n );\n return this;\n }\n\n close() {\n console.warn(\n 'Timepicker.close() is deprecated. Remove this method and wrap in modal yourself.'\n );\n return this;\n }\n\n static {\n Timepicker._template = `<div class=\"timepicker-container\">\n <div class=\"timepicker-digital-display\">\n <div class=\"timepicker-text-container\">\n <div class=\"timepicker-display-column timepicker-display-digital-clock\">\n <div class=\"timepicker-input-hours-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-hours text-primary\" />\n </div>\n <div class=\"timepicker-input-divider-wrapper\">\n <span class=\"timepicker-input-divider\">:</span>\n </div>\n <div class=\"timepicker-input-minutes-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-minutes\" />\n </div>\n </div>\n <div class=\"timepicker-display-column timepicker-display-am-pm\">\n <div class=\"timepicker-span-am-pm\"></div>\n </div>\n </div>\n </div>\n <div class=\"timepicker-analog-display\">\n <div class=\"timepicker-plate\">\n <div class=\"timepicker-canvas\"></div>\n <div class=\"timepicker-dial timepicker-hours\"></div>\n <div class=\"timepicker-dial timepicker-minutes timepicker-dial-out\"></div>\n </div>\n <div class=\"timepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n", "import { BaseOptions } from '../core/component';\n\nexport interface ToastOptions extends BaseOptions {\n /**\n * The content of the Toast.\n * @default \"\"\n */\n text: string;\n /**\n * Optional action label. Rendered as a trailing text button.\n * @default \"\"\n */\n action: string;\n /**\n * Called when the action button is pressed. The toast still dismisses.\n * @default null\n */\n onAction: () => void;\n /**\n * Show a trailing close icon button.\n * @default false\n */\n dismissible: boolean;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n toastId?: string;\n /**\n * Length in ms the Toast stays before dismissal.\n * @default 4000\n */\n displayLength: number;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 375\n */\n outDuration: number;\n /**\n * Classes to be added to the toast element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when toast is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the toast's width it takes fora drag\n * to dismiss a Toast.\n * @default 0.8\n */\n activationPercent: number;\n}\n\nconst _defaults: ToastOptions = {\n text: '',\n action: '',\n onAction: null,\n dismissible: false,\n displayLength: 4000,\n inDuration: 300,\n outDuration: 375,\n classes: '',\n completeCallback: null,\n activationPercent: 0.8\n};\n\nexport class Toast {\n /** The toast element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the toast\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Toast.\n */\n panning: boolean;\n options: ToastOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the toast is due to dismiss, for pause/resume. */\n private _deadline: number;\n wasSwiped: boolean;\n startingXPos: number;\n xPos: number;\n time: number;\n deltaX: number;\n velocityX: number;\n\n static _toasts: Toast[];\n static _container: HTMLElement;\n static _draggedToast: Toast;\n\n constructor(options: Partial<ToastOptions>) {\n this.options = {\n ...Toast.defaults,\n ...options\n };\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n if (Toast._toasts.length === 0) {\n Toast._createContainer();\n }\n // Create new toast\n Toast._toasts.push(this);\n const toastElement = this._createToast();\n toastElement['Expressive_Toast'] = this;\n this.el = toastElement;\n this._animateIn();\n this._setTimer();\n }\n\n static get defaults(): ToastOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Toast {\n return el['Expressive_Toast'];\n }\n\n static _createContainer() {\n const container = document.createElement('div');\n container.setAttribute('id', 'toast-container');\n // Add event handler\n container.addEventListener('touchstart', Toast._onDragStart);\n container.addEventListener('touchmove', Toast._onDragMove);\n container.addEventListener('touchend', Toast._onDragEnd);\n container.addEventListener('mousedown', Toast._onDragStart);\n document.addEventListener('mousemove', Toast._onDragMove);\n document.addEventListener('mouseup', Toast._onDragEnd);\n document.body.appendChild(container);\n Toast._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('mousemove', Toast._onDragMove);\n document.removeEventListener('mouseup', Toast._onDragEnd);\n Toast._container.remove();\n Toast._container = null;\n }\n\n static _onDragStart(e: TouchEvent | MouseEvent) {\n const target = e.target as HTMLElement | null;\n // Don't start a swipe from the action or close \u2014 those are buttons.\n if (target && !target.closest('button, a') && target.closest('.toast, .snackbar')) {\n const toastElem = target.closest('.toast, .snackbar') as HTMLElement;\n const toast: Toast = toastElem['Expressive_Toast'];\n if (!toast) return;\n toast.panning = true;\n toast._pauseTimer();\n Toast._draggedToast = toast;\n toast.el.classList.add('panning');\n toast.el.style.transition = '';\n toast.startingXPos = Toast._xPos(e);\n toast.time = Date.now();\n toast.xPos = Toast._xPos(e);\n }\n }\n\n static _onDragMove(e: TouchEvent | MouseEvent) {\n if (!!Toast._draggedToast) {\n e.preventDefault();\n const toast = Toast._draggedToast;\n toast.deltaX = Math.abs(toast.xPos - Toast._xPos(e));\n toast.xPos = Toast._xPos(e);\n toast.velocityX = toast.deltaX / (Date.now() - toast.time);\n toast.time = Date.now();\n\n const totalDeltaX = toast.xPos - toast.startingXPos;\n const activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n toast.el.style.transform = `translateX(${totalDeltaX}px)`;\n toast.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd() {\n if (!!Toast._draggedToast) {\n const toast = Toast._draggedToast;\n toast.panning = false;\n toast.el.classList.remove('panning');\n\n const totalDeltaX = toast.xPos - toast.startingXPos;\n const activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || toast.velocityX > 1;\n\n // Remove toast\n if (shouldBeDismissed) {\n toast.wasSwiped = true;\n toast.dismiss();\n // Animate toast back to original position\n } else {\n toast.el.style.transition = 'transform .2s, opacity .2s';\n toast.el.style.transform = '';\n toast.el.style.opacity = '';\n toast._resumeTimer();\n }\n Toast._draggedToast = null;\n }\n }\n\n static _xPos(e: TouchEvent | MouseEvent) {\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return (e as TouchEvent).targetTouches[0].clientX;\n }\n // mouse event\n return (e as MouseEvent).clientX;\n }\n\n /**\n * dismiss all toasts.\n */\n static dismissAll() {\n // Copy first: dismiss() splices the list it is iterating.\n for (const toast of [...Toast._toasts]) {\n toast.dismiss();\n }\n }\n\n _createToast() {\n let toast: HTMLElement = this.options.toastId\n ? document.getElementById(this.options.toastId)\n : document.createElement('div');\n if (toast instanceof HTMLTemplateElement) {\n const node = (toast as HTMLTemplateElement).content.cloneNode(true);\n toast = (node as HTMLElement).firstElementChild as HTMLElement;\n }\n toast.classList.add('toast', 'snackbar');\n toast.setAttribute('role', 'status');\n toast.setAttribute('aria-live', 'polite');\n toast.setAttribute('aria-atomic', 'true');\n // Add custom classes onto toast\n if (this.options.classes.length > 0) {\n toast.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n if (this.message) {\n const text = document.createElement('p');\n text.textContent = this.message;\n toast.replaceChildren(text);\n }\n if (this.options.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.textContent = this.options.action;\n action.addEventListener('click', (e) => {\n e.stopPropagation();\n if (typeof this.options.onAction === 'function') {\n this.options.onAction();\n }\n this.dismiss();\n });\n toast.appendChild(action);\n }\n if (this.options.dismissible) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'circle';\n close.setAttribute('aria-label', 'Dismiss');\n const icon = document.createElement('i');\n icon.className = 'material-symbols';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = 'close';\n close.appendChild(icon);\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dismiss();\n });\n toast.appendChild(close);\n }\n Toast._container.appendChild(toast);\n return toast;\n }\n\n _animateIn() {\n // Animate toast in\n this.el.style.display = '';\n this.el.style.opacity = '0';\n // easeOutCubic\n this.el.style.transition = `\n top ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n setTimeout(() => {\n this.el.style.top = '0';\n this.el.style.opacity = '1';\n }, 1);\n }\n\n /**\n * Arm the dismissal timer.\n *\n * One timeout, not a 20ms interval ticking a counter down: the old form woke\n * the page up 50 times a second per toast purely to subtract 20 from a\n * number. Dragging pauses the countdown via _pauseTimer/_resumeTimer instead.\n */\n _setTimer() {\n if (this.timeRemaining === Infinity) return;\n this._deadline = Date.now() + this.timeRemaining;\n this.counterTimeout = setTimeout(() => this.dismiss(), this.timeRemaining);\n }\n\n /** Stop the countdown, banking the time that was left on it. */\n _pauseTimer() {\n if (this.counterTimeout == null) return;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this.timeRemaining = Math.max(0, this._deadline - Date.now());\n }\n\n /** Restart a countdown stopped by {@link _pauseTimer}. */\n _resumeTimer() {\n if (this.counterTimeout != null) return;\n this._setTimer();\n }\n\n /**\n * Dismiss toast with animation.\n */\n dismiss() {\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n const activationDistance = this.el.offsetWidth * this.options.activationPercent;\n\n if (this.wasSwiped) {\n this.el.style.transition = 'transform .05s, opacity .05s';\n this.el.style.transform = `translateX(${activationDistance}px)`;\n this.el.style.opacity = '0';\n }\n\n // easeOutExpo\n this.el.style.transition = `\n margin ${this.options.outDuration}ms ease,\n opacity ${this.options.outDuration}ms ease`;\n\n setTimeout(() => {\n this.el.style.opacity = '0';\n this.el.style.marginTop = '-40px';\n }, 1);\n\n setTimeout(() => {\n // Call the optional callback\n if (typeof this.options.completeCallback === 'function') {\n this.options.completeCallback();\n }\n // Remove toast from DOM\n if (this.el.id != this.options.toastId) {\n this.el.remove();\n // Guarded: splice(-1, 1) on an already-removed toast would drop an\n // unrelated one off the end of the list.\n const index = Toast._toasts.indexOf(this);\n if (index >= 0) Toast._toasts.splice(index, 1);\n if (Toast._toasts.length === 0 && Toast._container) {\n Toast._removeContainer();\n }\n }\n }, this.options.outDuration);\n }\n\n static {\n Toast._toasts = [];\n Toast._container = null;\n Toast._draggedToast = null;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Bounding } from '../core/bounding';\nimport { Component, BaseOptions, InitElements, MElement } from '../core/component';\n\nexport type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface TooltipOptions extends BaseOptions {\n /**\n * Delay time before tooltip disappears.\n * @default 200\n */\n exitDelay: number;\n /**\n * Delay time before tooltip appears.\n * @default 0\n */\n enterDelay: number;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n tooltipId?: string;\n /**\n * Text string for the tooltip.\n * @default \"\"\n */\n text: string;\n /**\n * Set distance tooltip appears away from its activator\n * excluding transitionMovement.\n * @default 4\n */\n margin: number;\n /**\n * Enter transition duration.\n * @default 300\n */\n inDuration: number;\n /**\n * Opacity of the tooltip.\n * @default 1\n */\n opacity: number;\n /**\n * Exit transition duration.\n * @default 250\n */\n outDuration: number;\n /**\n * Set the direction of the tooltip.\n * @default 'bottom'\n */\n position: TooltipPosition;\n /**\n * Amount in px that the tooltip moves during its transition.\n * @default 10\n */\n transitionMovement: number;\n}\n\nconst _defaults: TooltipOptions = {\n exitDelay: 200,\n enterDelay: 0,\n text: '',\n margin: 4,\n inDuration: 250,\n outDuration: 200,\n position: 'bottom' as TooltipPosition,\n transitionMovement: 10,\n opacity: 1\n};\n\nexport class Tooltip extends Component<TooltipOptions> {\n /**\n * If tooltip is open.\n */\n isOpen: boolean;\n /**\n * If tooltip is hovered.\n */\n isHovered: boolean;\n /**\n * If tooltip is focused.\n */\n isFocused: boolean;\n tooltipEl: HTMLElement;\n private _exitDelayTimeout: ReturnType<typeof setTimeout>;\n private _enterDelayTimeout: ReturnType<typeof setTimeout>;\n xMovement: number;\n yMovement: number;\n\n constructor(el: HTMLElement, options: Partial<TooltipOptions>) {\n super(el, options, Tooltip);\n this.el['Expressive_Tooltip'] = this;\n\n this.options = {\n ...Tooltip.defaults,\n ...this._getAttributeOptions(),\n ...options\n };\n\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n this._appendTooltipEl();\n this._setupEventHandlers();\n }\n\n static get defaults(): TooltipOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tooltip.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TooltipOptions>): Tooltip;\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<MElement>, options?: Partial<TooltipOptions>): Tooltip[];\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<MElement>,\n options: Partial<TooltipOptions> = {}\n ): Tooltip | Tooltip[] {\n return super.init(els, options, Tooltip);\n }\n\n static getInstance(el: HTMLElement): Tooltip {\n return el['Expressive_Tooltip'];\n }\n\n destroy() {\n if (this.el.getAttribute('aria-describedby') === this.tooltipEl.id) {\n this.el.removeAttribute('aria-describedby');\n }\n this.tooltipEl.remove();\n this._removeEventHandlers();\n this.el['Expressive_Tooltip'] = undefined;\n }\n\n _appendTooltipEl() {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.classList.add('tooltip', 'material-tooltip');\n this.tooltipEl.id = `tooltip-${Utils.guid()}`;\n this.tooltipEl.setAttribute('role', 'tooltip');\n this.el.setAttribute('aria-describedby', this.tooltipEl.id);\n\n const tooltipContentEl = this.options.tooltipId\n ? document.getElementById(this.options.tooltipId)\n : document.createElement('div');\n if (this.options.tooltipId) {\n this.tooltipEl.classList.add('rich');\n }\n tooltipContentEl.style.display = '';\n tooltipContentEl.classList.add('tooltip-content');\n this._setTooltipContent(tooltipContentEl);\n this.tooltipEl.appendChild(tooltipContentEl);\n document.body.appendChild(this.tooltipEl);\n }\n\n _setTooltipContent(tooltipContentEl: HTMLElement) {\n if (this.options.tooltipId) return;\n tooltipContentEl.innerText = this.options.text;\n }\n\n _updateTooltipContent() {\n this._setTooltipContent(this.tooltipEl.querySelector('.tooltip-content'));\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.el.addEventListener('focus', this._handleFocus, true);\n this.el.addEventListener('blur', this._handleBlur, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.el.removeEventListener('focus', this._handleFocus, true);\n this.el.removeEventListener('blur', this._handleBlur, true);\n }\n\n /**\n * Show tooltip.\n */\n open = (isManual: boolean) => {\n if (this.isOpen) return;\n isManual = isManual === undefined ? true : undefined; // Default value true\n this.isOpen = true;\n // Update tooltip content with HTML attribute options\n this.options = { ...this.options, ...this._getAttributeOptions() };\n this._updateTooltipContent();\n this._setEnterDelayTimeout(isManual);\n };\n\n /**\n * Hide tooltip.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isHovered = false;\n this.isFocused = false;\n this.isOpen = false;\n this._setExitDelayTimeout();\n };\n\n _setExitDelayTimeout() {\n clearTimeout(this._exitDelayTimeout);\n this._exitDelayTimeout = setTimeout(() => {\n if (this.isHovered || this.isFocused) return;\n this._animateOut();\n }, this.options.exitDelay);\n }\n\n _setEnterDelayTimeout(isManual) {\n clearTimeout(this._enterDelayTimeout);\n this._enterDelayTimeout = setTimeout(() => {\n if (!this.isHovered && !this.isFocused && !isManual) return;\n this._animateIn();\n }, this.options.enterDelay);\n }\n\n _positionTooltip() {\n const tooltip: HTMLElement = this.tooltipEl;\n const origin = this.el as HTMLElement,\n originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n tooltipHeight = tooltip.offsetHeight,\n tooltipWidth = tooltip.offsetWidth,\n margin = this.options.margin;\n\n this.xMovement = 0;\n this.yMovement = 0;\n\n const originRect = origin.getBoundingClientRect();\n let targetTop = originRect.top + Utils.getDocumentScrollTop();\n let targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n if (this.options.position === 'top') {\n targetTop += -tooltipHeight - margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = -this.options.transitionMovement;\n } else if (this.options.position === 'right') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += originWidth + margin;\n this.xMovement = this.options.transitionMovement;\n } else if (this.options.position === 'left') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += -tooltipWidth - margin;\n this.xMovement = -this.options.transitionMovement;\n } else {\n targetTop += originHeight + margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = this.options.transitionMovement;\n }\n\n const newCoordinates = this._repositionWithinScreen(\n targetLeft,\n targetTop,\n tooltipWidth,\n tooltipHeight\n );\n\n tooltip.style.top = newCoordinates.y + 'px';\n tooltip.style.left = newCoordinates.x + 'px';\n }\n\n _repositionWithinScreen(x: number, y: number, width: number, height: number) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding: Bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n const offset = this.options.margin + this.options.transitionMovement;\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n\n _animateIn() {\n this._positionTooltip();\n this.tooltipEl.style.visibility = 'visible';\n const duration = this.options.inDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(${this.xMovement}px) translateY(${this.yMovement}px)`;\n this.tooltipEl.style.opacity = (this.options.opacity || 1).toString();\n }, 1);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(0px) translateY(0px)`;\n this.tooltipEl.style.opacity = '0';\n }, 1);\n /*\n anim.remove(this.tooltipEl);\n anim({\n targets: this.tooltipEl,\n opacity: 0,\n translateX: 0,\n translateY: 0,\n duration: this.options.outDuration,\n easing: 'easeOutCubic'\n });\n */\n }\n\n _handleMouseEnter = () => {\n this.isHovered = true;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.open(false);\n };\n\n _handleMouseLeave = () => {\n this.isHovered = false;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.close();\n };\n\n _handleFocus = () => {\n if (Utils.tabPressed) {\n this.isFocused = true;\n this.open(false);\n }\n };\n\n _handleBlur = () => {\n this.isFocused = false;\n this.close();\n };\n\n _getAttributeOptions(): Partial<TooltipOptions> {\n const attributeOptions: Partial<TooltipOptions> = {};\n const tooltipTextOption = this.el.getAttribute('data-tooltip');\n const tooltipId = this.el.getAttribute('data-tooltip-id');\n const positionOption = this.el.getAttribute('data-position');\n if (tooltipTextOption) {\n attributeOptions.text = tooltipTextOption;\n }\n if (positionOption) {\n attributeOptions.position = positionOption as TooltipPosition;\n }\n if (tooltipId) {\n attributeOptions.tooltipId = tooltipId;\n }\n\n return attributeOptions;\n }\n}\n", "import { InitElements, MElement } from '../core/component';\nimport * as Components from './index';\nimport { CARDS_SELECTOR } from './cards';\n\n/**\n * The components `AutoInit()` starts, in initialization order, with the\n * selector each one claims.\n *\n * This table is the single source of truth: the options type below and the\n * init calls in `AutoInit()` are both derived from it, so wiring up a new\n * auto-initialized component means adding one line here (plus its export in\n * ./index.ts) - not four hand-synchronized edits that fail silently when one\n * is forgotten.\n *\n * A component that should only ever be constructed explicitly (Toast,\n * CharacterCounter, Range, ...) simply stays out of this table.\n */\nexport const AUTO_INIT_COMPONENTS = {\n Autocomplete: { component: Components.Autocomplete, selector: '.autocomplete' },\n // Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read\n // '.cards', which no card markup uses.\n Cards: { component: Components.Cards, selector: CARDS_SELECTOR },\n Carousel: { component: Components.Carousel, selector: '.carousel' },\n Chips: { component: Components.Chips, selector: '.chips' },\n Collapsible: { component: Components.Collapsible, selector: '.collapsible' },\n Datepicker: { component: Components.Datepicker, selector: '.datepicker' },\n Dropdown: { component: Components.Dropdown, selector: '.dropdown-trigger' },\n Lightbox: { component: Components.Lightbox, selector: '.lightboxed' },\n Modal: { component: Components.Modal, selector: '.modal' },\n Parallax: { component: Components.Parallax, selector: '.parallax' },\n Pushpin: { component: Components.Pushpin, selector: '.pushpin' },\n ScrollSpy: { component: Components.ScrollSpy, selector: '.scrollspy' },\n FormSelect: { component: Components.FormSelect, selector: 'select' },\n Sidenav: { component: Components.Sidenav, selector: '.sidenav' },\n Tabs: { component: Components.Tabs, selector: '.tabs' },\n TapTarget: { component: Components.TapTarget, selector: '.tap-target' },\n Timepicker: { component: Components.Timepicker, selector: '.timepicker' },\n Tooltip: { component: Components.Tooltip, selector: '.tooltipped' },\n FloatingActionButton: {\n component: Components.FloatingActionButton,\n selector: '.fixed-action-btn'\n }\n};\n\ntype Registry = typeof AUTO_INIT_COMPONENTS;\n\n/**\n * Per-component options accepted by {@link AutoInit}, derived from the table\n * above - each key takes that component's own options type.\n */\nexport type AutoInitOptions = {\n [K in keyof Registry]?: Partial<InstanceType<Registry[K]['component']>['options']>;\n};\n\n/** The shape every entry in the table satisfies; see the cast in AutoInit. */\ntype AutoInitable = {\n init(els: InitElements<MElement>, options: Partial<object>): unknown;\n};\n\n/**\n * Automatically initialize components.\n * @param context Root element to initialize. Defaults to `document.body`.\n * @param options Options for each component.\n */\nexport function AutoInit(\n context: HTMLElement = document.body,\n options?: Partial<AutoInitOptions>\n) {\n for (const name of Object.keys(AUTO_INIT_COMPONENTS) as (keyof Registry)[]) {\n const { component, selector } = AUTO_INIT_COMPONENTS[name];\n // `:is()` so that `:not(.no-autoinit)` applies to the whole selector. A\n // bare `${selector}:not(...)` binds the negation to the last alternative\n // only, which would silently break the opt-out for any comma-separated\n // entry (Cards is the first).\n const els = context.querySelectorAll(`:is(${selector}):not(.no-autoinit)`);\n // Each component's static `init` is overloaded; indexing the table widens\n // it to a union TypeScript cannot call, so narrow it once, here.\n (component as unknown as AutoInitable).init(els, options?.[name] ?? {});\n }\n}\n", "// Public entry point of the bundle.\n//\n// Layout:\n// core/ Component base class, Utils, shared types\n// components/ per-element widgets (+ index.ts barrel, registry.ts)\n// behaviors/ document-level enhancers, started below at import time\n// plugins/ helpers that are not Components\n//\n// See src/ts/README.md before adding anything.\n\nimport { Utils } from './core/utils';\nimport { Cards } from './components/cards';\nimport { Chips } from './components/chips';\nimport { Range } from './components/range';\nimport { Dialogs } from './behaviors/dialogs';\nimport { Forms } from './behaviors/forms';\nimport { Waves } from './behaviors/waves';\n\nexport * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { Forms } from './behaviors/forms';\nexport { Waves } from './behaviors/waves';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.3.0';\n\n// Side effects: importing the bundle wires up the document-level behaviors and\n// the delegated listeners the components below rely on. Order is preserved from\n// the original bundle - do not reorder without checking the event handlers.\n\nif (typeof document !== 'undefined') {\n document.addEventListener('keydown', Utils.docHandleKeydown, true);\n document.addEventListener('keyup', Utils.docHandleKeyup, true);\n document.addEventListener('focus', Utils.docHandleFocus, true);\n document.addEventListener('blur', Utils.docHandleBlur, true);\n}\nForms.Init();\nChips.Init();\nWaves.Init();\nRange.Init();\nCards.Init();\nDialogs.Init();\n"],
5
+ "mappings": ";;;;;;;;AAMO,IAAM,SAAN,MAAM,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCjB,OAAO,iBAAiB,GAAkB;AACxC,WAAM,UAAU;AAChB,QAAI,OAAM,gBAAgB,IAAI,EAAE,GAAG,GAAG;AACpC,aAAM,aAAa;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,eAAe,GAAkB;AACtC,WAAM,UAAU;AAChB,QAAI,OAAM,gBAAgB,IAAI,EAAE,GAAG,GAAG;AACpC,aAAM,aAAa;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,eAAe,GAAe;AACnC,QAAI,OAAM,SAAS;AACjB,eAAS,KAAK,UAAU,IAAI,kBAAkB;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,cAAc,GAAe;AAClC,aAAS,KAAK,UAAU,OAAO,kBAAkB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,gBAAgB,UAA4B;AACjD,QAAI,OAAO,aAAa,YAAa;AACrC,QAAI,SAAS,eAAe,WAAW;AACrC,eAAS,iBAAiB,oBAAoB,UAAU,EAAE,MAAM,KAAK,CAAC;AAAA,IACxE,OAAO;AACL,eAAS;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAe;AACpB,UAAM,KAAK,MAAc;AACvB,aAAO,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK,KAAO,EAC5C,SAAS,EAAE,EACX,UAAU,CAAC;AAAA,IAChB;AACA,WAAO,GAAG,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,qBAAqB,WAAwB,UAAoB,QAAuB;AAC7F,UAAM,QAAQ;AAAA,MACZ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAEA,UAAM,gBAAgB,UAAU,sBAAsB;AAEtD,UAAM,kBACJ,cAAc,SAAS,OACnB,KAAK,IAAI,cAAc,QAAQ,OAAO,WAAW,IACjD,cAAc;AAEpB,UAAM,aAAa,UAAU;AAC7B,UAAM,YAAY,UAAU;AAE5B,UAAM,YAAY,SAAS,OAAO;AAClC,UAAM,YAAY,SAAS,MAAM;AAGjC,QAAI,YAAY,cAAc,OAAO,UAAU,YAAY,QAAQ;AACjE,YAAM,OAAO;AAAA,IACf;AAEA,QACE,YAAY,SAAS,QAAQ,cAAc,QAAQ,UACnD,YAAY,SAAS,QAAQ,OAAO,aAAa,QACjD;AACA,YAAM,QAAQ;AAAA,IAChB;AAEA,QAAI,YAAY,cAAc,MAAM,UAAU,YAAY,QAAQ;AAChE,YAAM,MAAM;AAAA,IACd;AAEA,QACE,YAAY,SAAS,SAAS,kBAAkB,UAChD,YAAY,SAAS,SAAS,OAAO,cAAc,QACnD;AACA,YAAM,SAAS;AAAA,IACjB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,wBACL,IACA,WACA,UACA,QACA;AACA,UAAM,WASF;AAAA,MACF,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,eAAe;AAAA,MACf,aAAa;AAAA,IACf;AAEA,UAAM,0BAA0B,iBAAiB,SAAS,EAAE,aAAa;AACzE,UAAM,gBAAgB,UAAU,sBAAsB;AACtD,UAAM,kBAAkB,KAAK,IAAI,cAAc,QAAQ,OAAO,WAAW;AACzE,UAAM,iBAAiB,KAAK,IAAI,cAAc,OAAO,OAAO,UAAU;AACtE,UAAM,eAAe,GAAG,sBAAsB;AAE9C,UAAM,aAAa,UAAU;AAC7B,UAAM,YAAY,UAAU;AAE5B,UAAM,YAAY,SAAS,OAAO;AAClC,UAAM,mBAAmB,SAAS,MAAM;AACxC,UAAM,sBAAsB,SAAS,MAAM,aAAa,SAAS;AAGjE,aAAS,eAAe,CAAC,0BACrB,kBAAkB,YAAY,SAAS,SACvC,OAAO,cAAc,aAAa,OAAO,SAAS;AACtD,QAAI,SAAS,eAAe,GAAG;AAC7B,eAAS,OAAO;AAAA,IAClB;AAGA,aAAS,cAAc,CAAC,0BACpB,YAAY,SAAS,QAAQ,aAAa,QAC1C,aAAa,QAAQ,SAAS;AAClC,QAAI,SAAS,cAAc,GAAG;AAC5B,eAAS,QAAQ;AAAA,IACnB;AAGA,aAAS,gBAAgB,CAAC,0BACtB,mBAAmB,mBAAmB,SAAS,SAAS,UACxD,OAAO,eAAe,aAAa,MAAM,SAAS,SAAS;AAC/D,QAAI,SAAS,gBAAgB,GAAG;AAC9B,eAAS,MAAM;AAAA,IACjB;AAGA,aAAS,aAAa,CAAC,0BACnB,uBAAuB,SAAS,SAAS,UACzC,aAAa,UAAU,SAAS,SAAS;AAC7C,QAAI,SAAS,aAAa,GAAG;AAC3B,eAAS,SAAS;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,iBAAiB,SAA8B;AACpD,QAAI,KAAK,QAAQ,QAAQ;AACzB,QAAI,CAAC,IAAI;AACP,WAAK,QAAQ,aAAa,MAAM;AAChC,aAAO,KAAK,GAAG,MAAM,CAAC,IAAI;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,uBAA+B;AACpC,WAAO,OAAO,WAAW,SAAS,gBAAgB,aAAa,SAAS,KAAK,aAAa;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAgC;AACrC,WAAO,OAAO,WAAW,SAAS,gBAAgB,cAAc,SAAS,KAAK,cAAc;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,SACL,MACA,MACA,UAA4D,CAAC,GAC7D;AAEA,QAAI,WAAsB,MACxB,QACA,UAAU,MACV,WAAW;AAEb,UAAM,QAAQ,MAAM;AAClB,iBAAW,SAAS,YAAY,QAAQ,IAAI,KAAK,IAAI;AACrD,gBAAU;AAGV,eAAS,KAAK,GAAI,YAAY,CAAC,CAAE;AACjC,iBAAW;AAAA,IACb;AAEA,WAAO,IAAI,SAAoB;AAC7B,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,CAAC,YAAY,SAAS,YAAY,MAAO,YAAW;AACxD,YAAM,YAAY,QAAQ,MAAM;AAChC,iBAAW;AACX,UAAI,aAAa,GAAG;AAClB,qBAAa,OAAO;AACpB,kBAAU;AACV,mBAAW;AACX,mBAAW;AACX,iBAAS,KAAK,GAAG,IAAI;AAAA,MACvB,WAAW,CAAC,WAAW,SAAS,aAAa,OAAO;AAClD,kBAAU,WAAW,OAAO,SAAS;AAAA,MACvC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,4BACL,WACA,aACA,YACA,WACA,UACM;AACN,UAAM,+BAA+B,SAAS,cAAc,KAAK;AACjE,iCAA6B,UAAU,IAAI,mBAAmB;AAC9D,cAAU,OAAO,4BAA4B;AAE7C,SAAK,aAAa,8BAA8B,YAAY,CAAC,YAAY,GAAG,MAAM,QAAQ;AAC1F,SAAK,aAAa,8BAA8B,aAAa,CAAC,aAAa,GAAG,MAAM,SAAS;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aACL,WACA,MACA,YAAsB,CAAC,GACvB,aAAsB,MACtB,WAAuC,MACjC;AACN,gBAAY,UAAU,OAAO,CAAC,OAAO,gBAAgB,MAAM,CAAC;AAC5D,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY,UAAU,KAAK,GAAG;AACrC,WAAO,MAAM,aAAa,aAAa,YAAY;AACnD,WAAO,OAAO;AACd,WAAO,WAAW,CAAC,CAAC,aAAa,IAAI;AACrC,WAAO,YAAY;AAGnB,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,iBAAiB,SAAS,QAAQ;AACzC,aAAO,iBAAiB,YAAY,CAAC,MAAM;AACzC,YAAI,OAAM,KAAK,MAAM,SAAS,EAAE,GAAG,EAAG,UAAS,CAAC;AAAA,MAClD,CAAC;AAAA,IACH;AACA,cAAU,OAAO,MAAM;AAAA,EACzB;AAAA,EAEA,OAAO,qBACL,QACA,WACA,UACA,QACA,oBACA,QAAgB,UAChB;AACA,UAAM,eAAe,OAAO,cAC1B,cAAc,OAAO,aACrB,kBAAkB,UAAU,cAC5B,iBAAiB,UAAU,aAC3B,aAAa,OAAO,sBAAsB;AAC5C,QAAI,YAAY,GACd,YAAY,GACZ,YAAY,WAAW,MAAM,OAAM,qBAAqB,GACxD,aAAa,WAAW,OAAO,OAAM,sBAAsB;AAE7D,QAAI,aAAa,OAAO;AACtB,mBAAa,CAAC,kBAAkB;AAChC,UAAI,UAAU,UAAU;AACtB,sBAAc,cAAc,IAAI,iBAAiB;AAAA,MACnD;AACA,kBAAY,CAAC;AAAA,IACf,WAAW,aAAa,SAAS;AAC/B,mBAAa,eAAe,IAAI,kBAAkB;AAClD,mBAAa,cAAc;AAC3B,kBAAY;AAAA,IACd,WAAW,aAAa,QAAQ;AAC9B,mBAAa,eAAe,IAAI,kBAAkB;AAClD,mBAAa,CAAC,iBAAiB;AAC/B,kBAAY,CAAC;AAAA,IACf,OAAO;AACL,mBAAa,eAAe;AAC5B,UAAI,UAAU,UAAU;AACtB,sBAAc,cAAc,IAAI,iBAAiB;AAAA,MACnD;AACA,kBAAY;AAAA,IACd;AACA,QAAI,UAAU,SAAS;AACrB,oBAAc,cAAc,iBAAiB;AAAA,IAC/C;AAEA,UAAM,iBAAiB,OAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,cAAU,MAAM,MAAM,eAAe,IAAI;AACzC,cAAU,MAAM,OAAO,eAAe,IAAI;AAE1C,WAAO,EAAC,GAAG,WAAW,GAAG,UAAS;AAAA,EACpC;AAAA,EAEA,OAAO,wBACL,GACA,GACA,OACA,QACA,QACA,oBACA,OACA;AACA,UAAM,aAAa,OAAM,sBAAsB;AAC/C,UAAM,YAAY,OAAM,qBAAqB;AAC7C,QAAI,OAAO,IAAI;AACf,QAAI,OAAO,IAAI;AAEf,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,QAAI;AACJ,QAAI,UAAU,UAAU,SAAS,UAAU;AACzC,eAAS,SAAS;AAAA,IACpB,WAAW,UAAU,SAAS;AAC5B,eAAS,SAAS;AAAA,IACpB;AACA,UAAM,QAAQ,OAAM,qBAAqB,SAAS,MAAM,UAAU,MAAM;AAExE,QAAI,MAAM,MAAM;AACd,aAAO;AAAA,IACT,WAAW,MAAM,OAAO;AACtB,cAAQ,OAAO,QAAQ,OAAO;AAAA,IAChC;AACA,QAAI,MAAM,KAAK;AACb,aAAO;AAAA,IACT,WAAW,MAAM,QAAQ;AACvB,cAAQ,OAAO,SAAS,OAAO;AAAA,IACjC;AACA,WAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACZ;AAAA,EACF;AACF;AAAA;AA5ca,OAEJ,aAAsB;AAAA;AAFlB,OAIJ,UAAmB;AAAA;AAAA;AAAA;AAJf,OASJ,OAAO;AAAA,EACZ,KAAK,CAAC,KAAK;AAAA,EACX,OAAO,CAAC,OAAO;AAAA,EACf,KAAK,CAAC,UAAU,KAAK;AAAA,EACrB,WAAW,CAAC,WAAW;AAAA,EACvB,UAAU,CAAC,WAAW,IAAI;AAAA,EAC1B,YAAY,CAAC,aAAa,MAAM;AAAA,EAChC,YAAY,CAAC,aAAa,MAAM;AAAA,EAChC,aAAa,CAAC,cAAc,OAAO;AAAA,EACnC,QAAQ,CAAC,UAAU,KAAK;AAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnBW,OA4BI,kBAAkB,oBAAI,IAAI;AAAA,EACvC,GAAG,OAAM,KAAK;AAAA,EACd,GAAG,OAAM,KAAK;AAAA,EACd,GAAG,OAAM,KAAK;AAChB,CAAC;AAhCI,IAAM,QAAN;;;ACsBA,IAAM,YAAN,MAAuC;AAAA;AAAA;AAAA;AAAA,EAa5C,YAAY,IAAiB,SAAqB,UAA0C;AAE1F,QAAI,EAAE,cAAc,cAAc;AAChC,cAAQ,MAAM,MAAM,KAAK,yBAAyB,CAAC;AAAA,IACrD;AAEA,UAAM,MAAM,SAAS,YAAY,EAAE;AACnC,QAAI,CAAC,CAAC,KAAK;AACT,UAAI,QAAQ;AAAA,IACd;AACA,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCA,OAAiB,KACf,KACA,SACA,UACS;AACT,QAAI,YAAY;AAChB,QAAI,eAAe,SAAS;AAC1B,kBAAY,IAAI,SAAsB,KAAK,OAAO;AAAA,IACpD,WAAW,CAAC,CAAC,OAAO,IAAI,QAAQ;AAC9B,kBAAY,CAAC;AACb,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,kBAAU,KAAK,IAAI,SAAsB,IAAI,CAAC,GAAG,OAAO,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAwB;AACjC,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY,IAAyC;AAC1D,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACF;;;AC1HA,IAAM,YAA0B;AAAA,EAC9B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AACf;AAUO,IAAM,iBAAiB;AAEvB,IAAM,QAAN,MAAM,eAAc,UAA4C;AAAA,EAOrE,YAAY,IAAiB,SAAgC;AAC3D,UAAM,IAAI,SAAS,MAAK;AAP1B,kBAAkB;AA6ElB,+BAAsB,MAAM;AAC1B,WAAK,YAAY,QAAQ,CAAC,OAAoB;AAC5C,WAAG,iBAAiB,SAAS,KAAK,uBAAuB;AACzD,WAAG,iBAAiB,YAAY,KAAK,oBAAoB;AAAA,MAC3D,CAAC;AAAA,IACH;AAEA,gCAAuB,MAAM;AAC3B,WAAK,YAAY,QAAQ,CAAC,OAAoB;AAC5C,WAAG,oBAAoB,SAAS,KAAK,uBAAuB;AAC5D,WAAG,oBAAoB,YAAY,KAAK,oBAAoB;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,mCAA0B,MAAM;AAC9B,WAAK,mBAAmB;AAAA,IAC1B;AAEA,gCAAmD,CAAC,MAAqB;AACvE,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,8BAAqB,MAAM;AAEzB,WAAK,YAAY,QAAQ,CAAC,OAAqB,GAAG,WAAW,EAAG;AAChE,WAAK,KAAK;AAAA,IACZ;AAEA,0CAAiC,MAAM;AACrC,WAAK,gBAAgB,iBAAiB,SAAS,KAAK,KAAK;AACzD,WAAK,gBAAgB,iBAAiB,YAAY,KAAK,yBAAyB;AAAA,IAClF;AAEA,2CAAkC,MAAM;AACtC,WAAK,gBAAgB,oBAAoB,SAAS,KAAK,KAAK;AAC5D,WAAK,gBAAgB,oBAAoB,YAAY,KAAK,yBAAyB;AAAA,IACrF;AAEA,qCAAwD,CAAC,MAAqB;AAC5E,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAKA;AAAA;AAAA;AAAA,gBAAmB,MAAM;AACvB,UAAI,KAAK,OAAQ;AACjB,WAAK,SAAS;AACd,WAAK,GAAG,MAAM,WAAW;AACzB,WAAK,WAAW,MAAM,UAAU;AAChC,WAAK,WAAW,eAAe;AAE/B,UAAI,KAAK,gBAAiB,MAAK,gBAAgB,WAAW;AAC1D,iBAAW,MAAM;AACf,aAAK,WAAW,MAAM,aAAa,aAAa,KAAK,QAAQ,WAAW;AACxE,aAAK,WAAW,MAAM,YAAY;AAAA,MACpC,GAAG,CAAC;AACJ,UAAI,OAAO,KAAK,QAAQ,WAAW,YAAY;AAC7C,aAAK,QAAQ,OAAO,KAAK,IAAI;AAAA,MAC/B;AACA,UAAI,KAAK,gBAAiB,MAAK,+BAA+B;AAAA,IAChE;AAKA;AAAA;AAAA;AAAA,iBAAoB,MAAM;AACxB,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,SAAS;AACd,WAAK,WAAW,MAAM,aAAa,aAAa,KAAK,QAAQ,UAAU;AACvE,WAAK,WAAW,MAAM,YAAY;AAClC,iBAAW,MAAM;AACf,aAAK,WAAW,MAAM,UAAU;AAChC,aAAK,WAAW,eAAe;AAC/B,aAAK,YAAY,QAAQ,CAAC,OAAqB,GAAG,WAAW,CAAE;AAC/D,YAAI,KAAK,gBAAiB,MAAK,gBAAgB,WAAW;AAC1D,aAAK,GAAG,MAAM,WAAW,KAAK;AAAA,MAChC,GAAG,KAAK,QAAQ,UAAU;AAC1B,UAAI,OAAO,KAAK,QAAQ,YAAY,YAAY;AAC9C,aAAK,QAAQ,QAAQ,KAAK,IAAI;AAAA,MAChC;AACA,UAAI,KAAK,gBAAiB,MAAK,gCAAgC;AAAA,IACjE;AA3JE,SAAK,GAAG,kBAAkB,IAAI;AAE9B,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AAEA,SAAK,cAAc,CAAC;AAEpB,SAAK,aAAa,KAAK,GAAG,cAAc,8BAA8B;AACtE,QAAI,KAAK,YAAY;AACnB,WAAK,kBAAkB,iBAAiB,KAAK,EAAE,EAAE;AACjD,WAAK,cAAc,MAAM,KAAK,KAAK,GAAG,iBAAiB,YAAY,CAAC;AACpE,WAAK,YAAY,QAAQ,CAACA,QAAoB;AAC5C,YAAIA,IAAI,CAAAA,IAAG,WAAW;AAAA,MACxB,CAAC;AAED,WAAK,kBAAkB,KAAK,WAAW;AAAA,QACrC;AAAA,MACF;AACA,UAAI,KAAK,gBAAiB,MAAK,gBAAgB,WAAW;AAE1D,WAAK,WAAW,eAAe;AAC/B,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,WAAW,WAAyB;AAClC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,SACiB;AACjB,WAAO,MAAM,KAAK,KAAK,SAAS,MAAK;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY,IAAwB;AACzC,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,qBAAqB;AAC1B,QAAI,KAAK,gBAAiB,MAAK,gCAAgC;AAC/D,SAAK,cAAc,CAAC;AACpB,SAAK,GAAG,kBAAkB,IAAI;AAAA,EAChC;AAAA,EA0FA,OAAO,OAAO;AAEZ,UAAM,gBAAgB,MAAM;AAC1B,YAAM,QAAQ,SAAS,iBAAiB,cAAc;AACtD,YAAM,QAAQ,CAAC,OAAO;AACpB,YAAI,MAAM,GAAG,kBAAkB,KAAK,OAAW,MAAK,KAAK,EAAiB;AAAA,MAC5E,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC9HA,IAAMC,aAA6B;AAAA,EACjC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AACf;AAEO,IAAM,YAAN,MAAM,kBAAiB,UAA+C;AAAA,EAgB3E,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AAmH7B,wBAAe,CAAC,MAAkB;AAChC,QAAE,eAAe;AAEjB,UAAI,KAAK,QAAQ;AACf,aAAK,MAAM;AAAA,MACb,OAAO;AACL,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,6BAAoB,MAAM;AAExB,WAAK,KAAK;AAAA,IACZ;AAEA,6BAAoB,CAAC,MAAkB;AACrC,YAAM,OAAO,EAAE;AAEf,UAAI,CAAC,MAAM;AACT,aAAK,MAAM;AACX;AAAA,MACF;AACA,YAAM,yBAAyB,CAAC,CAAC,KAAK,QAAQ,yBAAyB;AACvE,UAAI,+BAA+B;AACnC,YAAM,iBAAiB,KAAK,QAAQ,mBAAmB;AACvD,UAAI,kBAAkB,CAAC,CAAC,eAAe,qBAAqB,KAAK,eAAe,qBAAqB,EAAE,QAAQ;AAC7G,uCAA+B;AAAA,MACjC;AAEA,UAAI,CAAC,gCAAgC,CAAC,wBAAwB;AAC5D,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,gCAAuB,CAAC,MAAkB;AACxC,YAAM,SAAsB,EAAE;AAC9B,UAAI,KAAK,QAAQ,gBAAgB,OAAO,QAAQ,yBAAyB,KAAK,CAAC,KAAK,eAAe;AAEjG,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,OAAO,QAAQ,yBAAyB,GAAG;AAGrD,mBAAW,MAAM;AACf,cAAI,KAAK,QAAQ;AACf,iBAAK,MAAM;AAAA,UACb;AAAA,QACF,GAAG,CAAC;AAAA,MACN;AACA,WAAK,gBAAgB;AAAA,IACvB;AAEA,iCAAwB,CAAC,MAAqB;AAE5C,YAAM,mBACJ,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG;AAC1E,UAAI,oBAAoB,CAAC,KAAK,QAAQ;AACpC,UAAE,eAAe;AACjB,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,oCAA2B,CAAC,MAAkB;AAC5C,YAAM,SAAsB,EAAE;AAC9B,UAAI,OAAO,QAAQ,yBAAyB,GAAG;AAC7C,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF;AAEA,gCAAuB,CAAC,MAAkB;AAExC,UAAI,OAAO,KAAK,QAAQ,gBAAgB,YAAY;AAClD,cAAM,SAAuB,EAAE,OAAQ,QAAQ,IAAI;AACnD,aAAK,QAAQ,YAAY,KAAK,MAAM,MAAM;AAAA,MAC5C;AAAA,IACF;AAEA,kCAAyB,CAAC,MAAqB;AAC7C,YAAM,gBACJ,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG;AAC7E,UAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,GAAG;AAClC,UAAE,eAAe;AACjB,aAAK,MAAM;AAAA,MACb,WAES,iBAAiB,KAAK,QAAQ;AACrC,UAAE,eAAe;AACjB,cAAM,YAAY,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,IAAI,IAAI;AAC9D,YAAI,kBAAkB,KAAK;AAC3B,YAAI,mBAAmB;AACvB,WAAG;AACD,4BAAkB,kBAAkB;AACpC,cACE,CAAC,CAAC,KAAK,WAAW,SAAS,eAAe,KAC1B,KAAK,WAAW,SAAS,eAAe,EAAG,aAAa,IACxE;AACA,+BAAmB;AACnB;AAAA,UACF;AAAA,QACF,SAAS,kBAAkB,KAAK,WAAW,SAAS,UAAU,mBAAmB;AAEjF,YAAI,kBAAkB;AAEpB,cAAI,KAAK,gBAAgB;AACvB,iBAAK,WAAW,SAAS,KAAK,YAAY,EAAE,UAAU,OAAO,QAAQ;AACvE,eAAK,eAAe;AACpB,eAAK,kBAAkB;AAAA,QACzB;AAAA,MACF,WAES,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,KAAK,QAAQ;AAExD,cAAM,iBAAiB,KAAK,WAAW,SAAS,KAAK,YAAY;AACjE,cAAM,qBAAkC,gBAAgB,cAAc,WAAW;AAEjF,YAAI,CAAC,CAAC,oBAAoB;AACxB,6BAAmB,MAAM;AAAA,QAC3B,WAAW,CAAC,CAAC,gBAAgB;AAC3B,cAAI,0BAA0B,aAAa;AACzC,2BAAe,MAAM;AAAA,UACvB;AAAA,QACF;AAAA,MACF,WAES,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,KAAK,KAAK,QAAQ;AACtD,UAAE,eAAe;AACjB,aAAK,MAAM;AAAA,MACb;AAGA,YAAM,UAAU,EAAE,IAAI,YAAY;AAClC,YAAM,WAAW,gBAAgB,KAAK,OAAO;AAC7C,YAAM,cAAc;AAAA,QAClB,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,MAChB;AACA,UAAI,YAAY,CAAC,YAAY,SAAS,EAAE,GAAG,GAAG;AAC5C,aAAK,YAAY,KAAK,OAAO;AAC7B,cAAM,SAAS,KAAK,YAAY,KAAK,EAAE;AAGvC,cAAM,cAAc,MAAM,KAAK,KAAK,WAAW,iBAAiB,IAAI,CAAC,EAAE;AAAA,UACrE,CAAC,OAAO,GAAG,YAAY,KAAK,EAAE,YAAY,EAAE,QAAQ,MAAM,MAAM;AAAA,QAClE;AACA,YAAI,aAAa;AACf,eAAK,eAAe,CAAC,GAAG,YAAY,WAAW,QAAQ,EAAE,QAAQ,WAAW;AAC5E,eAAK,kBAAkB;AAAA,QACzB;AAAA,MACF;AAGA,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB,WAAW,KAAK,mBAAmB,GAAI;AAAA,IAC9D;AAEA,+BAAsB,MAAM;AAG1B,UAAI,KAAK,GAAG,cAAc;AACxB,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AAEA,6BAAoB,MAAM;AACxB,WAAK,cAAc,CAAC;AAAA,IACtB;AA6OA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,KAAK,OAAQ;AACjB,WAAK,SAAS;AAEd,UAAI,OAAO,KAAK,QAAQ,gBAAgB,YAAY;AAClD,aAAK,QAAQ,YAAY,KAAK,MAAM,KAAK,EAAE;AAAA,MAC7C;AAEA,WAAK,qBAAqB;AAC1B,WAAK,WAAW,MAAM,UAAU;AAChC,WAAK,eAAe;AACpB,WAAK,WAAW;AAGhB,iBAAW,MAAM,KAAK,6BAA6B,GAAG,CAAC;AACvD,WAAK,GAAG,eAAe;AAAA,IACzB;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,SAAS;AACd,WAAK,eAAe;AAEpB,UAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,aAAK,QAAQ,aAAa,KAAK,MAAM,KAAK,EAAE;AAAA,MAC9C;AACA,WAAK,YAAY;AACjB,WAAK,8BAA8B;AACnC,UAAI,KAAK,QAAQ,WAAW;AAC1B,aAAK,GAAG,MAAM;AAAA,MAChB;AACA,WAAK,GAAG,eAAe;AAAA,IACzB;AAKA;AAAA;AAAA;AAAA,iCAAwB,MAAM;AAC5B,UAAI,KAAK,QAAQ;AACf,aAAK,gCAAgC;AACrC,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAnjBE,SAAK,GAAG,qBAAqB,IAAI;AAEjC,cAAS,WAAW,KAAK,IAAI;AAC7B,SAAK,KAAK,MAAM,iBAAiB,EAAE;AACnC,SAAK,aAAa,SAAS,eAAe,KAAK,EAAE;AACjD,SAAK,YAAY,UAAU,IAAI,kBAAkB;AAEjD,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,SAAK,cAAc,CAAC;AACpB,SAAK,GAAG,eAAe;AAGvB,SAAK,uBAAuB;AAC5B,SAAK,uBAAuB;AAC5B,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,iBAAa,KAAK,aAAa;AAC/B,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAG1B,SAAK,8BAA8B;AACnC,UAAM,QAAQ,UAAS,WAAW,QAAQ,IAAI;AAC9C,QAAI,SAAS,EAAG,WAAS,WAAW,OAAO,OAAO,CAAC;AACnD,SAAK,GAAG,qBAAqB,IAAI;AAAA,EACnC;AAAA,EAEA,sBAAsB;AAEpB,SAAK,GAAG,iBAAiB,WAAW,KAAK,qBAAqB;AAE9D,SAAK,YAAY,iBAAiB,SAAS,KAAK,oBAAoB;AAEpE,QAAI,KAAK,QAAQ,OAAO;AACtB,WAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,WAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,WAAK,WAAW,iBAAiB,cAAc,KAAK,iBAAiB;AAAA,IAEvE,OAAO;AACL,WAAK,GAAG,iBAAiB,SAAS,KAAK,YAAY;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,uBAAuB;AAIrB,SAAK,GAAG,oBAAoB,WAAW,KAAK,qBAAqB;AACjE,SAAK,YAAY,oBAAoB,SAAS,KAAK,oBAAoB;AACvE,QAAI,KAAK,QAAQ,OAAO;AACtB,WAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,WAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,WAAK,YAAY,oBAAoB,cAAc,KAAK,iBAAiB;AAAA,IAC3E,OAAO;AACL,WAAK,GAAG,oBAAoB,SAAS,KAAK,YAAY;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,+BAA+B;AAC7B,aAAS,KAAK,iBAAiB,SAAS,KAAK,oBAAoB;AACjE,aAAS,KAAK,iBAAiB,aAAa,KAAK,0BAA0B,EAAE,SAAS,KAAK,CAAC;AAC5F,SAAK,YAAY,iBAAiB,WAAW,KAAK,sBAAsB;AACxE,WAAO,iBAAiB,UAAU,KAAK,mBAAmB;AAAA,EAC5D;AAAA,EAEA,gCAAgC;AAC9B,aAAS,KAAK,oBAAoB,SAAS,KAAK,oBAAoB;AACpE,aAAS,KAAK,oBAAoB,aAAa,KAAK,wBAAwB;AAC5E,SAAK,YAAY,oBAAoB,WAAW,KAAK,sBAAsB;AAC3E,WAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAAA,EAC/D;AAAA,EA2KA,uBAAuB;AACrB,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,gCAAgC;AACrC,SAAK,WAAW,MAAM,YAAY;AAClC,SAAK,WAAW,MAAM,UAAU;AAAA,EAClC;AAAA,EAEA,kCAAkC;AAChC,SAAK,WAAW,MAAM,QAAQ;AAC9B,SAAK,WAAW,MAAM,SAAS;AAC/B,SAAK,WAAW,MAAM,OAAO;AAC7B,SAAK,WAAW,MAAM,MAAM;AAC5B,SAAK,WAAW,MAAM,kBAAkB;AAAA,EAC1C;AAAA,EAEA,uBAAuB,cAA2B,MAAM;AACtD,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,QAAQ,UAAU,OAAO,KAAK,UAAU;AAC7C;AAAA,IACF;AACA,QAAI,aAAa;AACf,UAAI,CAAC,YAAY,SAAS,KAAK,UAAU,EAAG,aAAY,OAAO,KAAK,UAAU;AAC9E;AAAA,IACF;AACA,SAAK,GAAG,MAAM,KAAK,UAAU;AAAA,EAC/B;AAAA,EAEA,yBAAyB;AACvB,QAAI,CAAC,KAAK,WAAY;AACtB,SAAK,WAAW,UAAU;AAE1B,SAAK,WAAW,WAAW;AAE3B,UAAM,KAAK,KAAK,WAAW,QAAQ,EAAE,QAAQ,CAAC,OAAO;AACnD,UAAI,cAAc,iBAAiB,GAAG,UAAU,SAAS,SAAS,GAAG;AACnE,WAAG,aAAa,YAAY,IAAI;AAChC;AAAA,MACF;AACA,UAAI,CAAC,GAAG,aAAa,UAAU,EAAG,IAAG,aAAa,YAAY,GAAG;AAAA,IACnE,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB;AAClB,QACE,KAAK,gBAAgB,KACrB,KAAK,eAAe,KAAK,WAAW,SAAS,UAC7C,KAAK,QAAQ,WACb;AACA,MAAC,KAAK,WAAW,SAAS,KAAK,YAAY,EAAkB,MAAM;AAAA,QACjE,eAAe;AAAA,MACjB,CAAC;AACD,WAAK,WAAW,SAAS,KAAK,YAAY,EAAE,eAAe;AAAA,QACzD,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,qBAAqB,uBAAoC;AAEvD,UAAM,eAAe,KAAK,GAAG,sBAAsB;AACnD,UAAM,gBAAgB,KAAK,WAAW,sBAAsB;AAE5D,QAAI,cAAc,cAAc;AAChC,QAAI,aAAa,cAAc;AAC/B,QAAI,YAAY,aAAa,OAAO,cAAc;AAClD,QAAI,YAAY,aAAa,MAAM,cAAc;AAEjD,UAAM,iBAAiB;AAAA,MACrB,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAM;AAAA,MACvB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,QAAQ,eAAe,IAAI,aAAa;AAAA,IAC/C;AAEA,QAAI,oBAAoB;AACxB,QAAI,sBAAsB,KAAK,QAAQ;AACvC,iBAAa,KAAK,QAAQ,eAAe,IAAI,aAAa;AAG1D,SAAK,eAAe;AAEpB,QAAI,CAAC,WAAW,KAAK;AACnB,UAAI,WAAW,QAAQ;AACrB,4BAAoB;AAEpB,YAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,uBAAa,aAAa;AAAA,QAC5B;AAAA,MACF,OAAO;AACL,aAAK,eAAe;AAGpB,uBAAe;AACf,YAAI,WAAW,aAAa,WAAW,eAAe;AACpD,8BAAoB;AACpB,yBAAe,WAAW;AAC1B,uBAAa,KAAK,QAAQ,eACtB,WAAW,aAAa,KACxB,WAAW,aAAa,KAAK,aAAa;AAAA,QAChD,OAAO;AACL,yBAAe,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,WAAW,mBAAmB,GAAG;AACpC,YAAM,oBAAoB,wBAAwB,SAAS,UAAU;AACrE,UAAI,WAAW,iBAAiB,GAAG;AACjC,8BAAsB;AAAA,MACxB,OAAO;AAEL,YAAI,WAAW,cAAc,WAAW,cAAc;AACpD,gCAAsB;AACtB,wBAAc,WAAW;AACzB,uBAAa,WAAW;AAAA,QAC1B,OAAO;AACL,gCAAsB;AACtB,wBAAc,WAAW;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,sBAAsB,UAAU;AAClC,kBACE,YAAY,cAAc,UAAU,KAAK,QAAQ,eAAe,aAAa,SAAS;AAAA,IAC1F;AACA,QAAI,wBAAwB,SAAS;AACnC,kBAAY,YAAY,cAAc,QAAQ,aAAa;AAAA,IAC7D;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa;AACX,UAAM,WAAW,KAAK,QAAQ;AAC9B,SAAK,WAAW,MAAM,aAAa;AAEnC,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,WAAW,MAAM,YAAY;AAClC,eAAW,MAAM;AAEf,WAAK,WAAW,MAAM,aAAa,WAAW,QAAQ,sBAAsB,QAAQ;AAEpF,WAAK,WAAW,MAAM,UAAU;AAChC,WAAK,WAAW,MAAM,YAAY;AAAA,IACpC,GAAG,CAAC;AACJ,eAAW,MAAM;AACf,UAAI,KAAK,QAAQ,UAAW,MAAK,WAAW,MAAM;AAClD,UAAI,OAAO,KAAK,QAAQ,cAAc,WAAY,MAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,EAAE;AAAA,IAC7F,GAAG,QAAQ;AAAA,EACb;AAAA,EAEA,cAAc;AACZ,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,WAAW,MAAM,aAAa,WAAW,QAAQ,sBAAsB,QAAQ;AAEpF,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,WAAW,MAAM,YAAY;AAClC,eAAW,MAAM;AACf,WAAK,qBAAqB;AAC1B,UAAI,OAAO,KAAK,QAAQ,eAAe;AACrC,aAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE;AAAA,IAC9C,GAAG,QAAQ;AAAA,EACb;AAAA,EAEQ,oBAAoB,IAAiB,WAA+C;AAC1F,QAAI,WAAW,GAAG;AAClB,WAAO,aAAa,QAAQ,aAAa,UAAU;AACjD,UAAI,UAAU,QAAQ,GAAG;AACvB,eAAoB;AAAA,MACtB;AACA,iBAAW,SAAS;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB;AAEf,QAAI,wBAAqC,KAAK;AAAA,MAC5C,KAAK;AAAA,MACL,CAAC,aAA0B;AACzB,eACE,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,SAAS,OAAO,KAC3C,iBAAiB,QAAQ,EAAE,aAAa;AAAA,MAE5C;AAAA,IACF;AAEA,QAAI,CAAC,uBAAuB;AAC1B,8BACG,CAAC,CAAC,KAAK,WAAW,eAAe,KAAK,WAAW,eAAe,KAAK,WAAW;AAAA,IAErF;AAEA,QAAI,iBAAiB,qBAAqB,EAAE,aAAa;AACvD,4BAAsB,MAAM,WAAW;AAKzC,UAAM,aAAa,KAAK,QAAQ,iBAC5B,KAAK,GAAG,sBAAsB,EAAE,QAChC,KAAK,WAAW,sBAAsB,EAAE;AAC5C,SAAK,WAAW,MAAM,QAAQ,aAAa;AAE3C,UAAM,eAAe,KAAK,qBAAqB,qBAAqB;AACpE,SAAK,WAAW,MAAM,OAAO,aAAa,IAAI;AAC9C,SAAK,WAAW,MAAM,MAAM,aAAa,IAAI;AAC7C,SAAK,WAAW,MAAM,SAAS,aAAa,SAAS;AACrD,SAAK,WAAW,MAAM,QAAQ,aAAa,QAAQ;AACnD,SAAK,WAAW,MAAM,kBAAkB,GACtC,aAAa,wBAAwB,SAAS,MAAM,MACtD,IAAI,aAAa,sBAAsB,QAAQ,MAAM,MAAM;AAAA,EAC7D;AAmDF;AAtkBa,UACJ,aAAyB,CAAC;AAD5B,IAAM,WAAN;;;ACnBP,IAAMC,aAAiC;AAAA,EACrC,MAAM,CAAC;AAAA;AAAA,EACP,gBAAgB;AAAA;AAAA,EAChB,iBAAiB;AAAA;AAAA,IAEf,WAAW;AAAA,IACX,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAAA,EACA,WAAW;AAAA;AAAA,EACX,eAAe;AAAA,EACf,UAAU,CAAC,MAAc,iBAA+B;AACtD,UAAM,aAAa,KAAK,kBAAkB;AAC1C,iBAAa;AAAA,MAEX,aAAa,QAAQ,KAAK;AAAA,QAAO,CAAC,WAChC,OAAO,GAAG,SAAS,EAAE,kBAAkB,EAAE,SAAS,UAAU,KACvD,OAAO,MAAM,kBAAkB,EAAE,SAAS,UAAU;AAAA,MAE3D;AAAA,IACF;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,UAAU,CAAC;AACb;AAEO,IAAM,gBAAN,MAAM,sBAAqB,UAA+B;AAAA,EAkB/D,YAAY,IAAsB,SAAuC;AACvE,UAAM,IAAI,SAAS,aAAY;AA4KjC,4BAAmB,MAAM;AACvB,UAAI,CAAC,KAAK,YAAY;AACpB,aAAK,MAAM;AACX,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,6BAAoB,CAAC,MAAqB;AACxC,UAAI,EAAE,SAAS,QAAS,eAAa,WAAW;AAChD,WAAK,QAAQ;AACb,YAAM,cAAc,KAAK,GAAG,MAAM,kBAAkB;AAEpD,UACE,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAC/B,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG,KAClC,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG;AAEpC;AAGF,UAAI,KAAK,WAAW,eAAe,MAAM,YAAY;AACnD,aAAK,KAAK;AAAA,MACZ;AACA,WAAK,sBAAsB,WAAW;AAAA,IACxC;AAEA,6BAAoB,MAAM;AACxB,WAAK,QAAQ;AACb,YAAM,cAAc,KAAK,GAAG,MAAM,kBAAkB;AACpD,WAAK,sBAAsB,WAAW;AAAA,IACxC;AAEA,iCAAwB,CAAC,UAAkB;AAEzC,UAAI,KAAK,WAAW,OAAO;AACzB,aAAK,kBAAkB;AACvB,aAAK,QAAQ,SAAS,KAAK,GAAG,OAAO,IAAI;AAAA,MAC3C;AAEA,UAAI,CAAC,KAAK,QAAQ,iBAAiB,KAAK,GAAG,MAAM,WAAW,GAAG;AAC7D,aAAK,iBAAiB,CAAC;AACvB,aAAK,gBAAgB;AAAA,MACvB;AACA,WAAK,SAAS;AAAA,IAChB;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,oBAAa,WAAW;AAExB,YAAM,WAAW,KAAK,UAAU,iBAAiB,IAAI,EAAE;AAEvD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,KAAK,eAAe,GAAG;AAC7D,cAAM,YAAY,KAAK,UAAU,iBAAiB,IAAI,EAAE,KAAK,WAAW;AACxE,YAAI,WAAW;AACb,eAAK,aAAa,UAAU,aAAa,SAAS,CAAC;AACnD,YAAE,eAAe;AAAA,QACnB;AACA;AAAA,MACF;AAEA,UAAI,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,GAAG;AAChF,UAAE,eAAe;AACjB,YAAI,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG,KAAK,KAAK,cAAc,EAAG,MAAK;AACtE,YAAI,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,KAAK,cAAc,WAAW;AACzE,eAAK;AACP,aAAK,SAAS,UAAU,OAAO,QAAQ;AACvC,YAAI,KAAK,eAAe,GAAG;AACzB,eAAK,UAAU,KAAK,UAAU,iBAAiB,IAAI,EAAE,KAAK,WAAW;AACrE,eAAK,SAAS,UAAU,IAAI,QAAQ;AAEpC,eAAK,UAAU,SAAS,KAAK,WAAW,EAAE,eAAe;AAAA,YACvD,UAAU;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,6BAAoB,MAAM;AACxB,WAAK,KAAK;AAAA,IACZ;AAEA,kDAAyC,MAAM;AAC7C,WAAK,aAAa;AAAA,IACpB;AAEA,8CAAqC,MAAM;AACzC,WAAK,aAAa;AAAA,IACpB;AAkJA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,YAAM,YAAY,KAAK,GAAG,MAAM,kBAAkB;AAClD,WAAK,mBAAmB;AACxB,UAAI,UAAU,UAAU,KAAK,QAAQ,WAAW;AAC9C,aAAK,SAAS;AACd,aAAK,gBAAgB;AAAA,MACvB;AAEA,UAAI,CAAC,KAAK,SAAS,QAAQ;AACzB,mBAAW,MAAM;AACf,eAAK,SAAS,KAAK;AAAA,QACrB,GAAG,CAAC;AAAA,MACN,MAAO,MAAK,SAAS,sBAAsB;AAAA,IAC7C;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,WAAK,SAAS,MAAM;AAAA,IACtB;AA1aE,SAAK,GAAG,yBAAyB,IAAI;AAErC,SAAK,UAAU;AAAA,MACb,GAAG,cAAa;AAAA,MAChB,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,iBAAiB,KAAK,kBAAkB,KAAK,QAAQ,SAAS,IAAI,CAAC,WAA4B,EAAE,IAAI,MAAM,EAAC,KAAK,CAAC;AACvH,SAAK,YAAY,KAAK,QAAQ,QAAQ,CAAC;AACvC,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAgC;AACzC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAwC,CAAC,GACV;AAC/B,WAAO,MAAM,KAAK,KAAK,SAAS,aAAY;AAAA,EAC9C;AAAA,EAEA,OAAO,YAAY,IAA+B;AAChD,WAAO,GAAG,yBAAyB;AAAA,EACrC;AAAA,EAWA,OAAe,oBAAiC;AAC9C,QAAI,CAAC,cAAa,kBAAkB;AAClC,YAAM,WAAW,SAAS,cAAc,UAAU;AAClD,eAAS,YAAY;AAAA;AAAA;AAAA;AAAA;AAKrB,oBAAa,mBAAmB,SAAS,QAAQ;AAAA,IACnD;AACA,WAAO,cAAa,iBAAiB,UAAU,IAAI;AAAA,EACrD;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,gBAAgB;AACrB,SAAK,GAAG,yBAAyB,IAAI;AAAA,EACvC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,QAAQ,KAAK,gBAAgB;AACtD,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,WAAW,KAAK,mBAAmB;AAC5D,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,UAAU,iBAAiB,aAAa,KAAK,sCAAsC;AACxF,SAAK,UAAU,iBAAiB,WAAW,KAAK,kCAAkC;AAClF,QAAI,OAAO,OAAO,iBAAiB,aAAa;AAC9C,WAAK,UAAU,iBAAiB,cAAc,KAAK,sCAAsC;AACzF,WAAK,UAAU,iBAAiB,YAAY,KAAK,kCAAkC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,QAAQ,KAAK,gBAAgB;AACzD,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,WAAW,KAAK,mBAAmB;AAC/D,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,UAAU,oBAAoB,aAAa,KAAK,sCAAsC;AAC3F,SAAK,UAAU,oBAAoB,WAAW,KAAK,kCAAkC;AAErF,QAAI,OAAO,OAAO,iBAAiB,aAAa;AAC9C,WAAK,UAAU,oBAAoB,cAAc,KAAK,sCAAsC;AAC5F,WAAK,UAAU,oBAAoB,YAAY,KAAK,kCAAkC;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,iBAAiB;AACf,SAAK,YAAY,SAAS,cAAc,IAAI;AAC5C,SAAK,UAAU,MAAM,YAAY,KAAK,QAAQ;AAC9C,SAAK,UAAU,KAAK,wBAAwB,MAAM,KAAK,CAAC;AACxD,SAAK,UAAU,UAAU,IAAI,wBAAwB,kBAAkB;AACvE,SAAK,UAAU,eAAe;AAC9B,SAAK,GAAG,aAAa,eAAe,KAAK,UAAU,EAAE;AAErD,SAAK,UAAU,QAAQ,CAAC,aAAa;AACnC,YAAM,cAAc,KAAK,oBAAoB,QAAQ;AACrD,WAAK,UAAU,OAAO,WAAW;AAAA,IACnC,CAAC;AAGD,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAGhD,UAAM,kBAAkB;AAAA,MACtB,GAAG,cAAa,SAAS;AAAA,MACzB,GAAG,KAAK,QAAQ;AAAA,IAClB;AAEA,UAAM,kBAAkB,gBAAgB;AAExC,oBAAgB,cAAc,CAAC,OAAO;AACpC,UAAI,CAAC,GAAI;AACT,YAAM,UAAU,GAAG,aAAa,SAAS;AACzC,WAAK,aAAa,OAAO;AAEzB,UAAI,mBAAmB,OAAO,oBAAoB;AAChD,wBAAgB,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAC/C;AACA,SAAK,WAAW,SAAS,KAAK,KAAK,IAAI,eAAe;AAItD,UAAM,QAAQ,KAAK,GAAG,cAAc,cAAc,OAAO;AACzD,QAAI,MAAO,MAAK,GAAG,MAAM,KAAK;AAG9B,SAAK,GAAG,oBAAoB,SAAS,KAAK,SAAS,YAAY;AAC/D,QAAG,CAAC,KAAK,QAAQ,iBAAiB,EAAE,KAAK,QAAQ,SAAS,WAAW,IAAI;AACvE,YAAM,gBAAgB,KAAK,UAAU,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,eAAe,CAAC,EAAE,EAAE;AAC7F,WAAK,GAAG,QAAQ,cAAc,CAAC,EAAE;AAAA,IACnC;AAEA,QAAI,KAAK,GAAG,MAAO,MAAK,aAAa,KAAK,GAAG,KAAK;AAElD,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,UAAU,IAAI,aAAa;AAC/B,QAAI,aAAa,SAAS,mCAAmC;AAC7D,SAAK,GAAG,cAAc,YAAY,GAAG;AACrC,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,kBAAkB;AAChB,SAAK,UAAU,eAAe;AAC9B,SAAK,UAAU,WAAW,YAAY,KAAK,SAAS;AAAA,EACtD;AAAA,EA6FA,+BAA+B;AAC7B,SAAK,cAAc;AACnB,SAAK,SAAS,UAAU,OAAO,QAAQ;AAAA,EACzC;AAAA,EAEA,qBAAqB;AACnB,SAAK,UAAU,gBAAgB;AAC/B,SAAK,6BAA6B;AAClC,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,sBAAsB,OAAe,OAAe;AAClD,UAAM,QAAQ,MAAM,kBAAkB,EAAE,QAAQ,KAAK,MAAM,kBAAkB,CAAM;AACnF,UAAM,MAAM,QAAQ,MAAM,SAAS;AAEnC,QAAI,SAAS,MAAM,OAAO,IAAI;AAC5B,aAAO,CAAC,OAAO,IAAI,EAAE;AAAA,IACvB;AACA,WAAO,CAAC,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,MAAM,OAAO,MAAM,CAAC,GAAG,MAAM,MAAM,MAAM,CAAC,CAAC;AAAA,EAClF;AAAA,EAEA,oBAAoB,OAAyB;AAC3C,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,aAAa,WAAmB,MAAM,EAAE;AAC7C,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AACA,SAAK,WAAW;AAEhB,QAAI,KAAK,QAAQ,eAAe;AAC9B,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,UAAU,IAAI,gBAAgB;AACxC,gBAAU,MAAM,YAAY;AAC5B,YAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,eAAS,OAAO;AAChB,eAAS,UAAU,KAAK,eAAe,KAAK,CAAC,QAAQ,IAAI,OAAO,MAAM,EAAE;AACxE,YAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,aAAO,MAAM,cAAc;AAC3B,gBAAU,OAAO,UAAU,MAAM;AACjC,WAAK,YAAY,SAAS;AAAA,IAC5B;AAEA,QAAI,MAAM,OAAO;AACf,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,UAAU,IAAI,QAAQ;AAC1B,UAAI,MAAM,MAAM;AAChB,WAAK,YAAY,GAAG;AAAA,IACtB;AAGA,UAAM,YAAY,KAAK,GAAG,MAAM,kBAAkB;AAClD,UAAM,QAAQ,KAAK,sBAAsB,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AACvF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,aAAa,SAAS,kCAAkC;AAC5D,QAAI,KAAK,QAAQ,iBAAiB;AAChC,UAAI,YAAY,MAAM,CAAC,IAAI,6BAA6B,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC;AAAA,IACxF,OAAO;AACL,UAAI,YAAY,SAAS,eAAe,MAAM,CAAC,CAAC,CAAC;AACjD,UAAI,MAAM,CAAC,GAAG;AACZ,cAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,kBAAU,cAAc,MAAM,CAAC;AAC/B,kBAAU,UAAU,IAAI,WAAW;AACnC,YAAI,YAAY,SAAS;AACzB,YAAI,YAAY,SAAS,eAAe,MAAM,CAAC,CAAC,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,aAAS,UAAU,IAAI,WAAW;AAClC,aAAS,aAAa,SAAS,8BAA8B;AAC7D,SAAK,YAAY,QAAQ;AACzB,SAAK,cAAc,YAAY,EAAE,YAAY,GAAG;AAEhD,QACE,OAAO,MAAM,gBAAgB,YAC5B,OAAO,MAAM,gBAAgB,YAAY,CAAC,MAAM,MAAM,WAAW,GAClE;AACA,YAAM,cAAc,SAAS,cAAc,OAAO;AAClD,kBAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,kBAAY,YAAY,MAAM;AAC9B,WAAK,cAAc,YAAY,EAAE,YAAY,WAAW;AAAA,IAC1D;AAEA,UAAM,gBAAgB,MAAM;AAC1B,UAAI,KAAK,QAAQ,eAAe;AAC9B,YAAI,MAAM,MAAO,QAAO;AACxB,eAAO;AAAA,MACT;AACA,UAAI,MAAM,MAAO,QAAO;AACxB,aAAO;AAAA,IACT;AACA,SAAK,MAAM,sBAAsB,cAAc;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB;AAChB,SAAK,mBAAmB;AAExB,QAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,KAAK;AAC9C,YAAM,OAAO,KAAK,oBAAoB,KAAK,UAAU,CAAC,CAAC;AACvD,WAAK,UAAU,OAAO,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,oBAAoB;AAClB,UAAM,gBAAgB,KAAK,GAAG,cAAc,cAAc,cAAc;AACxE,QAAI,cAAe,eAAc,gBAAgB,cAAa,kBAAkB,CAAC;AAAA,EACnF;AAAA,EAEA,sBAAsB;AACpB,UAAM,gBAAgB,KAAK,GAAG,cAAc,cAAc,cAAc;AACxE,QAAI,eAAe;AACjB,UAAI,KAAK,QAAQ;AACf,sBAAc,cAAc,KAAK,eAAe,OAAO,SAAS;AAAA,UAC7D,eAAc,gBAAgB;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,oBAAoB;AAClB,QAAI,KAAK,eAAe,WAAW,GAAG;AACpC,YAAM,QAAQ,KAAK,eAAe,CAAC;AACnC,WAAK,GAAG,QAAQ,MAAM,QAAgB,MAAM;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,kBAAkB;AAChB,SAAK,GAAG,cAAc,IAAI,MAAM,QAAQ,CAAC;AAEzC,QAAI,OAAO,KAAK,QAAQ,mBAAmB;AACzC,WAAK,QAAQ,eAAe,KAAK,MAAM,KAAK,cAAc;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,aAAa,WAA+B,WAAgC,MAAM,OAAgB,MAAM;AACtG,SAAK,YAAY;AACjB,SAAK,QAAQ,OAAO;AACpB,QAAI,UAAU;AACZ,WAAK,iBAAiB,KAAK,UAAU;AAAA,QACnC,CAAC,SAAS,EAAE,SAAS,QAAe,KAAK,EAAE,MAAM;AAAA,MACnD;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,eAAe;AAC9B,WAAK,gBAAgB;AAAA,IACvB,OAAO;AACL,WAAK,kBAAkB;AAAA,IACzB;AACA,QAAI,KAAM,MAAK,KAAK;AACpB,SAAK,oBAAoB;AACzB,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,SAA6B;AACrC,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AACzB,QAAI,CAAC,KAAK,QAAQ,eAAe;AAC/B,WAAK,kBAAkB;AAAA,IACzB;AACA,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,IAAqB;AAChC,UAAM,QAAQ,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;AACzD,QAAI,CAAC,MAAO;AAIZ,QAAI,KAAK,QAAQ,eAAe;AAG9B,UAAI,EAAE,KAAK,eAAe;AAAA,QACxB,CAAC,kBAAkB,cAAc,OAAO,MAAM;AAAA,MAChD,EAAE,UAAU,GAAI,MAAK,eAAe,KAAK,KAAK;AAAA,UACzC,MAAK,iBAAiB,KAAK,eAAe;AAAA,QAC7C,CAAC,kBAAkB,cAAc,OAAO,MAAM;AAAA,MAChD;AACA,WAAK,gBAAgB;AACrB,WAAK,GAAG,MAAM;AAAA,IAChB,OAAO;AAEL,WAAK,iBAAiB,CAAC,KAAK;AAC5B,WAAK,kBAAkB;AACvB,WAAK,mBAAmB;AACxB,WAAK,MAAM;AAAA,IACb;AACA,SAAK,oBAAoB;AACzB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,cAAc,KAAS;AACrB,UAAM,UAAU,KAAK,UAAU;AAAA,MAC7B,CAAC,SAAS,EAAE,IAAI,QAAe,KAAK,EAAE,MAAM;AAAA,IAC9C;AACA,QAAI,CAAC,QAAS;AACd,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AAAA,EACvB;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9gBa,cAiFI,mBAAgC;AAjF1C,IAAM,eAAN;;;ACxBP,IAAMC,aAA0B;AAAA,EAC9B,MAAM,CAAC;AAAA,EACP,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,qBAAqB,CAAC;AAAA,EACtB,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAChB;AAEO,IAAM,SAAN,MAAM,eAAc,UAAwB;AAAA,EAajD,YAAY,IAAiB,SAAgC;AAC3D,UAAM,IAAI,SAAS,MAAK;AAiG1B,4BAAmB,CAAC,MAAkB;AACpC,YAAM,QAAsB,EAAE,OAAQ,QAAQ,OAAO;AACrD,YAAM,eAA6B,EAAE,OAAQ,UAAU,SAAS,OAAO;AACvE,UAAI,OAAO;AAIT,cAAM,QAAQ,KAAK,OAAO,QAAQ,KAAoB;AACtD,YAAI,QAAQ,EAAG;AACf,YAAI,cAAc;AAChB,eAAK,WAAW,KAAK;AACrB,eAAK,OAAO,MAAM;AAAA,QACpB,OAAO;AACL,eAAK,WAAW,KAAK;AAAA,QACvB;AAAA,MAEF,OAAO;AACL,aAAK,OAAO,MAAM;AAAA,MACpB;AAAA,IACF;AAqDA,6BAAoB,MAAM;AACxB,WAAK,GAAG,UAAU,IAAI,OAAO;AAAA,IAC/B;AAEA,4BAAmB,MAAM;AACvB,WAAK,GAAG,UAAU,OAAO,OAAO;AAAA,IAClC;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,aAAM,WAAW;AACjB,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AAEpC,YAAI,KAAK,mBAAmB,KAAK,gBAAgB,KAAK,aAAa,QAAQ;AACzE;AAAA,QACF;AACA,UAAE,eAAe;AACjB,YAAI,CAAC,KAAK,mBAAoB,KAAK,mBAAmB,CAAC,KAAK,QAAQ,kBAAmB;AACrF,eAAK,QAAQ,EAAE,IAAI,KAAK,OAAO,MAAM,CAAC;AAAA,QACxC;AACA,aAAK,OAAO,QAAQ;AAAA,MACtB,YACG,MAAM,KAAK,UAAU,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,MAC7E,KAAK,OAAO,UAAU,MACtB,KAAK,UAAU,QACf;AACA,UAAE,eAAe;AACjB,aAAK,WAAW,KAAK,UAAU,SAAS,CAAC;AAAA,MAC3C;AAAA,IACF;AApME,SAAK,GAAG,kBAAkB,IAAI;AAE9B,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AAEA,SAAK,GAAG,UAAU,IAAI,OAAO;AAC7B,SAAK,YAAY,CAAC;AAClB,SAAK,SAAS,CAAC;AAGf,QAAI,KAAK,QAAQ,KAAK,QAAQ;AAC5B,WAAK,YAAY,KAAK,QAAQ;AAC9B,WAAK,aAAa;AAAA,IACpB;AAGA,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,WAAK,GAAG,UAAU,IAAI,aAAa;AACnC,WAAK,YAAY;AACjB,WAAK,oBAAoB;AAEzB,WAAK,GAAG,OAAO,KAAK,MAAM;AAAA,IAC5B;AAGA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAiC,CAAC,GACjB;AACjB,WAAO,MAAM,KAAK,KAAK,SAAS,MAAK;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY,IAAwB;AACzC,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA,EAEA,UAAU;AACR,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,WAAK,qBAAqB;AAAA,IAC5B;AACA,SAAK,OAAO,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;AACrC,SAAK,SAAS,CAAC;AACf,SAAK,GAAG,kBAAkB,IAAI;AAAA,EAChC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,gBAAgB;AAEvD,aAAS,iBAAiB,WAAW,OAAM,mBAAmB;AAC9D,aAAS,iBAAiB,SAAS,OAAM,iBAAiB;AAC1D,SAAK,GAAG,iBAAiB,QAAQ,OAAM,kBAAkB,IAAI;AAC7D,SAAK,OAAO,iBAAiB,SAAS,KAAK,iBAAiB;AAC5D,SAAK,OAAO,iBAAiB,QAAQ,KAAK,gBAAgB;AAC1D,SAAK,OAAO,iBAAiB,WAAW,KAAK,mBAAmB;AAAA,EAClE;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,gBAAgB;AAC1D,aAAS,oBAAoB,WAAW,OAAM,mBAAmB;AACjE,aAAS,oBAAoB,SAAS,OAAM,iBAAiB;AAC7D,SAAK,GAAG,oBAAoB,QAAQ,OAAM,kBAAkB,IAAI;AAChE,SAAK,OAAO,oBAAoB,SAAS,KAAK,iBAAiB;AAC/D,SAAK,OAAO,oBAAoB,QAAQ,KAAK,gBAAgB;AAC7D,SAAK,OAAO,oBAAoB,WAAW,KAAK,mBAAmB;AAAA,EACrE;AAAA,EAuBA,OAAO,oBAAoB,GAAkB;AAC3C,WAAM,WAAW;AACjB,UAAM,QAAsB,EAAE,OAAQ,QAAQ,QAAQ;AACtD,UAAM,eAAe,EAAE,UAAU;AAGjC,UAAM,MAAoB,EAAE,OAAQ;AACpC,QAAI,QAAQ,WAAW,QAAQ,cAAc,CAAC,aAAc;AAE5D,UAAM,YAAmB,MAAM,kBAAkB;AACjD,QAAI,CAAC,UAAW;AAEhB,QAAI,MAAM,KAAK,UAAU,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,OAAO,SAAS,EAAE,GAAG,GAAG;AAC7E,QAAE,eAAe;AACjB,UAAI,cAAc,UAAU,UAAU;AACtC,UAAI,UAAU,eAAe;AAC3B,cAAM,QAAQ,UAAU,OAAO,QAAQ,UAAU,aAAa;AAC9D,kBAAU,WAAW,KAAK;AAC1B,kBAAU,gBAAgB;AAE1B,sBAAc,KAAK,IAAI,QAAQ,GAAG,CAAC;AAAA,MACrC;AACA,UAAI,UAAU,UAAU,OAAQ,WAAU,WAAW,WAAW;AAAA,UAC3D,WAAU,OAAO,MAAM;AAAA,IAC9B,WAAW,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,GAAG;AAChD,UAAI,UAAU,eAAe;AAC3B,cAAM,cAAc,UAAU,OAAO,QAAQ,UAAU,aAAa,IAAI;AACxE,YAAI,cAAc,EAAG;AACrB,kBAAU,WAAW,WAAW;AAAA,MAClC;AAAA,IACF,WAAW,MAAM,KAAK,YAAY,SAAS,EAAE,GAAG,GAAG;AACjD,UAAI,UAAU,eAAe;AAC3B,cAAM,cAAc,UAAU,OAAO,QAAQ,UAAU,aAAa,IAAI;AACxE,YAAI,eAAe,UAAU,UAAU,OAAQ,WAAU,OAAO,MAAM;AAAA,YACjE,WAAU,WAAW,WAAW;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,oBAAoB;AACzB,WAAM,WAAW;AAAA,EACnB;AAAA,EAEA,OAAO,iBAAiB,GAAU;AAChC,QAAI,CAAC,OAAM,YAAY,SAAS,QAAQ;AACtC,YAAM,QAAsB,EAAE,OAAQ,QAAQ,QAAQ;AACtD,YAAM,YAAmB,QAAQ,kBAAkB;AACnD,UAAI,UAAW,WAAU,gBAAgB;AAAA,IAC3C;AAAA,EACF;AAAA,EAgCA,YAAY,MAAgC;AAC1C,QAAI,CAAC,KAAK,GAAI;AACd,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,UAAU,IAAI,MAAM;AACjC,iBAAa,YAAY,KAAK,QAAgB,KAAK;AAEnD,QAAI,KAAK,OAAO;AACd,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,aAAa,OAAO,KAAK,KAAK;AAClC,mBAAa,aAAa,KAAK,aAAa,UAAU;AAAA,IACxD;AACA,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,mBAAa,aAAa,YAAY,GAAG;AACzC,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,UAAU,IAAI,KAAK,QAAQ,gBAAgB,OAAO;AAC5D,gBAAU,YAAY;AACtB,mBAAa,YAAY,SAAS;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe;AACb,SAAK,SAAS,CAAC;AACf,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,KAAK;AAC9C,YAAM,WAAW,KAAK,YAAY,KAAK,UAAU,CAAC,CAAC;AACnD,WAAK,GAAG,YAAY,QAAQ;AAC5B,WAAK,OAAO,KAAK,QAAQ;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,SAAK,QAAQ,oBAAoB,iBAAiB,CAAC,UAAU;AAC3D,UAAI,MAAM,SAAS;AACjB,aAAK,QAAQ;AAAA,UACX,IAAI,MAAM,CAAC,EAAE;AAAA,UACb,MAAM,MAAM,CAAC,EAAE;AAAA,UACf,OAAO,MAAM,CAAC,EAAE;AAAA,QAClB,CAAC;AACH,WAAK,OAAO,QAAQ;AACpB,WAAK,OAAO,MAAM;AAAA,IACpB;AACA,SAAK,eAAe,aAAa,KAAK,KAAK,QAAQ,KAAK,QAAQ,mBAAmB;AAAA,EACrF;AAAA,EAEA,cAAc;AACZ,SAAK,SAAS,KAAK,GAAG,cAAc,OAAO;AAC3C,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,SAAS,cAAc,OAAO;AAC5C,WAAK,GAAG,OAAO,KAAK,MAAM;AAAA,IAC5B;AACA,SAAK,OAAO,UAAU,IAAI,OAAO;AACjC,SAAK,kBAAkB,OAAO,KAAK,KAAK,QAAQ,mBAAmB,EAAE,SAAS;AAE9E,QAAI,KAAK,gBAAiB,MAAK,mBAAmB;AAClD,SAAK,gBAAgB;AAErB,QAAI,CAAC,KAAK,OAAO,aAAa,IAAI,EAAG,MAAK,OAAO,aAAa,MAAM,MAAM,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,cAAc;AACZ,SAAK,SAAS,KAAK,GAAG,cAAc,OAAO;AAE3C,QAAI,KAAK,UAAU,KAAK,OAAQ,MAAK,OAAO,aAAa,OAAO,KAAK,OAAO,aAAa,IAAI,CAAC;AAAA,EAChG;AAAA,EAEA,kBAAkB;AAChB,QAAI,KAAK,cAAc,UAAa,CAAC,KAAK,UAAU,UAAU,KAAK,QAAQ,aAAa;AACtF,WAAK,OAAO,cAAc,KAAK,QAAQ;AAAA,IACzC,YACG,KAAK,cAAc,UAAa,CAAC,CAAC,KAAK,UAAU,WAClD,KAAK,QAAQ,sBACb;AACA,WAAK,OAAO,cAAc,KAAK,QAAQ;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,oBAAoB,MAAgB;AAClC,UAAM,UAAU,CAAC,CAAC,KAAK;AACvB,UAAM,eAAe,CAAC,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,MAAM,KAAK,EAAE;AACtE,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MAAgB;AACtB,QAAI,CAAC,KAAK,oBAAoB,IAAI,KAAK,KAAK,UAAU,UAAU,KAAK,QAAQ,MAAO;AACpF,UAAM,eAAe,KAAK,YAAY,IAAI;AAC1C,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,UAAU,KAAK,IAAI;AAExB,SAAK,OAAO,OAAO,YAAY;AAC/B,SAAK,gBAAgB;AAErB,QAAI,OAAO,KAAK,QAAQ,cAAc,YAAY;AAChD,WAAK,QAAQ,UAAU,KAAK,IAAI,YAAY;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,WAAmB;AAC5B,UAAM,OAAO,KAAK,OAAO,SAAS;AAClC,QAAI,CAAC,KAAM;AACX,SAAK,OAAO;AACZ,SAAK,OAAO,OAAO,WAAW,CAAC;AAC/B,SAAK,UAAU,OAAO,WAAW,CAAC;AAClC,SAAK,gBAAgB;AAErB,QAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,WAAK,QAAQ,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,WAAmB;AAC5B,UAAM,OAAO,KAAK,OAAO,SAAS;AAClC,QAAI,CAAC,KAAM;AACX,SAAK,gBAAgB;AACrB,SAAK,MAAM;AAEX,QAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,WAAK,QAAQ,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,OAAO,OAAO;AAKZ,UAAM,gBAAgB,MAAM;AAC1B,YAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAChD,YAAM,QAAQ,CAAC,OAAO;AACpB,WAAG,iBAAiB,SAAS,CAAC,MAAM;AAClC,cAAI,GAAG,kBAAkB,EAAG;AAC5B,cAAkB,EAAE,OAAQ,UAAU,SAAS,OAAO,GAAG;AACvD,kBAAM,OAAqB,EAAE,OAAQ,QAAQ,OAAO;AACpD,gBAAI,KAAM,MAAK,OAAO;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAKF;AAFI,OAAM,WAAW;AA7Wd,IAAM,QAAN;;;ACrFP,IAAMC,aAA0B,CAAC;AAE1B,IAAM,QAAN,MAAM,eAAc,UAAwB;AAAA,EAMjD,YAAY,IAAsB,SAAgC;AAChE,UAAM,IAAI,SAAS,MAAK;AAsF1B,8BAAqB,MAAM;AACzB,WAAK,MAAM;AACX,WAAK,MAAM,UAAU,IAAI,QAAQ;AAAA,IACnC;AAEA,2CAAkC,CAAC,MAA+B;AAChE,WAAK,aAAa;AAClB,WAAK,GAAG,UAAU,IAAI,QAAQ;AAC9B,WAAK,MAAM;AACX,UAAI,EAAE,SAAS,SAAS;AACtB,aAAK,MAAM,UAAU,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,+CAAsC,MAAM;AAC1C,UAAI,KAAK,YAAY;AACnB,aAAK,MAAM;AACX,aAAK,MAAM,UAAU,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,uCAA8B,MAAM;AAClC,WAAK,aAAa;AAClB,WAAK,GAAG,UAAU,OAAO,QAAQ;AAAA,IACnC;AAEA,8CAAqC,MAAM;AACzC,UAAI,CAAC,KAAK,YAAY;AACpB,aAAK,MAAM,UAAU,OAAO,QAAQ;AAAA,MACtC;AAAA,IACF;AAnHE,SAAK,GAAG,kBAAkB,IAAI;AAE9B,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AAEA,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,MAAM;AACX,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAyB;AAClC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAiC,CAAC,GACjB;AACjB,WAAO,MAAM,KAAK,KAAK,SAAS,MAAK;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,aAAa;AAClB,SAAK,GAAG,kBAAkB,IAAI;AAAA,EAChC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,UAAU,KAAK,kBAAkB;AAC1D,SAAK,GAAG,iBAAiB,aAAa,KAAK,+BAA+B;AAC1E,SAAK,GAAG,iBAAiB,cAAc,KAAK,+BAA+B;AAC3E,SAAK,GAAG,iBAAiB,SAAS,KAAK,mCAAmC;AAC1E,SAAK,GAAG,iBAAiB,aAAa,KAAK,mCAAmC;AAE9E,SAAK,GAAG,iBAAiB,aAAa,KAAK,qCAAqC;AAAA,MAC9E,SAAS;AAAA,IACX,CAAC;AACD,SAAK,GAAG,iBAAiB,WAAW,KAAK,2BAA2B;AACpE,SAAK,GAAG,iBAAiB,YAAY,KAAK,2BAA2B;AACrE,SAAK,GAAG,iBAAiB,QAAQ,KAAK,kCAAkC;AACxE,SAAK,GAAG,iBAAiB,YAAY,KAAK,kCAAkC;AAC5E,SAAK,GAAG,iBAAiB,cAAc,KAAK,kCAAkC;AAAA,EAChF;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,UAAU,KAAK,kBAAkB;AAC7D,SAAK,GAAG,oBAAoB,aAAa,KAAK,+BAA+B;AAC7E,SAAK,GAAG,oBAAoB,cAAc,KAAK,+BAA+B;AAC9E,SAAK,GAAG,oBAAoB,SAAS,KAAK,mCAAmC;AAC7E,SAAK,GAAG,oBAAoB,aAAa,KAAK,mCAAmC;AACjF,SAAK,GAAG,oBAAoB,aAAa,KAAK,mCAAmC;AACjF,SAAK,GAAG,oBAAoB,WAAW,KAAK,2BAA2B;AACvE,SAAK,GAAG,oBAAoB,YAAY,KAAK,2BAA2B;AACxE,SAAK,GAAG,oBAAoB,QAAQ,KAAK,kCAAkC;AAC3E,SAAK,GAAG,oBAAoB,YAAY,KAAK,kCAAkC;AAC/E,SAAK,GAAG,oBAAoB,cAAc,KAAK,kCAAkC;AAAA,EACnF;AAAA,EAkCA,cAAc;AACZ,SAAK,QAAQ,SAAS,cAAc,MAAM;AAC1C,SAAK,QAAQ,SAAS,cAAc,MAAM;AAC1C,SAAK,MAAM,UAAU,IAAI,OAAO;AAChC,SAAK,MAAM,UAAU,IAAI,OAAO;AAChC,SAAK,MAAM,OAAO,KAAK,KAAK;AAC5B,SAAK,GAAG,MAAM,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,eAAe;AACb,SAAK,MAAM,OAAO;AAAA,EACpB;AAAA,EAEA,cAAuB;AACrB,WAAO,CAAC,CAAC,KAAK,GAAG,QAAQ,WAAW;AAAA,EACtC;AAAA,EAEA,QAAQ;AACN,UAAM,MAAM,WAAW,KAAK,GAAG,aAAa,KAAK,CAAC,KAAK;AACvD,UAAM,MAAM,WAAW,KAAK,GAAG,aAAa,KAAK,CAAC,KAAK;AACvD,UAAM,MAAM,WAAW,KAAK,GAAG,KAAK,KAAK;AACzC,UAAM,UAAU,QAAQ,MAAM,KAAK,MAAM,QAAQ,MAAM;AAKvD,UAAM,OAAO,KAAK,GAAG;AACrB,UAAM,MAAM,KAAK,GAAG;AACpB,UAAM,QAAQ,KAAK,GAAG;AACtB,UAAM,SAAS,KAAK,GAAG;AAEvB,SAAK,GAAG,MAAM,YAAY,oCAAoC,GAAG,UAAU,GAAG,GAAG;AACjF,SAAK,MAAM,cAAc,KAAK,GAAG;AACjC,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,MAAM,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC;AAC3C,WAAK,MAAM,MAAM,MAAM,GAAG,OAAO,IAAI,WAAW,MAAM;AAAA,IACxD,OAAO;AACL,WAAK,MAAM,MAAM,OAAO,GAAG,OAAO,UAAU,KAAK;AACjD,WAAK,MAAM,MAAM,MAAM,GAAG,GAAG;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO;AAGZ,UAAM,gBAAgB,MAAM;AAC1B,aAAM,KAAK,SAAS,iBAAiB,mBAAmB,GAAmC,CAAC,CAAC;AAAA,IAC/F,CAAC;AAAA,EACH;AACF;;;ACzKO,IAAM,WAAN,MAAM,SAAQ;AAAA,EAGnB,OAAO,OAAO;AACZ,UAAM,gBAAgB,MAAM;AAC1B,eAAS,iBAAiB,eAAe,SAAQ,gBAAgB,EAAE,SAAS,KAAK,CAAC;AAClF,eAAS,iBAAiB,aAAa,SAAQ,cAAc,EAAE,SAAS,KAAK,CAAC;AAC9E,eAAS,iBAAiB,iBAAiB,SAAQ,kBAAkB,EAAE,SAAS,KAAK,CAAC;AAAA,IACxF,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,eAAe,OAAqB;AACzC,QAAI,CAAC,SAAQ,gBAAgB,KAAK,GAAG;AACnC,eAAQ,QAAQ;AAChB;AAAA,IACF;AACA,UAAM,SAAS,SAAQ,gBAAgB,KAAK;AAC5C,QAAI,CAAC,UAAU,CAAC,SAAQ,kBAAkB,MAAM,KAAK,CAAC,SAAQ,SAAS,OAAO,MAAM,GAAG;AACrF,eAAQ,QAAQ;AAChB;AAAA,IACF;AACA,aAAQ,QAAQ,EAAE,QAAQ,WAAW,MAAM,UAAU;AAAA,EACvD;AAAA,EAEA,OAAO,aAAa,OAAqB;AACvC,UAAM,UAAU,SAAQ;AACxB,aAAQ,QAAQ;AAChB,QAAI,CAAC,WAAW,QAAQ,cAAc,MAAM,UAAW;AACvD,QAAI,CAAC,MAAM,UAAW;AACtB,QAAI,CAAC,QAAQ,OAAO,eAAe,CAAC,QAAQ,OAAO,KAAM;AACzD,QAAI,CAAC,SAAQ,kBAAkB,QAAQ,MAAM,EAAG;AAChD,QAAI,SAAQ,gBAAgB,KAAK,MAAM,QAAQ,OAAQ;AACvD,QAAI,SAAQ,SAAS,OAAO,QAAQ,MAAM,GAAG;AAC3C,cAAQ,OAAO,MAAM;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,OAAO,mBAAmB;AACxB,aAAQ,QAAQ;AAAA,EAClB;AAAA;AAAA,EAGA,OAAe,gBAAgB,OAAwC;AACrE,UAAM,SAAS,MAAM;AACrB,QAAI,EAAE,kBAAkB,sBAAsB,CAAC,OAAO,KAAM,QAAO;AACnE,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,SAAS,OAAqB,QAAoC;AAC/E,UAAM,OAAO,OAAO,sBAAsB;AAC1C,WACE,MAAM,UAAU,KAAK,QACrB,MAAM,UAAU,KAAK,SACrB,MAAM,UAAU,KAAK,OACrB,MAAM,UAAU,KAAK;AAAA,EAEzB;AAAA,EAEA,OAAe,gBAAgB,OAA8B;AAC3D,QAAI,CAAC,MAAM,UAAW,QAAO;AAC7B,WAAO,MAAM,gBAAgB,WAAW,MAAM,WAAW;AAAA,EAC3D;AAAA,EAEA,OAAe,kBAAkB,QAAoC;AACnE,UAAM,QAAQ,SAAQ,UAAU,MAAM;AACtC,QAAI,UAAU,UAAU,UAAU,eAAgB,QAAO;AAGzD,QAAI,UAAU,SAAS,cAAc,kBAAkB,UAAW,QAAO;AACzE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,UAAU,QAA4C;AACnE,UAAM,OAAO,OAAO,aAAa,UAAU;AAC3C,QAAI,SAAS,SAAS,SAAS,kBAAkB,SAAS,OAAQ,QAAO;AACzE,WAAO;AAAA,EACT;AACF;AAhFa,SACI,QAAiE;AAD3E,IAAM,UAAN;;;ACdA,IAAM,QAAN,MAAM,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,OAAO,cAAc,WAA6B;AAChD,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,6BAA6B;AAC3C;AAAA,IACF;AAEA,UAAM,YAAY,UAAU,aAAa,aAAa,MAAM;AAC5D,UAAM,UAAU,SAAS,UAAU,aAAa,aAAa,CAAC;AAC9D,UAAM,MAAM,UAAU,MAAM;AAE5B,QACE,QAAQ,KACR,UAAU,SAAS,aAAa,SAChC,CAAC,UAAU,YACX,UAAU,UAAU,SAAS,UAAU,GACvC;AACA,gBAAU,UAAU,OAAO,SAAS;AAAA,IACtC,WAAW,UAAU,UAAU,SAAS,UAAU,GAAG;AAEnD,UACG,UAAU,SAAS,SAAS,aAAa,OAAO,WAChD,UAAU,SAAS,SAAS,CAAC,WAC9B;AACA,kBAAU,UAAU,OAAO,SAAS;AAAA,MACtC,OAAO;AACL,kBAAU,UAAU,IAAI,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,mBAAmB,GAAgB;AACxC,UAAM,WAAW;AACjB,QAAI,CAAC,SAAU;AAaf,QAAI,CAAC,SAAS,aAAa,iBAAiB,GAAG;AAC7C,eAAS,aAAa,mBAAmB,SAAS,sBAAsB,EAAE,OAAO,SAAS,CAAC;AAAA,IAC7F;AACA,UAAM,iBAAiB,SAAS,SAAS,aAAa,iBAAiB,CAAC;AACxE,QAAI,MAAM,cAAc,EAAG;AAE3B,aAAS,MAAM,SAAS;AAExB,UAAM,UAAU,SAAS,eAAe,SAAS;AACjD,UAAM,gBAAgB,SAAS,eAAe;AAC9C,aAAS,MAAM,SAAS,KAAK,IAAI,gBAAgB,aAAa,IAAI;AAAA,EACpE;AAAA,EAEA,OAAO,OAAO;AACZ,UAAM,gBAAgB,MAAM;AAC1B,eAAS,iBAAiB,UAAU,CAAC,MAAqB;AACxD,cAAM,SAA2B,EAAE;AACnC,YAAI,kBAAkB,kBAAkB;AAKtC,iBAAM,cAAc,MAAM;AAAA,QAC5B;AAAA,MACF,CAAC;AAED,eAAS,iBAAiB,SAAS,CAAC,MAAqB;AACvD,cAAM,SAA2B,EAAE;AAEnC,YAAI,kBAAkB,oBAAoB,CAAC,SAAS,UAAU,EAAE,SAAS,OAAO,IAAI,GAAG;AAErF,cAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,GAAG;AAClC,mBAAO,UAAU,IAAI,QAAQ;AAC7B,mBAAO,iBAAiB,QAAQ,MAAM,OAAO,UAAU,OAAO,QAAQ,GAAG;AAAA,cACvE,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AAED,eAAS,iBAAiB,sBAAsB,EAAE,QAAQ,CAAC,aAAkC;AAC3F,eAAM,aAAa,QAAQ;AAAA,MAC7B,CAAC;AAGD,eACG,iBAAiB,gCAAgC,EACjD,QAAQ,CAAC,cAAgC;AACxC,eAAM,kBAAkB,SAAS;AAAA,MACnC,CAAC;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aAAa,UAA+B;AAEjD,aAAS,aAAa,mBAAmB,SAAS,sBAAsB,EAAE,OAAO,SAAS,CAAC;AAC3F,WAAM,mBAAmB,QAAQ;AAIjC,aAAS,iBAAiB,SAAS,CAAC,MAAM,OAAM,mBAAmB,EAAE,MAAM,CAAC;AAAA,EAC9E;AAAA,EAEA,OAAO,kBAAkB,WAA6B;AACpD,cAAU,iBAAiB,UAAU,MAAM;AACzC,YAAM,YAAY,UAAU,QAAQ,aAAa;AACjD,YAAM,YAA8B,UAAU,cAAc,iBAAiB;AAC7E,YAAM,QAAQ,UAAU;AACxB,YAAM,YAAY,CAAC;AACnB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,kBAAU,KAAK,MAAM,CAAC,EAAE,IAAI;AAAA,MAC9B;AACA,gBAAU,QAAQ,UAAU,KAAK,IAAI;AACrC,gBAAU;AAAA,QACR,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,MACzE;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC3HO,IAAM,QAAN,MAAM,OAAM;AAAA,EACjB,OAAe,QAAQ,IAAiB;AACtC,UAAM,MAAM,GAAG,sBAAsB;AACrC,UAAM,UAAU,SAAS;AACzB,WAAO;AAAA,MACL,KAAK,IAAI,MAAM,OAAO,cAAc,QAAQ;AAAA,MAC5C,MAAM,IAAI,OAAO,OAAO,cAAc,QAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,iBACL,eACA,WAA4B,MAC5B,QAAyB,MACnB;AACN,UAAM,aAAa,aAAa;AAChC,UAAM,WAAW;AACjB,QAAI,gBAAwB;AAC5B,UAAM,gBAAgB,SAAU,WAAmB;AACjD,UAAI,CAAC,gBAAgB;AACnB,yBAAiB;AAAA,MACnB;AACA,YAAM,QAAQ,YAAY;AAC1B,UAAI,QAAQ,UAAU;AACpB,cAAM,SAAU,QAAQ,YAAa,IAAI,QAAQ;AACjD,cAAM,SAAS,aACX,sBACA,aAAa,SAAS,CAAC,MAAM,SAAS,CAAC;AAC3C,cAAM,YAAY,QAAQ,OAAO,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,OAAO,IAAI,OAAO;AAClG,cAAM,OAAO,KAAK,SAAS;AAC3B,sBAAc,MAAM,kBAClB,qBACA,SACA,OACA,YACA,MACA,OACA,mBACA,OACA;AACF,yBAAiB,OAAO,sBAAsB,aAAa;AAAA,MAC7D,OAAO;AACL,sBAAc,MAAM,kBAAkB;AACtC,eAAO,qBAAqB,cAAc;AAAA,MAC5C;AAAA,IACF;AACA,qBAAiB,OAAO,sBAAsB,aAAa;AAAA,EAC7D;AAAA,EAEA,OAAO,OAAO;AACZ,UAAM,gBAAgB,MAAM;AAC1B,eAAS,KAAK,iBAAiB,SAAS,CAAC,MAAM;AAC7C,cAAM,UAAuB,EAAE;AAC/B,cAAM,KAAkB,QAAQ,QAAQ,eAAe;AACvD,YAAI,MAAM,GAAG,SAAS,OAAO,GAAG;AAC9B,gBAAM,aAAa,GAAG,UAAU,SAAS,cAAc;AACvD,gBAAM,SAAS,OAAM,QAAQ,EAAE;AAC/B,gBAAM,IAAI,EAAE,QAAQ,OAAO;AAC3B,gBAAM,IAAI,EAAE,QAAQ,OAAO;AAE3B,cAAI,QAAQ;AACZ,cAAI,GAAG,UAAU,SAAS,aAAa,EAAG,SAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAE3E,iBAAM,iBAAiB,IAAI,aAAa,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK;AAAA,QAChE;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC5DA,IAAMC,aAAyC;AAAA,EAC7C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAClB;AAOO,IAAM,uBAAN,MAAM,8BACH,UAEV;AAAA,EAME,YAAY,IAAiB,SAA+C;AAC1E,UAAM,IAAI,SAAS,qBAAoB;AAwEzC;AAAA;AAAA;AAAA,gBAAO,MAAY;AACjB,UAAI,KAAK,OAAQ;AACjB,WAAK,SAAS;AACd,WAAK,GAAG,UAAU,IAAI,QAAQ;AAC9B,WAAK,SAAS,aAAa,iBAAiB,MAAM;AAElD,eAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAC5D,eAAS,iBAAiB,WAAW,KAAK,sBAAsB;AAAA,IAClE;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAY;AAClB,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,SAAS;AACd,WAAK,GAAG,UAAU,OAAO,QAAQ;AACjC,WAAK,SAAS,aAAa,iBAAiB,OAAO;AACnD,eAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAC/D,eAAS,oBAAoB,WAAW,KAAK,sBAAsB;AAAA,IACrE;AAuBA,SAAQ,kBAAkB,CAAC,MAAkB;AAC3C,QAAE,gBAAgB;AAClB,WAAK,QAAQ;AAAA,IACf;AAEA,SAAQ,uBAAuB,CAAC,MAAqB;AACnD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,EAAE,QAAQ,KAAK;AACrD,UAAE,eAAe;AACjB,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAEA,SAAQ,yBAAyB,CAAC,MAAqB;AACrD,UAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,EAAG,MAAK,MAAM;AAAA,IACjD;AAEA,SAAQ,uBAAuB,CAAC,MAAkB;AAChD,YAAM,SAAS,EAAE;AACjB,UAAI,EAAE,kBAAkB,SAAS,KAAK,GAAG,SAAS,MAAM,EAAG;AAC3D,WAAK,MAAM;AAAA,IACb;AAtIE,SAAK,GAAG,iCAAiC,IAAI;AAE7C,UAAM,aAAa,KAAK,oBAAoB;AAC5C,UAAM,UAAU,GAAG,UAAU,SAAS,SAAS,KAAK,QAAQ,mBAAmB;AAC/E,UAAM,gBACJ,GAAG,UAAU,SAAS,iBAAiB,KAAK,QAAQ,iBAAiB;AAEvE,SAAK,UAAU;AAAA,MACb,GAAG,sBAAqB;AAAA,MACxB,GAAG;AAAA,MACH,WAAW,QAAQ,aAAa,cAAc,sBAAqB,SAAS;AAAA,MAC5E,cAAc,CAAC;AAAA,MACf,gBAAgB;AAAA,IAClB;AAEA,SAAK,SAAS;AACd,SAAK,UAAU,KAAK,GAAG,cAAc,6BAA6B;AAClE,SAAK,QAAQ,KAAK,GAAG,cAAc,UAAU;AAE7C,SAAK,GAAG,UAAU,IAAI,aAAa,KAAK,QAAQ,SAAS,EAAE;AAC3D,QAAI,cAAe,MAAK,GAAG,UAAU,IAAI,iBAAiB;AAC1D,QAAI,QAAS,MAAK,GAAG,UAAU,IAAI,SAAS;AAE5C,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,aAAa,iBAAiB,MAAM;AACjD,WAAK,QAAQ,aAAa,iBAAiB,OAAO;AAClD,UACE,KAAK,mBAAmB,qBACxB,CAAC,KAAK,QAAQ,aAAa,MAAM,KACjC,KAAK,QAAQ,WAAW,GACxB;AACA,aAAK,QAAQ,WAAW;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,KAAK,MAAO,MAAK,MAAM,aAAa,QAAQ,MAAM;AAEtD,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA,EAUA,OAAO,KACL,KACA,UAAgD,CAAC,GACF;AAC/C,WAAO,MAAM,KAAK,KAAK,SAAS,qBAAoB;AAAA,EACtD;AAAA,EAEA,OAAO,YAAY,IAAuC;AACxD,WAAO,GAAG,iCAAiC;AAAA,EAC7C;AAAA,EAEA,UAAU;AACR,SAAK,MAAM;AACX,SAAK,qBAAqB;AAC1B,SAAK,GAAG,iCAAiC,IAAI;AAAA,EAC/C;AAAA,EA2BQ,sBAAuE;AAC7E,UAAM,QAAQ,CAAC,GAAG,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,YAAY,CAAC;AAC3E,UAAM,QAAQ,OAAO,MAAM,aAAa,MAAM;AAC9C,QAAI,UAAU,SAAS,UAAU,WAAW,UAAU,YAAY,UAAU,QAAQ;AAClF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe;AACtD,QAAI,KAAK,mBAAmB,qBAAqB,CAAC,KAAK,QAAQ,aAAa,MAAM,GAAG;AACnF,WAAK,QAAQ,iBAAiB,WAAW,KAAK,oBAAoB;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe;AACzD,SAAK,SAAS,oBAAoB,WAAW,KAAK,oBAAoB;AAAA,EACxE;AAAA,EAwBQ,UAAU;AAChB,QAAI,KAAK,OAAQ,MAAK,MAAM;AAAA,QACvB,MAAK,KAAK;AAAA,EACjB;AACF;;;ACpIA,IAAMC,aAA6B;AAAA,EACjC,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,IAAM,YAAN,MAAM,kBAAiB,UAA2B;AAAA,EA2CvD,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AAvB7B,kBAAiB;AAMjB,SAAQ,iBAA0B;AAClC,SAAQ,WAA+B;AACvC,SAAQ,gBAAyB;AACjC,SAAQ,YAAoB;AAC5B,SAAQ,WAAoB;AAwM5B,kCAAyB,MAAM,SAAS,MAAM,KAAK,cAAc,GAAG,GAAG;AAEvE,8BAAqB,CAAC,MAAoB;AACxC,UAAI,EAAE,gBAAgB,WAAW,EAAE,WAAW,EAAG;AACjD,UAAI,EAAE,kBAAkB,eAAe,EAAE,OAAO,YAAY,OAAO;AACjE,UAAE,eAAe;AAAA,MACnB;AACA,WAAK,UAAU;AACf,WAAK,UAAU;AACf,WAAK,kBAAkB;AACvB,WAAK,YAAY,EAAE;AACnB,WAAK,aAAa,EAAE;AACpB,WAAK,WAAW,KAAK,YAAY;AACjC,WAAK,QAAQ,KAAK;AAClB,WAAK,YAAY,KAAK,IAAI;AAC1B,UAAI;AACF,aAAK,GAAG,kBAAkB,EAAE,SAAS;AAAA,MACvC,QAAQ;AAAA,MAER;AACA,UAAI,KAAK,cAAc,KAAM,sBAAqB,KAAK,SAAS;AAChE,YAAM,OAAO,MAAM;AACjB,aAAK,OAAO;AACZ,YAAI,KAAK,QAAS,MAAK,YAAY,sBAAsB,IAAI;AAAA,YACxD,MAAK,YAAY;AAAA,MACxB;AACA,WAAK,YAAY,sBAAsB,IAAI;AAAA,IAC7C;AAEA,+BAAsB,CAAC,MAAoB;AACzC,UAAI,CAAC,KAAK,QAAS;AACnB,YAAM,QAAQ,KAAK,YAAY,EAAE;AACjC,YAAM,SAAS,KAAK,IAAI,KAAK,aAAa,EAAE,OAAO;AACnD,UAAI,SAAS,MAAM,CAAC,KAAK,iBAAiB;AACxC,YAAI,QAAQ,KAAK,QAAQ,IAAI;AAC3B,eAAK,UAAU;AACf,eAAK,YAAY,EAAE;AACnB,eAAK,QAAQ,KAAK,SAAS,KAAK;AAAA,QAClC;AAAA,MACF,WAAW,KAAK,SAAS;AACvB,UAAE,eAAe;AAAA,MACnB,OAAO;AACL,aAAK,kBAAkB;AAAA,MACzB;AACA,UAAI,KAAK,QAAS,GAAE,eAAe;AAAA,IACrC;AAEA,kCAAyB,CAAC,MAAoB;AAC5C,UAAI,CAAC,KAAK,QAAS;AACnB,WAAK,UAAU;AACf,UAAI,KAAK,cAAc,MAAM;AAC3B,6BAAqB,KAAK,SAAS;AACnC,aAAK,YAAY;AAAA,MACnB;AACA,UAAI;AACF,aAAK,GAAG,sBAAsB,EAAE,SAAS;AAAA,MAC3C,QAAQ;AAAA,MAER;AACA,WAAK,SAAS,KAAK;AACnB,UAAI,KAAK,WAAW,MAAM,KAAK,WAAW,KAAK;AAC7C,aAAK,YAAY,MAAM,KAAK;AAC5B,aAAK,SAAS,KAAK,SAAS,KAAK;AAAA,MACnC;AACA,WAAK,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG,IAAI,KAAK;AACxD,UAAI,KAAK,QAAQ;AACf,YAAI,KAAK,UAAU,KAAK,OAAO,KAAK,QAAQ,IAAI;AAC9C,eAAK,SAAS,KAAK,OAAO,KAAK,QAAQ;AAAA,QACzC,WAAW,KAAK,SAAS,GAAG;AAC1B,eAAK,SAAS;AAAA,QAChB;AAAA,MACF;AACA,WAAK,YAAY,KAAK,SAAS,KAAK;AACpC,WAAK,YAAY,KAAK,IAAI;AAC1B,4BAAsB,KAAK,WAAW;AACtC,UAAI,KAAK,QAAS,GAAE,eAAe;AAAA,IACrC;AAEA,gCAAuB,CAAC,MAAkB;AACxC,UAAI,KAAK,SAAS;AAChB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB;AAAA,MACF;AACA,YAAM,cAAe,EAAE,OAAuB,QAAQ,gBAAgB;AACtE,UAAI,CAAC,eAAe,CAAC,KAAK,GAAG,SAAS,WAAW,EAAG;AACpD,YAAM,eAAe,KAAK,OAAO,QAAQ,WAA0B;AACnE,YAAM,OAAO,KAAK,MAAM,KAAK,MAAM,IAAI;AACvC,UAAI,SAAS,GAAG;AACd,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAAA,MACpB;AACA,UAAI,eAAe,GAAG;AACpB,YAAI,EAAE,UAAW,EAAE,OAAuB,sBAAsB,EAAE,OAAO,KAAK,GAAG,cAAc,GAAG;AAChG,eAAK,KAAK;AAAA,QACZ,OAAO;AACL,eAAK,KAAK;AAAA,QACZ;AAAA,MACF,OAAO;AACL,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACF;AAEA,iCAAwB,CAAC,MAAa;AACpC,QAAE,gBAAgB;AAClB,YAAM,YAAa,EAAE,OAAuB,QAAQ,iBAAiB;AACrE,UAAI,CAAC,aAAa,CAAC,KAAK,YAAY,SAAS,SAAS,EAAG;AACzD,YAAM,QAAQ,CAAC,GAAG,KAAK,YAAY,QAAQ,EAAE,QAAQ,SAAS;AAC9D,UAAI,QAAQ,EAAG;AACf,WAAK,SAAS,KAAK;AAAA,IACrB;AAEA,0BAAiB,CAAC,MAAqB;AACrC,YAAM,SAAS,EAAE;AACjB,UAAI,OAAO,QAAQ,mDAAmD,EAAG;AACzE,UAAI,MAAM,KAAK,YAAY,SAAS,EAAE,GAAG,GAAG;AAC1C,UAAE,eAAe;AACjB,aAAK,KAAK;AAAA,MACZ,WAAW,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,GAAG;AAChD,UAAE,eAAe;AACjB,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,6BAAoB,MAAM;AACxB,UAAI,KAAK,cAAe;AACxB,YAAM,QAAQ,KAAK,cAAc;AACjC,UAAI,UAAU,KAAK,OAAQ,MAAK,YAAY,OAAO,KAAK,OAAO;AAAA,IACjE;AAEA,yBAAgB,MAAM;AACpB,UAAI,CAAC,KAAK,OAAO,OAAQ;AACzB,UAAI,KAAK,OAAO;AACd,aAAK,eAAe,KAAK,QAAQ,KAAK;AACtC;AAAA,MACF;AACA,UAAI,KAAK,QAAQ,WAAW;AAC1B,cAAM,YAAY,KAAK,OAAO,CAAC;AAC/B,YAAI,CAAC,UAAW;AAChB,aAAK,YAAY,UAAU;AAC3B,aAAK,MAAM,KAAK,YAAY,IAAI,KAAK,QAAQ;AAC7C,aAAK,SAAS,KAAK,SAAS,IAAI,KAAK;AACrC,aAAK,SAAS,KAAK;AAAA,MACrB,OAAO;AACL,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAgBA,kBAAS,MAAM;AACb,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,UAAU,MAAM,KAAK;AAC3B,YAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,YAAM,IAAK,MAAO,SAAU,IAAI;AAChC,WAAK,YAAY;AACjB,WAAK,QAAQ,KAAK;AAClB,WAAK,WAAW,MAAM,IAAI,MAAM,KAAK;AAAA,IACvC;AAEA,uBAAc,MAAM;AAClB,UAAI,CAAC,KAAK,UAAW;AACrB,YAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,YAAM,QAAQ,KAAK,YAAY,KAAK,IAAI,CAAC,UAAU,KAAK,QAAQ,QAAQ;AACxE,UAAI,QAAQ,KAAK,QAAQ,IAAI;AAC3B,aAAK,QAAQ,KAAK,SAAS,KAAK;AAChC,8BAAsB,KAAK,WAAW;AAAA,MACxC,OAAO;AACL,aAAK,QAAQ,KAAK,MAAM;AAAA,MAC1B;AAAA,IACF;AAhXE,SAAK,GAAG,qBAAqB,IAAI;AAEjC,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,SAAK,QACH,KAAK,QAAQ,aACb,KAAK,GAAG,UAAU,SAAS,MAAM,KACjC,KAAK,GAAG,UAAU,SAAS,iBAAiB;AAC9C,QAAI,KAAK,OAAO;AACd,WAAK,GAAG,UAAU,IAAI,MAAM;AAC5B,WAAK,QAAQ,YAAY;AACzB,WAAK,QAAQ,OAAO;AAAA,IACtB;AAEA,QAAI,OAAO,WAAW,kCAAkC,EAAE,SAAS;AACjE,WAAK,QAAQ,WAAW;AACxB,UAAI,CAAC,KAAK,MAAO,MAAK,QAAQ,OAAO;AAAA,IACvC;AAEA,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,SAAS,KAAK,SAAS;AAC5B,SAAK,SAAS,KAAK,cAAc;AACjC,QAAI,CAAC,KAAK,OAAO,QAAQ;AACvB,cAAQ,MAAM,8CAA8C;AAC5D;AAAA,IACF;AAEA,SAAK,oBAAoB,KAAK,OAAO,SAAS;AAC9C,SAAK,iBAAiB,KAAK,QAAQ,cAAc,KAAK;AACtD,SAAK,SAAS,KAAK,QAAQ,UAAU,CAAC,KAAK,qBAAqB,KAAK;AACrE,SAAK,QAAQ,KAAK,OAAO;AACzB,SAAK,QAAQ,aAAa,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,UAAU;AAEtE,SAAK,OAAO,QAAQ,CAAC,SAAS,KAAK,UAAU,IAAI,eAAe,CAAC;AACjE,QAAI,KAAK,MAAO,MAAK,WAAW;AAEhC,UAAM,YAAY,KAAK,OAAO,CAAC;AAC/B,SAAK,YAAY,UAAU,eAAe,KAAK,GAAG,eAAe;AACjE,SAAK,aAAa,UAAU,gBAAgB,KAAK,GAAG,gBAAgB;AACpE,SAAK,MAAM,KAAK,YAAY,IAAI,KAAK,QAAQ,WAAW;AAExD,QAAI,KAAK,eAAgB,MAAK,iBAAiB;AAE/C,SAAK,GAAG,WAAW,KAAK,GAAG,YAAY,IAAI,KAAK,GAAG,WAAW;AAC9D,SAAK,GAAG,aAAa,wBAAwB,UAAU;AAEvD,SAAK,oBAAoB;AACzB,SAAK,WAAW;AAEhB,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,KAAK;AAAA,QACjB;AAAA,QACA,KAAK,OAAO,UAAU,CAACC,QAAOA,IAAG,UAAU,SAAS,QAAQ,CAAC;AAAA,MAC/D;AACA,WAAK,SAAS;AACd,WAAK,YAAY,OAAO,KAAK;AAC7B,WAAK,eAAe,OAAO,KAAK;AAAA,IAClC,OAAO;AACL,WAAK,QAAQ,KAAK,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EA5EA,IAAY,YAAyB;AACnC,WAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AAAA,EA4EA,WAAW,WAA4B;AACrC,WAAOD;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,SAAU,MAAK,UAAU;AAClC,SAAK,GAAG,qBAAqB,IAAI;AAAA,EACnC;AAAA,EAEQ,gBAA+B;AACrC,UAAM,WAAW,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE;AAAA,MAC5C,CAAC,OAA0B,cAAc,eAAe,GAAG,UAAU,SAAS,eAAe;AAAA,IAC/F;AACA,QAAI,SAAS,OAAQ,QAAO;AAC5B,WAAO,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,OAA0B;AACpE,UAAI,EAAE,cAAc,aAAc,QAAO;AACzC,UAAI,GAAG,UAAU,SAAS,YAAY,KAAK,GAAG,UAAU,SAAS,qBAAqB,GAAG;AACvF,eAAO;AAAA,MACT;AACA,aAAO,GAAG,YAAY;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB;AACzB,UAAM,WAAW,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE;AAAA,MAC5C,CAAC,OAA0B,cAAc,eAAe,GAAG,UAAU,SAAS,YAAY;AAAA,IAC5F;AACA,SAAK,cAAc,YAAY,SAAS,cAAc,KAAK;AAC3D,SAAK,iBAAiB,CAAC;AACvB,SAAK,YAAY,UAAU,IAAI,YAAY;AAC3C,SAAK,YAAY,aAAa,cAAc,QAAQ;AACpD,SAAK,YAAY,gBAAgB;AAEjC,SAAK,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC5B,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,UAAU,IAAI,gBAAgB;AACrC,UAAI,MAAM,GAAG;AACX,eAAO,UAAU,IAAI,QAAQ;AAC7B,eAAO,aAAa,gBAAgB,MAAM;AAAA,MAC5C;AACA,aAAO,aAAa,cAAc,SAAS,IAAI,CAAC,EAAE;AAClD,WAAK,YAAY,YAAY,MAAM;AAAA,IACrC,CAAC;AAED,QAAI,KAAK,eAAgB,MAAK,GAAG,YAAY,KAAK,WAAW;AAC7D,QAAI,KAAK,OAAO;AACd,WAAK,GAAG,cAAc,sBAAsB,GAAG,UAAU,IAAI,iBAAiB;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,WAAW,KAAK,cAAc;AACvD,QAAI,KAAK,kBAAkB,KAAK,aAAa;AAC3C,WAAK,YAAY,iBAAiB,SAAS,KAAK,qBAAqB;AAAA,IACvE;AACA,cAAS,MAAM,IAAI,IAAI;AACvB,QAAI,CAAC,UAAS,kBAAkB;AAC9B,aAAO,iBAAiB,UAAU,UAAS,WAAW,EAAE,SAAS,KAAK,CAAC;AACvE,gBAAS,mBAAmB;AAAA,IAC9B;AAEA,QAAI,KAAK,OAAO;AACd,WAAK,UAAU,iBAAiB,UAAU,KAAK,mBAAmB,EAAE,SAAS,KAAK,CAAC;AACnF;AAAA,IACF;AAEA,SAAK,GAAG,iBAAiB,eAAe,KAAK,kBAAkB;AAC/D,SAAK,GAAG,iBAAiB,eAAe,KAAK,mBAAmB;AAChE,SAAK,GAAG,iBAAiB,aAAa,KAAK,sBAAsB;AACjE,SAAK,GAAG,iBAAiB,iBAAiB,KAAK,sBAAsB;AACrE,SAAK,GAAG,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,EAC7D;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,WAAW,KAAK,cAAc;AAC1D,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,oBAAoB,SAAS,KAAK,qBAAqB;AAAA,IAC1E;AACA,SAAK,UAAU,oBAAoB,UAAU,KAAK,iBAAiB;AACnE,SAAK,GAAG,oBAAoB,eAAe,KAAK,kBAAkB;AAClE,SAAK,GAAG,oBAAoB,eAAe,KAAK,mBAAmB;AACnE,SAAK,GAAG,oBAAoB,aAAa,KAAK,sBAAsB;AACpE,SAAK,GAAG,oBAAoB,iBAAiB,KAAK,sBAAsB;AACxE,SAAK,GAAG,oBAAoB,SAAS,KAAK,oBAAoB;AAE9D,cAAS,MAAM,OAAO,IAAI;AAC1B,QAAI,UAAS,MAAM,SAAS,KAAK,UAAS,kBAAkB;AAC1D,aAAO,oBAAoB,UAAU,UAAS,SAAS;AACvD,gBAAS,mBAAmB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,YAAY;AAClB,SAAK,qBAAqB;AAC1B,QAAI,KAAK,cAAc,KAAM,sBAAqB,KAAK,SAAS;AAChE,WAAO,aAAa,KAAK,gBAAgB;AACzC,QAAI,KAAK,eAAgB,MAAK,aAAa,OAAO;AAClD,SAAK,aAAa;AAClB,SAAK,OAAO,QAAQ,CAAC,OAAO;AAC1B,SAAG,MAAM,YAAY;AACrB,SAAG,MAAM,SAAS;AAClB,SAAG,MAAM,UAAU;AACnB,SAAG,MAAM,aAAa;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAsJA,MAAM,GAA2C;AAC/C,QAAI,aAAa,EAAG,QAAO,EAAE;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,GAA2C;AAC/C,QAAI,aAAa,EAAG,QAAO,EAAE;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,GAAW;AACf,WAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,KAAK,QAAS,IAAI,KAAK,KAAM,IAAI;AAAA,EAChG;AAAA,EAwBA,QAAQ,IAAY,GAAG;AACrB,QAAI,CAAC,KAAK,GAAG,UAAU,SAAS,WAAW,GAAG;AAC5C,WAAK,GAAG,UAAU,IAAI,WAAW;AAAA,IACnC;AACA,WAAO,aAAa,KAAK,gBAAgB;AACzC,SAAK,mBAAmB,WAAW,MAAM;AACvC,WAAK,GAAG,UAAU,OAAO,WAAW;AAAA,IACtC,GAAG,KAAK,QAAQ,QAAQ;AAExB,SAAK,SAAS,OAAO,MAAM,WAAW,IAAI,KAAK;AAC/C,SAAK,SAAS,KAAK,OAAO,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,GAAG;AAEhE,UAAM,OAAO,KAAK,SAAS;AAC3B,UAAM,QAAQ,KAAK,SAAS,KAAK,SAAS,KAAK;AAC/C,UAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,UAAM,QAAS,CAAC,MAAM,QAAQ,IAAK,KAAK;AACxC,UAAM,aAAa,KAAK;AACxB,UAAM,mBAAmB,IAAI,KAAK,QAAQ;AAE1C,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAY;AACZ,6BAAuB;AAAA,IACzB,OAAO;AACL,kBAAY,iBAAiB,KAAK,GAAG,cAAc,KAAK,aAAa,IAAI;AACzE,mBAAa,iBAAiB,KAAK,GAAG,eAAe,KAAK,cAAc,IAAI;AAC5E,6BAAuB,IAAI,mBAAmB;AAAA,IAChD;AAEA,SAAK,iBAAiB,KAAK,MAAM;AAEjC,QAAI,CAAC,KAAK,UAAW,KAAK,UAAU,KAAK,KAAK,SAAS,KAAK,OAAQ;AAClE,YAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,MAAM,CAAC;AAC9C,UAAI,MAAM,CAAC,GAAG,UAAU,SAAS,QAAQ,GAAG;AAC1C,aAAK,GAAG,cAAc,uBAAuB,GAAG,UAAU,OAAO,QAAQ;AACzE,WAAG,UAAU,IAAI,QAAQ;AAAA,MAC3B;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,KAAK,MAAM,EAAE,GAAG;AAC9B,UAAI;AACJ,UAAI;AACJ,UAAI,KAAK,QAAQ,WAAW;AAC1B,uBAAe,KAAK,QAAQ;AAC5B,yBAAiB,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AAAA,MACzD,OAAO;AACL,uBAAe,KAAK,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AACpD,yBAAiB,IAAI,oBAAoB,IAAI,IAAI,QAAQ;AAAA,MAC3D;AACA,UAAI,CAAC,KAAK,UAAU,KAAK,SAAS,IAAI,KAAK,OAAO;AAChD,cAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;AAClD,cAAM,kBAAkB,GAAG,SAAS,eAClC,KAAK,QAAQ,SAAS,KAAK,MAAM,IAAI,SAAS,CAChD,kBAAkB,YAAY;AAC9B,aAAK,iBAAiB,IAAI,gBAAgB,CAAC,GAAG,eAAe;AAAA,MAC/D;AACA,UAAI,KAAK,QAAQ,WAAW;AAC1B,uBAAe,KAAK,QAAQ;AAC5B,yBAAiB,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AAAA,MACzD,OAAO;AACL,uBAAe,KAAK,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AACpD,yBAAiB,IAAI,oBAAoB,IAAI,IAAI,QAAQ;AAAA,MAC3D;AACA,UAAI,CAAC,KAAK,UAAU,KAAK,SAAS,KAAK,GAAG;AACxC,cAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;AAClD,cAAM,kBAAkB,GAAG,SAAS,eAClC,CAAC,KAAK,QAAQ,SAAS,CAAC,KAAK,MAAM,IAAI,SAAS,CAClD,kBAAkB,YAAY;AAC9B,aAAK,iBAAiB,IAAI,gBAAgB,CAAC,GAAG,eAAe;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,UAAW,KAAK,UAAU,KAAK,KAAK,SAAS,KAAK,OAAQ;AAClE,YAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,MAAM,CAAC;AAC9C,YAAM,kBAAkB,GAAG,SAAS,eAAe,CAAC,QAAQ,CAAC,kBAC3D,MAAM,KAAK,QAAQ,QAAQ,KAC7B,kBAAkB,KAAK,QAAQ,OAAO,KAAK;AAC3C,WAAK,iBAAiB,IAAI,sBAAsB,GAAG,eAAe;AAAA,IACpE;AAEA,UAAM,WAAW,KAAK,OAAO,KAAK,MAAM,KAAK,MAAM,CAAC;AACpD,SAAK,UAAU,KAAK,MAAM,KAAK,MAAM,CAAC;AAEtC,QAAI,eAAe,KAAK,UAAU,OAAO,KAAK,QAAQ,cAAc,YAAY;AAC9E,WAAK,QAAQ,UAAU,KAAK,MAAM,UAAU,KAAK,OAAO;AAAA,IAC1D;AACA,QAAI,OAAO,KAAK,oBAAoB,YAAY;AAC9C,WAAK,gBAAgB,KAAK,MAAM,UAAU,KAAK,OAAO;AACtD,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,iBAAiB,IAAiB,SAAiB,QAAgB,WAAmB;AACpF,QAAI,CAAC,GAAI;AACT,OAAG,MAAM,YAAY;AACrB,OAAG,MAAM,SAAS,OAAO,SAAS;AAClC,OAAG,MAAM,UAAU,QAAQ,SAAS;AACpC,OAAG,MAAM,aAAa;AAAA,EACxB;AAAA,EAEQ,iBAAiB,QAAgB;AACvC,QAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,YAAa;AAC/C,UAAM,OAAQ,SAAS,KAAK,QAAS,KAAK,SAAS,KAAK;AACxD,SAAK,YAAY,iBAAiB,iBAAiB,EAAE,QAAQ,CAAC,IAAI,MAAM;AACtE,YAAM,KAAK,MAAM;AACjB,SAAG,UAAU,OAAO,UAAU,EAAE;AAChC,UAAI,GAAI,IAAG,aAAa,gBAAgB,MAAM;AAAA,UACzC,IAAG,gBAAgB,cAAc;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEQ,UAAU,OAAe;AAC/B,SAAK,OAAO,QAAQ,CAAC,IAAI,MAAM;AAC7B,UAAI,MAAM,MAAO,IAAG,gBAAgB,aAAa;AAAA,UAC5C,IAAG,aAAa,eAAe,MAAM;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,OAAe,SAAkB;AACnD,UAAM,OAAO,KAAK;AAClB,SAAK,SAAS;AACd,SAAK,OAAO,QAAQ,CAAC,IAAI,MAAM,GAAG,UAAU,OAAO,UAAU,MAAM,KAAK,CAAC;AACzE,SAAK,iBAAiB,KAAK;AAC3B,SAAK,UAAU,KAAK;AACpB,UAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,QAAI,SAAS,SAAS,OAAO,KAAK,QAAQ,cAAc,YAAY;AAClE,WAAK,QAAQ,UAAU,KAAK,MAAM,MAAM,OAAO;AAAA,IACjD;AACA,QAAI,OAAO,KAAK,oBAAoB,YAAY;AAC9C,WAAK,gBAAgB,KAAK,MAAM,MAAM,OAAO;AAC7C,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,SAAK,OAAO,CAAC,EAAE,OAAO,KAAK;AAC3B,SAAK,OAAO,QAAQ,CAAC,OAAO,MAAM,YAAY,EAAE,CAAC;AACjD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,eAAe;AACrB,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,OAAO,QAAQ,CAAC,OAAO,KAAK,GAAG,aAAa,IAAI,KAAK,QAAQ,CAAC;AACnE,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,gBAAwB;AAC9B,UAAM,OAAO,KAAK,UAAU;AAC5B,QAAI,OAAO;AACX,QAAI,WAAW;AACf,SAAK,OAAO,QAAQ,CAAC,IAAI,MAAM;AAC7B,YAAM,OAAO,KAAK,IAAI,GAAG,aAAa,IAAI;AAC1C,UAAI,OAAO,UAAU;AACnB,mBAAW;AACX,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,GAAW,SAAS,MAAM;AAC/C,UAAM,KAAK,KAAK,OAAO,CAAC;AACxB,QAAI,CAAC,GAAI;AACT,UAAM,OAAO,GAAG;AAChB,QAAI,KAAK,IAAI,KAAK,UAAU,aAAa,IAAI,IAAI,GAAG;AAClD,WAAK,YAAY,GAAG,KAAK;AACzB;AAAA,IACF;AACA,SAAK,gBAAgB;AACrB,SAAK,UAAU,SAAS,EAAE,MAAM,UAAU,SAAS,WAAW,OAAO,CAAC;AACtE,UAAM,OAAO,MAAM;AACjB,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,UAAU,iBAAiB,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AACjE,WAAO,WAAW,MAAM,KAAK,QAAQ,WAAW,GAAG;AAAA,EACrD;AAAA,EAEA,SAAS,GAAW,WAAyC,MAAM;AACjE,QAAI,KAAK,OAAO;AACd,UAAI,OAAO,aAAa,WAAY,MAAK,kBAAkB;AAC3D,WAAK,YAAY,GAAG,KAAK;AACzB,WAAK,eAAe,CAAC;AACrB;AAAA,IACF;AACA,QAAI,OAAQ,KAAK,SAAS,KAAK,QAAS;AACxC,QAAI,CAAC,KAAK,QAAQ;AAChB,UAAI,OAAO,GAAG;AACZ,YAAI,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG;AAChD,kBAAQ,KAAK;AAAA,QACf;AAAA,MACF,WAAW,OAAO,GAAG;AACnB,YAAI,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,MAAM;AACtC,kBAAQ,KAAK;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,SAAK,SAAS,KAAK,MAAM,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AAC1D,QAAI,OAAO,GAAG;AACZ,WAAK,UAAU,KAAK,MAAM,KAAK,IAAI,IAAI;AAAA,IACzC,WAAW,OAAO,GAAG;AACnB,WAAK,UAAU,KAAK,MAAM;AAAA,IAC5B;AACA,QAAI,OAAO,aAAa,YAAY;AAClC,WAAK,kBAAkB;AAAA,IACzB;AACA,QAAI,KAAK,WAAW,KAAK,QAAQ;AAC/B,WAAK,YAAY,KAAK,SAAS,KAAK;AACpC,WAAK,YAAY,KAAK,IAAI;AAC1B,4BAAsB,KAAK,WAAW;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,KAAK,IAAY,GAAG;AAClB,QAAI,MAAM,UAAa,MAAM,CAAC,EAAG,KAAI;AACrC,QAAI,QAAQ,KAAK,SAAS;AAC1B,QAAI,SAAS,KAAK,SAAS,QAAQ,GAAG;AACpC,UAAI,KAAK,OAAQ;AACjB,cAAQ,KAAK,MAAM,KAAK;AAAA,IAC1B;AACA,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEA,KAAK,IAAY,GAAG;AAClB,QAAI,MAAM,UAAa,MAAM,CAAC,EAAG,KAAI;AACrC,QAAI,QAAQ,KAAK,SAAS;AAC1B,QAAI,SAAS,KAAK,SAAS,QAAQ,GAAG;AACpC,UAAI,KAAK,OAAQ;AACjB,cAAQ,KAAK,MAAM,KAAK;AAAA,IAC1B;AACA,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEA,IAAI,GAAW,UAAyC;AACtD,QAAI,MAAM,UAAa,MAAM,CAAC,EAAG,KAAI;AACrC,QAAI,IAAI,KAAK,SAAS,IAAI,GAAG;AAC3B,UAAI,KAAK,OAAQ;AACjB,UAAI,KAAK,MAAM,CAAC;AAAA,IAClB;AACA,SAAK,SAAS,GAAG,QAAQ;AAAA,EAC3B;AACF;AAnpBa,UAqCI,QAAQ,oBAAI,IAAc;AArC9B,UAsCI,mBAAmB;AAtCvB,UAuCI,YAAY,MAAM,SAAS,MAAM;AAC9C,YAAS,MAAM,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;AACjD,GAAG,GAAG;AAzCD,IAAM,WAAN;;;AC7DP,IAAME,aAAY,OAAO,OAAO,CAAC,CAAC;AAI3B,IAAM,mBAAN,MAAM,0BAAyB,UAAkB;AAAA,EAStD,YAAY,IAA4C,SAA+B;AACrF,UAAM,IAAI,CAAC,GAAG,iBAAgB;AA+EhC,yBAAgB,MAAM;AACpB,YAAM,YAAY,SAAS,KAAK,GAAG,aAAa,WAAW,CAAC,GAC1D,eAAgB,KAAK,GAAwB,MAAM;AAErD,WAAK,gBAAgB,gBAAgB;AACrC,UAAI,gBAAgB,aAAa,SAAS;AAC1C,UAAI,WAAW;AACb,yBAAiB,MAAM;AACvB,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,UAAU,cAAc;AAAA,IAC/B;AAzFE,SAAK,GAAG,6BAA6B,IAAI;AAEzC,SAAK,UAAU;AAAA,MACb,GAAG,kBAAiB;AAAA,MACpB,GAAG;AAAA,IACL;AAEA,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAErB,SAAK,cAAc;AACnB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAgC,CAAC,GACM;AACvC,WAAO,MAAM,KAAK,KAAK,SAAS,iBAAgB;AAAA,EAClD;AAAA,EAEA,OAAO,YAAY,IAAoC;AACrD,WAAO,GAAG,6BAA6B;AAAA,EACzC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,GAAG,6BAA6B,IAAI;AACzC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAC1D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC5D;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAC7D,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC/D;AAAA,EAEA,gBAAgB;AACd,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,UAAU,IAAI,mBAAmB;AAChD,SAAK,UAAU,MAAM,QAAQ;AAC7B,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,UAAU,MAAM,SAAS;AAC9B,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAeA,iBAAiB;AACf,QAAI,KAAK,iBAAiB,KAAK,WAAW;AACxC,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,SAAS;AAAA,IACpC,WAAW,CAAC,KAAK,iBAAiB,CAAC,KAAK,WAAW;AACjD,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,OAAO;AAChC,WAAK,GAAG,UAAU,IAAI,SAAS;AAAA,IACjC;AAAA,EACF;AACF;;;AC1EA,IAAMC,aAAgC;AAAA,EACpC,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AACf;AAOO,IAAM,cAAN,MAAM,qBAAoB,UAA8B;AAAA,EAM7D,YAAY,IAAiB,SAAsC;AACjE,UAAM,IAAI,SAAS,YAAW;AANhC,SAAQ,SAAwB,CAAC;AAEjC,SAAQ,aAAuB,CAAC;AAChC,SAAQ,iBAAgC,CAAC;AAoEzC;AAAA;AAAA;AAAA;AAAA,gBAAO,CAAC,UAAkB;AACxB,YAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,UAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAG;AAEjC,UAAI,KAAK,QAAQ,WAAW;AAC1B,aAAK,OAAO,QAAQ,CAAC,OAAO,MAAM;AAChC,cAAI,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAG,MAAK,MAAM,CAAC;AAAA,QACtD,CAAC;AAAA,MACH;AAEA,WAAK,SAAS,MAAM,IAAI;AAAA,IAC1B;AAMA;AAAA;AAAA;AAAA;AAAA,iBAAQ,CAAC,UAAkB;AACzB,YAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,UAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,EAAG;AAClC,WAAK,SAAS,MAAM,KAAK;AAAA,IAC3B;AA4GA,SAAQ,eAAe,CAAC,MAAkB;AACxC,YAAM,SAAU,EAAE,OAAuB,QAAQ,qBAAqB;AACtE,UAAI,CAAC,UAAU,OAAO,QAAQ,cAAc,MAAM,KAAK,GAAI;AAC3D,UAAI,OAAO,QAAQ,SAAS,EAAG;AAE/B,YAAM,OAAO,OAAO,QAAQ,IAAI;AAChC,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,KAAK,OAAO,QAAQ,IAAmB;AACrD,UAAI,QAAQ,EAAG;AAEf,UAAI,KAAK,QAAQ,IAAmB,EAAG,MAAK,MAAM,KAAK;AAAA,UAClD,MAAK,KAAK,KAAK;AAAA,IACtB;AAEA,SAAQ,iBAAiB,CAAC,MAAqB;AAC7C,UAAI,CAAC,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,EAAE,QAAQ,IAAK;AACxD,YAAM,SAAU,EAAE,OAAuB,QAAQ,qBAAqB;AACtE,UAAI,CAAC,UAAU,OAAO,QAAQ,cAAc,MAAM,KAAK,GAAI;AAC3D,UAAI,OAAO,QAAQ,SAAS,EAAG;AAC/B,UAAI,OAAO,QAAQ,WAAW,EAAG;AAEjC,QAAE,eAAe;AACjB,YAAM,OAAO,OAAO,QAAQ,IAAI;AAChC,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,KAAK,OAAO,QAAQ,IAAmB;AACrD,UAAI,QAAQ,EAAG;AAEf,UAAI,KAAK,QAAQ,IAAmB,EAAG,MAAK,MAAM,KAAK;AAAA,UAClD,MAAK,KAAK,KAAK;AAAA,IACtB;AAEA,SAAQ,gBAAgB,CAAC,MAAa;AACpC,YAAM,OAAO,EAAE;AACf,UAAI,EAAE,gBAAgB,oBAAqB;AAC3C,UAAI,CAAC,KAAK,OAAO,SAAS,IAAI,EAAG;AACjC,WAAK,QAAQ,MAAM,KAAK,IAAI;AAAA,IAC9B;AArOE,SAAK,GAAG,wBAAwB,IAAI;AAEpC,UAAM,YACJ,QAAQ,cAAc,SAClB,QAAQ,YACR,CAAC,GAAG,UAAU,SAAS,YAAY;AAEzC,SAAK,UAAU;AAAA,MACb,GAAG,aAAY;AAAA,MACf,GAAG;AAAA,MACH;AAAA,IACF;AAEA,SAAK,aAAa,GAAG,KAAK,eAAe,GAAG,EAAE,KAAK,eAAe,MAAM,KAAK,CAAC;AAC9E,SAAK,SAAS,KAAK,cAAc;AACjC,SAAK,mBAAmB;AACxB,SAAK,YAAY;AACjB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA+B;AACxC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAuC,CAAC,GACX;AAC7B,WAAO,MAAM,KAAK,KAAK,SAAS,YAAW;AAAA,EAC7C;AAAA,EAEA,OAAO,YAAY,IAA8B;AAC/C,WAAO,GAAG,wBAAwB;AAAA,EACpC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,WAAW,QAAQ,CAAC,OAAO,aAAa,EAAE,CAAC;AAChD,SAAK,aAAa,CAAC;AACnB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,wBAAwB,IAAI;AAAA,EACtC;AAAA,EA6BQ,gBAA+B;AACrC,UAAM,UAAU,MAAM,KAAK,KAAK,GAAG,iBAAiB,kBAAkB,CAAC;AACvE,QAAI,QAAQ,OAAQ,QAAO;AAC3B,WAAO,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,IAAI;AAAA,EACtE;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,OAAO,QAAQ,CAAC,SAAS;AAC5B,YAAI,gBAAgB,sBAAsB,CAAC,KAAK,aAAa,MAAM,GAAG;AACpE,eAAK,aAAa,QAAQ,KAAK,UAAU;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,KAAK,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC;AAC9D,QAAI,KAAK,QAAQ,aAAa,OAAO,SAAS,GAAG;AAC/C,aAAO,MAAM,CAAC,EAAE,QAAQ,CAAC,SAAS;AAChC,YAAI,gBAAgB,mBAAoB,MAAK,OAAO;AAAA,YAC/C,MAAK,UAAU,OAAO,QAAQ;AAAA,MACrC,CAAC;AAAA,IACH;AAEA,SAAK,OAAO,QAAQ,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA,EACpD;AAAA,EAEQ,QAAQ,MAA4B;AAC1C,QAAI,gBAAgB,mBAAoB,QAAO,KAAK;AACpD,WAAO,KAAK,UAAU,SAAS,QAAQ;AAAA,EACzC;AAAA,EAEQ,SAAS,MAAmB,MAAe;AACjD,QAAI,gBAAgB,oBAAoB;AACtC,WAAK,OAAO;AACZ;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,IAAI;AACpC,SAAK,UAAU,IAAI;AACnB,SAAK,QAAQ,MAAM,IAAI;AAAA,EACzB;AAAA,EAEQ,UAAU,MAAuC;AACvD,QAAI,gBAAgB,oBAAoB;AACtC,aAAO,KAAK,cAAc,kBAAkB;AAAA,IAC9C;AACA,WAAO,KAAK,cAAc,8BAA8B;AAAA,EAC1D;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,OAAO,QAAQ,CAAC,SAAS;AAC5B,UAAI,EAAE,gBAAgB,oBAAqB;AAC3C,UAAI,KAAK,cAAc,4BAA4B,EAAG;AACtD,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,WAAK,YAAY;AACjB,YAAM,KAAK,KAAK,UAAU,EAAE,QAAQ,CAAC,SAAS;AAC5C,YAAI,gBAAgB,eAAe,KAAK,YAAY,UAAW;AAC/D,aAAK,YAAY,IAAI;AAAA,MACvB,CAAC;AACD,WAAK,YAAY,IAAI;AACrB,WAAK,eAAe,KAAK,IAAI;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,eAAe,QAAQ,CAAC,SAAS;AACpC,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,OAAQ;AACb,aAAO,KAAK,WAAY,QAAO,aAAa,KAAK,YAAY,IAAI;AACjE,WAAK,OAAO;AAAA,IACd,CAAC;AACD,SAAK,iBAAiB,CAAC;AAAA,EACzB;AAAA,EAEQ,QAAQ,MAAuC;AACrD,WAAO,KAAK,cAAc,4BAA4B;AAAA,EACxD;AAAA,EAEQ,UAAU,MAAmB;AACnC,QAAI,gBAAgB,mBAAoB;AACxC,UAAM,SAAS,KAAK,UAAU,IAAI;AAClC,UAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,QAAI,CAAC,OAAQ;AAEb,WAAO,aAAa,iBAAiB,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC;AAC/D,QAAI,MAAM;AACR,UAAI,CAAC,KAAK,GAAI,MAAK,KAAK,oBAAoB,MAAM,KAAK,CAAC;AACxD,aAAO,aAAa,iBAAiB,KAAK,EAAE;AAAA,IAC9C;AACA,QAAI,CAAC,OAAO,QAAQ,oBAAoB,GAAG;AACzC,aAAO,aAAa,QAAQ,QAAQ;AACpC,UAAI,OAAO,WAAW,EAAG,QAAO,WAAW;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,GAAG,iBAAiB,SAAS,KAAK,YAAY;AACnD,SAAK,GAAG,iBAAiB,WAAW,KAAK,cAAc;AACvD,SAAK,GAAG,iBAAiB,UAAU,KAAK,eAAe,IAAI;AAAA,EAC7D;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,GAAG,oBAAoB,SAAS,KAAK,YAAY;AACtD,SAAK,GAAG,oBAAoB,WAAW,KAAK,cAAc;AAC1D,SAAK,GAAG,oBAAoB,UAAU,KAAK,eAAe,IAAI;AAAA,EAChE;AAAA,EAwCQ,QAAQ,MAAmB,SAAkB;AACnD,UAAM,QAAQ,UAAU,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAChE,QAAI,OAAO,UAAU,WAAY,OAAM,KAAK,MAAM,IAAI;AAEtD,UAAM,MAAM,UAAU,KAAK,QAAQ,YAAY,KAAK,QAAQ;AAC5D,QAAI,OAAO,QAAQ,WAAY;AAE/B,UAAM,SAAS,KAAK,QAAQ,IAAI,KAAK;AACrC,QAAI,OAAO;AACX,UAAM,SAAS,MAAM;AACnB,UAAI,KAAM;AACV,aAAO;AACP,aAAO,oBAAoB,iBAAiB,KAAK;AACjD,UAAI,KAAK,MAAM,IAAI;AAAA,IACrB;AACA,UAAM,QAAQ,CAAC,OAAwB;AACrC,UAAI,GAAG,WAAW,OAAQ;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,iBAAiB,KAAK;AAC9C,SAAK,WAAW,KAAK,OAAO,WAAW,QAAQ,KAAK,YAAY,IAAI,EAAE,CAAC;AAAA,EACzE;AAAA,EAEQ,cAAsB;AAC5B,UAAM,MAAM,iBAAiB,KAAK,EAAE,EACjC,iBAAiB,gCAAgC,EACjD,KAAK;AACR,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,IAAI,SAAS,IAAI,EAAG,QAAO,WAAW,GAAG;AAC7C,QAAI,IAAI,SAAS,GAAG,EAAG,QAAO,WAAW,GAAG,IAAI;AAChD,UAAM,IAAI,WAAW,GAAG;AACxB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACF;;;AC5TA,IAAMC,cAA+B;AAAA,EACnC,SAAS;AAAA,EACT,iBAAiB,CAAC;AACpB;AAOO,IAAM,aAAN,MAAM,oBAAmB,UAA6B;AAAA,EAqB3D,YAAY,IAAuB,SAA4B;AAC7D,UAAM,IAAI,SAAS,WAAU;AA4F/B,+BAAsB,MAAM;AAC1B,WAAK,iBAAiB;AAAA,IACxB;AAIA;AAAA;AAAA,gCAAuB,CAAC,MAAqB;AAC3C,UAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAAS,MAAK,mBAAmB,CAAC;AAAA,IACnE;AAEA,8BAAqB,CAAC,MAAkC;AACtD,QAAE,eAAe;AACjB,YAAM,gBAAiB,EAAE,OAAyB,QAAQ,IAAI;AAC9D,WAAK,qBAAqB,aAAa;AACvC,QAAE,gBAAgB;AAAA,IACpB;AAsCA,6BAAoB,MAAM;AACxB,UAAI,KAAK,YAAY,KAAK,SAAS,QAAQ;AACzC,aAAK,iBAAiB;AACtB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AArJE,QAAI,KAAK,GAAG,UAAU,SAAS,iBAAiB,EAAG;AACnD,SAAK,GAAG,uBAAuB,IAAI;AAEnC,SAAK,UAAU;AAAA,MACb,GAAG,YAAW;AAAA,MACd,GAAG;AAAA,IACL;AAEA,SAAK,aAAa,KAAK,GAAG;AAC1B,SAAK,iBAAiB,KAAK,GAAG,YAAY;AAC1C,SAAK,GAAG,WAAW;AACnB,SAAK,UAAU,CAAC;AAChB,SAAK,eAAe;AACpB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA8B;AACvC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAsC,CAAC,GACZ;AAC3B,WAAO,MAAM,KAAK,KAAK,SAAS,WAAU;AAAA,EAC5C;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,uBAAuB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAI1B,SAAK,UAAU,QAAQ;AACvB,SAAK,gBAAgB;AACrB,SAAK,GAAG,uBAAuB,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,sBAAsB;AACpB,SAAK,gBAAgB,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AACzE,SAAG,iBAAiB,SAAS,KAAK,kBAAkB;AACpD,SAAG,iBAAiB,WAAW,KAAK,oBAAoB;AAAA,IAC1D,CAAC;AACD,SAAK,GAAG,iBAAiB,UAAU,KAAK,mBAAmB;AAC3D,SAAK,MAAM,iBAAiB,SAAS,KAAK,iBAAiB;AAAA,EAC7D;AAAA,EAEA,uBAAuB;AACrB,SAAK,gBAAgB,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AACzE,SAAG,oBAAoB,SAAS,KAAK,kBAAkB;AACvD,SAAG,oBAAoB,WAAW,KAAK,oBAAoB;AAAA,IAC7D,CAAC;AACD,SAAK,GAAG,oBAAoB,UAAU,KAAK,mBAAmB;AAC9D,SAAK,MAAM,oBAAoB,SAAS,KAAK,iBAAiB;AAAA,EAChE;AAAA,EAmBA,aAAmB,GAAQ,GAAc;AACvC,QAAI,MAAM,EAAG,QAAO;AACpB,QAAI,KAAK,QAAQ,KAAK,KAAM,QAAO;AACnC,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAG,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAC7D,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,eAA4B;AAC/C,QACE,CAAC,cAAc,UAAU,SAAS,UAAU,KAC5C,CAAC,cAAc,UAAU,SAAS,UAAU,GAC5C;AACA,YAAM,QAAQ,KAAK,QAAQ,KAAK,CAACC,WAAUA,OAAM,aAAa,aAAa;AAC3E,YAAM,yBAAyB,KAAK,kBAAkB;AACtD,UAAI,KAAK,YAAY;AAEnB,aAAK,sBAAsB,KAAK;AAAA,MAClC,OAAO;AAEL,aAAK,aAAa;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAEA,WAAK,iBAAiB;AAEtB,YAAM,uBAAuB,KAAK,kBAAkB;AACpD,YAAM,sBAAsB,CAAC,KAAK,aAAa,wBAAwB,oBAAoB;AAC3F,UAAI;AACF,aAAK,GAAG;AAAA,UACN,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,QACzE;AAAA,IACJ;AACA,QAAI,CAAC,KAAK,WAAY,MAAK,SAAS,MAAM;AAAA,EAC5C;AAAA,EASA,iBAAiB;AAIf,SAAK,UAAU,KAAK,GAAG,SAAS,CAAC,KAAK;AAEtC,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,UAAU,IAAI,kBAAkB,aAAa;AAC1D,QAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,WAAK,QAAQ,UAAU,IAAI,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,IAC/E;AACA,SAAK,GAAG,OAAO,KAAK,OAAO;AAG3B,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,UAAU,IAAI,aAAa;AACrC,SAAK,QAAQ,OAAO,SAAS;AAC7B,cAAU,YAAY,KAAK,EAAE;AAE7B,QAAI,KAAK,GAAG,SAAU,MAAK,QAAQ,UAAU,IAAI,UAAU;AAE3D,SAAK,gBACH,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;AAIzF,SAAK,kBAAkB,SAAS,cAAc,IAAI;AAClD,SAAK,gBAAgB,KAAK,kBAAkB,MAAM,KAAK,CAAC;AACxD,SAAK,gBAAgB,aAAa,WAAW,MAAM;AACnD,SAAK,gBAAgB,UAAU,IAAI,oBAAoB,iBAAiB;AACxE,SAAK,gBAAgB,aAAa,QAAQ,SAAS;AACnD,SAAK,gBAAgB,sBAAsB,KAAK,WAAW,SAAS;AACpE,QAAI,KAAK,WAAY,MAAK,gBAAgB,UAAU,IAAI,0BAA0B;AAGlF,QAAI,KAAK,cAAc,SAAS,GAAG;AACjC,WAAK,cAAc,QAAQ,CAAC,eAAe;AACzC,YAAI,WAAW,YAAY,UAAU;AAEnC,gBAAM,gBAAgB,KAAK;AAAA,YACzB;AAAA,YACA,KAAK,aAAa,aAAa;AAAA,UACjC;AACA,eAAK,mBAAmB,YAAiC,aAAa;AAAA,QACxE,WAAW,WAAW,YAAY,YAAY;AAE5C,gBAAM,UAAU,eAAe,MAAM,KAAK;AAC1C,gBAAM,cAAc,SAAS,cAAc,IAAI;AAC/C,sBAAY,UAAU,IAAI,UAAU;AACpC,sBAAY,WAAW;AACvB,sBAAY,aAAa,QAAQ,OAAO;AACxC,sBAAY,aAAa,mBAAmB,OAAO;AAInD,gBAAM,aAAa,SAAS,cAAc,MAAM;AAChD,qBAAW,KAAK;AAChB,qBAAW,aAAa,QAAQ,cAAc;AAC9C,qBAAW,cAAc,WAAW,aAAa,OAAO,KAAK;AAC7D,sBAAY,gBAAgB,UAAU;AACtC,eAAK,gBAAgB,OAAO,WAAW;AAEvC,gBAAM,gBAAgB,CAAC;AACvB,gBAAM,gBACJ,MAAM,KAAK,WAAW,QAAQ,EAAE,OAAO,CAAC,OAAO,GAAG,YAAY,QAAQ;AAExE,wBAAc,QAAQ,CAACC,gBAAe;AACpC,kBAAM,gBAAgB,KAAK;AAAA,cACzBA;AAAA,cACA;AAAA,YACF;AACA,kBAAM,UAAU,eAAe,MAAM,KAAK;AAC1C,0BAAc,KAAK;AACnB,0BAAc,KAAK,OAAO;AAC1B,iBAAK,mBAAmBA,aAAY,aAAa;AAAA,UACnD,CAAC;AACD,sBAAY,aAAa,aAAa,cAAc,KAAK,GAAG,CAAC;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH;AACA,SAAK,QAAQ,OAAO,KAAK,eAAe;AAGxC,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,KAAK,oBAAoB,MAAM,KAAK;AAC/C,SAAK,MAAM,UAAU,IAAI,mBAAmB,kBAAkB;AAC9D,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,aAAa,eAAe,KAAK,gBAAgB,EAAE;AAC9D,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,eAAe,KAAK,GAAG,aAAa,UAAU,EAAE,SAAS;AACpE,QAAI,KAAK,GAAG,SAAU,MAAK,MAAM,WAAW;AAC5C,SAAK,MAAM,aAAa,YAAY,KAAK,eAAe,SAAS,CAAC;AAElE,UAAM,QAAQ,KAAK,GAAG;AACtB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,KAAK,KAAK,WAAW,OAAO,EAAG,MAAK,MAAM,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAClF;AAGA,SAAK,MAAM,aAAa,QAAQ,UAAU;AAC1C,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,aAAa,aAAa,KAAK,gBAAgB,EAAE;AAC5D,SAAK,MAAM,aAAa,iBAAiB,KAAK,gBAAgB,EAAE;AAChE,SAAK,MAAM,cAAc;AAEzB,SAAK,QAAQ,QAAQ,KAAK,KAAK;AAC/B,SAAK,iBAAiB;AAGtB,UAAM,eAAe,SAAS,gBAAgB,8BAA8B,KAAK;AACjF,iBAAa,UAAU,IAAI,OAAO;AAClC,iBAAa,aAAa,UAAU,IAAI;AACxC,iBAAa,aAAa,SAAS,IAAI;AACvC,iBAAa,aAAa,WAAW,WAAW;AAChD,iBAAa,aAAa;AAC1B,iBAAa,YAAY;AACzB,SAAK,QAAQ,QAAQ,YAAY;AAGjC,QAAI,CAAC,KAAK,GAAG,UAAU;AACrB,YAAM,kBAAkB,EAAE,GAAG,KAAK,QAAQ,gBAAgB;AAC1D,sBAAgB,eAAe;AAC/B,YAAM,gBAAgB,gBAAgB;AACtC,YAAM,iBAAiB,gBAAgB;AAEvC,sBAAgB,YAAY,MAAM;AAChC,cAAM,iBAAiB,KAAK,gBAAgB,cAAc,WAAW;AACrE,YAAI,gBAAgB;AAElB,gBAAM,UAAU;AAChB,eAAK,SAAS,eAAe,CAAC,GAAG,eAAe,WAAW,QAAQ,EAAE;AAAA,YACnE;AAAA,UACF;AACA,eAAK,SAAS,kBAAkB;AAChC,gBAAM,UAAU;AAEhB,cAAI,KAAK,SAAS,cAAc;AAC9B,gBAAI,eACF,eAAe,sBAAsB,EAAE,MACtC,KAAK,gBAAgC,sBAAsB,EAAE;AAChE,4BAAgB,KAAK,gBAAgB,eAAe;AACpD,iBAAK,gBAAgB,YAAY;AAAA,UACnC;AAAA,QACF;AACA,aAAK,MAAM,eAAe;AAE1B,YAAI,iBAAiB,OAAO,kBAAkB;AAC5C,wBAAc,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,MAC7C;AAEA,sBAAgB,aAAa,MAAM;AACjC,aAAK,MAAM,eAAe;AAE1B,YAAI,kBAAkB,OAAO,mBAAmB;AAC9C,yBAAe,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,MAC9C;AAEA,sBAAgB,eAAe;AAC/B,WAAK,WAAW,SAAS,KAAK,KAAK,OAAO,eAAe;AAAA,IAC3D;AAEA,SAAK,mBAAmB;AAExB,QAAI,KAAK,QAAS,MAAK,MAAM,MAAM,KAAK,OAAO;AAAA,EACjD;AAAA,EAEA,mBAAmB,YAA+B,eAA4B;AAC5E,SAAK,QAAQ,KAAK,EAAE,IAAI,YAAY,UAAU,cAAc,CAAC;AAAA,EAC/D;AAAA,EAEA,kBAAkB;AAChB,SAAK,QAAQ,cAAc,QAAQ,EAAE,OAAO;AAC5C,SAAK,MAAM,OAAO;AAClB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,QAAQ,OAAO,KAAK,EAAE;AAC3B,SAAK,QAAQ,OAAO;AAAA,EACtB;AAAA,EAEA,+BACE,YACA,MACA;AACA,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,aAAa,QAAQ,QAAQ;AAChC,QAAI,WAAW,UAAU;AACvB,SAAG,UAAU,IAAI,UAAU;AAC3B,SAAG,eAAe;AAAA,IACpB;AACA,QAAI,SAAS,kBAAmB,IAAG,UAAU,IAAI,IAAI;AAKrD,UAAM,aAAa,WAAW;AAC9B,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAI,KAAK,cAAc,CAAC,WAAW,UAAU;AAC3C,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,eAAS,OAAO;AAChB,YAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,gBAAU,cAAc;AACxB,YAAM,OAAO,UAAU,SAAS;AAChC,WAAK,YAAY,KAAK;AAAA,IACxB,OAAO;AACL,WAAK,cAAc;AAAA,IACrB;AACA,OAAG,YAAY,IAAI;AAGnB,UAAM,UAAU,WAAW,aAAa,WAAW;AAGnD,UAAM,UAAU,WAAW,aAAa,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3E,QAAI,SAAS;AACX,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,SAAS,OAAQ,KAAI,UAAU,IAAI,GAAG,OAAO;AACjD,UAAI,MAAM;AACV,UAAI,aAAa;AACjB,SAAG,QAAQ,GAAG;AAAA,IAChB;AAEA,SAAK,gBAAgB,OAAO,EAAE;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,OAAoB;AAC/B,UAAM,GAAG,WAAW;AACpB,UAAM,SAAS,UAAU,IAAI,UAAU;AACvC,UAAM,SAAS,eAAe;AAC9B,UAAM,WAA6B,MAAM,SAAS,cAAc,wBAAwB;AACxF,QAAI,SAAU,UAAS,UAAU;AAAA,EACnC;AAAA,EAEA,eAAe,OAAoB;AACjC,UAAM,GAAG,WAAW;AACpB,UAAM,SAAS,UAAU,OAAO,UAAU;AAC1C,UAAM,SAAS,eAAe;AAC9B,UAAM,WAA6B,MAAM,SAAS,cAAc,wBAAwB;AACxF,QAAI,SAAU,UAAS,UAAU;AAAA,EACnC;AAAA,EAEA,eAAe;AACb,SAAK,QAAQ,QAAQ,CAAC,UAAU,KAAK,eAAe,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,iBAAiB,OAAoB;AACnC,UAAM,aAAa,KAAK,kBAAkB;AAC1C,WAAO,WAAW,KAAK,CAAC,cAAc,cAAc,MAAM,GAAG,KAAK;AAAA,EACpE;AAAA,EAEA,sBAAsB,OAAoB;AACxC,QAAI,KAAK,iBAAiB,KAAK,EAAG,MAAK,eAAe,KAAK;AAAA,QACtD,MAAK,aAAa,KAAK;AAAA,EAC9B;AAAA,EAEA,sBAA2C;AAEzC,WAAO,MAAM,UAAU,OAAO;AAAA,MAC5B,KAAK,GAAG;AAAA,MACR,CAAC,eAAkC;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,UAAM,sBAAsB,KAAK,oBAAoB;AACrD,UAAM,sBAAsB,KAAK,QAAQ;AAAA,MACvC,CAAC,UAAU,oBAAoB,QAAQ,MAAM,EAAE,KAAK;AAAA,IACtD;AAEA,UAAM,yBAAyB,oBAAoB,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,QAAQ;AAGjF,UAAM,QAAQ,uBAAuB;AAAA,MAAI,CAAC,UACxC,MAAM,SAAS,cAAc,MAAM,EAAE,YAAY,KAAK;AAAA,IACxD;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,sBAAyC,KAAK,GAAG,cAAc,iBAAiB;AACtF,UAAI,uBAAuB,oBAAoB,UAAU,IAAI;AAC3D,aAAK,MAAM,QAAQ,oBAAoB;AACvC;AAAA,MACF;AAAA,IACF;AACA,SAAK,MAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,qBAAqB;AACnB,SAAK,QAAQ,QAAQ,CAAC,UAAU;AAC9B,YAAM,mBAAmB,MAAM,GAAG;AAClC,YAAM,KAAuB,MAAM,SAAS,cAAc,wBAAwB;AAClF,UAAI,GAAI,IAAG,UAAU;AACrB,UAAI,kBAAkB;AACpB,aAAK,gBAAgB,KAAK,iBAAiB,MAAM,QAAQ;AAAA,MAC3D,OAAO;AACL,cAAM,SAAS,UAAU,OAAO,UAAU;AAC1C,cAAM,SAAS,eAAe;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,IAAiB,IAAiB;AAChD,QAAI,CAAC,GAAI;AACT,QAAI,CAAC,KAAK;AACR,SAAG,iBAAiB,aAAa,EAAE,QAAQ,CAACC,QAAOA,IAAG,UAAU,OAAO,UAAU,CAAC;AACpF,OAAG,UAAU,IAAI,UAAU;AAC3B,OAAG,eAAe;AAAA,EACpB;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,oBAAoB,EAAE,IAAI,CAAC,eAAe,WAAW,KAAK;AAAA,EACxE;AACF;;;AC7eA,IAAMC,cAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,sBAAN,MAAM,qBAAoB;AAAA,EAM/B,YAAY,IAAiB,WAAwB,SAA8C;AAenG,SAAQ,uBAAuB,CAAC,MAAkB;AAChD,UAAI,KAAK,WAAW,EAAE,KAAK,OAAoB,EAAE,WAAW,CAAgB,EAAE,OAAQ,QAAQ,iBAAiB,GAAI;AACjH,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAU,MAAM;AACd,eAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAC/D,WAAK,UAAU,OAAO;AAAA,IACxB;AAYA,gBAAO,MAAM;AACX,UAAI,KAAK,QAAS;AAClB,WAAK,UAAU;AACf,YAAM,cAAc,MAAM,qBAAqB,KAAK,IAAI,KAAK,WAAW,UAAU,KAAK,QAAQ,QAAQ,KAAK,QAAQ,YAAY,KAAK,QAAQ,KAAK;AAIlJ,WAAK,UAAU,MAAM,aAAa;AAClC,WAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,KAAK,QAAQ,QAAQ;AAAA,gBACvB,KAAK,QAAQ,QAAQ;AACjC,iBAAW,MAAM;AACf,aAAK,UAAU,MAAM,YAAY,cAAc,YAAY,CAAC,kBAAkB,YAAY,CAAC;AAC3F,aAAK,UAAU,MAAM,UAAW,GAAG,SAAS;AAAA,MAC9C,GAAG,CAAC;AAAA,IACN;AAEA,gBAAO,MAAM;AACX,UAAI,CAAC,KAAK,QAAS;AACnB,WAAK,UAAU;AAEf,WAAK,UAAU,gBAAgB,OAAO;AACtC,WAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,KAAK,QAAQ,QAAQ;AAAA,gBACvB,KAAK,QAAQ,QAAQ;AACjC,iBAAW,MAAM;AACf,aAAK,UAAU,MAAM,YAAY;AACjC,aAAK,UAAU,MAAM,UAAU;AAAA,MACjC,GAAG,CAAC;AAAA,IACN;AArEE,SAAK,KAAK;AACV,SAAK,UAAU;AAAA,MACb,GAAGA;AAAA,MACH,GAAG;AAAA,IACL;AAEA,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,UAAU,IAAI,gBAAgB;AAC7C,SAAK,UAAU,OAAO,SAAS;AAC/B,OAAG,cAAc,OAAO,KAAK,SAAS;AAEtC,aAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,OAAO,KAAK,IAAiB,WAAwB,SAAoE;AACvH,WAAO,IAAI,qBAAoB,IAAI,WAAW,OAAO;AAAA,EACvD;AAgCF;;;AC4FA,IAAMC,cAA+B;AAAA;AAAA,EAEnC,QAAQ;AAAA;AAAA,EAER,OAAO;AAAA;AAAA,EAEP,aAAa;AAAA;AAAA,EAEb,gBAAgB;AAAA;AAAA,EAEhB,qBAAqB;AAAA;AAAA,EAErB,aAAa;AAAA;AAAA,EAEb,gBAAgB;AAAA;AAAA,EAEhB,gBAAgB;AAAA;AAAA,EAEhB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAAA;AAAA,EAEd,UAAU;AAAA;AAAA,EAEV,SAAS;AAAA;AAAA,EAET,SAAS;AAAA;AAAA,EAET,WAAW;AAAA;AAAA,EAEX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,kBAAkB;AAAA;AAAA,EAElB,oBAAoB;AAAA;AAAA,EAEpB,iCAAiC;AAAA;AAAA,EAEjC,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA;AAAA,EAEX,cAAc;AAAA;AAAA,EAEd,YAAY;AAAA;AAAA,EAEZ,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AAAA,IACvF,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC/D,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACpD;AAAA;AAAA,EAEA,QAAQ,CAAC;AAAA;AAAA,EAET,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,IAAM,cAAN,MAAM,oBAAmB,UAA6B;AAAA,EAqC3D,YAAY,IAAsB,SAAqC;AACrE,UAAM,IAAI,SAAS,WAAU;AAnC/B,oBAAoB;AAyBpB;AAAA,SAAQ,aAAa;AAErB;AAAA,SAAQ,aAAa;AAErB;AAAA,SAAQ,eAAuB;AAE/B;AAAA,SAAQ,UAAkB;AAm+B1B,6BAAoB,CAAC,MAAM;AAEzB,UAAI,EAAE,QAAQ,QAAQ;AACpB,UAAE,eAAe;AAAA,MACnB;AACA,WAAK,YAAY,MAAM;AACrB,aAAK,iBAAiB,EAAE,MAA0B;AAClD,aAAK,KAAK;AACV,aAAK,SAAsB,EAAE,WAAW,KAAK,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,MAC5E,CAAC;AACD,UAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAChD,UAAI,KAAK,QAAQ,mBAAoB,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AAAA,IAChF;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,UAAE,eAAe;AACjB,aAAK,YAAY,MAAM;AACrB,eAAK,iBAAiB,EAAE,MAA0B;AAClD,eAAK,KAAK;AAAA,QACZ,CAAC;AACD,YAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAChD,YAAI,KAAK,QAAQ,mBAAoB,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AAAA,MAChF;AAAA,IACF;AAEA,gCAAuB,CAAC,MAAM;AAC5B,YAAM,SAAsB,EAAE;AAC9B,UAAI,OAAO,UAAU,SAAS,aAAa,EAAG;AAE9C,WAAK,YAAY,MAAM;AACrB,YACE,OAAO,UAAU,SAAS,uBAAuB,KACjD,CAAC,OAAO,UAAU,SAAS,UAAU,KACrC,CAAC,OAAO,cAAc,UAAU,SAAS,aAAa,GACtD;AACA,gBAAM,eAAe,IAAI;AAAA,YACvB,EAAE,OAAO,aAAa,WAAW;AAAA,YACjC,EAAE,OAAO,aAAa,YAAY;AAAA,YAClC,EAAE,OAAO,aAAa,UAAU;AAAA,UAClC;AAEA,cAAI,CAAC,KAAK,YAAa,KAAK,YAAY,KAAK,QAAQ,qBAAsB;AACzE,iBAAK,QAAQ,YAAY;AAAA,UAC3B;AAGA,cAAI,KAAK,QAAQ,aAAa;AAC5B,iBAAK,8BAA8B,YAAY;AAAA,UACjD;AAEA,cAAI,KAAK,QAAQ,WAAY,MAAK,iBAAiB;AAAA,QACrD,WAAW,OAAO,QAAQ,aAAa,GAAG;AACxC,eAAK,UAAU;AAAA,QACjB,WAAW,OAAO,QAAQ,aAAa,GAAG;AACxC,eAAK,UAAU;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,yCAAgC,CAAC,SAAe;AAC9C,UAAI,KAAK,WAAW,QAAQ,CAAC,YAAW,cAAc,MAAM,KAAK,OAAO,GAAG;AACzE,YAAI,YAAW,QAAQ,KAAK,IAAI,KAAK,YAAW,iBAAiB,MAAM,KAAK,IAAI,GAAG;AACjF;AAAA,QACF;AAEA,aAAK,QAAQ,MAAM,OAAO,YAAW,QAAQ,KAAK,IAAI,CAAC;AACvD;AAAA,MACF;AAEA,WAAK,YAAY;AACjB,WAAK,KAAK;AAAA,IACZ;AAEA,6BAAoB,MAAM;AACxB,WAAK,YAAY;AACjB,WAAK,eAAe;AAAA,IACtB;AAEA,uBAAc,MAAM;AAClB,WAAK,OAAO;AACZ,WAAK,UAAU;AACf,WAAK,KAAK;AAAA,IACZ;AAEA,8BAAqB,CAAC,MAAM;AAC1B,WAAK,UAAU,EAAE,OAAO,KAAK;AAAA,IAC/B;AAEA,6BAAoB,CAAC,MAAM;AACzB,WAAK,SAAS,EAAE,OAAO,KAAK;AAAA,IAC9B;AAkBA,8BAAqB,CAAC,MAAa;AACjC,UAAI;AACJ,YAAM,KAAK,EAAE;AAEb,UAAI,EAAE,QAAQ,GAAG,YAAY,KAAM;AAEnC,UAAI,MAAM,KAAK,aAAa,CAAC,KAAK,KAAM;AACxC,UAAI,KAAK,QAAQ,OAAO;AACtB,eAAO,KAAK,QAAQ;AAAA,UACjB,EAAE,OAA4B;AAAA,UAC/B,OAAO,KAAK,QAAQ,WAAW,aAC3B,KAAK,QAAQ,OAAO,IAAI,KAAK,KAAK,GAAG,KAAK,CAAC,IAC3C,KAAK,QAAQ;AAAA,QACnB;AAAA,MACF,OAAO;AACL,eAAO,IAAI,KAAK,KAAK,MAAO,EAAE,OAA4B,KAAK,CAAC;AAAA,MAClE;AACA,UAAI,YAAW,QAAQ,IAAI,GAAG;AAC5B,aAAK,QAAQ,MAAM,OAAO,MAAM,KAAK,WAAW,IAAI;AACpD,YAAI,EAAE,QAAQ,QAAQ;AACpB,eAAK,YAAY,GAAG,IAAI;AACxB,eAAK,eAAe;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAuBA;AAAA,4BAAmB,MAAM;AACvB,WAAK,eAAe;AAAA,IAGtB;AAEA,oBAAW,MAAM;AACf,WAAK,iBAAiB;AACtB,UAAI,OAAO,KAAK,QAAQ,cAAc,WAAY,MAAK,QAAQ,UAAU,KAAK,IAAI;AAAA,IACpF;AAEA,mBAAU,MAAM;AACd,UAAI,OAAO,KAAK,QAAQ,aAAa,WAAY,MAAK,QAAQ,SAAS,KAAK,IAAI;AAAA,IAClF;AAvoCE,SAAK,GAAG,uBAAuB,IAAI;AAEnC,SAAK,UAAU;AAAA,MACb,GAAG,YAAW;AAAA,MACd,GAAG;AAAA,IACL;AAGA,QAAI,CAAC,CAAC,WAAW,QAAQ,eAAe,MAAM,KAAK,OAAO,QAAQ,SAAS,UAAU;AACnF,WAAK,QAAQ,OAAO,EAAE,GAAG,YAAW,SAAS,MAAM,GAAG,QAAQ,KAAK;AAAA,IACrE;AAGA,QAAI,KAAK,QAAQ,QAAS,MAAK,QAAQ,QAAQ,SAAS,GAAG,GAAG,GAAG,CAAC;AAClE,QAAI,KAAK,QAAQ,QAAS,MAAK,QAAQ,QAAQ,SAAS,GAAG,GAAG,GAAG,CAAC;AAElE,SAAK,KAAK,MAAM,KAAK;AAErB,SAAK,gBAAgB;AACrB,SAAK,mBAAmB;AACxB,SAAK,oBAAoB;AAEzB,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,QAAQ,cAAc,IAAI,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,CAAC;AAAA,IAC/D;AAEA,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,YAAW,QAAQ,OAAO,GAAG;AAC/B,UAAI,KAAK,QAAQ,gBAAgB;AAC/B,aAAK,QAAQ,SAAS,IAAI;AAC1B,aAAK,cAAc,KAAK,IAAI,OAAO;AAAA,MACrC,OAAO;AACL,aAAK,SAAS,OAAO;AAAA,MACvB;AAAA,IACF,OAAO;AACL,WAAK,SAAS,oBAAI,KAAK,CAAC;AAAA,IAC1B;AACA,QAAI,KAAK,QAAQ,aAAa;AAC5B,WAAK,WAAW;AAChB,YAAM,aAAa,KAAK,QAAQ;AAChC,UAAI,YAAW,QAAQ,UAAU,GAAG;AAClC,YAAI,KAAK,QAAQ,mBAAmB;AAClC,eAAK,QAAQ,YAAY,MAAM,IAAI;AACnC,eAAK,cAAc,KAAK,WAAW,UAAU;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,qBAAqB;AACpC,WAAK,WAAW;AAChB,WAAK,QAAQ,CAAC;AACd,WAAK,UAAU,CAAC;AAChB,WAAK,QAAQ,KAAK,EAAE;AAAA,IACtB;AACA,QAAI,KAAK,QAAQ,eAAe;AAC9B,UAAI,KAAK,QAAQ,kBAAkB,SAAU,MAAK,gBAAgB,oBAAoB,KAAK,KAAK,IAAI,KAAK,aAAa,KAAK,QAAQ,oBAAoB;AAAA,IACzJ;AAAA,EACF;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAsC,CAAC,GACZ;AAC3B,WAAO,MAAM,KAAK,KAAK,SAAS,WAAU;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,QAAQ,OAAwB;AACrC,WAAO,OAAO,SAAS,EAAE,EACtB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAAA,EAC1B;AAAA,EAEA,OAAO,QAAQ,KAAK;AAClB,WAAO,OAAO,KAAK,OAAO,UAAU,SAAS,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;AAAA,EACjF;AAAA,EAEA,OAAO,WAAW,MAAM;AACtB,UAAM,MAAM,KAAK,OAAO;AACxB,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,MAAM;AAC5B,QAAI,YAAW,QAAQ,IAAI,EAAG,MAAK,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,EACxD;AAAA,EAEA,OAAO,gBAAgB,MAAM,OAAO;AAClC,WAAO,CAAC,IAAI,YAAW,YAAY,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EACxF,KACF;AAAA,EACF;AAAA,EAEA,OAAO,YAAY,MAAM;AAEvB,WAAQ,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ;AAAA,EAChE;AAAA,EAEA,OAAO,cAAc,GAAG,GAAG;AAEzB,WAAO,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAAA,EACnC;AAAA,EAEA,OAAO,oBAAoB,KAAW,MAAY,SAAe;AAC/D,WAAO,IAAI,QAAQ,IAAI,KAAK,QAAQ,KAAK,IAAI,QAAQ,IAAI,QAAQ,QAAQ;AAAA,EAC3E;AAAA,EAEA,OAAO,iBAAiB,GAAS,GAAS;AACxC,WAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,EACjC;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,uBAAuB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,eAAe,QAAQ;AAC5B,SAAK,YAAY,OAAO;AACxB,SAAK,eAAe;AACpB,SAAK,GAAG,uBAAuB,IAAI;AAAA,EACrC;AAAA,EAEA,iBAAiB;AACf,UAAM,gBAAgB,KAAK,WAAW,cAAc,mBAAmB;AACvE,QAAI,eAAe;AACjB,iBAAW,YAAY,aAA4B,EAAE,QAAQ;AAAA,IAC/D;AACA,UAAM,iBAAiB,KAAK,WAAW,cAAc,oBAAoB;AACzE,QAAI,gBAAgB;AAClB,iBAAW,YAAY,cAA6B,EAAE,QAAQ;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,qBAAqB;AAEnB,QAAI,KAAK,GAAG,QAAQ,QAAQ;AAC1B,WAAK,GAAG,UAAU,IAAI,uBAAuB;AAAA,IAC/C;AAIA,SAAK,uBAAuB,KAAK,EAAE;AAEnC,QAAI,KAAK,QAAQ,aAAa;AAC5B,WAAK,YAAY,UAAU,IAAI,WAAW;AAC1C,UAAI,CAAC,KAAK,QAAQ,gBAAgB;AAChC,aAAK,YAAY,KAAK,gBAAgB;AACtC,aAAK,UAAU,UAAU,IAAI,qBAAqB;AAAA,MACpD,OAAO;AAIL,aAAK,YAAY,SAAS,cAAc,KAAK,QAAQ,cAAc;AACnE,YAAI,CAAC,KAAK,WAAW;AACnB,kBAAQ,KAAK,oEAAoE;AAAA,QACnF,OAAO;AACL,eAAK,uBAAuB,KAAK,SAAS;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAQA,UAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,CAAC,kBAAkB,GAAG,KAAK,QAAQ,cAAc,KAAK,iBAAiB;AAEhI,QAAI,CAAC,KAAK,QAAQ,YAAY;AAC5B,YAAM,4BAA4B,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,KAAK,OAAO;AAAA,IAC9H;AAEA,QAAI,KAAK,QAAQ,WAAW;AAC1B,YAAM,QAAQ,KAAK,QAAQ;AAC3B,WAAK,QAAQ,YACX,iBAAiB,cAAc,QAAS,SAAS,cAAc,KAAK;AACtE,WAAK,QAAQ,UAAU,OAAO,KAAK,WAAW;AAAA,IAChD,OAAO;AAEL,YAAM,WAAW,CAAC,KAAK,YAAY,KAAK,KAAK,KAAK;AAClD,UAAI,CAAC,KAAK,QAAQ,cAAe,CAAC,KAAK,YAA4B,aAAa,SAAS,oCAAoC;AAC7H,eAAS,cAAc,MAAM,KAAK,WAAW;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,IAAsB;AAC3C,UAAM,WAAW,GAAG,eAAe,cAAc,oBAAoB;AACrE,QAAI,CAAC,SAAU;AAIf,aAAS,cACP,OAAO,KAAK,QAAQ,WAAW,aAAa,KAAK,OAAO,KAAK,QAAQ,MAAM;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAa,KAAK,MAAM,SAAyC,MAAc;AACtF,aAAS,UAAU,KAAK,QAAQ;AAChC,QAAI,OAAO,WAAW,WAAY,QAAO,OAAO,IAAI;AACpD,QAAI,CAAC,YAAW,QAAQ,IAAI,EAAG,QAAO;AAEtC,WAAO,KAAK,WAAW,MAAM,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAY,QAAgB;AACrC,UAAM,cAAc,OAAO,MAAM,6BAA6B;AAC9D,WAAO,YACJ,IAAI,CAAC,UAAW,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,EAAE,IAAI,IAAI,KAAM,EACxE,KAAK,EAAE;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAsB;AACrC,UAAM,OAAO,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,CAAC;AAC1C,SAAK,QAAQ,MAAM,OAAO,MAAM,KAAK,WAAW,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QACE,OAAa,MACb,kBAA2B,OAC3B,YAAqB,OACrB,gBAAyB,OACzB;AACA,UAAM,eAAe,KAAK,aAAa,IAAI;AAC3C,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,QAAQ,oBAAqB,MAAK,cAAc,cAAc,SAAS;AAAA,aACxE,CAAC,cAAe,MAAK,aAAa,YAAY;AACvD,gBAAW,iBAAiB,YAAY;AACxC,SAAK,SAAS,YAAY;AAC1B,QAAI,CAAC,mBAAmB,OAAO,KAAK,QAAQ,aAAa,YAAY;AACnE,WAAK,QAAQ,SAAS,KAAK,MAAM,YAAY;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,aAAa,MAAY;AACvB,QAAI,CAAC,MAAM;AACT,WAAK,mBAAmB,IAAI;AAC5B,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,IAClC;AACA,QAAI,CAAC,YAAW,QAAQ,IAAI,GAAG;AAC7B;AAAA,IACF;AACA,UAAM,MAAM,KAAK,QAAQ,SACvB,MAAM,KAAK,QAAQ;AACrB,QAAI,YAAW,QAAQ,GAAG,KAAK,OAAO,KAAK;AACzC,aAAO;AAAA,IACT,WAAW,YAAW,QAAQ,GAAG,KAAK,OAAO,KAAK;AAChD,aAAO;AAAA,IACT;AACA,WAAO,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,MAAY,WAAoB;AAC5C,QAAI,CAAC,WAAW;AACd,WAAK,OAAO;AAAA,IACd,WAAW,WAAW;AACpB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAY;AACvB,UAAM,eAAe,KAAK,OAAO,KAAK,CAAC,SAAS;AAC9C,aAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,IAAI,OAAO;AAAA,IACpD,CAAC;AACD,QAAI,CAAC,cAAc;AACjB,WAAK,MAAM,KAAK,IAAI;AAAA,IACtB,OAAO;AACL,WAAK,MAAM,OAAO,KAAK,MAAM,QAAQ,YAAY,GAAG,CAAC;AAAA,IACvD;AACA,SAAK,MAAM,KAAK,CAAC,GAAS,MAAa,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAE;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAI,MAAM;AACpB,OAAG,aAAa,aAAa,KAAK,SAAS,IAAI,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACf,QAAI,CAAC,KAAK,SAAS,qBAAqB;AACtC,WAAK,cAAc,KAAK,IAAI,KAAK,IAAI;AACrC,UAAI,KAAK,SAAS,aAAa;AAC7B,aAAK,cAAc,KAAK,WAAW,KAAK,OAAO;AAAA,MACjD;AACA;AAAA,IACF;AACA,SAAK,gCAAgC;AAAA,EACvC;AAAA,EAEA,kCAAkC;AAChC,UAAM,aAAa,MAAM,KAAK,KAAK,OAAO,EAAE,OAAO,CAAC,IAAI,UAAU;AAChE,UAAI,QAAQ,KAAK,MAAM,SAAS,EAAG,QAAO;AAAA,IAC5C,CAAC;AACD,eAAW,QAAQ,CAAC,OAAO;AACzB,SAAG,OAAO;AAAA,IACZ,CAAC;AACD,SAAK,MAAM,QAAQ,CAAC,MAAY,UAAkB;AAChD,UAAI,MAAM,KAAK,KAAK,OAAO,EAAE,KAAK,GAAG;AACnC,aAAK,cAAc,KAAK,QAAQ,KAAK,GAAG,IAAI;AAC5C;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,gBAAgB;AACpC,WAAK,cAAc,QAAQ,IAAI;AAC/B,WAAK,QAAQ,KAAK,MAAM;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,IAAI,MAAM;AACtB,QAAI,GAAG,QAAQ,QAAQ;AACrB,WAAK,YAAY,IAAI,IAAI;AACzB,SAAG,QAAQ,KAAK,WAAW,MAAM,YAAY;AAAA,IAC/C,OAAO;AACL,SAAG,QAAQ,KAAK,SAAS,IAAI;AAAA,IAC/B;AACA,SAAK,GAAG;AAAA,MACN,IAAI,YAAY,UAAU;AAAA,QACxB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ,EAAE,SAAS,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,MAAY,UAAgB,MAAM;AACnD,UAAM,cAAc,YAAW,QAAQ,IAAI,IAAI,OAAO,oBAAI,KAAK;AAI/D,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,WAAW,cAAc,KAAK,WAAW,aAAa,YAAY;AAAA,IACzE,OAAO;AACL,YAAM,iBAAiB,YAAW,QAAQ,OAAO,IAAI,UAAU,oBAAI,KAAK;AACxE,WAAK,WAAW,cAAc,GAAG,KAAK,WAAW,aAAa,OAAO,CAAC,MAAM,KAAK,WAAW,gBAAgB,OAAO,CAAC;AAAA,IACtH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,MAAY;AACnB,QAAI,cAAc;AAClB,QAAI,CAAC,YAAW,QAAQ,IAAI,GAAG;AAC7B;AAAA,IACF;AACA,QAAI,KAAK,WAAW;AAClB,YAAM,mBAAmB,IAAI,KAAK,KAAK,UAAU,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,EAAE,OAAO,CAAC,GAClF,kBAAkB,IAAI;AAAA,QACpB,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE;AAAA,QAC1C,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE;AAAA,QAC1C;AAAA,MACF,GACA,cAAc,KAAK,QAAQ;AAE7B,sBAAgB,SAAS,gBAAgB,SAAS,IAAI,CAAC;AACvD,sBAAgB,QAAQ,gBAAgB,QAAQ,IAAI,CAAC;AACrD,oBACE,cAAc,iBAAiB,QAAQ,KAAK,gBAAgB,QAAQ,IAAI;AAAA,IAC5E;AACA,QAAI,aAAa;AACf,WAAK,YAAY;AAAA,QACf;AAAA,UACE,OAAO,KAAK,SAAS;AAAA,UACrB,MAAM,KAAK,YAAY;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AACA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,kBAAkB;AAChB,SAAK,UAAU,CAAC,IAAI,KAAK,eAAe,KAAK,UAAU,CAAC,CAAC;AACzD,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,eAAe,UAAU;AACvB,QAAI,SAAS,QAAQ,GAAG;AACtB,eAAS,QAAQ,KAAK,KAAK,KAAK,IAAI,SAAS,KAAK,IAAI,EAAE;AACxD,eAAS,SAAS;AAAA,IACpB;AACA,QAAI,SAAS,QAAQ,IAAI;AACvB,eAAS,QAAQ,KAAK,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,EAAE;AACzD,eAAS,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AACV,SAAK,UAAU,CAAC,EAAE;AAClB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,YAAY;AACV,SAAK,UAAU,CAAC,EAAE;AAClB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,OAAO,MAAM,OAAO,QAAQ;AAC1B,UAAM,MAAM,oBAAI,KAAK,GACnB,OAAO,YAAW,gBAAgB,MAAM,KAAK,GAC7C,OAAO,CAAC;AACV,QAAI,SAAS,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,GAC3C,MAAM,CAAC;AACT,gBAAW,iBAAiB,GAAG;AAC/B,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,gBAAU,KAAK,QAAQ;AACvB,UAAI,SAAS,GAAG;AACd,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,gBAAgB,UAAU,IAAI,KAAK,QAAQ,GAC/C,YAAY,UAAU,KAAK,IAAI,QAAQ,GACvC,sBAAsB,UAAU,IAAI,OAAO,IAAI,MAC/C,kBAAkB,UAAU,KAAK,OAAO,IAAI,MAC5C,sBAAsB,YAAW,gBAAgB,qBAAqB,aAAa;AACrF,QAAI,QAAQ,OAAO,QACjB,QAAQ;AACV,WAAO,QAAQ,GAAG;AAChB,eAAS;AAAA,IACX;AACA,aAAS,IAAI;AACb,QAAI,iBAAiB;AACrB,aAAS,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,KAAK;AACrC,YAAM,MAAM,IAAI,KAAK,MAAM,OAAO,KAAK,IAAI,OAAO,GAChD,UAAU,YAAW,cAAc,KAAK,GAAG,GAC3C,WAAW,KAAK,QAAQ,OAAO,QAAQ,IAAI,aAAa,CAAC,MAAM,IAC/D,UAAU,IAAI,UAAU,KAAK,OAAO,QACpC,eACE,KAAK,QAAQ,cAAc,YAAW,cAAc,KAAK,QAAQ,YAAY,GAAG,GAClF,aAAa,KAAK,QAAQ,YAAY,YAAW,cAAc,KAAK,QAAQ,UAAU,GAAG,GACzF,YACE,KAAK,QAAQ,cACb,KAAK,QAAQ,YACb,KAAK,QAAQ,aAAa,OAC1B,MAAM,KAAK,QAAQ,UACrB,aACG,KAAK,QAAQ,WAAW,MAAM,KAAK,QAAQ,WAC3C,KAAK,QAAQ,WAAW,MAAM,KAAK,QAAQ,WAC3C,KAAK,QAAQ,mBAAmB,YAAW,WAAW,GAAG,KACzD,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAAa,GAAG,GAC7D,mBAAmB,KAAK,QAAQ,eAAe,KAAK,QAAQ,KAAK,WAAW,YAAW,cAAc,KAAK,MAAM,GAAG,GACnH,iBAAiB,KAAK,QAAQ,eAAe,KAAK,WAAW,YAAW,cAAc,KAAK,SAAS,GAAG,GACvG,cACE,KAAK,QAAQ,eACb,YAAW,QAAQ,KAAK,OAAO,KAC/B,YAAW,oBAAoB,KAAK,KAAK,MAAM,KAAK,OAAO;AAC/D,UAAI,YAAY,KAAK,IAAI,SACvB,cAAc,OACd,aAAa;AAEf,UAAI,aAAa;AACjB,UAAI,YAAW,QAAQ,KAAK,IAAI,GAAG;AACjC,qBAAa,YAAW,cAAc,KAAK,KAAK,IAAI;AAAA,MACtD;AAEA,UAAI,CAAC,cAAc,YAAW,QAAQ,KAAK,OAAO,GAAG;AACnD,qBAAa,YAAW,cAAc,KAAK,KAAK,OAAO;AAAA,MACzD;AAEA,UACE,KAAK,QAAQ,uBACb,KAAK,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,MAAM,IAAI,QAAQ,CAAC,GAC3D;AACA,qBAAa;AAAA,MACf;AAEA,UAAI,SAAS;AACX,YAAI,IAAI,QAAQ;AACd,sBAAY,sBAAsB;AAClC,wBAAc;AACd,uBAAa;AAAA,QACf,OAAO;AACL,sBAAY,YAAY;AACxB,wBAAc;AACd,uBAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,YAAY;AAAA,QAChB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iCAAiC,KAAK,QAAQ;AAAA,QAC9C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,KAAK,KAAK,UAAU,SAAS,CAAC;AAElC,UAAI,EAAE,MAAM,GAAG;AACb,aAAK,KAAK,KAAK,UAAU,KAAK,KAAK,QAAQ,OAAO,cAAc,CAAC;AACjE,cAAM,CAAC;AACP,YAAI;AACJ,yBAAiB;AAAA,MACnB;AAAA,IACF;AACA,WAAO,KAAK,YAAY,KAAK,SAAS,MAAM,MAAM;AAAA,EACpD;AAAA,EAEA,UAAU,MAAM;AACd,UAAM,WAAW;AAAA,MACb,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf,GACA,eAAe,EAAE,CAAC,cAAc,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,eAAe,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,WAAW,IACjI,MAAM,CAAC,gBAAgB;AAEzB,QAAI,KAAK,SAAS;AAChB,UAAI,KAAK,iCAAiC;AACxC,YAAI,KAAK,0BAA0B;AACnC,YAAI,KAAK,uBAAuB;AAAA,MAClC,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,eAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC5D,UAAI,KAAK,eAAe,QAAQ,KAAK,KAAK,QAAQ,GAAG;AACnD,YAAI,KAAK,SAAS;AAAA,MACpB;AAAA,IACF;AAEA,WACE,iBAAiB,KAAK,GAAG,YAAY,IAAI,KAAK,GAAG,CAAC,oBAAoB,YAAY,oEAChB,KAAK,IAAI,iBAAiB,KAAK,KAAK,eAAe,KAAK,GAAG,KAAK,KAAK,GAAG;AAAA,EAG9I;AAAA,EAEA,UAAU,MAAM,OAAO,eAAe;AACpC,WACE,+BACC,gBAAgB,iBAAiB,MAClC,QACC,QAAQ,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,IACvC;AAAA,EAEJ;AAAA,EAEA,YAAY,MAAM,MAAM,QAAQ;AAC9B,WACE,wIACA,SACA,OACA,KAAK,WAAW,IAAI,IACpB,KAAK,WAAW,IAAI,IACpB;AAAA,EAEJ;AAAA,EAEA,WAAW,MAAM;AACf,UAAM,MAAM,CAAC;AACb,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACtB,YAAM,OAAO,YAAW,QAAQ,KAAK,cAAc,MAAM,CAAC,CAAC;AAC3D,YAAM,SAAS,YAAW,QAAQ,KAAK,cAAc,MAAM,GAAG,IAAI,CAAC;AACnE,UAAI,KAAK,gCAAgC,IAAI,KAAK,MAAM,cAAc;AAAA,IACxE;AACA,WAAO,iBAAiB,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI;AAAA,EACvE;AAAA,EAEA,WAAW,MAAM;AACf,WAAO,YAAY,KAAK,KAAK,EAAE,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAY,MAAc,OAAe;AAC/C,UAAM,OAAO,KAAK;AAClB,UAAM,YAAY,SAAS,KAAK;AAChC,UAAM,YAAY,SAAS,KAAK;AAChC,WAAO;AAAA,MACL,MAAM,EAAE,cAAc,UAAU,KAAK,KAAK,YAAY;AAAA,MACtD,MAAM,EAAE,cAAc,UAAU,MAAM,KAAK,YAAY;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAAkB,MAAsB;AAC9C,UAAM,IAAI,KAAK;AACf,WAAO;AAAA,MACL;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,MAAM,QAAQ,EAAE,SAAS,IAAI,EAAE,UAAU,KAAK,GAAG,IAAI,EAAE;AAAA,MACvD,EAAE;AAAA,MACF,EAAE;AAAA,IACJ,EAAE,KAAK,GAAG;AAAA,EACZ;AAAA,EAEA,YAAY,UAAU,GAAG,MAAM,OAAO,SAAS,QAAQ;AACrD,UAAM,OAAO,KAAK,SAChB,YAAY,SAAS,KAAK,SAC1B,YAAY,SAAS,KAAK;AAC5B,QAAI,GACF,GACA,MAAM,CAAC,GACP,OACE,cACA,SACA;AAKJ,UAAM,EAAE,MAAM,KAAK,IAAI,KAAK,YAAY,MAAM,KAAK;AAEnD,SAAK,IAAI,GAAG,IAAI,IAAI,KAAK;AACvB,UAAI;AAAA,QACF,qBACG,SAAS,UAAU,IAAI,IAAI,KAAK,IAAI,KACrC,OACC,MAAM,QAAQ,yBAAyB,OACtC,aAAa,IAAI,KAAK,YAAc,aAAa,IAAI,KAAK,WACxD,wBACA,MACJ,MACA,YAAW,QAAQ,KAAK,KAAK,OAAO,CAAC,CAAC,IACtC;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,YACJ,uEACA,IAAI,KAAK,EAAE,IACX;AAEF,QAAI,MAAM,QAAQ,KAAK,SAAS,GAAG;AACjC,UAAI,KAAK,UAAU,CAAC;AACpB,UAAI,KAAK,UAAU,CAAC,IAAI;AAAA,IAC1B,OAAO;AACL,UAAI,OAAO,KAAK;AAChB,UAAI,IAAI,OAAO,KAAK;AAAA,IACtB;AAEA,SAAK,MAAM,CAAC,GAAG,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK;AAC9C,UAAI,KAAK,KAAK,SAAS;AACrB,YAAI,KAAK,kBAAkB,CAAC,KAAK,MAAM,OAAO,wBAAwB,EAAE,IAAI,CAAC,WAAW;AAAA,MAC1F;AAAA,IACF;AACA,QAAI,KAAK,iBAAkB,KAAI,QAAQ;AAEvC,UAAM,WAAW,oEAAoE,IAAI,KAAK,EAAE,CAAC;AAEjG,UAAM,YACJ;AACF,YAAQ,4BACN,OAAO,KAAK,cAEd,uBAAuB,SAAS;AAEhC,YAAQ;AACR,QAAI,KAAK,oBAAoB;AAC3B,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,cAAQ,YAAY;AAAA,IACtB;AACA,YAAQ;AAER,UAAM,aACJ;AACF,YAAQ,4BACN,OAAO,KAAK,cAEd,uBAAuB,UAAU;AAEjC,WAAQ,QAAQ;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBQ,YAAY,IAAgB;AAClC,SAAK;AACL,QAAI;AACF,SAAG;AAAA,IACL,UAAE;AACA,WAAK;AACL,UAAI,KAAK,eAAe,KAAK,KAAK,YAAY;AAC5C,aAAK,aAAa;AAClB,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,OAAO;AAEL,QAAI,KAAK,aAAa,GAAG;AACvB,WAAK,aAAa;AAClB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,SAChB,UAAU,KAAK,SACf,UAAU,KAAK,SACf,WAAW,KAAK,UAChB,WAAW,KAAK;AAElB,QAAI,KAAK,MAAM,SAAS;AACtB,WAAK,KAAK;AACV,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,UAAU;AAC1C,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AACA,QAAI,KAAK,MAAM,SAAS;AACtB,WAAK,KAAK;AACV,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,UAAU;AAC1C,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,UAAU,CAAC,EAAE;AAC/B,UAAM,QAAQ,KAAK,UAAU,CAAC,EAAE;AAEhC,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,mBAAmB,KAAK,IAAI;AAAA,IACnC,OAAO;AACL,WAAK,mBAAmB,KAAK,MAAM,KAAK,OAAO;AAAA,IACjD;AAMA,UAAM,MAAM,KAAK,kBAAkB,IAAI;AACvC,QAAI,QAAQ,KAAK,gBAAgB,KAAK,WAAW,cAAc,sBAAsB,GAAG;AACtF,WAAK,eAAe,MAAM,KAAK;AAAA,IACjC,OAAO;AACL,WAAK,eAAe;AAGpB,WAAK,UAAU,sBAAsB,MAAM,KAAK;AAChD,WAAK,iBAAiB,MAAM,KAAK;AAAA,IACnC;AACA,SAAK,qBAAqB,MAAM,KAAK;AAErC,QAAI,OAAO,KAAK,QAAQ,WAAW,YAAY;AAC7C,WAAK,QAAQ,OAAO,KAAK,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA,EAGQ,iBAAiB,MAAc,OAAe;AACpD,SAAK,eAAe;AACpB,SAAK,WAAW,YAAY,KAAK,YAAY,MAAM,GAAG,MAAM,OAAO,MAAM,KAAK,OAAO;AAErF,UAAM,aAAa,KAAK,WAAW,cAAc,mBAAmB;AACpE,UAAM,cAAc,KAAK,WAAW,cAAc,oBAAoB;AAEtE,eAAW,KAAK,YAAY;AAAA,MAC1B,SAAS;AAAA,MACT,iBAAiB,EAAE,WAAW,SAAS,MAAM,gBAAgB,MAAM;AAAA,IACrE,CAAC;AACD,eAAW,KAAK,aAAa;AAAA,MAC3B,SAAS;AAAA,MACT,iBAAiB,EAAE,WAAW,SAAS,MAAM,gBAAgB,MAAM;AAAA,IACrE,CAAC;AAGD,eAAW,iBAAiB,UAAU,KAAK,iBAAiB;AAC5D,gBAAY,iBAAiB,UAAU,KAAK,kBAAkB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,MAAc,OAAe;AAClD,UAAM,cAAc,KAAK,WAAW,cAAc,oBAAoB;AACtE,QAAI,eAAe,YAAY,UAAU,MAAM,SAAS,GAAG;AACzD,kBAAY,QAAQ,MAAM,SAAS;AAEnC,iBAAW,YAAY,WAAW,GAAG,QAAQ;AAAA,IAC/C;AAEA,UAAM,EAAE,MAAM,KAAK,IAAI,KAAK,YAAY,MAAM,KAAK;AACnD,SAAK,WAAW,cAAc,aAAa,GAAG,UAAU,OAAO,eAAe,CAAC,IAAI;AACnF,SAAK,WAAW,cAAc,aAAa,GAAG,UAAU,OAAO,eAAe,CAAC,IAAI;AAAA,EACrF;AAAA;AAAA,EAGQ,qBAAqB,MAAc,OAAe;AACxD,UAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO;AAClD,UAAM,WAAW,KAAK,WAAW,cAAc,2BAA2B;AAC1E,QAAI,SAAU,UAAS,YAAY;AAAA,QAC9B,MAAK,WAAW,mBAAmB,aAAa,IAAI;AAAA,EAC3D;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,WAAW,KAAK,mBAAmB;AAC5D,SAAK,GAAG,iBAAiB,UAAU,KAAK,kBAAkB;AAC1D,SAAK,WAAW,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,EAOrE;AAAA,EAEA,kBAAkB;AAChB,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY,YAAW,UAAU,KAAK;AAE/C,SAAK,cAA2B,SAAS,QAAQ;AAEjD,SAAK,aAAa,KAAK,YAAY,cAAc,sBAAsB;AACvE,SAAK,aAAa,KAAK,YAAY,cAAc,YAAY;AAC7D,SAAK,aAAa,KAAK,YAAY,cAAc,YAAY;AAM7D,SAAK,SAAS,KAAK,YAAY,cAAc,oBAAoB;AAEjE,SAAK,UAAU;AAAA,MACb,GAAG,CAAC,SAAe;AACjB,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,IAAI,CAAC,SAAe;AAClB,cAAM,IAAI,KAAK,QAAQ;AACvB,gBAAQ,IAAI,KAAK,MAAM,MAAM;AAAA,MAC/B;AAAA,MACA,KAAK,CAAC,SAAe;AACnB,eAAO,KAAK,QAAQ,KAAK,cAAc,KAAK,OAAO,CAAC;AAAA,MACtD;AAAA,MACA,MAAM,CAAC,SAAe;AACpB,eAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,MACjD;AAAA,MACA,GAAG,CAAC,SAAe;AACjB,eAAO,KAAK,SAAS,IAAI;AAAA,MAC3B;AAAA,MACA,IAAI,CAAC,SAAe;AAClB,cAAM,IAAI,KAAK,SAAS,IAAI;AAC5B,gBAAQ,IAAI,KAAK,MAAM,MAAM;AAAA,MAC/B;AAAA,MACA,KAAK,CAAC,SAAe;AACnB,eAAO,KAAK,QAAQ,KAAK,YAAY,KAAK,SAAS,CAAC;AAAA,MACtD;AAAA,MACA,MAAM,CAAC,SAAe;AACpB,eAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS,CAAC;AAAA,MACjD;AAAA,MACA,IAAI,CAAC,SAAe;AAClB,gBAAQ,KAAK,KAAK,YAAY,GAAG,MAAM,CAAC;AAAA,MAC1C;AAAA,MACA,MAAM,CAAC,SAAe;AACpB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,WAAW,KAAK,mBAAmB;AAC/D,SAAK,GAAG,oBAAoB,UAAU,KAAK,kBAAkB;AAC7D,SAAK,WAAW,oBAAoB,SAAS,KAAK,oBAAoB;AACtE,QAAI,KAAK,QAAQ,eAAe,KAAK,WAAW;AAC9C,WAAK,UAAU,oBAAoB,SAAS,KAAK,iBAAiB;AAClE,WAAK,UAAU,oBAAoB,YAAY,KAAK,mBAAmB;AACvE,WAAK,UAAU,oBAAoB,UAAU,KAAK,kBAAkB;AAAA,IACtE;AAAA,EACF;AAAA;AAAA,EAgGA,UAAU,OAAO;AACf,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,WAAK,UAAU,CAAC,EAAE,QAAQ,SAAS,OAAO,EAAE;AAC5C,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,MAAM;AACb,QAAI,CAAC,MAAM,IAAI,GAAG;AAChB,WAAK,UAAU,CAAC,EAAE,OAAO,SAAS,MAAM,EAAE;AAC1C,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EA4BA,cAAc,MAAM,KAAK,OAAgB,OAAO;AAC9C,WAAO,KAAK;AACZ,WAAO,OAAO,GAAG;AACf,aAAO;AAAA,IACT;AACA,WAAO,OAAO,KAAK,KAAK,eAAe,GAAG,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,EACtE;AAAA,EAEA,kBAAkB;AAChB,UAAM,YAA8B,KAAK,GAAG,UAAU,IAAI;AAG1D,cAAU,gBAAgB,IAAI;AAC9B,cAAU,iBAAiB,SAAS,KAAK,iBAAiB;AAC1D,cAAU,iBAAiB,YAAY,KAAK,mBAAmB;AAC/D,cAAU,iBAAiB,UAAU,KAAK,kBAAkB;AAC5D,SAAK,GAAG,cAAc,YAAY,SAAS;AAC3C,WAAO;AAAA,EACT;AAAA;AAAA,EAmBA,OAAO;AACL,YAAQ,KAAK,iFAAiF;AAC9F,WAAO;AAAA,EACT;AAAA,EACA,QAAQ;AACN,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAqBF;AAlBI,YAAW,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7rCpB,IAAM,aAAN;;;ACtQP,IAAMC,cAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AACd;AAEO,IAAM,WAAN,MAAM,kBAAiB,UAA2B;AAAA,EAuBvD,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AA0E7B,SAAQ,uBAAuB,MAAM;AACnC,WAAK,sBAAsB;AAAA,IAC7B;AAEA,SAAQ,0BAA0B,CAAC,MAAqB;AACtD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AAEpC,UAAI,KAAK,kBAAkB,SAAU,KAAK,iBAAiB,KAAK,cAAgB,MAAK,MAAM;AAAA,UACtF,MAAK,KAAK;AAAA,IACjB;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,KAAK,cAAe,MAAK,MAAM;AAAA,IACrC;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,KAAK,cAAe,MAAK,MAAM;AAAA,IACrC;AAEA,SAAQ,sBAAsB,CAAC,MAAqB;AAClD,UAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,KAAK,KAAK,iBAAiB,KAAK,cAAe,MAAK,MAAM;AAAA,IAC7F;AAuMA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,WAAK,YAAY;AAGjB,YAAM,aAAa,KAAK,GAAG,sBAAsB;AACjD,YAAM,kBAAkB,KAAK,YAAY,sBAAsB;AAC/D,WAAK,gBAAgB,WAAW;AAChC,WAAK,iBAAiB,WAAW;AAEjC,WAAK,gBAAgB;AACrB,WAAK,GAAG,UAAU,IAAI,QAAQ;AAC9B,WAAK,gBAAgB;AAErB,UAAI,OAAO,KAAK,QAAQ,gBAAgB;AACtC,aAAK,QAAQ,YAAY,KAAK,MAAM,KAAK,EAAE;AAE7C,WAAK,YAAY,MAAM,QAAQ,gBAAgB,QAAQ;AACvD,WAAK,YAAY,MAAM,SAAS,gBAAgB,SAAS;AACzD,WAAK,YAAY,MAAM,WAAW;AAClC,WAAK,YAAY,MAAM,MAAM;AAC7B,WAAK,YAAY,MAAM,OAAO;AAC9B,WAAK,8BAA8B;AAEnC,WAAK,GAAG,MAAM,WAAW;AACzB,WAAK,GAAG,MAAM,SAAS;AACvB,WAAK,GAAG,MAAM,aAAa;AAE3B,WAAK,YAAY,KAAK,GAAG,aAAa,OAAO;AAC7C,WAAK,aAAa,KAAK,GAAG,aAAa,QAAQ;AAC/C,UAAI,KAAK,WAAW;AAClB,aAAK,GAAG,MAAM,QAAQ,KAAK,YAAY;AACvC,aAAK,GAAG,gBAAgB,OAAO;AAAA,MACjC;AACA,UAAI,KAAK,YAAY;AACnB,aAAK,GAAG,MAAM,SAAS,KAAK,aAAa;AACzC,aAAK,GAAG,gBAAgB,QAAQ;AAAA,MAClC;AACA,WAAK,YAAY;AAEjB,UAAI,KAAK,YAAY,GAAI,MAAK,YAAY;AAE1C,YAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,YAAM,gBAAgB,KAAK,iBAAiB,KAAK;AACjD,WAAK,WAAW;AAChB,WAAK,YAAY;AACjB,UAAI,eAAe,eAAe;AAEhC,cAAM,QAAQ,KAAK,iBAAiB,KAAK;AACzC,aAAK,WAAW,KAAK,cAAc;AACnC,aAAK,YAAY,KAAK,cAAc,MAAM;AAAA,MAC5C,OAAO;AAEL,cAAM,QAAQ,KAAK,gBAAgB,KAAK;AACxC,aAAK,WAAW,KAAK,eAAe,MAAM;AAC1C,aAAK,YAAY,KAAK,eAAe;AAAA,MACvC;AACA,WAAK,gBAAgB;AAErB,aAAO,iBAAiB,UAAU,KAAK,qBAAqB,EAAE,SAAS,KAAK,CAAC;AAC7E,aAAO,iBAAiB,UAAU,KAAK,qBAAqB,EAAE,SAAS,KAAK,CAAC;AAC7E,aAAO,iBAAiB,SAAS,KAAK,mBAAmB;AAAA,IAC3D;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,WAAK,YAAY;AACjB,WAAK,gBAAgB;AAErB,UAAI,OAAO,KAAK,QAAQ,iBAAiB;AACvC,aAAK,QAAQ,aAAa,KAAK,MAAM,KAAK,EAAE;AAK9C,aAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAC7D,aAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAC7D,aAAO,oBAAoB,SAAS,KAAK,mBAAmB;AAC5D,WAAK,eAAe;AACpB,WAAK,iBAAiB;AACtB,UAAI,KAAK,YAAY,GAAI,MAAK,eAAe;AAAA,IAC/C;AA5XE,SAAK,GAAG,qBAAqB,IAAI;AAEjC,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AACrB,SAAK,cAAc,SAAS,cAAc,KAAK;AAC/C,SAAK,YAAY,UAAU,IAAI,sBAAsB;AACrD,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB,KAAK,GAAG,aAAa,OAAO;AACtD,SAAK,UAAU,KAAK,GAAG,aAAa,cAAc,KAAK;AACvD,SAAK,GAAG,WAAW;AAEnB,SAAK,GAAG,OAAO,KAAK,WAAW;AAC/B,SAAK,YAAY,OAAO,KAAK,EAAE;AAC/B,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,GAAG,qBAAqB,IAAI;AAGjC,SAAK,YAAY,OAAO;AACxB,SAAK,GAAG,gBAAgB,OAAO;AAAA,EACjC;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,GAAG,iBAAiB,SAAS,KAAK,oBAAoB;AAC3D,SAAK,GAAG,iBAAiB,YAAY,KAAK,uBAAuB;AAAA,EACnE;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,GAAG,oBAAoB,SAAS,KAAK,oBAAoB;AAC9D,SAAK,GAAG,oBAAoB,YAAY,KAAK,uBAAuB;AAAA,EACtE;AAAA,EA8BQ,gCAAgC;AACtC,SAAK,uBAAuB,CAAC;AAC7B,QAAI,WAAW,KAAK,YAAY;AAChC,WAAO,aAAa,QAAQ,aAAa,UAAU;AACjD,YAAM,OAAoB;AAC1B,UAAI,KAAK,MAAM,aAAa,WAAW;AACrC,aAAK,MAAM,WAAW;AACtB,aAAK,qBAAqB,KAAK,IAAI;AAAA,MACrC;AACA,iBAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,QAAQ,IAAiB;AAC/B,UAAM,MAAM,GAAG,sBAAsB;AACrC,UAAM,UAAU,SAAS;AACzB,WAAO;AAAA,MACL,KAAK,IAAI,MAAM,OAAO,UAAU,QAAQ;AAAA,MACxC,MAAM,IAAI,OAAO,OAAO,UAAU,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA,EACQ,cAAoB;AAC1B,SAAK,cAAc,OAAO;AAC1B,SAAK,eAAe,OAAO;AAC3B,SAAK,UAAU,KAAK,GAAG,aAAa,cAAc,KAAK;AAAA,EACzD;AAAA;AAAA,EAGQ,kBAAwB;AAC9B,SAAK,GAAG,MAAM,YAAY,KAAK,UAAU,SAAS,IAAI;AACtD,SAAK,GAAG,MAAM,WAAW,KAAK,SAAS,SAAS,IAAI;AACpD,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,GAAG,MAAM,aAAa;AAC3B,SAAK,GAAG,MAAM,SAAS,KAAK,iBAAiB;AAC7C,SAAK,GAAG,MAAM,QAAQ,KAAK,gBAAgB;AAC3C,eAAW,MAAM;AAEf,YAAM,oBAAoB,KAAK,QAAQ,KAAK,WAAW;AAEvD,WAAK,GAAG,MAAM,aAAa,UAAU,QAAQ;AAAA,gBACnC,QAAQ;AAAA,eACT,QAAQ;AAAA,cACT,QAAQ;AAAA;AAGhB,WAAK,GAAG,MAAM,SAAS,KAAK,YAAY;AACxC,WAAK,GAAG,MAAM,QAAQ,KAAK,WAAW;AACtC,WAAK,GAAG,MAAM,OACZ,MAAM,sBAAsB,IAC5B,KAAK,cAAc,IACnB,kBAAkB,OAClB,KAAK,WAAW,IAChB;AAEF,WAAK,GAAG,MAAM,MACZ,MAAM,qBAAqB,IAC3B,KAAK,eAAe,IACpB,kBAAkB,MAClB,KAAK,YAAY,IACjB;AAAA,IACJ,GAAG,CAAC;AAEJ,eAAW,MAAM;AACf,WAAK,gBAAgB;AACrB,UAAI,OAAO,KAAK,QAAQ,cAAc,WAAY,MAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,EAAE;AAAA,IAC7F,GAAG,QAAQ;AAAA,EA0Bb;AAAA,EACQ,mBAAyB;AAC/B,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,GAAG,MAAM,aAAa,UAAU,QAAQ;AAAA,cACnC,QAAQ;AAAA,aACT,QAAQ;AAAA,YACT,QAAQ;AAAA;AAGhB,SAAK,GAAG,MAAM,SAAS,KAAK,iBAAiB;AAC7C,SAAK,GAAG,MAAM,QAAQ,KAAK,gBAAgB;AAC3C,SAAK,GAAG,MAAM,OAAO;AACrB,SAAK,GAAG,MAAM,MAAM;AACpB,eAAW,MAAM;AACf,WAAK,YAAY,MAAM,SAAS;AAChC,WAAK,YAAY,MAAM,QAAQ;AAC/B,WAAK,YAAY,MAAM,WAAW;AAClC,WAAK,YAAY,MAAM,MAAM;AAC7B,WAAK,YAAY,MAAM,OAAO;AAE9B,UAAI,KAAK,UAAW,MAAK,GAAG,aAAa,SAAS,KAAK,UAAU,SAAS,CAAC;AAC3E,UAAI,KAAK,WAAY,MAAK,GAAG,aAAa,UAAU,KAAK,WAAW,SAAS,CAAC;AAC9E,WAAK,GAAG,gBAAgB,OAAO;AAC/B,UAAI,KAAK,mBAAoB,MAAK,GAAG,aAAa,SAAS,KAAK,kBAAkB;AAElF,WAAK,GAAG,UAAU,OAAO,QAAQ;AACjC,WAAK,gBAAgB;AAErB,WAAK,qBAAqB,QAAQ,CAAC,cAAe,UAAU,MAAM,WAAW,EAAG;AAEhF,UAAI,OAAO,KAAK,QAAQ,eAAe;AACrC,aAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE;AAAA,IAC9C,GAAG,QAAQ;AAAA,EACb;AAAA;AAAA,EAGQ,cAAoB;AAC1B,SAAK,gBAAgB,SAAS,cAAc,KAAK;AACjD,SAAK,cAAc,UAAU,IAAI,kBAAkB;AACnD,SAAK,cAAc,YAAY,KAAK;AACpC,aAAS,KAAK,OAAO,KAAK,aAAa;AACvC,SAAK,cAAc,MAAM,UAAU;AAEnC,SAAK,cAAc,MAAM,aAAa;AACtC,SAAK,cAAc,MAAM,UAAU;AACnC,UAAM,WAAW,KAAK,QAAQ;AAC9B,eAAW,MAAM;AACf,WAAK,cAAc,MAAM,aAAa,WAAW,QAAQ;AACzD,WAAK,cAAc,MAAM,UAAU;AAAA,IACrC,GAAG,CAAC;AAAA,EACN;AAAA,EACQ,iBAAuB;AAC7B,UAAM,WAAW,KAAK,QAAQ;AAC9B,SAAK,cAAc,MAAM,aAAa,WAAW,QAAQ;AACzD,SAAK,cAAc,MAAM,UAAU;AACnC,eAAW,MAAM;AACf,WAAK,cAAc,OAAO;AAAA,IAC5B,GAAG,QAAQ;AAAA,EACb;AAAA;AAAA,EAGQ,cAAoB;AAC1B,SAAK,WAAW,SAAS,cAAc,KAAK;AAC5C,SAAK,SAAS,KAAK;AACnB,SAAK,SAAS;AAAA,MACZ;AAAA,MACA,MAAM;AACJ,YAAI,KAAK,cAAe,MAAK,MAAM;AAAA,MACrC;AAAA,MACA,EAAE,MAAM,KAAK;AAAA,IACf;AAGA,SAAK,GAAG,OAAO,KAAK,QAAQ;AAG5B,UAAM,gBAAgB,KAAK,SAAS,sBAAsB;AAC1D,SAAK,SAAS,MAAM,QAAQ,KAAK,cAAc;AAC/C,SAAK,SAAS,MAAM,SAAS,KAAK,eAAe;AACjD,SAAK,SAAS,MAAM,OAAO,KAAK,cAAc,OAAO;AACrD,SAAK,SAAS,MAAM,MAAM,KAAK,cAAc,MAAM;AAGnD,SAAK,SAAS,MAAM,aAAa;AACjC,SAAK,SAAS,MAAM,UAAU;AAC9B,UAAM,WAAW,KAAK,QAAQ;AAC9B,eAAW,MAAM;AACf,WAAK,SAAS,MAAM,aAAa,WAAW,QAAQ;AACpD,WAAK,SAAS,MAAM,UAAU;AAAA,IAChC,GAAG,CAAC;AAAA,EACN;AAAA,EACQ,iBAAuB;AAC7B,UAAM,WAAW,KAAK,QAAQ;AAC9B,SAAK,SAAS,MAAM,aAAa,WAAW,QAAQ;AACpD,SAAK,SAAS,MAAM,UAAU;AAC9B,eAAW,MAAM;AACf,WAAK,gBAAgB;AACrB,WAAK,SAAS,OAAO;AAAA,IACvB,GAAG,QAAQ;AAAA,EACb;AAwFF;;;ACjbA,IAAMC,cAAY;AAAA,EAChB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AACb;AA9BA;AAgCO,IAAM,SAAN,MAAM,eAAc,UAAwB;AAAA,EACjD,YAAY,IAAiB,SAAgC;AAC3D,UAAM,IAAI,SAAS,MAAK;AACxB,SAAK,GAAG,kBAAkB,IAAI;AAC9B,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AACA,SAAK,GAAG,WAAW;AACnB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAiC,CAAC,GACjB;AACjB,WAAO,MAAM,KAAK,KAAK,SAAS,MAAK;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY,IAAwB;AACzC,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA,EAEA,UAAU;AAAA,EAAC;AAAA,EACX,sBAAsB;AAAA,EAAC;AAAA,EACvB,uBAAuB;AAAA,EAAC;AAAA,EACxB,sBAAsB;AAAA,EAAC;AAAA,EACvB,sBAAsB;AAAA,EAAC;AAAA,EACvB,yBAAyB;AAAA,EAAC;AAAA,EAC1B,iBAAiB;AAAA,EAAC;AAAA,EAClB,eAAe;AAAA,EAAC;AAAA,EAChB,OAAO;AACL,WAAO;AAAA,EACT;AAAA,EACA,QAAQ;AACN,WAAO;AAAA,EACT;AAAA,EAwBA,OAAO,OAAO,QAAQ;AACpB,UAAM,WAAW;AACjB,QAAI,SAAU,QAAO,sBAAK,8BAAL,WAAiB;AACtC,WAAO,sBAAK,qCAAL,WAAwB;AAAA,EACjC;AAGF;AAzEO;AA8CE,gBAAW,SAAC,QAA2B;AAC5C,QAAM,QAAQ,OAAO,SACjB,OAAO,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,EAAE,UAC7D;AACJ,QAAM,UAAU,OAAO,SACnB,yBAAyB,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,EAAE,YAC/E;AACJ,SAAO,eAAe,OAAO,EAAE;AAAA,QAC3B,KAAK;AAAA,aACA,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,EAAE;AAAA,QAC7D,OAAO;AAAA;AAEb;AAEO,uBAAkB,SAAC,QAA2B;AACnD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,KAAK,OAAO;AACnB,SAAO;AACT;AAhEK,aAAM,QAAN;AAAA,IAAM,QAAN;;;ACrBP,IAAMC,cAA6B;AAAA,EACjC,qBAAqB;AACvB;AAOO,IAAM,WAAN,MAAM,kBAAiB,UAA2B;AAAA,EACvD,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AAC3B,SAAK,GAAG,qBAAqB,IAAI;AAEjC,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,QAAI,CAAC,KAAK,GAAG,cAAc,YAAY,GAAG;AACxC,cAAQ,MAAM,oEAAoE;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAOA;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,SAAK,GAAG,qBAAqB,IAAI;AAAA,EACnC;AACF;;;AC1BA,IAAMC,cAAY;AAAA,EAChB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,kBAAkB;AACpB;AAEO,IAAM,WAAN,MAAM,iBAAgB,UAA0B;AAAA,EAIrD,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,SAAS,QAAO;AAC1B,SAAK,GAAG,oBAAoB,IAAI;AAEhC,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG;AAAA,IACL;AAEA,SAAK,iBAAkB,KAAK,GAAmB;AAC/C,aAAQ,UAAU,KAAK,IAAI;AAC3B,SAAK,oBAAoB;AACzB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAmC,CAAC,GACf;AACrB,WAAO,MAAM,KAAK,KAAK,SAAS,QAAO;AAAA,EACzC;AAAA,EAEA,OAAO,YAAY,IAA0B;AAC3C,WAAO,GAAG,oBAAoB;AAAA,EAChC;AAAA,EAEA,UAAU;AACR,IAAC,KAAK,GAAmB,MAAM,MAAM;AACrC,SAAK,kBAAkB;AAEvB,UAAM,QAAQ,SAAQ,UAAU,QAAQ,IAAI;AAC5C,aAAQ,UAAU,OAAO,OAAO,CAAC;AACjC,QAAI,SAAQ,UAAU,WAAW,GAAG;AAClC,WAAK,qBAAqB;AAAA,IAC5B;AACA,SAAK,GAAG,oBAAoB,IAAI;AAAA,EAClC;AAAA,EAEA,OAAO,kBAAkB;AACvB,aAAS,IAAI,GAAG,IAAI,SAAQ,UAAU,QAAQ,KAAK;AACjD,eAAQ,UAAU,CAAC,EAAE,gBAAgB;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,sBAAsB;AACpB,aAAS,iBAAiB,UAAU,SAAQ,iBAAiB,EAAE,SAAS,KAAK,CAAC;AAAA,EAChF;AAAA,EAEA,uBAAuB;AACrB,aAAS,oBAAoB,UAAU,SAAQ,eAAe;AAAA,EAChE;AAAA,EAEA,kBAAkB;AAChB,UAAM,WAAW,MAAM,qBAAqB,IAAI,KAAK,QAAQ;AAE7D,QACE,KAAK,QAAQ,OAAO,YACpB,KAAK,QAAQ,UAAU,YACvB,CAAC,KAAK,GAAG,UAAU,SAAS,QAAQ,GACpC;AACA,WAAK,kBAAkB;AACvB,MAAC,KAAK,GAAmB,MAAM,MAAM,GAAG,KAAK,QAAQ,MAAM;AAC3D,WAAK,GAAG,UAAU,IAAI,QAAQ;AAG9B,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB,KAAK,MAAM,QAAQ;AAAA,MACnD;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,QAAQ,OAAO,CAAC,KAAK,GAAG,UAAU,SAAS,SAAS,GAAG;AACzE,WAAK,kBAAkB;AACvB,MAAC,KAAK,GAAmB,MAAM,MAAM;AACrC,WAAK,GAAG,UAAU,IAAI,SAAS;AAG/B,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB,KAAK,MAAM,SAAS;AAAA,MACpD;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,QAAQ,UAAU,CAAC,KAAK,GAAG,UAAU,SAAS,YAAY,GAAG;AAC/E,WAAK,kBAAkB;AACvB,WAAK,GAAG,UAAU,IAAI,YAAY;AAClC,MAAC,KAAK,GAAmB,MAAM,MAAM,GAAG,KAAK,QAAQ,SAAS,KAAK,cAAc;AAGjF,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB,KAAK,MAAM,YAAY;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAAoB;AAClB,SAAK,GAAG,UAAU,OAAO,WAAW,UAAU,YAAY;AAAA,EAC5D;AAKF;AAFI,SAAQ,YAAY,CAAC;AA7HlB,IAAM,UAAN;;;ACKP,IAAMC,cAA8B;AAAA,EAClC,UAAU;AAAA,EACV,cAAc;AAAA;AAAA,EACd,aAAa;AAAA,EACb,kBAAkB,CAAC,OAAuB;AACxC,WAAO,cAAc,KAAK;AAAA,EAC5B;AAAA,EACA,sBAAsB;AAAA,EACtB,mBAAmB;AACrB;AAEO,IAAM,aAAN,MAAM,mBAAkB,UAA4B;AAAA,EAkBzD,YAAY,IAAiB,SAAoC;AAC/D,UAAM,IAAI,SAAS,UAAS;AAC5B,SAAK,GAAG,sBAAsB,IAAI;AAElC,SAAK,UAAU;AAAA,MACb,GAAG,WAAU;AAAA,MACb,GAAG;AAAA,IACL;AAEA,eAAU,UAAU,KAAK,IAAI;AAC7B,eAAU;AACV,eAAU;AACV,SAAK,SAAS;AACd,SAAK,KAAK,WAAU,WAAW,SAAS;AACxC,SAAK,oBAAoB;AACzB,eAAU,oBAAoB;AAAA,EAChC;AAAA,EAEA,WAAW,WAA6B;AACtC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAqC,CAAC,GACb;AACzB,WAAO,MAAM,KAAK,KAAK,SAAS,UAAS;AAAA,EAC3C;AAAA,EAEA,OAAO,YAAY,IAA4B;AAC7C,WAAO,GAAG,sBAAsB;AAAA,EAClC;AAAA,EAEA,UAAU;AACR,UAAM,eAAe,WAAU,UAAU,QAAQ,IAAI;AACrD,QAAI,gBAAgB,EAAG,YAAU,UAAU,OAAO,cAAc,CAAC;AACjE,UAAM,cAAc,WAAU,gBAAgB,QAAQ,IAAI;AAC1D,QAAI,eAAe,EAAG,YAAU,gBAAgB,OAAO,aAAa,CAAC;AACrE,UAAM,eAAe,WAAU,iBAAiB,QAAQ,KAAK,EAAE;AAC/D,QAAI,gBAAgB,EAAG,YAAU,iBAAiB,OAAO,cAAc,CAAC;AACxE,eAAU;AACV,SAAK,qBAAqB;AAG1B,UAAM,UAAU,SAAS,cAAc,KAAK,QAAQ,iBAAiB,KAAK,GAAG,EAAE,CAAC;AAChF,aAAS,UAAU,OAAO,KAAK,QAAQ,WAAW;AAClD,SAAK,GAAG,sBAAsB,IAAI;AAAA,EACpC;AAAA,EAEA,sBAAsB;AACpB,QAAI,WAAU,WAAW,GAAG;AAI1B,iBAAU,mBAAmB,MAAM,SAAS,WAAU,qBAAqB,KAAK,QAAQ,QAAQ;AAChG,iBAAU,mBAAmB,MAAM,SAAS,WAAU,qBAAqB,GAAG;AAC9E,aAAO,iBAAiB,UAAU,WAAU,kBAAkB,EAAE,SAAS,KAAK,CAAC;AAC/E,aAAO,iBAAiB,UAAU,WAAU,kBAAkB,EAAE,SAAS,KAAK,CAAC;AAC/E,eAAS,KAAK,iBAAiB,SAAS,WAAU,mBAAmB;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,QAAI,WAAU,WAAW,GAAG;AAC1B,aAAO,oBAAoB,UAAU,WAAU,gBAAgB;AAC/D,aAAO,oBAAoB,UAAU,WAAU,gBAAgB;AAC/D,eAAS,KAAK,oBAAoB,SAAS,WAAU,mBAAmB;AACxE,iBAAU,mBAAmB;AAC7B,iBAAU,mBAAmB;AAAA,IAC/B;AAAA,EACF;AAAA,EA+EA,OAAO,cAAc,KAAa,OAAe,QAAgB,MAA2B;AAC1F,UAAM,OAAO,CAAC;AAGd,UAAM,UAAU,SAAS;AACzB,UAAM,YAAY,QAAQ;AAC1B,UAAM,aAAa,QAAQ;AAC3B,UAAM,UAAU,OAAO;AACvB,UAAM,UAAU,OAAO;AAEvB,aAAS,IAAI,GAAG,IAAI,WAAU,UAAU,QAAQ,KAAK;AACnD,YAAM,YAAY,WAAU,UAAU,CAAC;AACvC,YAAM,UAAU,MAAM,UAAU,QAAQ,gBAAgB;AAMxD,YAAM,MAAM,UAAU,GAAG,sBAAsB;AAC/C,UAAI,IAAI,SAAS,GAAG;AAClB,cAAM,QAAQ,IAAI,MAAM,UAAU,WAChC,SAAS,IAAI,OAAO,UAAU,YAC9B,UAAU,SAAS,IAAI,OACvB,WAAW,QAAQ,IAAI;AAEzB,cAAM,cAAc,EAClB,SAAS,SACT,UAAU,QACV,QAAQ,UACR,WAAW;AAGb,YAAI,aAAa;AACf,eAAK,KAAK,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,eAAU,mBAAmB,WAAU,iBAAiB;AAAA,MACtD,CAAC,UAAU,MAAM,sBAAsB,EAAE,WAAW;AAAA,IACtD;AAEA,QAAI,WAAU,iBAAiB,CAAC,GAAG;AACjC,YAAM,UAAU,SAAS;AAAA,QACvB,KAAK,QAAQ,iBAAiB,WAAU,iBAAiB,CAAC,EAAE,EAAE;AAAA,MAChE;AACA,eAAS,UAAU,OAAO,KAAK,QAAQ,WAAW;AAElD,UACE,WAAU,iBAAiB,CAAC,EAAE,sBAAsB,KACpD,KAAK,KAAK,WAAU,iBAAiB,CAAC,EAAE,sBAAsB,EAAE,IAChE;AACA,mBAAU,iBAAiB,QAAQ,KAAK,EAAE;AAAA,MAC5C,OAAO;AACL,mBAAU,iBAAiB,KAAK,KAAK,EAAE;AAAA,MACzC;AAAA,IACF,OAAO;AACL,iBAAU,iBAAiB,KAAK,KAAK,EAAE;AAAA,IACzC;AACA,eAAU,2BAA2B,KAAK,QAAQ,WAAW;AAC7D,UAAM,WAAW,KAAK,QAAQ,iBAAiB,WAAU,iBAAiB,CAAC,EAAE,EAAE;AAC/E,aAAS,cAAc,QAAQ,GAAG,UAAU,IAAI,KAAK,QAAQ,WAAW;AAAA,EAC1E;AAAA,EAEA,QAAQ;AACN,eAAU,mBAAmB,WAAU,iBAAiB;AAAA,MACtD,CAAC,UAAU,MAAM,sBAAsB,EAAE,WAAW;AAAA,IACtD;AAEA,QAAI,WAAU,iBAAiB,CAAC,GAAG;AACjC,YAAM,UAAU,SAAS;AAAA,QACvB,KAAK,QAAQ,iBAAiB,WAAU,iBAAiB,CAAC,EAAE,EAAE;AAAA,MAChE;AACA,eAAS,UAAU,OAAO,KAAK,QAAQ,WAAW;AAElD,iBAAU,mBAAmB,WAAU,iBAAiB,OAAO,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,EAAE;AAExF,UAAI,WAAU,iBAAiB,CAAC,GAAG;AAEjC,cAAM,WAAW,KAAK,QAAQ,iBAAiB,WAAU,iBAAiB,CAAC,EAAE,EAAE;AAC/E,iBAAS,cAAc,QAAQ,GAAG,UAAU,IAAI,KAAK,QAAQ,WAAW;AACxE,mBAAU,2BAA2B,KAAK,QAAQ,WAAW;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,2BAA2B,aAAqB;AAC7D,QAAI,WAAU,uBAAuB;AACnC,iBAAU,sBAAsB,UAAU,OAAO,WAAW;AAC5D,iBAAU,wBAAwB;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAe,uBAAuB,SAAS;AAC7C,UAAM,OAAO,QAAQ,sBAAsB;AAC3C,UAAM,WAAW,KAAK;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,sBAAsB,SAAS,WAAW,KAAK;AAC5D,UAAM,iBACJ,QAAQ,sBAAsB,EAAE,OAAO,OAAO,WAAW,OAAO;AAClE,UAAM,gBAAgB,OAAO,WAAW,OAAO;AAC/C,UAAM,WAAW,iBAAiB;AAClC,UAAM,YAAY,YAAY,IAAI;AAElC,aAAS,WAAW,aAAa;AAC/B,YAAM,UAAU,cAAc;AAC9B,YAAM,WAAW,KAAK,IAAI,UAAU,UAAU,CAAC;AAC/C,YAAM,UAAU,gBAAgB,WAAW;AAE3C,UAAI,WAAW,GAAG;AAChB,eAAO,SAAS,GAAG,OAAO;AAC1B,8BAAsB,UAAU;AAAA,MAClC,OAAO;AACL,eAAO,SAAS,GAAG,cAAc;AAAA,MACnC;AAAA,IACF;AACA,0BAAsB,UAAU;AAAA,EAClC;AAUF;AA5Ta,WAOJ,wBAA4C;AAAA;AAAA;AAAA;AAAA;AAPxC,WAYI,mBAAiD;AAZrD,WAaI,mBAAiD;AAbrD,WA2GJ,sBAAsB,CAAC,MAAkB;AAC9C,QAAM,UAAU,EAAE;AAClB,WAAS,IAAI,WAAU,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;AACxD,UAAM,YAAY,WAAU,UAAU,CAAC;AACvC,UAAM,IAAI,SAAS,cAAc,cAAc,UAAU,GAAG,KAAK,IAAI;AACrE,QAAI,YAAY,GAAG;AACjB,QAAE,eAAe;AAEjB,UAAI,UAAU,GAAG,sBAAsB,EAAE,QAAQ,mBAAmB;AAClE,mBAAU;AAAA,UACR,UAAU;AAAA,UACV,UAAU,GAAG,sBAAsB,EAAE,QAAQ;AAAA,QAC/C;AAAA,MACF,OAAO;AACL,kBAAU,GAAG,eAAe,EAAE,UAAU,SAAS,CAAC;AAAA,MACpD;AACA;AAAA,IACF;AAAA,EACF;AACF;AA9HW,WAgIJ,sBAAsB,MAAM;AAEjC,aAAU;AAGV,QAAM,MAAM,MAAM,qBAAqB,GACrC,OAAO,MAAM,sBAAsB,GACnC,QAAQ,OAAO,OAAO,YACtB,SAAS,MAAM,OAAO;AAGxB,QAAM,gBAAgB,WAAU,cAAc,KAAK,OAAO,QAAQ,IAAI;AACtE,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAM,YAAY,cAAc,CAAC;AACjC,UAAM,WAAW,UAAU;AAC3B,QAAI,WAAW,GAAG;AAEhB,gBAAU,OAAO;AAAA,IACnB;AAGA,cAAU,SAAS,WAAU;AAAA,EAC/B;AAEA,WAAS,IAAI,GAAG,IAAI,WAAU,gBAAgB,QAAQ,KAAK;AACzD,UAAM,YAAY,WAAU,gBAAgB,CAAC;AAC7C,UAAM,WAAW,UAAU;AAC3B,QAAI,YAAY,KAAK,aAAa,WAAU,QAAQ;AAElD,gBAAU,MAAM;AAChB,gBAAU,SAAS;AAAA,IACrB;AAAA,EACF;AAEA,aAAU,kBAAkB;AAC5B,MAAI,WAAU,UAAU,QAAQ;AAC9B,UAAM,UAAU,WAAU,UAAU,CAAC,EAAE,GAAG,sBAAsB,EAAE;AAClE,QAAI,QAAQ,wBAAwB,WAAU,iBAAiB,WAAW,GAAG;AAC3E,iBAAU,2BAA2B,QAAQ,WAAW;AAGxD,YAAM,cAAc,WAAU,UAC3B,IAAI,CAAC,WAAW,EAAE,OAAO,UAAU,WAAU,uBAAuB,MAAM,EAAE,EAAE,EAAE,EAChF,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,EACtC,IAAI,CAAC,UAAU,MAAM,KAAK;AAC7B,YAAM,oBAAoB,YAAY,SAClC,YAAY,YAAY,SAAS,CAAC,IAClC,WAAU,UAAU,CAAC;AACzB,YAAM,UAAU,SAAS,cAAc,QAAQ,iBAAiB,kBAAkB,GAAG,EAAE,CAAC;AACxF,eAAS,UAAU,IAAI,QAAQ,WAAW;AAC1C,iBAAU,wBAAwB;AAAA,IACpC;AAAA,EACF;AACF;AA+HE,WAAU,YAAY,CAAC;AACvB,WAAU,kBAAkB,CAAC;AAC7B,WAAU,mBAAmB,CAAC;AAC9B,WAAU,SAAS;AACnB,WAAU,aAAa;AACvB,WAAU,SAAS;AA1ThB,IAAM,YAAN;;;ACAP,IAAMC,cAA4B;AAAA,EAChC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,kBAAkB;AACpB;AAEO,IAAM,WAAN,MAAM,iBAAgB,UAA8C;AAAA,EAuBzE,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,SAAS,QAAO;AA2J5B,SAAQ,wBAAwB,CAAC,MAAM;AAErC,UAAI,CAAC,KAAK,aAAa,EAAG;AAC1B,UAAI,cAAc,KAAK,gBAAgB,CAAC;AACxC,YAAM,gBAAgB,cAAc,IAAI,UAAU;AAElD,oBAAc,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,WAAW,CAAC;AACzD,UAAI,KAAK,QAAQ,SAAS,eAAe;AACvC,sBAAc;AAAA,MAChB;AAMA,UAAI,aAAa;AACjB,UAAI,kBAAkB;AACtB,UAAI,KAAK,QAAQ,SAAS,SAAS;AACjC,0BAAkB;AAClB,qBAAa,CAAC;AAAA,MAChB;AAEA,WAAK,cAAc,KAAK,IAAI,GAAG,cAAc,KAAK,MAAM;AAExD,WAAK,GAAG,MAAM,YAAY,GAAG,eAAe,eAAe,UAAU;AACrE,WAAK,SAAS,MAAM,UAAU,KAAK,YAAY,SAAS;AAAA,IAC1D;AAEA,SAAQ,2BAA2B,MAAM;AACvC,UAAI,KAAK,WAAW;AAClB,YAAI,KAAK,cAAc,KAAK;AAC1B,eAAK,KAAK;AAAA,QACZ,OAAO;AACL,eAAK,YAAY;AAAA,QACnB;AACA,aAAK,YAAY;AACjB,aAAK,uBAAuB;AAAA,MAC9B;AAAA,IACF;AAEA,SAAQ,mBAAmB,CAAC,MAAM;AAEhC,UAAI,CAAC,KAAK,UAAU,CAAC,KAAK,aAAa,EAAG;AAC1C,UAAI,cAAc,KAAK,gBAAgB,CAAC;AAExC,YAAM,gBAAgB,cAAc,IAAI,UAAU;AAClD,oBAAc,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,WAAW,CAAC;AACzD,UAAI,KAAK,QAAQ,SAAS,eAAe;AACvC,sBAAc;AAAA,MAChB;AACA,UAAI,aAAa,CAAC;AAClB,UAAI,KAAK,QAAQ,SAAS,SAAS;AACjC,qBAAa,CAAC;AAAA,MAChB;AAEA,WAAK,cAAc,KAAK,IAAI,GAAG,IAAI,cAAc,KAAK,MAAM;AAE5D,WAAK,GAAG,MAAM,YAAY,cAAc,UAAU;AAClD,WAAK,SAAS,MAAM,UAAU,KAAK,YAAY,SAAS;AAAA,IAC1D;AAEA,SAAQ,kBAAkB,CAAC,MAAM;AAE/B,UAAI,CAAC,KAAK,WAAW;AACnB,aAAK,WAAW,CAAC;AAAA,MACnB;AAEA,WAAK,gBAAgB,CAAC;AAEtB,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,KAAK,UAAU,KAAK,WAAW;AACjC,YAAI,KAAK,cAAc,KAAK;AAC1B,eAAK,WAAW;AAAA,QAClB,OAAO;AACL,eAAK,MAAM;AAAA,QACb;AACA,aAAK,YAAY;AACjB,aAAK,uBAAuB;AAAA,MAC9B;AAAA,IACF;AAGA;AAAA,SAAQ,2BAA2B,CAAC,MAAM;AACxC,YAAM,eAAe,EAAE,OAAO,QAAQ,gBAAgB;AACtD,UAAI,gBAAgB,CAAC,KAAK,kBAAkB,GAAG;AAC7C,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,SAAQ,sBAAsB,MAAM;AAElC,UAAI,KAAK,oBAAoB,OAAO,YAAY;AAC9C,YAAI,OAAO,aAAa,KAAK;AAC3B,eAAK,KAAK;AAAA,QACZ,OAAO;AACL,eAAK,MAAM;AAAA,QACb;AAAA,MACF;AACA,WAAK,kBAAkB,OAAO;AAC9B,WAAK,mBAAmB,OAAO;AAAA,IACjC;AA6CA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,KAAK,WAAW,KAAM;AAC1B,WAAK,SAAS;AAEd,UAAI,OAAO,KAAK,QAAQ,gBAAgB,YAAY;AAClD,aAAK,QAAQ,YAAY,KAAK,MAAM,KAAK,EAAE;AAAA,MAC7C;AAEA,UAAI,KAAK,kBAAkB,GAAG;AAE5B,aAAK,GAAG,MAAM,YAAY;AAC1B,aAAK,qBAAqB;AAC1B,aAAK,SAAS,MAAM,UAAU;AAAA,MAChC,OAEK;AACH,YAAI,KAAK,QAAQ,iBAAkB,MAAK,sBAAsB;AAC9D,YAAI,CAAC,KAAK,aAAa,KAAK,eAAe,EAAG,MAAK,WAAW;AAE9D,aAAK,eAAe;AACpB,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,KAAK,WAAW,MAAO;AAC3B,WAAK,SAAS;AAEd,UAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,aAAK,QAAQ,aAAa,KAAK,MAAM,KAAK,EAAE;AAAA,MAC9C;AAEA,UAAI,KAAK,kBAAkB,GAAG;AAC5B,cAAM,aAAa,KAAK,QAAQ,SAAS,SAAS,UAAU;AAC5D,aAAK,GAAG,MAAM,YAAY,cAAc,UAAU;AAAA,MACpD,OAEK;AACH,aAAK,qBAAqB;AAC1B,YAAI,CAAC,KAAK,aAAa,KAAK,eAAe,GAAG;AAC5C,eAAK,YAAY;AAAA,QACnB,OAAO;AACL,eAAK,SAAS,MAAM,UAAU;AAAA,QAChC;AAEA,aAAK,eAAe;AACpB,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAmFA,SAAQ,iBAAiB,MAAM;AAC7B,WAAK,GAAG,aAAa,KAAK,SAAS,UAAU;AAC7C,YAAM,aAAa,SAAS,cAAc,iBAAiB;AAC3D,UAAI,WAAY,YAAW,aAAa,KAAK,OAAO,SAAS;AAAA,IAC/D;AAEA,SAAQ,eAAe,MAAM;AAC3B,YAAM,WAAW,SAAS,iBAAiB,sBAAsB;AACjE,YAAM,eAAe,SAAS,iBAAiB,eAAe;AAC9D,UAAI;AACF,iBAAS,QAAQ,CAAC,YAA+B;AAC/C,kBAAQ,WAAW,KAAK,SAAS,KAAK;AAAA,QACxC,CAAC;AACH,UAAI;AACF,qBAAa,QAAQ,CAAC,gBAAmC;AACvD,sBAAY,WAAW,KAAK,SAAS,IAAI;AAAA,QAC3C,CAAC;AAAA,IACL;AArcE,SAAK,GAAG,oBAAoB,IAAI;AAEhC,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG;AAAA,IACL;AAEA,SAAK,KAAK,KAAK,GAAG;AAClB,SAAK,SAAS;AACd,SAAK,UAAU,KAAK,GAAG,UAAU,SAAS,eAAe;AACzD,SAAK,YAAY;AAEjB,SAAK,kBAAkB,OAAO;AAC9B,SAAK,mBAAmB,OAAO;AAC/B,SAAK,eAAe;AACpB,SAAK,kBAAkB;AACvB,SAAK,oBAAoB;AACzB,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,aAAQ,UAAU,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAmC,CAAC,GACf;AACrB,WAAO,MAAM,KAAK,KAAK,SAAS,QAAO;AAAA,EACzC;AAAA,EAEA,OAAO,YAAY,IAA0B;AAC3C,WAAO,GAAG,oBAAoB;AAAA,EAChC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,SAAS,WAAW,YAAY,KAAK,QAAQ;AAClD,SAAK,WAAW,WAAW,YAAY,KAAK,UAAU;AACtD,SAAK,GAAG,oBAAoB,IAAI;AAChC,SAAK,GAAG,MAAM,YAAY;AAC1B,UAAM,QAAQ,SAAQ,UAAU,QAAQ,IAAI;AAC5C,QAAI,SAAS,GAAG;AACd,eAAQ,UAAU,OAAO,OAAO,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,SAAK,WAAW,SAAS,cAAc,KAAK;AAC5C,SAAK,SAAS,UAAU,IAAI,iBAAiB;AAC7C,SAAK,SAAS,iBAAiB,SAAS,KAAK,KAAK;AAClD,aAAS,KAAK,YAAY,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,SAAQ,UAAU,WAAW,GAAG;AAClC,eAAS,KAAK,iBAAiB,SAAS,KAAK,mBAAmB;AAAA,IAClE;AAGA,UAAM,UAAU,EAAE,SAAS,KAAK;AAChC,SAAK,WAAW,iBAAiB,aAAa,KAAK,uBAAuB,OAAO;AACjF,SAAK,WAAW,iBAAiB,YAAY,KAAK,wBAAwB;AAC1E,SAAK,SAAS,iBAAiB,aAAa,KAAK,kBAAkB,OAAO;AAC1E,SAAK,SAAS,iBAAiB,YAAY,KAAK,mBAAmB;AACnE,SAAK,GAAG,iBAAiB,aAAa,KAAK,kBAAkB,OAAO;AACpE,SAAK,GAAG,iBAAiB,YAAY,KAAK,mBAAmB;AAC7D,SAAK,GAAG,iBAAiB,SAAS,KAAK,wBAAwB;AAE/D,QAAI,KAAK,SAAS;AAChB,aAAO,iBAAiB,UAAU,KAAK,qBAAqB,OAAO;AAAA,IACrE;AAEA,SAAK,eAAe;AACpB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,SAAQ,UAAU,WAAW,GAAG;AAClC,eAAS,KAAK,oBAAoB,SAAS,KAAK,mBAAmB;AAAA,IACrE;AACA,SAAK,WAAW,oBAAoB,aAAa,KAAK,qBAAqB;AAC3E,SAAK,WAAW,oBAAoB,YAAY,KAAK,wBAAwB;AAC7E,SAAK,SAAS,oBAAoB,aAAa,KAAK,gBAAgB;AACpE,SAAK,SAAS,oBAAoB,YAAY,KAAK,mBAAmB;AACtE,SAAK,GAAG,oBAAoB,aAAa,KAAK,gBAAgB;AAC9D,SAAK,GAAG,oBAAoB,YAAY,KAAK,mBAAmB;AAChE,SAAK,GAAG,oBAAoB,SAAS,KAAK,wBAAwB;AAGlE,QAAI,KAAK,SAAS;AAChB,aAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,oBAAoB,GAAG;AAC7B,UAAM,UAAU,EAAE,OAAO,QAAQ,kBAAkB;AACnD,QAAI,EAAE,UAAU,SAAS;AACvB,YAAM,YAAY,MAAM,iBAAiB,OAAO;AAEhD,YAAM,kBAAkB,SAAS,eAAe,SAAS,IAAI,oBAAoB;AACjF,UAAI,iBAAiB;AACnB,wBAAgB,KAAK;AAAA,MACvB;AACA,QAAE,eAAe;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGQ,WAAW,GAAG;AACpB,UAAM,UAAU,EAAE,cAAc,CAAC,EAAE;AACnC,SAAK,YAAY;AACjB,SAAK,gBAAgB;AACrB,SAAK,QAAQ,KAAK;AAClB,SAAK,QAAQ,KAAK,IAAI;AACtB,SAAK,SAAS,KAAK,GAAG,sBAAsB,EAAE;AAC9C,SAAK,SAAS,MAAM,UAAU;AAC9B,SAAK,oBAAoB,KAAK,SAAS,KAAK,GAAG,YAAY,MAAM,qBAAqB;AACtF,SAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA,EAGQ,gBAAgB,GAAG;AACzB,UAAM,UAAU,EAAE,cAAc,CAAC,EAAE;AACnC,UAAM,mBAAmB,KAAK,SAAS,KAAK,GAAG,YAAY,MAAM,qBAAqB;AACtF,SAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,OAAO;AAC3C,SAAK,QAAQ;AACb,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI,IAAI,KAAK;AAClD,SAAK,QAAQ,KAAK,IAAI;AACtB,QAAI,KAAK,sBAAsB,kBAAkB;AAC/C,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA,EA2GQ,gBAAgB;AACtB,QAAI,KAAK,QAAQ,SAAS,SAAS;AACjC,WAAK,GAAG,UAAU,IAAI,eAAe;AACrC,WAAK,WAAW,UAAU,IAAI,eAAe;AAAA,IAC/C;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,SAAK,GAAG,UAAU,OAAO,eAAe;AACxC,SAAK,WAAW,UAAU,OAAO,eAAe;AAAA,EAClD;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,kBAAkB,EAAG,MAAK,KAAK;AAAA,EAC1C;AAAA,EAEQ,eAAe;AACrB,WAAO,KAAK,QAAQ,aAAa,CAAC,KAAK,kBAAkB,KAAK,CAAC,KAAK;AAAA,EACtE;AAAA,EAEQ,oBAAoB;AAC1B,WAAO,KAAK,WAAW,OAAO,aAAa;AAAA,EAC7C;AAAA,EAEQ,oBAAoB;AAC1B,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAW,UAAU,IAAI,aAAa;AACtC,eAAW,MAAM,QAAQ,KAAK,QAAQ;AACtC,aAAS,KAAK,YAAY,UAAU;AACpC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,wBAAwB;AAC9B,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA,EAEQ,uBAAuB;AAC7B,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA,EA0DQ,aAAa;AACnB,SAAK,kBAAkB;AACvB,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,cAAc;AACpB,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,kBAAkB,KAAK,QAAQ,SAAS,SAAS,KAAK;AAC1D,QAAI,KAAK,WAAW;AAClB,wBACE,KAAK,QAAQ,SAAS,SAClB,kBAAkB,KAAK,cACvB,kBAAkB,KAAK;AAAA,IAC/B;AACA,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,GAAG,MAAM,aAAa;AAC3B,SAAK,GAAG,MAAM,YAAY,gBAAgB,kBAAkB,MAAM;AAClE,eAAW,MAAM;AACf,WAAK,GAAG,MAAM,aAAa,aAAa,QAAQ;AAEhD,WAAK,GAAG,MAAM,YAAY;AAAA,IAC5B,GAAG,CAAC;AACJ,eAAW,MAAM;AACf,UAAI,OAAO,KAAK,QAAQ,cAAc,WAAY,MAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,EAAE;AAAA,IAC7F,GAAG,QAAQ;AAAA,EACb;AAAA,EAEQ,qBAAqB;AAC3B,UAAM,aAAa,KAAK,QAAQ,SAAS,SAAS,KAAK;AAUvD,UAAM,WAAW,KAAK,QAAQ;AAC9B,SAAK,GAAG,MAAM,aAAa,aAAa,QAAQ;AAEhD,SAAK,GAAG,MAAM,YAAY,gBAAgB,aAAa,MAAM;AAC7D,eAAW,MAAM;AACf,UAAI,OAAO,KAAK,QAAQ,eAAe;AACrC,aAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE;AAAA,IAC9C,GAAG,QAAQ;AAAA,EACb;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,QAAQ;AACZ,QAAI,KAAK,UAAW,SAAQ,KAAK;AAAA,QAC5B,MAAK,SAAS,MAAM,UAAU;AAEnC,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,SAAS,MAAM,aAAa;AACjC,SAAK,SAAS,MAAM,UAAU,MAAM,SAAS;AAE7C,eAAW,MAAM;AACf,WAAK,SAAS,MAAM,aAAa,WAAW,QAAQ;AAEpD,WAAK,SAAS,MAAM,UAAU;AAAA,IAChC,GAAG,CAAC;AAAA,EACN;AAAA,EAEQ,qBAAqB;AAC3B,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,SAAS,MAAM,aAAa,WAAW,QAAQ;AAEpD,SAAK,SAAS,MAAM,UAAU;AAC9B,eAAW,MAAM;AACf,WAAK,SAAS,MAAM,UAAU;AAAA,IAChC,GAAG,QAAQ;AAAA,EACb;AAwBF;AAFI,SAAQ,YAAY,CAAC;AAjelB,IAAM,UAAN;;;ACrBP,IAAMC,cAA2B;AAAA,EAC/B,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,oBAAoB;AAAA;AACtB;AAEO,IAAM,SAAN,MAAM,gBAAe,UAAyB;AAAA,EAcnD,YAAY,IAAiB,SAAiC;AAC5D,UAAM,IAAI,SAAS,OAAM;AAwJ3B;AAAA;AAAA;AAAA,SAAQ,0BAA0B,MAAM;AACtC,UAAI,SAAS,QAAQ;AACnB,YAAI,KAAK,YAAY,KAAM,MAAK,OAAO,IAAI;AAAA,MAC7C,WACE,KAAK,cACL,EAAE,KAAK,QAAQ,gBAAgB,KAAK,aACpC,EAAE,KAAK,QAAQ,gBAAgB,KAAK,WACpC;AACA,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,SAAQ,wBAAwB,CAAC,MAAkB;AACjD,YAAM,KAAmB,EAAE,OAAQ;AACnC,YAAM,YAAY,CAAC,GAAG,GAAG,WAAW,QAAQ,EAAE,QAAQ,EAAE;AACxD,WAAK,gBAAgB;AACrB,WAAK,IAAI,SAAS;AAAA,IACpB;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,KAAK,YAAY,MAAM;AACzB,aAAK,OAAO,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,KAAK,YAAY,MAAM;AACzB,aAAK,OAAO,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,EAAE,KAAK,QAAQ,gBAAgB,KAAK,aAAa,KAAK,YAAY;AACpE,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,EAAE,KAAK,QAAQ,gBAAgB,KAAK,aAAa,KAAK,YAAY;AACpE,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,SAAQ,kBAAkB,MAAM;AAC9B,YAAM,aAAa,KAAK,QAAQ,cAAc,SAAS;AACvD,UAAI,iBAAiB,CAAC,GAAG,WAAW,WAAW,QAAQ,EAAE,QAAQ,UAAU;AAC3E,UAAI,KAAK,QAAQ,WAAW,iBAAiB;AAC3C,yBAAiB;AAAA,UACd,mBAAkB;AACvB,WAAK,IAAI,cAAc;AAAA,IACzB;AA+IA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,WAAK,OAAO,KAAK;AAAA,IACnB;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,oBAAc,KAAK,QAAQ;AAC3B,WAAK,WAAW;AAAA,QACd,KAAK;AAAA,QACL,KAAK,QAAQ,WAAW,KAAK,QAAQ;AAAA,MACvC;AACA,WAAK,aAAa;AAAA,IACpB;AAKA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,WAAW,KAAK,cAAc;AAElC,UAAI,YAAY,KAAK,QAAQ,OAAQ,YAAW;AAAA,eACvC,WAAW,EAAG,YAAW,KAAK,QAAQ,SAAS;AACxD,WAAK,IAAI,QAAQ;AAAA,IACnB;AAKA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,WAAW,KAAK,cAAc;AAElC,UAAI,YAAY,KAAK,QAAQ,OAAQ,YAAW;AAAA,eACvC,WAAW,EAAG,YAAW,KAAK,QAAQ,SAAS;AACxD,WAAK,IAAI,QAAQ;AAAA,IACnB;AAhYE,SAAK,GAAG,mBAAmB,IAAI;AAE/B,SAAK,UAAU;AAAA,MACb,GAAG,QAAO;AAAA,MACV,GAAG;AAAA,IACL;AAGA,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,gBAAgB;AAGrB,SAAK,UAAU,KAAK,GAAG,cAAc,SAAS;AAC9C,SAAK,UAAU,MAAM,KAAK,KAAK,QAAQ,iBAAiB,IAAI,CAAC;AAC7D,SAAK,cAAc,KAAK,QAAQ,UAAU,CAAC,OAAO,GAAG,UAAU,SAAS,QAAQ,CAAC;AAEjF,QAAI,KAAK,gBAAgB,IAAI;AAC3B,WAAK,eAAe,KAAK,QAAQ,KAAK,WAAW;AAAA,IACnD;AAEA,SAAK,iBAAiB;AAGtB,QAAI,KAAK,QAAQ,aAAa,IAAI,EAAG,MAAK,YAAY,KAAK,QAAQ,aAAa,IAAI;AAAA,SAC/E;AACH,WAAK,YAAY,YAAY,MAAM,KAAK;AACxC,WAAK,QAAQ,aAAa,MAAM,KAAK,SAAS;AAAA,IAChD;AAEA,UAAM,oBACJ;AAEF,SAAK,QAAQ,QAAQ,CAAC,UAAU;AAK9B,YAAM,MAAM,MAAM,cAAc,KAAK;AACrC,UAAI,KAAK;AACP,YAAI,IAAI,QAAQ,mBAAmB;AACjC,cAAI,MAAM,kBAAkB,SAAS,IAAI,MAAM;AAC/C,cAAI,MAAM;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,CAAC,MAAM,aAAa,UAAU,EAAG,OAAM,aAAa,YAAY,IAAI;AAExE,YAAM,MAAM,aAAa;AAAA,IAC3B,CAAC;AAED,SAAK,iBAAiB;AAGtB,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,MAAM,UAAU;AAClC,WAAK,aAAa,MAAM,aAAa;AAAA,IACvC,OAAO;AACL,WAAK,cAAc;AACnB,WAAK,QAAQ,CAAC,EAAE,UAAU,IAAI,QAAQ;AACtC,WAAK,QAAQ,CAAC,EAAE,MAAM,aAAa;AACnC,WAAK,eAAe,KAAK,QAAQ,CAAC;AAClC,WAAK,cAAc,KAAK,QAAQ,CAAC,GAAG,IAAI;AAExC,UAAI,KAAK,QAAQ,YAAY;AAC3B,aAAK,YAAY,KAAK,WAAW,EAAE,SAAS,CAAC,EAAE,UAAU,IAAI,QAAQ;AAAA,MACvE;AAAA,IACF;AACA,SAAK,oBAAoB;AAEzB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAkC,CAAC,GAChB;AACnB,WAAO,MAAM,KAAK,KAAK,SAAS,OAAM;AAAA,EACxC;AAAA,EAEA,OAAO,YAAY,IAAyB;AAC1C,WAAO,GAAG,mBAAmB;AAAA,EAC/B;AAAA,EAEA,UAAU;AACR,SAAK,MAAM;AACX,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,mBAAmB,IAAI;AAAA,EACjC;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,iBAAiB,WAAW,KAAK,qBAAqB;AAC9D,WAAK,GAAG,iBAAiB,YAAY,KAAK,qBAAqB;AAAA,IACjE;AACA,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,iBAAiB,cAAc,KAAK,qBAAqB;AACjE,WAAK,GAAG,iBAAiB,cAAc,KAAK,qBAAqB;AAAA,IACnE;AACA,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,YAAY,QAAQ,CAAC,OAAO;AAC/B,WAAG,iBAAiB,SAAS,KAAK,qBAAqB;AAAA,MACzD,CAAC;AAAA,IACH;AACA,aAAS,iBAAiB,oBAAoB,KAAK,uBAAuB;AAAA,EAC5E;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,oBAAoB,WAAW,KAAK,qBAAqB;AACjE,WAAK,GAAG,oBAAoB,YAAY,KAAK,qBAAqB;AAAA,IACpE;AACA,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,oBAAoB,cAAc,KAAK,qBAAqB;AACpE,WAAK,GAAG,oBAAoB,cAAc,KAAK,qBAAqB;AAAA,IACtE;AACA,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,YAAY,QAAQ,CAAC,OAAO;AAC/B,WAAG,oBAAoB,SAAS,KAAK,qBAAqB;AAAA,MAC5D,CAAC;AAAA,IACH;AACA,aAAS,oBAAoB,oBAAoB,KAAK,uBAAuB;AAAA,EAC/E;AAAA,EA6DQ,cAAc,OAAoB,eAA8B;AACtE,QAAI,KAAK,GACP,KAAK;AAEP,UAAM,MAAM,UAAU,gBAAgB,MAAM;AAC5C,eAAW,MAAM;AACf,YAAM,MAAM,aAAa,WAAW,KAAK,QAAQ,QAAQ;AAEzD,YAAM,MAAM,UAAU,gBAAgB,MAAM;AAAA,IAC9C,GAAG,CAAC;AAEJ,UAAM,UAAuB,MAAM,cAAc,UAAU;AAC3D,QAAI,CAAC,QAAS;AACd,QAAI,QAAQ,UAAU,SAAS,cAAc,EAAG,MAAK;AAAA,aAC5C,QAAQ,UAAU,SAAS,aAAa,EAAG,MAAK;AAAA,aAChD,QAAQ,UAAU,SAAS,YAAY,EAAG,MAAK;AAExD,YAAQ,MAAM,UAAU,gBAAgB,MAAM;AAC9C,YAAQ,MAAM,YAAY,gBAAgB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAC1E,eAAW,MAAM;AACf,cAAQ,MAAM,aAAa,WAAW,KAAK,QAAQ,QAAQ,sBAAsB,KAAK,QAAQ,QAAQ;AAEtG,cAAQ,MAAM,UAAU,gBAAgB,MAAM;AAC9C,cAAQ,MAAM,YAAY,gBAAgB,oBAAoB,aAAa,EAAE,OAAO,EAAE;AAAA,IACxF,GAAG,KAAK,QAAQ,QAAQ;AAAA,EAC1B;AAAA,EAEQ,mBAAmB;AAEzB,QAAI,CAAC,KAAK,GAAG,UAAU,SAAS,YAAY,GAAG;AAC7C,UAAI,KAAK,QAAQ,YAAY;AAE3B,aAAK,GAAG,MAAM,SAAS,KAAK,QAAQ,SAAS,KAAK;AAAA,MACpD,OAAO;AACL,aAAK,GAAG,MAAM,SAAS,KAAK,QAAQ,SAAS;AAAA,MAC/C;AACA,WAAK,QAAQ,MAAM,SAAS,KAAK,QAAQ,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,mBAAmB;AACzB,QAAI,KAAK,QAAQ,YAAY;AAC3B,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,UAAU,IAAI,YAAY;AAE7B,YAAM,QAAQ,CAAC;AACf,WAAK,QAAQ,QAAQ,CAAC,IAAI,MAAM;AAC9B,cAAM,QAAQ,KAAK,QAAQ,qBACvB,KAAK,QAAQ,mBAAmB,KAAK,MAAM,IAAI,GAAG,MAAM,CAAC,IACzD,GAAG,IAAI,CAAC;AACZ,cAAM,KAAK,SAAS,cAAc,IAAI;AACtC,WAAG,UAAU,IAAI,gBAAgB;AAGjC,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,OAAO;AACd,eAAO,UAAU,IAAI,oBAAoB;AACzC,eAAO,aAAa,cAAc,KAAK;AACvC,eAAO,aAAa,iBAAiB,KAAK,SAAS;AACnD,WAAG,YAAY,MAAM;AACrB,cAAM,KAAK,EAAE;AACb,WAAG,OAAO,EAAE;AAAA,MACd,CAAC;AAED,WAAK,GAAG,OAAO,EAAE;AACjB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,GAAG,cAAc,eAAe,EAAE,OAAO;AAAA,EAChD;AAAA,EAEA,IAAI,OAAe;AAEjB,QAAI,SAAS,KAAK,QAAQ,OAAQ,SAAQ;AAAA,aACjC,QAAQ,EAAG,SAAQ,KAAK,QAAQ,SAAS;AAGlD,QAAI,KAAK,gBAAgB,MAAO;AAEhC,SAAK,eAAe,KAAK,QAAQ,KAAK,WAAW;AACjD,UAAM,WAA+B,KAAK,aAAa,cAAc,UAAU;AAE/E,SAAK,aAAa,UAAU,OAAO,QAAQ;AAE3C,SAAK,QAAQ,QAAQ,CAAC,UAAW,MAAM,MAAM,aAAa,SAAU;AAGpE,SAAK,aAAa,MAAM,UAAU;AAClC,eAAW,MAAM;AACf,WAAK,QAAQ,QAAQ,CAAC,UAAU;AAC9B,YAAI,MAAM,UAAU,SAAS,QAAQ,EAAG;AACxC,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,YAAY;AAExB,cAAM,MAAM,aAAa;AAAA,MAC3B,CAAC;AAAA,IACH,GAAG,KAAK,QAAQ,QAAQ;AAIxB,QAAI,SAAU,UAAS,MAAM,UAAU;AAGvC,QAAI,KAAK,QAAQ,YAAY;AAC3B,YAAM,kBAAkB,KAAK,YAAY,KAAK,WAAW,EAAE,SAAS,CAAC;AACrE,YAAM,gBAAgB,KAAK,YAAY,KAAK,EAAE,SAAS,CAAC;AACxD,sBAAgB,UAAU,OAAO,QAAQ;AACzC,oBAAc,UAAU,IAAI,QAAQ;AACpC,UAAI,OAAO,KAAK,QAAQ,uBAAuB,YAAY;AACzD,wBAAgB,YAAY,KAAK,QAAQ,mBAAmB;AAAA,UAC1D;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QACF;AACA,sBAAc,YAAY,KAAK,QAAQ,mBAAmB,KAAK,MAAM,OAAO,IAAI;AAAA,MAClF;AAAA,IACF;AAGA,SAAK,cAAc,KAAK,QAAQ,KAAK,GAAG,IAAI;AAC5C,SAAK,QAAQ,KAAK,EAAE,UAAU,IAAI,QAAQ;AAC1C,SAAK,cAAc;AAInB,QAAI,KAAK,YAAY,MAAM;AACzB,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,OAAO,WAAoB;AACzB,kBAAc,KAAK,QAAQ;AAC3B,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,EAClB;AA0CF;;;AC3aA,IAAMC,cAAyB;AAAA,EAC7B,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,qBAAqB;AAAA;AACvB;AAEO,IAAM,OAAN,MAAM,cAAa,UAAuB;AAAA,EAU/C,YAAY,IAAiB,SAA+B;AAC1D,UAAM,IAAI,SAAS,KAAI;AAkFzB,+BAAsB,MAAM;AAC1B,WAAK,oBAAoB;AACzB,UAAI,KAAK,cAAc,KAAK,KAAK,eAAe,GAAG;AACjD,aAAK,WAAW,MAAM,OAAO,KAAK,aAAa,KAAK,cAAc,IAAI;AACtE,aAAK,WAAW,MAAM,QAAQ,KAAK,cAAc,KAAK,cAAc,IAAI;AAAA,MAC1E;AAAA,IACF;AAQA,2BAAkB,CAAC,MAAkB;AACnC,YAAM,SAAS,EAAE;AACjB,UAAI,CAAC,OAAQ;AACb,YAAM,UAAU,OAAO,QAAQ,GAAG;AAClC,UAAI,CAAC,WAAW,CAAC,MAAM,KAAK,KAAK,SAAS,EAAE,SAAS,OAAO,EAAG;AAE/D,YAAM,MAAM,QAAQ;AACpB,YAAM,WACJ,QAAQ,UAAU,SAAS,UAAU,KACrC,QAAQ,aAAa,eAAe,MAAM,UAC1C,KAAK,UAAU,SAAS,UAAU;AACpC,UAAI,UAAU;AACZ,UAAE,eAAe;AACjB;AAAA,MACF;AAEA,UAAI,QAAQ,aAAa,QAAQ,EAAG;AAEpC,WAAK,eAAe,UAAU,OAAO,QAAQ;AAC7C,YAAM,cAAc,KAAK;AAGzB,WAAK,iBAAiB;AACtB,UAAI,QAAQ,KAAM,MAAK,WAAW,SAAS,cAAc,QAAQ,IAAI;AACrE,WAAK,YAAY,KAAK,eAAe;AAErC,WAAK,eAAe,UAAU,IAAI,QAAQ;AAC1C,YAAM,YAAY,KAAK;AACvB,WAAK,SAAS,KAAK,IAAI,MAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,OAAO,GAAG,CAAC;AAGrE,UAAI,KAAK,QAAQ,WAAW;AAC1B,YAAI,KAAK,eAAe;AACtB,eAAK,cAAc,IAAI,KAAK,QAAQ,MAAM;AACxC,gBAAI,OAAO,KAAK,QAAQ,WAAW;AACjC,mBAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAAA,UAChD,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,MAAM,UAAU;AAC9B,eAAK,SAAS,UAAU,IAAI,QAAQ;AACpC,cAAI,OAAO,KAAK,QAAQ,WAAW;AACjC,iBAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAC9C,cAAI,eAAe,gBAAgB,KAAK,UAAU;AAChD,wBAAY,MAAM,UAAU;AAC5B,wBAAY,UAAU,OAAO,QAAQ;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAEA,WAAK,oBAAoB;AACzB,WAAK,kBAAkB,SAAS;AAChC,QAAE,eAAe;AAAA,IACnB;AArJE,SAAK,GAAG,iBAAiB,IAAI;AAE7B,SAAK,UAAU;AAAA,MACb,GAAG,MAAK;AAAA,MACR,GAAG;AAAA,IACL;AAEA,SAAK,YAAY,KAAK,eAAe;AACrC,SAAK,SAAS;AACd,SAAK,oBAAoB;AACzB,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,oBAAoB;AAAA,IAC3B,OAAO;AACL,WAAK,iBAAiB;AAAA,IACxB;AAEA,SAAK,oBAAoB;AACzB,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAgC,CAAC,GAClB;AACf,WAAO,MAAM,KAAK,KAAK,SAAS,KAAI;AAAA,EACtC;AAAA,EAEA,OAAO,YAAY,IAAuB;AACxC,WAAO,GAAG,iBAAiB;AAAA,EAC7B;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,WAAW,WAAW,YAAY,KAAK,UAAU;AACtD,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,uBAAuB;AAAA,IAC9B,OAAO;AACL,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,GAAG,iBAAiB,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,sBAAsB;AACpB,WAAO,iBAAiB,UAAU,KAAK,mBAAmB;AAC1D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe;AAAA,EACxD;AAAA,EAEA,uBAAuB;AACrB,WAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAC7D,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe;AAAA,EAC3D;AAAA,EAUA,iBAAiB;AACf,WAAO,KAAK,GAAG;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EA0DA,mBAAmB;AACjB,UAAM,MAAM,KAAK,GAAG,YAAY,QAAQ,KAAK,GAAG,YAAY,OAAO,OAAO;AAC1E,UAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,cAAU,UAAU,IAAI,WAAW;AACnC,SAAK,GAAG,YAAY,SAAS;AAC7B,SAAK,aAAa;AAClB,SAAK,WAAW,MAAM,OAAO,KAAK,aAAa,KAAK,cAAc,IAAI;AACtE,SAAK,WAAW,MAAM,QAAQ,KAAK,cAAc,KAAK,cAAc,IAAI;AAAA,EAC1E;AAAA,EAEA,sBAAsB;AAEpB,SAAK,iBAAiB,MAAM,KAAK,KAAK,SAAS,EAAE;AAAA,MAC/C,CAAC,MAAyB,EAAE,aAAa,MAAM,MAAM,SAAS;AAAA,IAChE;AAEA,QAAI,CAAC,KAAK,gBAAgB;AACxB,UAAI,gBAAgB,KAAK,GAAG,cAAc,UAAU;AACpD,UAAI,CAAC,eAAe;AAClB,wBAAgB,KAAK,UAAU,CAAC;AAAA,MAClC;AACA,WAAK,iBAAiB;AAAA,IACxB;AACA,UAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,CAAC,MAAyB,EAAE,UAAU,OAAO,QAAQ,CAAC;AACzF,SAAK,eAAe,UAAU,IAAI,QAAQ;AAE1C,SAAK,SAAS,KAAK,IAAI,MAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,KAAK,cAAc,GAAG,CAAC;AACjF,QAAI,KAAK,kBAAkB,KAAK,eAAe,MAAM;AACnD,WAAK,WAAW,SAAS,cAAc,KAAK,eAAe,IAAI;AAC/D,UAAI,KAAK,SAAU,MAAK,SAAS,UAAU,IAAI,QAAQ;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,sBAAsB;AAEpB,QAAI,OAAO,aAAa,KAAK,QAAQ,oBAAqB,MAAK,QAAQ,YAAY;AAEnF,UAAM,cAAc,CAAC;AACrB,SAAK,UAAU,QAAQ,CAAC,MAAM;AAC5B,UAAI,EAAE,MAAM;AACV,cAAM,cAAc,SAAS,cAAc,EAAE,IAAI;AACjD,oBAAY,UAAU,IAAI,eAAe;AACzC,oBAAY,KAAK,WAAW;AAAA,MAC9B;AAAA,IACF,CAAC;AAGD,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,UAAU,IAAI,gBAAgB,YAAY,iBAAiB;AAGvE,gBAAY,CAAC,EAAE,cAAc,aAAa,aAAa,YAAY,CAAC,CAAC;AACrE,gBAAY,QAAQ,CAAC,eAAe;AAClC,kBAAY,YAAY,UAAU;AAClC,iBAAW,MAAM,UAAU;AAAA,IAC7B,CAAC;AAED,SAAK,gBAAgB,SAAS,KAAK,aAAa;AAAA,MAC9C,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW,CAAC,SAAS;AACnB,cAAM,YAAY,KAAK;AACvB,aAAK,SAAS,MAAM,KAAK,KAAK,WAAW,QAAQ,EAAE,QAAQ,IAAI;AAC/D,aAAK,eAAe,UAAU,OAAO,QAAQ;AAC7C,aAAK,iBAAiB,MAAM,KAAK,KAAK,SAAS,EAAE,KAAK,MAAM;AAC5D,aAAK,eAAe,UAAU,IAAI,QAAQ;AAC1C,aAAK,kBAAkB,SAAS;AAChC,YAAI,OAAO,KAAK,QAAQ,WAAW;AACjC,eAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAAA,MAChD;AAAA,IACF,CAAC;AAED,SAAK,cAAc,IAAI,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,yBAAyB;AACvB,UAAM,cAAc,KAAK,cAAc;AACvC,SAAK,cAAc,QAAQ;AAE3B,gBAAY,OAAO,YAAY,aAAa;AAC5C,gBAAY,OAAO;AAAA,EACrB;AAAA,EAEA,mBAAmB;AAEjB,UAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,CAAC,MAAM;AACxC,UAAI,MAAM,KAAK,eAAgB;AAC/B,UAAwB,EAAG,MAAM;AAC/B,cAAM,cAAc,SAAS,cAAkC,EAAG,IAAI;AACtE,YAAI,YAAa,CAAc,YAAa,MAAM,UAAU;AAAA,MAC9D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,sBAAsB;AAEpB,SAAK,UAAU,QAAQ,CAAC,MAAM;AAC5B,UAAI,EAAE,MAAM;AACV,cAAM,cAAc,SAAS,cAAc,EAAE,IAAI;AACjD,YAAI,YAAa,aAAY,MAAM,UAAU;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,sBAAsB;AACpB,SAAK,aAAa,KAAK,GAAG,sBAAsB,EAAE;AAClD,SAAK,YAAY,KAAK,IAAI,KAAK,YAAY,KAAK,GAAG,WAAW,IAAI,KAAK,UAAU;AAAA,EACnF;AAAA,EAEA,cAAc,IAAI;AAChB,WAAO,KAAK,KAAK,KAAK,aAAa,GAAG,aAAa,GAAG,sBAAsB,EAAE,KAAK;AAAA,EACrF;AAAA,EAEA,aAAa,IAAI;AACf,WAAO,KAAK,MAAM,GAAG,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB;AACnB,SAAK,oBAAoB;AACzB,SAAK,kBAAkB,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,kBAAkB,WAAW;AAC3B,QAAI,YAAY,GACd,aAAa;AAEf,UAAM,wBAAwB,KAAK,SAAS,aAAa;AACzD,QAAI,sBAAuB,aAAY;AAAA,QAClC,cAAa;AAGlB,SAAK,WAAW,MAAM,aAAa;AAAA,aAC1B,KAAK,QAAQ,QAAQ,eAAe,SAAS;AAAA,cAC5C,KAAK,QAAQ,QAAQ,eAAe,UAAU;AAExD,SAAK,WAAW,MAAM,OAAO,KAAK,aAAa,KAAK,cAAc,IAAI;AACtE,SAAK,WAAW,MAAM,QAAQ,KAAK,cAAc,KAAK,cAAc,IAAI;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAe;AACpB,UAAM,MAAM,MAAM,KAAK,KAAK,SAAS,EAAE;AAAA,MACrC,CAAC,MAAyB,EAAE,aAAa,MAAM,MAAM,MAAM;AAAA,IAC7D;AACA,QAAI,IAAK,CAAoB,IAAK,MAAM;AAAA,EAC1C;AACF;;;AC/UA,IAAMC,cAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,SAAS;AACX;AAOO,IAAM,aAAN,MAAM,mBAAkB,UAAgD;AAAA,EAe7E,YAAY,IAAiB,SAAoC;AAC/D,UAAM,IAAI,SAAS,UAAS;AAV9B,SAAQ,UAA8B;AACtC,SAAQ,SAA6B;AACrC,SAAQ,YAAgC;AACxC,SAAQ,kBAAkB;AAC1B,SAAQ,eAAe;AACvB,SAAQ,cAAc;AACtB,SAAQ,gBAAgB;AACxB,SAAQ,WAAW;AAyDnB;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,KAAK,UAAU,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS;AAEpD,iBAAU,YAAY,QAAQ,CAAC,UAAU;AACvC,YAAI,UAAU,KAAM,OAAM,MAAM;AAAA,MAClC,CAAC;AAED,WAAK,sBAAsB;AAE3B,UAAI,OAAO,KAAK,QAAQ,WAAW,YAAY;AAC7C,aAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAAA,MAC9C;AAEA,WAAK,SAAS;AACd,WAAK,QAAQ,UAAU,IAAI,MAAM;AACjC,WAAK,SAAS,aAAa,iBAAiB,MAAM;AAElD,UAAI,CAAC,KAAK,aAAa;AACrB,aAAK,SAAS,UAAU,IAAI,mBAAmB;AAC/C,YAAI,iBAAiB,KAAK,QAAQ,EAAE,aAAa,UAAU;AACzD,eAAK,SAAS,MAAM,WAAW;AAC/B,eAAK,gBAAgB;AAAA,QACvB;AAAA,MACF;AAEA,UAAI,KAAK,aAAa;AACpB,aAAK,WAAW;AAChB,YAAI;AACF,eAAK,QAAQ,YAAY;AAAA,QAC3B,QAAQ;AAAA,QAER;AACA,8BAAsB,MAAM;AAC1B,eAAK,WAAW;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,CAAC,KAAK,OAAQ;AAElB,UAAI,OAAO,KAAK,QAAQ,YAAY,cAAc,KAAK,UAAU;AAC/D,aAAK,QAAQ,QAAQ,KAAK,MAAM,KAAK,QAAQ;AAAA,MAC/C;AAEA,WAAK,SAAS;AACd,WAAK,SAAS,UAAU,OAAO,MAAM;AACrC,WAAK,UAAU,aAAa,iBAAiB,OAAO;AACpD,WAAK,UAAU,UAAU,OAAO,mBAAmB;AACnD,UAAI,KAAK,iBAAiB,KAAK,UAAU;AACvC,aAAK,SAAS,MAAM,WAAW;AAC/B,aAAK,gBAAgB;AAAA,MACvB;AAEA,UAAI,KAAK,eAAe,KAAK,SAAS;AACpC,YAAI;AACF,eAAK,QAAQ,YAAY;AAAA,QAC3B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAyFA;AAAA,SAAQ,yBAAyB,MAAM,SAAS,MAAM,KAAK,cAAc,GAAG,GAAG;AAE/E,SAAQ,uBAAuB,CAAC,MAAqB;AACnD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,EAAE,QAAQ,KAAK;AACrD,UAAE,eAAe;AACjB,aAAK,oBAAoB;AAAA,MAC3B;AAAA,IACF;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,CAAC,KAAK,OAAQ,MAAK,KAAK;AAAA,UACvB,MAAK,MAAM;AAAA,IAClB;AAEA,SAAQ,gBAAgB,MAAM;AAC5B,UAAI,KAAK,OAAQ,MAAK,sBAAsB;AAAA,IAC9C;AAEA,SAAQ,uBAAuB,CAAC,MAAa;AAC3C,YAAM,QAAQ,cAAc,IAAI,OAAQ,EAA2B,QAAQ,IAAI;AAC/E,UAAI,UAAU,OAAQ;AACtB,UAAI,KAAK,UAAU;AACjB,YAAI;AACF,eAAK,SAAS,YAAY;AAAA,QAC5B,QAAQ;AAAA,QAER;AACA;AAAA,MACF;AACA,UAAI,KAAK,OAAQ,MAAK,MAAM;AAAA,IAC9B;AA5OE,SAAK,GAAG,sBAAsB,IAAI;AAElC,SAAK,UAAU;AAAA,MACb,GAAG,WAAU;AAAA,MACb,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AAId,SAAK,WAAW,GAAG,QAAQ,SAAS,SAAS,eAAe,GAAG,QAAQ,MAAM,IAAI;AACjF,QAAI,CAAC,KAAK,UAAU;AAClB,cAAQ,MAAM,kCAAkC,GAAG,QAAQ,UAAU,EAAE,gBAAgB;AACvF;AAAA,IACF;AAEA,SAAK,OAAO;AACZ,SAAK,sBAAsB;AAC3B,SAAK,oBAAoB;AAEzB,eAAU,YAAY,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,WAAW,WAA6B;AACtC,WAAOA;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAqC,CAAC,GACb;AACzB,WAAO,MAAM,KAAK,KAAK,SAAS,UAAS;AAAA,EAC3C;AAAA,EAEA,OAAO,YAAY,IAA4B;AAC7C,WAAO,GAAG,sBAAsB;AAAA,EAClC;AAAA,EAEA,UAAU;AACR,SAAK,MAAM;AACX,SAAK,qBAAqB;AAC1B,SAAK,aAAa;AAClB,SAAK,GAAG,sBAAsB,IAAI;AAClC,UAAM,QAAQ,WAAU,YAAY,QAAQ,IAAI;AAChD,QAAI,SAAS,EAAG,YAAU,YAAY,OAAO,OAAO,CAAC;AAAA,EACvD;AAAA,EAuEQ,SAAS;AACf,UAAM,SAAS,KAAK,GAAG;AACvB,QAAI,QAAQ,UAAU,SAAS,oBAAoB,GAAG;AACpD,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,WAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,WAAK,QAAQ,UAAU,IAAI,oBAAoB;AAC/C,WAAK,GAAG,OAAO,KAAK,OAAO;AAC3B,WAAK,QAAQ,OAAO,KAAK,EAAE;AAC3B,WAAK,kBAAkB;AAAA,IACzB;AAEA,SAAK,YAAY,KAAK,GAAG,cAAc,qBAAqB;AAC5D,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,WAAK,UAAU,YAAY;AAC3B,aAAO,KAAK,GAAG,WAAY,MAAK,UAAU,OAAO,KAAK,GAAG,UAAU;AACnE,WAAK,GAAG,OAAO,KAAK,SAAS;AAAA,IAC/B;AAEA,SAAK,SACH,KAAK,GAAG,cAAc,kBAAkB,KACxC,KAAK,QAAQ,cAAc,kBAAkB;AAC/C,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,SAAS,cAAc,KAAK;AAC1C,WAAK,OAAO,YAAY;AACxB,WAAK,eAAe;AAAA,IACtB;AAGA,SAAK,GAAG,QAAQ,KAAK,MAAM;AAE3B,SAAK,GAAG,aAAa,QAAQ,QAAQ;AACrC,SAAK,kBAAkB;AAEvB,UAAM,SAAS,KAAK;AACpB,WAAO,aAAa,iBAAiB,OAAO;AAC5C,WAAO,aAAa,iBAAiB,KAAK,GAAG,MAAM,KAAK,UAAU,CAAC;AAEnE,SAAK,cAAc,OAAO,KAAK,QAAQ,gBAAgB;AACvD,QAAI,KAAK,aAAa;AACpB,WAAK,QAAQ,aAAa,WAAW,MAAM;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,YAAoB;AAC1B,QAAI,CAAC,KAAK,GAAG,GAAI,MAAK,GAAG,KAAK,cAAc,MAAM,KAAK,CAAC;AACxD,WAAO,KAAK,GAAG;AAAA,EACjB;AAAA,EAEQ,oBAAoB;AAC1B,UAAM,UAAU,KAAK,WAAW,cAAc,wBAAwB;AACtE,QAAI,CAAC,QAAS;AACd,QAAI,CAAC,QAAQ,GAAI,SAAQ,KAAK,oBAAoB,MAAM,KAAK,CAAC;AAC9D,SAAK,GAAG,aAAa,mBAAmB,QAAQ,EAAE;AAAA,EACpD;AAAA,EAEQ,eAAe;AACrB,QAAI,KAAK,aAAc,MAAK,QAAQ,OAAO;AAC3C,QAAI,KAAK,mBAAmB,KAAK,SAAS;AACxC,WAAK,QAAQ,OAAO,KAAK,EAAE;AAC3B,WAAK,QAAQ,OAAO;AAAA,IACtB;AACA,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAChE,QAAI,CAAC,KAAK,SAAS,QAAQ,8CAA8C,GAAG;AAC1E,WAAK,SAAS,WAAW;AACzB,WAAK,SAAS,iBAAiB,WAAW,KAAK,oBAAoB;AAAA,IACrE;AACA,SAAK,SAAS,iBAAiB,UAAU,KAAK,oBAAoB;AAClE,WAAO,iBAAiB,UAAU,KAAK,wBAAwB,EAAE,SAAS,KAAK,CAAC;AAAA,EAClF;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAS,oBAAoB,SAAS,KAAK,mBAAmB;AACnE,SAAK,SAAS,oBAAoB,WAAW,KAAK,oBAAoB;AACtE,SAAK,SAAS,oBAAoB,UAAU,KAAK,oBAAoB;AACrE,WAAO,oBAAoB,UAAU,KAAK,sBAAsB;AAAA,EAClE;AAAA,EAmCQ,wBAAwB;AAC9B,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS;AACrC,UAAM,OAAO,KAAK,SAAS,sBAAsB;AACjD,UAAM,IAAI,KAAK,OAAO,KAAK,QAAQ;AACnC,UAAM,IAAI,KAAK,MAAM,KAAK,SAAS;AACnC,UAAM,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,CAAC;AAEhD,SAAK,QAAQ,MAAM,YAAY,0BAA0B,GAAG,CAAC,IAAI;AACjE,SAAK,QAAQ,MAAM,YAAY,0BAA0B,GAAG,CAAC,IAAI;AACjE,SAAK,QAAQ,MAAM,YAAY,oCAAoC,GAAG,IAAI,IAAI;AAE9E,UAAM,WAAW,KAAK,OAAO,cAAc,IAAI,QAAQ;AACvD,UAAM,WAAW,KAAK,OAAO,aAAa,QAAQ,KAAK,OAAO,aAAa;AAC3E,UAAM,aAAa,WAAW,WAAW,KAAK,OAAO,aAAa,IAAI,SAAS;AAC/E,SAAK,QAAQ,QAAQ,OAAO,GAAG,QAAQ,IAAI,UAAU;AAAA,EACvD;AAKF;AAFI,WAAU,cAAc,CAAC;AAjRtB,IAAM,YAAN;;;AC4EP,IAAMC,cAA+B;AAAA,EACnC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA;AAAA,EACb,SAAS;AAAA;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA;AAAA,EAEZ,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA;AAAA,EACZ,SAAS;AAAA;AAAA;AAAA,EAET,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,eAAe;AAAA,EACf,sBAAsB;AACxB;AAOO,IAAM,cAAN,MAAM,oBAAmB,UAA6B;AAAA,EA+C3D,YAAY,IAAsB,SAAqC;AACrE,UAAM,IAAI,SAAS,WAAU;AAH/B;AAAA,SAAQ,cAAc;AA4GtB,6BAAoB,MAAM;AAGxB,WAAK,kBAAkB;AACvB,WAAK,WAAW,MAAM;AACtB,UAAI,OAAO,KAAK,QAAQ,uBAAuB,WAAY,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AACpG,UAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAAA,IAClD;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,UAAE,eAAe;AACjB,aAAK,kBAAkB;AACvB,aAAK,WAAW,MAAM;AACtB,YAAI,OAAO,KAAK,QAAQ,uBAAuB,WAAY,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AACpG,YAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAAA,MAClD;AAAA,IACF;AAEA,oCAA2B,CAAC,MAAqB;AAC/C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,UAAE,eAAe;AACjB,aAAK,oBAAoB;AAAA,MAC3B;AAAA,IACF;AAEA,kCAAyB,CAAC,MAAM;AAC9B,QAAE,eAAe;AACjB,WAAK,kBAAkB;AACvB,YAAM,eAAe,KAAK,MAAM,sBAAsB;AACtD,YAAM,SAAS,EAAE,GAAG,aAAa,MAAM,GAAG,aAAa,IAAI;AAE3D,WAAK,KAAK,OAAO,IAAI,KAAK,QAAQ;AAClC,WAAK,KAAK,OAAO,IAAI,KAAK,QAAQ;AAClC,WAAK,QAAQ;AACb,YAAM,WAAW,YAAW,KAAK,CAAC;AAClC,WAAK,KAAK,SAAS,IAAI,KAAK;AAC5B,WAAK,KAAK,SAAS,IAAI,KAAK;AAG5B,WAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK;AAEpC,eAAS,iBAAiB,aAAa,KAAK,wBAAwB;AACpE,eAAS,iBAAiB,aAAa,KAAK,wBAAwB;AAEpE,eAAS,iBAAiB,WAAW,KAAK,uBAAuB;AACjE,eAAS,iBAAiB,YAAY,KAAK,uBAAuB;AAAA,IACpE;AAEA,oCAA2B,CAAC,MAAM;AAChC,QAAE,eAAe;AACjB,YAAM,WAAW,YAAW,KAAK,CAAC;AAClC,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,WAAK,QAAQ;AACb,WAAK,QAAQ,GAAG,GAAG,KAAK;AAAA,IAC1B;AAEA,mCAA0B,CAAC,MAAM;AAC/B,QAAE,eAAe;AACjB,eAAS,oBAAoB,WAAW,KAAK,uBAAuB;AACpE,eAAS,oBAAoB,YAAY,KAAK,uBAAuB;AACrE,YAAM,WAAW,YAAW,KAAK,CAAC;AAClC,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,UAAI,KAAK,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,IAAI;AAChD,aAAK,QAAQ,GAAG,CAAC;AAAA,MACnB;AAEA,UAAI,KAAK,gBAAgB,SAAS;AAChC,aAAK,aAAa,MAAM;AACxB,aAAK,SAAS,WAAW,KAAK,QAAQ,WAAW,CAAC;AAAA,MACpD,OAAO;AAEL,mBAAW,MAAM;AACf,cAAI,KAAK,QAAQ,WAAY,MAAK,KAAK;AAAA,QACzC,GAAG,KAAK,QAAQ,WAAW,CAAC;AAAA,MAC9B;AAEA,UAAI,OAAO,KAAK,QAAQ,aAAa,YAAY;AAC/C,aAAK,QAAQ,SAAS,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO;AAAA,MAC3D;AAEA,eAAS,oBAAoB,aAAa,KAAK,wBAAwB;AACvE,eAAS,oBAAoB,aAAa,KAAK,wBAAwB;AAAA,IACzE;AAwNA,4BAAmB,CAAC,MAAkB;AACpC,WAAK,uBAAoC,EAAE,MAAM;AAAA,IACnD;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,uBAAoC,EAAE,MAAM;AAAA,MACnD;AAAA,IACF;AAEA,kCAAyB,CAAC,MAAmB;AAC3C,WAAK,SAAS,EAAE,UAAU,SAAS,QAAQ,IAAI,OAAO;AACtD,WAAK,gBAAgB;AAAA,IACvB;AAgDA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAW,CAAC,MAAa,QAAgB,SAAS;AAChD,WAAK,kBAAkB;AACvB,UAAI,SAAS,aAAa,iBAAiB,KAAK,SAAS,EAAE,eAAe,WAAW;AAAA,MAErF;AACA,YAAM,UAAU,SAAS,SACvB,WAAW,UAAU,KAAK,YAAY,KAAK,aAC3C,WAAW,UAAU,KAAK,cAAc,KAAK;AAC/C,WAAK,cAAc;AAWnB,eAAS,UAAU,IAAI,qBAAqB;AAE5C,eAAS,MAAM,aAAa;AAC5B,eAAS,UAAU,OAAO,qBAAqB;AAG/C,WAAK,WAAW,KAAK;AAErB,mBAAa,KAAK,eAAe;AACjC,WAAK,kBAAkB,WAAW,MAAM;AACtC,iBAAS,MAAM,aAAa;AAAA,MAC9B,GAAG,KAAK,QAAQ,QAAQ;AAAA,IAC1B;AAwBA,+BAAsB,MAAM;AAC1B,YAAM,UAAU,KAAK,gBAAgB;AACrC,UAAI,WAAW,KAAK,WAAW,UAAU,IAAI;AAC3C,cAAM,QAAQ,SAAS,KAAK,WAAW,KAAK;AAC5C,YAAI,QAAQ,KAAK,SAAS,KAAK,QAAQ,aAAa,KAAK,KAAK;AAC5D,eAAK,QAAQ;AAAA,QACf,OAAO;AACL,eAAK,gBAAgB;AAAA,QACvB;AACA,aAAK,uBAAuB,KAAK,OAAO,OAAO;AAAA,MACjD,WAAW,CAAC,WAAW,KAAK,aAAa,UAAU,IAAI;AACrD,cAAM,QAAQ,SAAS,KAAK,aAAa,KAAK;AAC9C,YAAI,SAAS,KAAK,QAAQ,IAAI;AAC5B,eAAK,UAAU;AAAA,QACjB,OAAO;AACL,eAAK,WAAU,oBAAI,KAAK,GAAE,WAAW;AACrC,eAAK,aAAa,QAAQ,KAAK,QAAQ,SAAS;AAAA,QAClD;AACA,aAAK,uBAAuB,KAAK,SAAS,OAAO;AAAA,MACnD;AAAA,IACF;AAkHA,gBAAO,CAAC,aAAa,SAAS;AAE5B,YAAM,OAAO,KAAK,GAAG;AACrB,UAAI,QAAQ,aACR,KACA,YAAW,gBAAgB,KAAK,KAAK,IAAI,MAAM,YAAW,gBAAgB,KAAK,OAAO;AAC1F,WAAK,OAAO;AACZ,UAAI,CAAC,cAAc,KAAK,QAAQ,YAAY;AAC1C,gBAAQ,GAAG,KAAK,IAAI,KAAK,MAAM;AAAA,MACjC;AACA,WAAK,GAAG,QAAQ;AAEhB,UAAI,UAAU,MAAM;AAClB,aAAK,GAAG;AAAA,UACN,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAEA,mBAAU,MAAM;AACd,WAAK,KAAK;AACV,UAAI,OAAO,KAAK,QAAQ,WAAW,WAAY,MAAK,QAAQ,OAAO,KAAK,IAAI;AAAA,IAC9E;AAEA,kBAAS,MAAM;AAGb,UAAI,OAAO,KAAK,QAAQ,aAAa,WAAY,MAAK,QAAQ,SAAS,KAAK,IAAI;AAAA,IAClF;AAEA,iBAAQ,MAAM;AACZ,WAAK,KAAK,IAAI;AAAA,IAChB;AA/qBE,SAAK,GAAG,uBAAuB,IAAI;AACnC,SAAK,UAAU;AAAA,MACb,GAAG,YAAW;AAAA,MACd,GAAG;AAAA,IACL;AACA,SAAK,KAAK,MAAM,KAAK;AACrB,SAAK,mBAAmB;AACxB,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AAIzB,SAAK,aAAa;AAElB,QAAI,KAAK,QAAQ,eAAe;AAC9B,UAAI,KAAK,QAAQ,kBAAkB,SAAU,MAAK,gBAAgB,oBAAoB,KAAK,KAAK,IAAI,KAAK,aAAa,KAAK,QAAQ,oBAAoB;AAAA,IACzJ;AAAA,EACF;AAAA,EAEA,WAAW,WAA8B;AACvC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAsC,CAAC,GACZ;AAC3B,WAAO,MAAM,KAAK,KAAK,SAAS,WAAU;AAAA,EAC5C;AAAA,EAEA,OAAO,gBAAgB,KAAa;AAClC,YAAQ,MAAM,KAAK,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,OAAO,aAAa,MAAc;AAChC,UAAM,QAAQ;AACd,WAAO,SAAS,gBAAgB,OAAO,IAAI;AAAA,EAC7C;AAAA,EAEA,OAAO,KAAK,GAAmC;AAC7C,QAAI,EAAE,KAAK,WAAW,OAAO,KAAM,EAAiB,cAAc,UAAU,GAAG;AAC7E,aAAO;AAAA,QACL,GAAI,EAAiB,cAAc,CAAC,EAAE;AAAA,QACtC,GAAI,EAAiB,cAAc,CAAC,EAAE;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,EAAE,GAAI,EAAiB,SAAS,GAAI,EAAiB,QAAQ;AAAA,EACtE;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,uBAAuB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,eAAe,QAAQ;AAC5B,SAAK,YAAY,OAAO;AACxB,SAAK,GAAG,uBAAuB,IAAI;AAAA,EACrC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,WAAW,KAAK,mBAAmB;AAC5D,SAAK,MAAM,iBAAiB,aAAa,KAAK,sBAAsB;AACpE,SAAK,MAAM,iBAAiB,cAAc,KAAK,sBAAsB;AACrE,SAAK,aAAa,iBAAiB,SAAS,KAAK,mBAAmB;AACpE,SAAK,WAAW,iBAAiB,SAAS,MAAM,KAAK,SAAS,OAAO,CAAC;AACtE,SAAK,WAAW,iBAAiB,YAAY,MAAM,KAAK,YAAY,CAAC;AACrE,SAAK,aAAa,iBAAiB,SAAS,MAAM,KAAK,SAAS,SAAS,CAAC;AAC1E,SAAK,aAAa,iBAAiB,YAAY,MAAM,KAAK,cAAc,CAAC;AAAA,EAC3E;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,WAAW,KAAK,mBAAmB;AAG/D,aAAS,oBAAoB,aAAa,KAAK,wBAAwB;AACvE,aAAS,oBAAoB,aAAa,KAAK,wBAAwB;AACvE,aAAS,oBAAoB,WAAW,KAAK,uBAAuB;AACpE,aAAS,oBAAoB,YAAY,KAAK,uBAAuB;AAAA,EACvE;AAAA,EAyFA,qBAAqB;AACnB,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY,YAAW,UAAU,KAAK;AAE/C,SAAK,cAA2B,SAAS,QAAQ;AACjD,SAAK,YAAY,KAAK,eAAe,KAAK;AAG1C,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,cAAc,iBAAiB,cAAc,QAAQ,SAAS,cAAc,KAAK;AAEvF,QAAI,KAAK,QAAQ,aAAa,CAAC,CAAC,aAAa;AAC3C,kBAAY,OAAO,KAAK,WAAW;AAAA,IACrC,OAAO;AACL,WAAK,GAAG,cAAc,YAAY,KAAK,WAAW;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,kBAAkB;AAChB,SAAK,cAAc;AAGnB,SAAK,aAAa,OAAO,UAAU,YAAY;AAC/C,SAAK,UAAU,KAAK,YAAY,cAAc,oBAAoB;AAClE,SAAK,QAAQ,KAAK,YAAY,cAAc,mBAAmB;AAC/D,SAAK,eAAe,KAAK,YAAY,cAAc,4BAA4B;AAC/E,SAAK,YAAY,KAAK,YAAY,cAAc,mBAAmB;AACnE,SAAK,cAAc,KAAK,YAAY,cAAc,qBAAqB;AACvE,SAAK,aAAa,KAAK,YAAY,cAAc,yBAAyB;AAC1E,SAAK,eAAe,KAAK,YAAY,cAAc,2BAA2B;AAC9E,SAAK,WAAW,KAAK,YAAY,cAAc,wBAAwB;AACvE,SAAK,SAAS,KAAK,YAAY,cAAc,oBAAoB;AACjE,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,eAAe;AAIb,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,KAAK,QAAQ,KAAK;AAAA,MAClB,CAAC,kBAAkB;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb,KAAK;AAAA,IACP;AAEA,QAAI,CAAC,KAAK,QAAQ,YAAY;AAc5B,YAAM;AAAA,QACJ,KAAK;AAAA,QACL,KAAK,QAAQ,KAAK;AAAA,QAClB,KAAK,QAAQ,KAAK;AAAA,QAClB,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AAEA,SAAK,qBAAqB;AAK1B,QAAI,CAAC,KAAK,QAAQ,cAAe,MAAK,SAAS,OAAO;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB;AAC1B,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc;AACnB,SAAK,YAAY;AAGjB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,QAAQ,YAAY;AAE3B,WAAK,SAAS,SAAS,cAAc,KAAK;AAC1C,WAAK,OAAO,UAAU,IAAI,UAAU,KAAK;AACzC,WAAK,OAAO,YAAY;AACxB,WAAK,OAAO,WAAW;AACvB,WAAK,OAAO,iBAAiB,SAAS,KAAK,gBAAgB;AAC3D,WAAK,OAAO,iBAAiB,YAAY,KAAK,mBAAmB;AACjE,WAAK,SAAS,YAAY,KAAK,MAAM;AAErC,WAAK,SAAS,SAAS,cAAc,KAAK;AAC1C,WAAK,OAAO,UAAU,IAAI,UAAU,KAAK;AACzC,WAAK,OAAO,YAAY;AACxB,WAAK,OAAO,WAAW;AACvB,WAAK,OAAO,iBAAiB,SAAS,KAAK,gBAAgB;AAC3D,WAAK,OAAO,iBAAiB,YAAY,KAAK,mBAAmB;AACjE,WAAK,SAAS,YAAY,KAAK,MAAM;AAAA,IACvC;AACA,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AACvB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,iBAAiB;AAEf,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,WAAW,aAAa;AAC9B,UAAM,MAAM,YAAW,aAAa,KAAK;AACzC,QAAI,aAAa,SAAS,gBAAgB;AAC1C,QAAI,aAAa,SAAS,SAAS,SAAS,CAAC;AAC7C,QAAI,aAAa,UAAU,SAAS,SAAS,CAAC;AAC9C,UAAM,IAAI,YAAW,aAAa,GAAG;AACrC,MAAE,aAAa,aAAa,eAAe,aAAa,MAAM,aAAa,GAAG;AAC9E,UAAM,UAAU,YAAW,aAAa,QAAQ;AAChD,YAAQ,aAAa,SAAS,2BAA2B;AACzD,YAAQ,aAAa,MAAM,GAAG;AAC9B,YAAQ,aAAa,MAAM,GAAG;AAC9B,YAAQ,aAAa,KAAK,GAAG;AAC7B,UAAM,OAAO,YAAW,aAAa,MAAM;AAC3C,SAAK,aAAa,MAAM,GAAG;AAC3B,SAAK,aAAa,MAAM,GAAG;AAC3B,UAAM,KAAK,YAAW,aAAa,QAAQ;AAC3C,OAAG,aAAa,SAAS,sBAAsB;AAC/C,OAAG,aAAa,KAAK,WAAW,SAAS,CAAC;AAC1C,MAAE,YAAY,IAAI;AAClB,MAAE,YAAY,EAAE;AAChB,MAAE,YAAY,OAAO;AACrB,QAAI,YAAY,CAAC;AACjB,SAAK,QAAQ,YAAY,GAAG;AAC5B,SAAK,OAAO;AACZ,SAAK,KAAK;AACV,SAAK,UAAU;AACf,SAAK,IAAI;AAAA,EACX;AAAA,EAEA,kBAAkB;AAIhB,QAAI,KAAK,QAAQ,YAAY;AAC3B,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;AAE9B,cAAM,SAAU,IAAI,IAAK,KAAK;AAC9B,cAAM,SAAS,KAAK,QAAQ;AAC5B,aAAK,gBAAgB,GAAG,QAAQ,MAAM;AAAA,MACxC;AAAA,IACF,OAAO;AACL,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;AAE9B,cAAM,SAAU,IAAI,IAAK,KAAK;AAC9B,cAAM,QAAQ,IAAI,KAAK,IAAI;AAC3B,cAAM,SAAS,QAAQ,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAC/D,aAAK,gBAAgB,GAAG,QAAQ,MAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,GAAW,QAAgB,QAAgB;AACzD,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,UAAU,IAAI,iBAAiB;AACpC,SAAK,MAAM,OACT,KAAK,QAAQ,aAAa,KAAK,IAAI,MAAM,IAAI,SAAS,KAAK,QAAQ,aAAa;AAClF,SAAK,MAAM,MACT,KAAK,QAAQ,aAAa,KAAK,IAAI,MAAM,IAAI,SAAS,KAAK,QAAQ,aAAa;AAClF,SAAK,cAAc,MAAM,IAAI,OAAO,EAAE,SAAS;AAC/C,SAAK,UAAU,YAAY,IAAI;AAAA,EACjC;AAAA,EAEA,oBAAoB;AAClB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,UAAU,IAAI,iBAAiB;AAErC,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;AAC9B,YAAM,OAAoB,MAAM,UAAU,IAAI;AAC9C,YAAM,SAAU,IAAI,KAAM,KAAK;AAC/B,WAAK,MAAM,OACT,KAAK,QAAQ,aACb,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,cAChC,KAAK,QAAQ,aACb;AACF,WAAK,MAAM,MACT,KAAK,QAAQ,aACb,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,cAChC,KAAK,QAAQ,aACb;AACF,WAAK,cAAc,YAAW,gBAAgB,CAAC;AAC/C,WAAK,YAAY,YAAY,IAAI;AAAA,IACnC;AAAA,EACF;AAAA,EAiBA,kBAAkB;AAGhB,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,OAAQ;AAClC,QAAI,KAAK,QAAQ,YAAY;AAC3B,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,OAAO,UAAU,OAAO,QAAQ;AACrC,aAAK,OAAO,UAAU,IAAI,QAAQ;AAAA,MACpC,WAAW,KAAK,WAAW,MAAM;AAC/B,aAAK,OAAO,UAAU,IAAI,QAAQ;AAClC,aAAK,OAAO,UAAU,OAAO,QAAQ;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,uBAAuB;AAErB,QAAI,UAAU,KAAK,GAAG,SAAS,KAAK,QAAQ,eAAe,MAAM,IAAI,MAAM,GAAG;AAC9E,QAAI,KAAK,QAAQ,cAAc,EAAE,OAAO,MAAM,CAAC,MAAM,cAAc;AACjE,UAAI,MAAM,CAAC,EAAE,YAAY,EAAE,QAAQ,IAAI,IAAI,GAAG;AAC5C,aAAK,SAAS;AAAA,MAChB,OAAO;AACL,aAAK,SAAS;AAAA,MAChB;AACA,YAAM,CAAC,IAAI,MAAM,CAAC,EAAE,QAAQ,MAAM,EAAE,EAAE,QAAQ,MAAM,EAAE;AAAA,IACxD;AACA,QAAI,MAAM,CAAC,MAAM,OAAO;AACtB,YAAM,MAAM,IAAI,KAAK,CAAC,oBAAI,KAAK,IAAI,KAAK,QAAQ,OAAO;AACvD,cAAQ,CAAC,IAAI,SAAS,EAAE,SAAS,GAAG,IAAI,WAAW,EAAE,SAAS,CAAC;AAC/D,UAAI,KAAK,QAAQ,YAAY;AAC3B,aAAK,SAAS,SAAS,MAAM,CAAC,CAAC,KAAK,MAAM,SAAS,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO;AAAA,MAC7E;AAAA,IACF;AACA,SAAK,QAAQ,CAAC,MAAM,CAAC,KAAK;AAC1B,SAAK,UAAU,CAAC,MAAM,CAAC,KAAK;AAC5B,SAAK,WAAW,QAAQ,YAAW,gBAAgB,KAAK,KAAK;AAC7D,SAAK,aAAa,QAAQ,YAAW,gBAAgB,KAAK,OAAO;AAEjE,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAwCA,WAAW,OAAO;AAChB,UAAM,OAAO,KAAK,aAChB,QAAQ,KAAK,IAAI,GACjB,UAAU,SAAS,SACnB,OAAO,KAAK,MAAM,UAAU,IAAI,KAChC,SAAS,QAAQ,MACjB,SACE,WAAW,QAAQ,KAAK,QAAQ,KAAK,KAAK,QAAQ,cAAc,KAAK,QAAQ,aAC/E,IAAI,KAAK,IAAI,MAAM,IAAI,QACvB,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI;AAE1B,QAAI,OAAO;AACT,WAAK,SAAS,UAAU,IAAI,uBAAuB;AACnD,iBAAW,MAAM;AACf,aAAK,SAAS,UAAU,OAAO,uBAAuB;AACtD,aAAK,QAAQ,GAAG,CAAC;AAAA,MACnB,GAAG,KAAK;AAAA,IACV,OAAO;AACL,WAAK,QAAQ,GAAG,CAAC;AAAA,IACnB;AAAA,EACF;AAAA,EAwBA,uBAAuB,OAAO,SAAS;AACrC,UAAM,OAAO,KAAK,MAAM,UAAU,IAAI;AACtC,UAAM,SAAS,QAAQ;AACvB,QAAI;AACJ,QAAI,KAAK,QAAQ,YAAY;AAC3B,eAAS,KAAK,QAAQ;AAAA,IACxB,OAAO;AACL,eACE,WAAW,QAAQ,KAAK,QAAQ,KAAK,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAAA,IACjF;AACA,SAAK,mBAAmB,QAAQ,MAAM;AAAA,EACxC;AAAA,EAEA,QAAQ,GAAG,GAAG,WAAoB,OAAO;AACvC,UAAM,UAAU,KAAK,gBAAgB,SACnC,OAAO,KAAK,MAAM,WAAW,WAAW,IAAI,KAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,GAC3B,QAAQ,WAAW,KAAK,KAAK,QAAQ,cAAc,KAAK,QAAQ,eAAe;AACjF,QAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,GAC3B,SAAS,QAAQ,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAE3D,QAAI,KAAK,QAAQ,YAAY;AAC3B,eAAS,KAAK,QAAQ;AAAA,IACxB;AAGA,QAAI,SAAS,GAAG;AACd,eAAS,KAAK,KAAK,IAAI;AAAA,IACzB;AAGA,QAAI,QAAQ,KAAK,MAAM,SAAS,IAAI;AAGpC,aAAS,QAAQ;AAGjB,QAAI,KAAK,QAAQ,YAAY;AAC3B,UAAI,SAAS;AACX,YAAI,UAAU,EAAG,SAAQ;AAAA,MAC3B,OAAO;AACL,YAAI,SAAU,UAAS;AACvB,YAAI,UAAU,GAAI,SAAQ;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,UAAI,SAAS;AACX,YAAI,UAAU,IAAI;AAChB,kBAAQ;AAAA,QACV;AACA,gBAAQ,QAAS,UAAU,IAAI,KAAK,QAAS,UAAU,IAAI,IAAI,QAAQ;AAAA,MACzE,OAAO;AACL,YAAI,UAAU;AACZ,mBAAS;AAAA,QACX;AACA,YAAI,UAAU,IAAI;AAChB,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,KAAK,WAAW,MAAM,OAAO;AACpC,UAAI,KAAK,cAAc,KAAK,QAAQ,SAAS;AAE3C,YAAI,CAAC,KAAK,cAAc;AACtB,oBAAU,QAAQ,EAAE;AACpB,eAAK,eAAe,WAAW,MAAM;AACnC,iBAAK,eAAe;AAAA,UACtB,GAAG,GAAG;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,KAAK,WAAW,IAAI;AACzB,QAAI,SAAS;AACX,WAAK,WAAW,QAAQ,YAAW,gBAAgB,KAAK;AAAA,IAC1D,OAAO;AACL,WAAK,aAAa,QAAQ,YAAW,gBAAgB,KAAK;AAAA,IAC5D;AAGA,SAAK,mBAAmB,QAAQ,MAAM;AAAA,EACxC;AAAA,EAEA,mBAAmB,QAAgB,QAAgB;AAEjD,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,GAAI;AAC5B,UAAM,MAAM,KAAK,IAAI,MAAM,KAAK,SAAS,KAAK,QAAQ,aACpD,MAAM,CAAC,KAAK,IAAI,MAAM,KAAK,SAAS,KAAK,QAAQ,aACjD,MAAM,KAAK,IAAI,MAAM,IAAI,QACzB,MAAM,CAAC,KAAK,IAAI,MAAM,IAAI;AAC5B,SAAK,KAAK,aAAa,MAAM,IAAI,SAAS,CAAC;AAC3C,SAAK,KAAK,aAAa,MAAM,IAAI,SAAS,CAAC;AAC3C,SAAK,GAAG,aAAa,MAAM,IAAI,SAAS,CAAC;AACzC,SAAK,GAAG,aAAa,MAAM,IAAI,SAAS,CAAC;AAAA,EAC3C;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,WAAW,SAAS,GAAI,MAAK,gBAAgB;AACtD,SAAK,WAAW,QAAQ,YAAW,gBAAgB,OAAO,KAAK,WAAW,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,gBAAgB;AACd,QAAI,KAAK,aAAa,SAAS,GAAI,MAAK,WAAU,oBAAI,KAAK,GAAE,WAAW;AACxE,SAAK,aAAa,QAAQ,YAAW,gBAAgB,OAAO,KAAK,aAAa,KAAK,CAAC;AAAA,EACtF;AAAA,EAEA,kBAAkB;AAChB,SAAK,SAAQ,oBAAI,KAAK,GAAE,SAAS;AACjC,SAAK,WAAW,SAAS,KAAK,SAAS,KAAK,QAAQ,aAAa,KAAK,KAAK,SAAS;AAAA,EACtF;AAAA;AAAA,EAqCA,OAAO;AACL,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAgCF;AA7BI,YAAW,YAAY;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;AAlvBpB,IAAM,aAAN;;;AC1EP,IAAMC,cAA0B;AAAA,EAC9B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,mBAAmB;AACrB;AAEO,IAAM,SAAN,MAAM,OAAM;AAAA,EA4BjB,YAAY,SAAgC;AAC1C,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AACA,SAAK,UAAU,KAAK,QAAQ;AAC5B,SAAK,UAAU;AACf,SAAK,gBAAgB,KAAK,QAAQ;AAClC,QAAI,OAAM,QAAQ,WAAW,GAAG;AAC9B,aAAM,iBAAiB;AAAA,IACzB;AAEA,WAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,eAAe,KAAK,aAAa;AACvC,iBAAa,kBAAkB,IAAI;AACnC,SAAK,KAAK;AACV,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAW,WAAyB;AAClC,WAAOA;AAAA,EACT;AAAA,EAEA,OAAO,YAAY,IAAwB;AACzC,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA,EAEA,OAAO,mBAAmB;AACxB,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,aAAa,MAAM,iBAAiB;AAE9C,cAAU,iBAAiB,cAAc,OAAM,YAAY;AAC3D,cAAU,iBAAiB,aAAa,OAAM,WAAW;AACzD,cAAU,iBAAiB,YAAY,OAAM,UAAU;AACvD,cAAU,iBAAiB,aAAa,OAAM,YAAY;AAC1D,aAAS,iBAAiB,aAAa,OAAM,WAAW;AACxD,aAAS,iBAAiB,WAAW,OAAM,UAAU;AACrD,aAAS,KAAK,YAAY,SAAS;AACnC,WAAM,aAAa;AAAA,EACrB;AAAA,EAEA,OAAO,mBAAmB;AACxB,aAAS,oBAAoB,aAAa,OAAM,WAAW;AAC3D,aAAS,oBAAoB,WAAW,OAAM,UAAU;AACxD,WAAM,WAAW,OAAO;AACxB,WAAM,aAAa;AAAA,EACrB;AAAA,EAEA,OAAO,aAAa,GAA4B;AAC9C,UAAM,SAAS,EAAE;AAEjB,QAAI,UAAU,CAAC,OAAO,QAAQ,WAAW,KAAK,OAAO,QAAQ,mBAAmB,GAAG;AACjF,YAAM,YAAY,OAAO,QAAQ,mBAAmB;AACpD,YAAM,QAAe,UAAU,kBAAkB;AACjD,UAAI,CAAC,MAAO;AACZ,YAAM,UAAU;AAChB,YAAM,YAAY;AAClB,aAAM,gBAAgB;AACtB,YAAM,GAAG,UAAU,IAAI,SAAS;AAChC,YAAM,GAAG,MAAM,aAAa;AAC5B,YAAM,eAAe,OAAM,MAAM,CAAC;AAClC,YAAM,OAAO,KAAK,IAAI;AACtB,YAAM,OAAO,OAAM,MAAM,CAAC;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,OAAO,YAAY,GAA4B;AAC7C,QAAI,CAAC,CAAC,OAAM,eAAe;AACzB,QAAE,eAAe;AACjB,YAAM,QAAQ,OAAM;AACpB,YAAM,SAAS,KAAK,IAAI,MAAM,OAAO,OAAM,MAAM,CAAC,CAAC;AACnD,YAAM,OAAO,OAAM,MAAM,CAAC;AAC1B,YAAM,YAAY,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM;AACrD,YAAM,OAAO,KAAK,IAAI;AAEtB,YAAM,cAAc,MAAM,OAAO,MAAM;AACvC,YAAM,qBAAqB,MAAM,GAAG,cAAc,MAAM,QAAQ;AAChE,YAAM,GAAG,MAAM,YAAY,cAAc,WAAW;AACpD,YAAM,GAAG,MAAM,WAAW,IAAI,KAAK,IAAI,cAAc,kBAAkB,GAAG,SAAS;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,OAAO,aAAa;AAClB,QAAI,CAAC,CAAC,OAAM,eAAe;AACzB,YAAM,QAAQ,OAAM;AACpB,YAAM,UAAU;AAChB,YAAM,GAAG,UAAU,OAAO,SAAS;AAEnC,YAAM,cAAc,MAAM,OAAO,MAAM;AACvC,YAAM,qBAAqB,MAAM,GAAG,cAAc,MAAM,QAAQ;AAChE,YAAM,oBAAoB,KAAK,IAAI,WAAW,IAAI,sBAAsB,MAAM,YAAY;AAG1F,UAAI,mBAAmB;AACrB,cAAM,YAAY;AAClB,cAAM,QAAQ;AAAA,MAEhB,OAAO;AACL,cAAM,GAAG,MAAM,aAAa;AAC5B,cAAM,GAAG,MAAM,YAAY;AAC3B,cAAM,GAAG,MAAM,UAAU;AACzB,cAAM,aAAa;AAAA,MACrB;AACA,aAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,GAA4B;AACvC,QAAI,EAAE,KAAK,WAAW,OAAO,KAAM,EAAiB,cAAc,UAAU,GAAG;AAC7E,aAAQ,EAAiB,cAAc,CAAC,EAAE;AAAA,IAC5C;AAEA,WAAQ,EAAiB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAa;AAElB,eAAW,SAAS,CAAC,GAAG,OAAM,OAAO,GAAG;AACtC,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,eAAe;AACb,QAAI,QAAqB,KAAK,QAAQ,UAClC,SAAS,eAAe,KAAK,QAAQ,OAAO,IAC5C,SAAS,cAAc,KAAK;AAChC,QAAI,iBAAiB,qBAAqB;AACxC,YAAM,OAAQ,MAA8B,QAAQ,UAAU,IAAI;AAClE,cAAS,KAAqB;AAAA,IAChC;AACA,UAAM,UAAU,IAAI,SAAS,UAAU;AACvC,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,aAAa,QAAQ;AACxC,UAAM,aAAa,eAAe,MAAM;AAExC,QAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,YAAM,UAAU,IAAI,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,IACxE;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,cAAc,KAAK;AACxB,YAAM,gBAAgB,IAAI;AAAA,IAC5B;AACA,QAAI,KAAK,QAAQ,QAAQ;AACvB,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,cAAc,KAAK,QAAQ;AAClC,aAAO,iBAAiB,SAAS,CAAC,MAAM;AACtC,UAAE,gBAAgB;AAClB,YAAI,OAAO,KAAK,QAAQ,aAAa,YAAY;AAC/C,eAAK,QAAQ,SAAS;AAAA,QACxB;AACA,aAAK,QAAQ;AAAA,MACf,CAAC;AACD,YAAM,YAAY,MAAM;AAAA,IAC1B;AACA,QAAI,KAAK,QAAQ,aAAa;AAC5B,YAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,YAAM,OAAO;AACb,YAAM,YAAY;AAClB,YAAM,aAAa,cAAc,SAAS;AAC1C,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,YAAY;AACjB,WAAK,aAAa,eAAe,MAAM;AACvC,WAAK,cAAc;AACnB,YAAM,YAAY,IAAI;AACtB,YAAM,iBAAiB,SAAS,CAAC,MAAM;AACrC,UAAE,gBAAgB;AAClB,aAAK,QAAQ;AAAA,MACf,CAAC;AACD,YAAM,YAAY,KAAK;AAAA,IACzB;AACA,WAAM,WAAW,YAAY,KAAK;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AAEX,SAAK,GAAG,MAAM,UAAU;AACxB,SAAK,GAAG,MAAM,UAAU;AAExB,SAAK,GAAG,MAAM,aAAa;AAAA,YACnB,KAAK,QAAQ,UAAU;AAAA,gBACnB,KAAK,QAAQ,UAAU;AAAA;AAEnC,eAAW,MAAM;AACf,WAAK,GAAG,MAAM,MAAM;AACpB,WAAK,GAAG,MAAM,UAAU;AAAA,IAC1B,GAAG,CAAC;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY;AACV,QAAI,KAAK,kBAAkB,SAAU;AACrC,SAAK,YAAY,KAAK,IAAI,IAAI,KAAK;AACnC,SAAK,iBAAiB,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,aAAa;AAAA,EAC3E;AAAA;AAAA,EAGA,cAAc;AACZ,QAAI,KAAK,kBAAkB,KAAM;AACjC,iBAAa,KAAK,cAAc;AAChC,SAAK,iBAAiB;AACtB,SAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,YAAY,KAAK,IAAI,CAAC;AAAA,EAC9D;AAAA;AAAA,EAGA,eAAe;AACb,QAAI,KAAK,kBAAkB,KAAM;AACjC,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,iBAAa,KAAK,cAAc;AAChC,SAAK,iBAAiB;AACtB,UAAM,qBAAqB,KAAK,GAAG,cAAc,KAAK,QAAQ;AAE9D,QAAI,KAAK,WAAW;AAClB,WAAK,GAAG,MAAM,aAAa;AAC3B,WAAK,GAAG,MAAM,YAAY,cAAc,kBAAkB;AAC1D,WAAK,GAAG,MAAM,UAAU;AAAA,IAC1B;AAGA,SAAK,GAAG,MAAM,aAAa;AAAA,eAChB,KAAK,QAAQ,WAAW;AAAA,gBACvB,KAAK,QAAQ,WAAW;AAEpC,eAAW,MAAM;AACf,WAAK,GAAG,MAAM,UAAU;AACxB,WAAK,GAAG,MAAM,YAAY;AAAA,IAC5B,GAAG,CAAC;AAEJ,eAAW,MAAM;AAEf,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB;AAAA,MAChC;AAEA,UAAI,KAAK,GAAG,MAAM,KAAK,QAAQ,SAAS;AACtC,aAAK,GAAG,OAAO;AAGf,cAAM,QAAQ,OAAM,QAAQ,QAAQ,IAAI;AACxC,YAAI,SAAS,EAAG,QAAM,QAAQ,OAAO,OAAO,CAAC;AAC7C,YAAI,OAAM,QAAQ,WAAW,KAAK,OAAM,YAAY;AAClD,iBAAM,iBAAiB;AAAA,QACzB;AAAA,MACF;AAAA,IACF,GAAG,KAAK,QAAQ,WAAW;AAAA,EAC7B;AAOF;AAJI,OAAM,UAAU,CAAC;AACjB,OAAM,aAAa;AACnB,OAAM,gBAAgB;AAxSnB,IAAM,QAAN;;;ACdP,IAAMC,cAA4B;AAAA,EAChC,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,SAAS;AACX;AAEO,IAAM,UAAN,MAAM,iBAAgB,UAA0B;AAAA,EAmBrD,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,SAAS,QAAO;AAuG5B;AAAA;AAAA;AAAA,gBAAO,CAAC,aAAsB;AAC5B,UAAI,KAAK,OAAQ;AACjB,iBAAW,aAAa,SAAY,OAAO;AAC3C,WAAK,SAAS;AAEd,WAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,KAAK,qBAAqB,EAAE;AACjE,WAAK,sBAAsB;AAC3B,WAAK,sBAAsB,QAAQ;AAAA,IACrC;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,SAAS;AACd,WAAK,qBAAqB;AAAA,IAC5B;AAkIA,6BAAoB,MAAM;AACxB,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,KAAK,KAAK;AAAA,IACjB;AAEA,6BAAoB,MAAM;AACxB,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,MAAM;AAAA,IACb;AAEA,wBAAe,MAAM;AACnB,UAAI,MAAM,YAAY;AACpB,aAAK,YAAY;AACjB,aAAK,KAAK,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,uBAAc,MAAM;AAClB,WAAK,YAAY;AACjB,WAAK,MAAM;AAAA,IACb;AAjRE,SAAK,GAAG,oBAAoB,IAAI;AAEhC,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG,KAAK,qBAAqB;AAAA,MAC7B,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAmC,CAAC,GACf;AACrB,WAAO,MAAM,KAAK,KAAK,SAAS,QAAO;AAAA,EACzC;AAAA,EAEA,OAAO,YAAY,IAA0B;AAC3C,WAAO,GAAG,oBAAoB;AAAA,EAChC;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,GAAG,aAAa,kBAAkB,MAAM,KAAK,UAAU,IAAI;AAClE,WAAK,GAAG,gBAAgB,kBAAkB;AAAA,IAC5C;AACA,SAAK,UAAU,OAAO;AACtB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,oBAAoB,IAAI;AAAA,EAClC;AAAA,EAEA,mBAAmB;AACjB,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,UAAU,IAAI,WAAW,kBAAkB;AAC1D,SAAK,UAAU,KAAK,WAAW,MAAM,KAAK,CAAC;AAC3C,SAAK,UAAU,aAAa,QAAQ,SAAS;AAC7C,SAAK,GAAG,aAAa,oBAAoB,KAAK,UAAU,EAAE;AAE1D,UAAM,mBAAmB,KAAK,QAAQ,YAClC,SAAS,eAAe,KAAK,QAAQ,SAAS,IAC9C,SAAS,cAAc,KAAK;AAChC,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,UAAU,UAAU,IAAI,MAAM;AAAA,IACrC;AACA,qBAAiB,MAAM,UAAU;AACjC,qBAAiB,UAAU,IAAI,iBAAiB;AAChD,SAAK,mBAAmB,gBAAgB;AACxC,SAAK,UAAU,YAAY,gBAAgB;AAC3C,aAAS,KAAK,YAAY,KAAK,SAAS;AAAA,EAC1C;AAAA,EAEA,mBAAmB,kBAA+B;AAChD,QAAI,KAAK,QAAQ,UAAW;AAC5B,qBAAiB,YAAY,KAAK,QAAQ;AAAA,EAC5C;AAAA,EAEA,wBAAwB;AACtB,SAAK,mBAAmB,KAAK,UAAU,cAAc,kBAAkB,CAAC;AAAA,EAC1E;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,SAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,SAAK,GAAG,iBAAiB,SAAS,KAAK,cAAc,IAAI;AACzD,SAAK,GAAG,iBAAiB,QAAQ,KAAK,aAAa,IAAI;AAAA,EACzD;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,SAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,SAAK,GAAG,oBAAoB,SAAS,KAAK,cAAc,IAAI;AAC5D,SAAK,GAAG,oBAAoB,QAAQ,KAAK,aAAa,IAAI;AAAA,EAC5D;AAAA,EA0BA,uBAAuB;AACrB,iBAAa,KAAK,iBAAiB;AACnC,SAAK,oBAAoB,WAAW,MAAM;AACxC,UAAI,KAAK,aAAa,KAAK,UAAW;AACtC,WAAK,YAAY;AAAA,IACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,EAC3B;AAAA,EAEA,sBAAsB,UAAU;AAC9B,iBAAa,KAAK,kBAAkB;AACpC,SAAK,qBAAqB,WAAW,MAAM;AACzC,UAAI,CAAC,KAAK,aAAa,CAAC,KAAK,aAAa,CAAC,SAAU;AACrD,WAAK,WAAW;AAAA,IAClB,GAAG,KAAK,QAAQ,UAAU;AAAA,EAC5B;AAAA,EAEA,mBAAmB;AACjB,UAAM,UAAuB,KAAK;AAClC,UAAM,SAAS,KAAK,IAClB,eAAe,OAAO,cACtB,cAAc,OAAO,aACrB,gBAAgB,QAAQ,cACxB,eAAe,QAAQ,aACvB,SAAS,KAAK,QAAQ;AAExB,SAAK,YAAY;AACjB,SAAK,YAAY;AAEjB,UAAM,aAAa,OAAO,sBAAsB;AAChD,QAAI,YAAY,WAAW,MAAM,MAAM,qBAAqB;AAC5D,QAAI,aAAa,WAAW,OAAO,MAAM,sBAAsB;AAC/D,QAAI,KAAK,QAAQ,aAAa,OAAO;AACnC,mBAAa,CAAC,gBAAgB;AAC9B,oBAAc,cAAc,IAAI,eAAe;AAC/C,WAAK,YAAY,CAAC,KAAK,QAAQ;AAAA,IACjC,WAAW,KAAK,QAAQ,aAAa,SAAS;AAC5C,mBAAa,eAAe,IAAI,gBAAgB;AAChD,oBAAc,cAAc;AAC5B,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC,WAAW,KAAK,QAAQ,aAAa,QAAQ;AAC3C,mBAAa,eAAe,IAAI,gBAAgB;AAChD,oBAAc,CAAC,eAAe;AAC9B,WAAK,YAAY,CAAC,KAAK,QAAQ;AAAA,IACjC,OAAO;AACL,mBAAa,eAAe;AAC5B,oBAAc,cAAc,IAAI,eAAe;AAC/C,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC;AAEA,UAAM,iBAAiB,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,YAAQ,MAAM,MAAM,eAAe,IAAI;AACvC,YAAQ,MAAM,OAAO,eAAe,IAAI;AAAA,EAC1C;AAAA,EAEA,wBAAwB,GAAW,GAAW,OAAe,QAAgB;AAC3E,UAAM,aAAa,MAAM,sBAAsB;AAC/C,UAAM,YAAY,MAAM,qBAAqB;AAC7C,QAAI,OAAO,IAAI;AACf,QAAI,OAAO,IAAI;AAEf,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,KAAK,QAAQ,SAAS,KAAK,QAAQ;AAClD,UAAM,QAAQ,MAAM,qBAAqB,SAAS,MAAM,UAAU,MAAM;AAExE,QAAI,MAAM,MAAM;AACd,aAAO;AAAA,IACT,WAAW,MAAM,OAAO;AACtB,cAAQ,OAAO,QAAQ,OAAO;AAAA,IAChC;AACA,QAAI,MAAM,KAAK;AACb,aAAO;AAAA,IACT,WAAW,MAAM,QAAQ;AACvB,cAAQ,OAAO,SAAS,OAAO;AAAA,IACjC;AACA,WAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,aAAa;AACX,SAAK,iBAAiB;AACtB,SAAK,UAAU,MAAM,aAAa;AAClC,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,QAAQ;AAAA,gBACV,QAAQ;AACpB,eAAW,MAAM;AACf,WAAK,UAAU,MAAM,YAAY,cAAc,KAAK,SAAS,kBAAkB,KAAK,SAAS;AAC7F,WAAK,UAAU,MAAM,WAAW,KAAK,QAAQ,WAAW,GAAG,SAAS;AAAA,IACtE,GAAG,CAAC;AAAA,EACN;AAAA,EAEA,cAAc;AACZ,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,QAAQ;AAAA,gBACV,QAAQ;AACpB,eAAW,MAAM;AACf,WAAK,UAAU,MAAM,YAAY;AACjC,WAAK,UAAU,MAAM,UAAU;AAAA,IACjC,GAAG,CAAC;AAAA,EAYN;AAAA,EA0BA,uBAAgD;AAC9C,UAAM,mBAA4C,CAAC;AACnD,UAAM,oBAAoB,KAAK,GAAG,aAAa,cAAc;AAC7D,UAAM,YAAY,KAAK,GAAG,aAAa,iBAAiB;AACxD,UAAM,iBAAiB,KAAK,GAAG,aAAa,eAAe;AAC3D,QAAI,mBAAmB;AACrB,uBAAiB,OAAO;AAAA,IAC1B;AACA,QAAI,gBAAgB;AAClB,uBAAiB,WAAW;AAAA,IAC9B;AACA,QAAI,WAAW;AACb,uBAAiB,YAAY;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT;AACF;;;AChXO,IAAM,uBAAuB;AAAA,EAClC,cAAc,EAAE,WAAsB,cAAc,UAAU,gBAAgB;AAAA;AAAA;AAAA,EAG9E,OAAO,EAAE,WAAsB,OAAO,UAAU,eAAe;AAAA,EAC/D,UAAU,EAAE,WAAsB,UAAU,UAAU,YAAY;AAAA,EAClE,OAAO,EAAE,WAAsB,OAAO,UAAU,SAAS;AAAA,EACzD,aAAa,EAAE,WAAsB,aAAa,UAAU,eAAe;AAAA,EAC3E,YAAY,EAAE,WAAsB,YAAY,UAAU,cAAc;AAAA,EACxE,UAAU,EAAE,WAAsB,UAAU,UAAU,oBAAoB;AAAA,EAC1E,UAAU,EAAE,WAAsB,UAAU,UAAU,cAAc;AAAA,EACpE,OAAO,EAAE,WAAsB,OAAO,UAAU,SAAS;AAAA,EACzD,UAAU,EAAE,WAAsB,UAAU,UAAU,YAAY;AAAA,EAClE,SAAS,EAAE,WAAsB,SAAS,UAAU,WAAW;AAAA,EAC/D,WAAW,EAAE,WAAsB,WAAW,UAAU,aAAa;AAAA,EACrE,YAAY,EAAE,WAAsB,YAAY,UAAU,SAAS;AAAA,EACnE,SAAS,EAAE,WAAsB,SAAS,UAAU,WAAW;AAAA,EAC/D,MAAM,EAAE,WAAsB,MAAM,UAAU,QAAQ;AAAA,EACtD,WAAW,EAAE,WAAsB,WAAW,UAAU,cAAc;AAAA,EACtE,YAAY,EAAE,WAAsB,YAAY,UAAU,cAAc;AAAA,EACxE,SAAS,EAAE,WAAsB,SAAS,UAAU,cAAc;AAAA,EAClE,sBAAsB;AAAA,IACpB,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AACF;AAsBO,SAAS,SACd,UAAuB,SAAS,MAChC,SACA;AACA,aAAW,QAAQ,OAAO,KAAK,oBAAoB,GAAyB;AAC1E,UAAM,EAAE,WAAW,SAAS,IAAI,qBAAqB,IAAI;AAKzD,UAAM,MAAM,QAAQ,iBAAiB,OAAO,QAAQ,qBAAqB;AAGzE,IAAC,UAAsC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC;AAAA,EACxE;AACF;;;ACtDO,IAAM,UAAU;AAMvB,IAAI,OAAO,aAAa,aAAa;AACnC,WAAS,iBAAiB,WAAW,MAAM,kBAAkB,IAAI;AACjE,WAAS,iBAAiB,SAAS,MAAM,gBAAgB,IAAI;AAC7D,WAAS,iBAAiB,SAAS,MAAM,gBAAgB,IAAI;AAC7D,WAAS,iBAAiB,QAAQ,MAAM,eAAe,IAAI;AAC7D;AACA,MAAM,KAAK;AACX,MAAM,KAAK;AACX,MAAM,KAAK;AACX,MAAM,KAAK;AACX,MAAM,KAAK;AACX,QAAQ,KAAK;",
6
+ "names": ["el", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "el", "_defaults", "_defaults", "_defaults", "value", "realOption", "li", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults"]
7
7
  }