@pecb-ui/components 1.1.2 → 1.2.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 (56) hide show
  1. package/README.md +556 -556
  2. package/fesm2022/pecb-ui-components.mjs +3826 -1945
  3. package/fesm2022/pecb-ui-components.mjs.map +1 -1
  4. package/index.d.ts +3937 -3
  5. package/package.json +6 -8
  6. package/esm2022/lib/components/button/button.component.mjs +0 -171
  7. package/esm2022/lib/components/card/card.component.mjs +0 -182
  8. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
  9. package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
  11. package/esm2022/lib/components/input/input.component.mjs +0 -321
  12. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
  13. package/esm2022/lib/components/radio/radio.component.mjs +0 -147
  14. package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
  15. package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
  16. package/esm2022/lib/components/status/status.component.mjs +0 -50
  17. package/esm2022/lib/components/tab/tab.component.mjs +0 -151
  18. package/esm2022/lib/components/table/table.component.mjs +0 -503
  19. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
  20. package/esm2022/lib/pecb-components.module.mjs +0 -118
  21. package/esm2022/lib/services/loading.service.mjs +0 -182
  22. package/esm2022/lib/services/notification.service.mjs +0 -144
  23. package/esm2022/lib/services/theme.service.mjs +0 -232
  24. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
  25. package/esm2022/lib/shared/types/common.types.mjs +0 -6
  26. package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
  27. package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
  28. package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
  29. package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
  30. package/esm2022/pecb-ui-components.mjs +0 -5
  31. package/esm2022/public-api.mjs +0 -53
  32. package/lib/components/button/button.component.d.ts +0 -130
  33. package/lib/components/card/card.component.d.ts +0 -140
  34. package/lib/components/checkbox/checkbox.component.d.ts +0 -74
  35. package/lib/components/datepicker/datepicker.component.d.ts +0 -155
  36. package/lib/components/dropdown/dropdown.component.d.ts +0 -144
  37. package/lib/components/input/input.component.d.ts +0 -215
  38. package/lib/components/pagination/pagination.component.d.ts +0 -53
  39. package/lib/components/radio/radio.component.d.ts +0 -93
  40. package/lib/components/right-modal/right-modal.component.d.ts +0 -137
  41. package/lib/components/sidebar/sidebar.component.d.ts +0 -97
  42. package/lib/components/status/status.component.d.ts +0 -19
  43. package/lib/components/tab/tab.component.d.ts +0 -102
  44. package/lib/components/table/table.component.d.ts +0 -403
  45. package/lib/components/toggle/toggle.component.d.ts +0 -74
  46. package/lib/pecb-components.module.d.ts +0 -37
  47. package/lib/services/loading.service.d.ts +0 -129
  48. package/lib/services/notification.service.d.ts +0 -136
  49. package/lib/services/theme.service.d.ts +0 -142
  50. package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
  51. package/lib/shared/types/common.types.d.ts +0 -86
  52. package/lib/shared/utils/accessibility.utils.d.ts +0 -167
  53. package/lib/shared/utils/dom.utils.d.ts +0 -108
  54. package/lib/shared/utils/error.utils.d.ts +0 -191
  55. package/lib/shared/utils/string.utils.d.ts +0 -144
  56. package/public-api.d.ts +0 -24
@@ -1 +1 @@
1
- {"version":3,"file":"pecb-ui-components.mjs","sources":["../../../projects/ui-components/src/lib/shared/utils/dom.utils.ts","../../../projects/ui-components/src/lib/components/button/button.component.ts","../../../projects/ui-components/src/lib/components/button/button.component.html","../../../projects/ui-components/src/lib/components/card/card.component.ts","../../../projects/ui-components/src/lib/components/card/card.component.html","../../../projects/ui-components/src/lib/components/status/status.component.ts","../../../projects/ui-components/src/lib/components/status/status.component.html","../../../projects/ui-components/src/lib/components/pagination/pagination.component.ts","../../../projects/ui-components/src/lib/components/pagination/pagination.component.html","../../../projects/ui-components/src/lib/components/table/table.component.ts","../../../projects/ui-components/src/lib/components/table/table.component.html","../../../projects/ui-components/src/lib/components/tab/tab.component.ts","../../../projects/ui-components/src/lib/components/tab/tab.component.html","../../../projects/ui-components/src/lib/components/datepicker/datepicker.component.ts","../../../projects/ui-components/src/lib/components/datepicker/datepicker.component.html","../../../projects/ui-components/src/lib/components/input/input.component.ts","../../../projects/ui-components/src/lib/components/input/input.component.html","../../../projects/ui-components/src/lib/components/radio/radio.component.ts","../../../projects/ui-components/src/lib/components/radio/radio.component.html","../../../projects/ui-components/src/lib/components/checkbox/checkbox.component.ts","../../../projects/ui-components/src/lib/components/checkbox/checkbox.component.html","../../../projects/ui-components/src/lib/components/toggle/toggle.component.ts","../../../projects/ui-components/src/lib/components/toggle/toggle.component.html","../../../projects/ui-components/src/lib/components/dropdown/dropdown.component.ts","../../../projects/ui-components/src/lib/components/dropdown/dropdown.component.html","../../../projects/ui-components/src/lib/components/right-modal/right-modal.component.ts","../../../projects/ui-components/src/lib/components/right-modal/right-modal.component.html","../../../projects/ui-components/src/lib/components/sidebar/sidebar.component.ts","../../../projects/ui-components/src/lib/components/sidebar/sidebar.component.html","../../../projects/ui-components/src/lib/pecb-components.module.ts","../../../projects/ui-components/src/lib/services/notification.service.ts","../../../projects/ui-components/src/lib/services/theme.service.ts","../../../projects/ui-components/src/lib/services/loading.service.ts","../../../projects/ui-components/src/lib/shared/types/common.types.ts","../../../projects/ui-components/src/lib/shared/utils/string.utils.ts","../../../projects/ui-components/src/lib/shared/utils/accessibility.utils.ts","../../../projects/ui-components/src/lib/shared/utils/error.utils.ts","../../../projects/ui-components/src/public-api.ts","../../../projects/ui-components/src/pecb-ui-components.ts"],"sourcesContent":["/**\r\n * DOM utility functions for PECB UI Components\r\n * @module utils/dom\r\n */\r\n\r\n/**\r\n * Check if code is running in a browser environment\r\n * @returns True if running in browser\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\n/**\r\n * Generate a unique ID for DOM elements\r\n * @param prefix - Optional prefix for the ID\r\n * @returns A unique ID string\r\n *\r\n * @example\r\n * generateUniqueId('btn') // 'btn-a1b2c3d4'\r\n */\r\nexport function generateUniqueId(prefix = 'pecb'): string {\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return `${prefix}-${random}`;\r\n}\r\n\r\n/**\r\n * Check if an element matches a CSS selector\r\n * @param element - The element to check\r\n * @param selector - The CSS selector\r\n * @returns True if the element matches\r\n */\r\nexport function matchesSelector(element: Element, selector: string): boolean {\r\n return element.matches(selector);\r\n}\r\n\r\n/**\r\n * Find the closest ancestor matching a selector\r\n * @param element - Starting element\r\n * @param selector - CSS selector to match\r\n * @returns The matching ancestor or null\r\n */\r\nexport function closestElement<T extends Element>(element: Element, selector: string): T | null {\r\n return element.closest(selector) as T | null;\r\n}\r\n\r\n/**\r\n * Check if an element is visible in the viewport\r\n * @param element - The element to check\r\n * @param partial - Whether partial visibility counts\r\n * @returns True if visible\r\n */\r\nexport function isElementVisible(element: Element, partial = true): boolean {\r\n if (!isBrowser()) return false;\r\n\r\n const rect = element.getBoundingClientRect();\r\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\r\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\r\n\r\n if (partial) {\r\n return (\r\n rect.top < windowHeight &&\r\n rect.bottom > 0 &&\r\n rect.left < windowWidth &&\r\n rect.right > 0\r\n );\r\n }\r\n\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= windowHeight &&\r\n rect.right <= windowWidth\r\n );\r\n}\r\n\r\n/**\r\n * Get all focusable elements within a container\r\n * @param container - The container element\r\n * @returns Array of focusable elements\r\n */\r\nexport function getFocusableElements(container: Element): HTMLElement[] {\r\n const focusableSelectors = [\r\n 'a[href]',\r\n 'area[href]',\r\n 'button:not([disabled])',\r\n 'input:not([disabled]):not([type=\"hidden\"])',\r\n 'select:not([disabled])',\r\n 'textarea:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable=\"true\"]'\r\n ].join(',');\r\n\r\n return Array.from(container.querySelectorAll<HTMLElement>(focusableSelectors));\r\n}\r\n\r\n/**\r\n * Trap focus within a container (useful for modals)\r\n * @param container - The container to trap focus in\r\n * @returns Cleanup function to remove the trap\r\n */\r\nexport function trapFocus(container: HTMLElement): () => void {\r\n const focusableElements = getFocusableElements(container);\r\n const firstElement = focusableElements[0];\r\n const lastElement = focusableElements[focusableElements.length - 1];\r\n\r\n const handleKeyDown = (event: KeyboardEvent): void => {\r\n if (event.key !== 'Tab') return;\r\n\r\n if (event.shiftKey) {\r\n if (document.activeElement === firstElement) {\r\n event.preventDefault();\r\n lastElement?.focus();\r\n }\r\n } else {\r\n if (document.activeElement === lastElement) {\r\n event.preventDefault();\r\n firstElement?.focus();\r\n }\r\n }\r\n };\r\n\r\n container.addEventListener('keydown', handleKeyDown);\r\n firstElement?.focus();\r\n\r\n return () => {\r\n container.removeEventListener('keydown', handleKeyDown);\r\n };\r\n}\r\n\r\n/**\r\n * Scroll an element into view smoothly\r\n * @param element - The element to scroll to\r\n * @param options - Scroll options\r\n */\r\nexport function scrollIntoView(\r\n element: Element,\r\n options: ScrollIntoViewOptions = { behavior: 'smooth', block: 'nearest' }\r\n): void {\r\n element.scrollIntoView(options);\r\n}\r\n\r\n/**\r\n * Get the scroll parent of an element\r\n * @param element - The element to find scroll parent for\r\n * @returns The scroll parent element\r\n */\r\nexport function getScrollParent(element: Element): Element | null {\r\n if (!isBrowser()) return null;\r\n\r\n let parent: Element | null = element.parentElement;\r\n\r\n while (parent) {\r\n const style = getComputedStyle(parent);\r\n const overflow = style.overflow + style.overflowY + style.overflowX;\r\n\r\n if (/auto|scroll|overlay/.test(overflow)) {\r\n return parent;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return document.scrollingElement || document.documentElement;\r\n}\r\n\r\n/**\r\n * Disable body scroll (useful for modals)\r\n * @returns Cleanup function to re-enable scroll\r\n */\r\nexport function disableBodyScroll(): () => void {\r\n if (!isBrowser()) return () => {};\r\n\r\n const scrollY = window.scrollY;\r\n const body = document.body;\r\n const originalStyles = {\r\n position: body.style.position,\r\n top: body.style.top,\r\n width: body.style.width,\r\n overflow: body.style.overflow\r\n };\r\n\r\n body.style.position = 'fixed';\r\n body.style.top = `-${scrollY}px`;\r\n body.style.width = '100%';\r\n body.style.overflow = 'hidden';\r\n\r\n return () => {\r\n body.style.position = originalStyles.position;\r\n body.style.top = originalStyles.top;\r\n body.style.width = originalStyles.width;\r\n body.style.overflow = originalStyles.overflow;\r\n window.scrollTo(0, scrollY);\r\n };\r\n}\r\n\r\n/**\r\n * Copy text to clipboard\r\n * @param text - The text to copy\r\n * @returns Promise that resolves when copied\r\n */\r\nexport async function copyToClipboard(text: string): Promise<void> {\r\n if (!isBrowser()) {\r\n throw new Error('Clipboard API not available in this environment');\r\n }\r\n\r\n if (navigator.clipboard && navigator.clipboard.writeText) {\r\n await navigator.clipboard.writeText(text);\r\n } else {\r\n // Fallback for older browsers\r\n const textArea = document.createElement('textarea');\r\n textArea.value = text;\r\n textArea.style.position = 'fixed';\r\n textArea.style.left = '-9999px';\r\n textArea.style.top = '-9999px';\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(textArea);\r\n }\r\n}\r\n\r\n/**\r\n * Check if an element has a specific CSS class\r\n * @param element - The element to check\r\n * @param className - The class name\r\n * @returns True if the element has the class\r\n */\r\nexport function hasClass(element: Element, className: string): boolean {\r\n return element.classList.contains(className);\r\n}\r\n\r\n/**\r\n * Add CSS class(es) to an element\r\n * @param element - The element to modify\r\n * @param classNames - Class name(s) to add\r\n */\r\nexport function addClass(element: Element, ...classNames: string[]): void {\r\n element.classList.add(...classNames);\r\n}\r\n\r\n/**\r\n * Remove CSS class(es) from an element\r\n * @param element - The element to modify\r\n * @param classNames - Class name(s) to remove\r\n */\r\nexport function removeClass(element: Element, ...classNames: string[]): void {\r\n element.classList.remove(...classNames);\r\n}\r\n\r\n/**\r\n * Toggle a CSS class on an element\r\n * @param element - The element to modify\r\n * @param className - The class name to toggle\r\n * @param force - Optional force add (true) or remove (false)\r\n * @returns True if the class is now present\r\n */\r\nexport function toggleClass(element: Element, className: string, force?: boolean): boolean {\r\n return element.classList.toggle(className, force);\r\n}\r\n\r\n/**\r\n * Get computed CSS property value\r\n * @param element - The element to check\r\n * @param property - CSS property name\r\n * @returns The computed value\r\n */\r\nexport function getComputedStyleValue(element: Element, property: string): string {\r\n if (!isBrowser()) return '';\r\n return getComputedStyle(element).getPropertyValue(property);\r\n}\r\n","import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type ButtonVariant =\r\n | 'primary'\r\n | 'primary-outline'\r\n | 'primary-2'\r\n | 'primary-2-outline'\r\n | 'neutral'\r\n | 'neutral-outline'\r\n | 'secondary'\r\n | 'text'\r\n | 'destructive'\r\n | 'destructive-outline';\r\nexport type ButtonSize = 'sm' | 'md' | 'lg';\r\nexport type ButtonIconStyle = 'none' | 'leading' | 'trailing' | 'icon-only';\r\n\r\n/**\r\n * A professional button component with multiple variants and sizes.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-button variant=\"primary\" size=\"md\" (clicked)=\"handleClick()\">\r\n * Click me\r\n * </pecb-button>\r\n *\r\n * <!-- With leading icon -->\r\n * <pecb-button variant=\"primary\" iconStyle=\"leading\" icon=\"+\">\r\n * Add Item\r\n * </pecb-button>\r\n *\r\n * <!-- Icon only button -->\r\n * <pecb-button variant=\"secondary\" iconStyle=\"icon-only\" icon=\"+\" ariaLabel=\"Add item\"></pecb-button>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './button.component.html',\r\n styleUrls: ['./button.component.scss']\r\n})\r\nexport class ButtonComponent {\r\n /**\r\n * Unique ID for the button element\r\n */\r\n @Input() id: string = generateUniqueId('btn');\r\n\r\n /**\r\n * The visual style variant of the button\r\n */\r\n @Input() variant: ButtonVariant = 'primary';\r\n\r\n /**\r\n * The size of the button\r\n */\r\n @Input() size: ButtonSize = 'md';\r\n\r\n /**\r\n * Icon placement style\r\n */\r\n @Input() iconStyle: ButtonIconStyle = 'none';\r\n\r\n /**\r\n * Icon to display (used with iconStyle)\r\n */\r\n @Input() icon?: string;\r\n\r\n /**\r\n * Whether the button is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether the button should take full width\r\n */\r\n @Input() fullWidth = false;\r\n\r\n /**\r\n * Whether the button is in loading state\r\n */\r\n @Input() loading = false;\r\n\r\n /**\r\n * Button type attribute\r\n */\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Accessible label for the button (required for icon-only buttons)\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of element that labels this button\r\n */\r\n @Input() ariaLabelledBy?: string;\r\n\r\n /**\r\n * ID of element that describes this button\r\n */\r\n @Input() ariaDescribedBy?: string;\r\n\r\n /**\r\n * Indicates the button controls an expandable element\r\n */\r\n @Input() ariaExpanded?: boolean;\r\n\r\n /**\r\n * Indicates the pressed state for toggle buttons\r\n */\r\n @Input() ariaPressed?: boolean;\r\n\r\n /**\r\n * Indicates the button opens a popup (menu, listbox, dialog, etc.)\r\n */\r\n @Input() ariaHasPopup?: boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\r\n\r\n /**\r\n * ID of the element controlled by this button\r\n */\r\n @Input() ariaControls?: string;\r\n\r\n /**\r\n * Event emitted when the button is clicked\r\n */\r\n @Output() clicked = new EventEmitter<MouseEvent>();\r\n\r\n /**\r\n * Host binding for the component's ID\r\n */\r\n @HostBinding('attr.id') get hostId(): null {\r\n return null; // ID is on the button element, not the host\r\n }\r\n\r\n /**\r\n * Get CSS classes for the button\r\n */\r\n get buttonClasses(): string[] {\r\n return [\r\n 'pecb-button',\r\n `pecb-button--${this.variant}`,\r\n `pecb-button--${this.size}`,\r\n this.iconStyle !== 'none' ? `pecb-button--icon-${this.iconStyle}` : '',\r\n this.fullWidth ? 'pecb-button--full-width' : '',\r\n this.loading ? 'pecb-button--loading' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Check if we should show leading icon\r\n */\r\n get showLeadingIcon(): boolean {\r\n return this.iconStyle === 'leading' && !!this.icon && !this.loading;\r\n }\r\n\r\n /**\r\n * Check if we should show trailing icon\r\n */\r\n get showTrailingIcon(): boolean {\r\n return this.iconStyle === 'trailing' && !!this.icon && !this.loading;\r\n }\r\n\r\n /**\r\n * Check if this is icon-only button\r\n */\r\n get isIconOnly(): boolean {\r\n return this.iconStyle === 'icon-only';\r\n }\r\n\r\n /**\r\n * Get the loading announcement text for screen readers\r\n */\r\n get loadingText(): string {\r\n return 'Loading, please wait';\r\n }\r\n\r\n /**\r\n * Handle button click\r\n */\r\n onClick(event: MouseEvent): void {\r\n if (!this.disabled && !this.loading) {\r\n this.clicked.emit(event);\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard events for accessibility\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n // Allow Enter and Space to trigger click\r\n if ((event.key === 'Enter' || event.key === ' ') && !this.disabled && !this.loading) {\r\n event.preventDefault();\r\n this.clicked.emit(event as unknown as MouseEvent);\r\n }\r\n }\r\n}\r\n","<button\r\n [id]=\"id\"\r\n [type]=\"type\"\r\n [disabled]=\"disabled || loading\"\r\n [class]=\"buttonClasses.join(' ')\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\r\n [attr.aria-pressed]=\"ariaPressed !== undefined ? ariaPressed : null\"\r\n [attr.aria-haspopup]=\"ariaHasPopup\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-busy]=\"loading ? true : null\"\r\n [attr.aria-disabled]=\"disabled ? true : null\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-button__content\">\r\n <!-- Loading spinner with screen reader announcement -->\r\n <span *ngIf=\"loading\" class=\"pecb-button__spinner\" aria-hidden=\"true\"></span>\r\n <span *ngIf=\"loading\" class=\"pecb-button__sr-only\">{{ loadingText }}</span>\r\n\r\n <!-- Leading icon -->\r\n <span\r\n *ngIf=\"showLeadingIcon\"\r\n class=\"pecb-button__icon pecb-button__icon--leading\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Icon only -->\r\n <span\r\n *ngIf=\"isIconOnly && icon && !loading\"\r\n class=\"pecb-button__icon\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Button text content (hidden for icon-only) -->\r\n <span *ngIf=\"!isIconOnly\" class=\"pecb-button__text\">\r\n <ng-content></ng-content>\r\n </span>\r\n\r\n <!-- Trailing icon -->\r\n <span\r\n *ngIf=\"showTrailingIcon\"\r\n class=\"pecb-button__icon pecb-button__icon--trailing\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ icon }}\r\n </span>\r\n </span>\r\n</button>\r\n","import { Component, Input } from '@angular/core';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type CardElevation = 'none' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Semantic role for the card component\r\n */\r\nexport type CardRole = 'article' | 'region' | 'group' | 'listitem' | 'none';\r\n\r\n/**\r\n * A professional card component for displaying content in a contained format.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic card -->\r\n * <pecb-card elevation=\"md\">\r\n * <pecb-card-header>\r\n * <h3>Card Title</h3>\r\n * </pecb-card-header>\r\n * <pecb-card-body>\r\n * <p>Card content goes here</p>\r\n * </pecb-card-body>\r\n * </pecb-card>\r\n *\r\n * <!-- Accessible card with region role -->\r\n * <pecb-card role=\"region\" ariaLabel=\"Product Information\">\r\n * <pecb-card-body>\r\n * <p>Product details...</p>\r\n * </pecb-card-body>\r\n * </pecb-card>\r\n *\r\n * <!-- Card as article -->\r\n * <pecb-card role=\"article\" ariaLabelledBy=\"article-title\">\r\n * <pecb-card-header>\r\n * <h2 id=\"article-title\">Article Headline</h2>\r\n * </pecb-card-header>\r\n * <pecb-card-body>\r\n * <p>Article content...</p>\r\n * </pecb-card-body>\r\n * </pecb-card>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card',\r\n standalone: true,\r\n templateUrl: './card.component.html',\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardComponent {\r\n /**\r\n * Unique ID for the card element\r\n */\r\n @Input() id: string = generateUniqueId('card');\r\n\r\n /**\r\n * The elevation level (shadow depth) of the card\r\n */\r\n @Input() elevation: CardElevation = 'md';\r\n\r\n /**\r\n * Whether the card should be hoverable with elevation change\r\n */\r\n @Input() hoverable = false;\r\n\r\n /**\r\n * Whether to add padding to the card\r\n */\r\n @Input() noPadding = false;\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Semantic role for the card (article, region, group, listitem, or none)\r\n * Use 'article' for self-contained content, 'region' for significant sections\r\n */\r\n @Input() role: CardRole = 'none';\r\n\r\n /**\r\n * Accessible label for the card\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of element that labels this card\r\n */\r\n @Input() ariaLabelledBy?: string;\r\n\r\n /**\r\n * ID of element that describes this card\r\n */\r\n @Input() ariaDescribedBy?: string;\r\n\r\n /**\r\n * Get CSS classes for the card\r\n */\r\n get cardClasses(): string[] {\r\n return [\r\n 'pecb-card',\r\n `pecb-card--elevation-${this.elevation}`,\r\n this.hoverable ? 'pecb-card--hoverable' : '',\r\n this.noPadding ? 'pecb-card--no-padding' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get the role attribute value\r\n */\r\n get roleAttribute(): string | null {\r\n return this.role !== 'none' ? this.role : null;\r\n }\r\n}\r\n\r\n/**\r\n * Card header component for displaying title and actions.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-card-header>\r\n * <h3>Card Title</h3>\r\n * </pecb-card-header>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card-header',\r\n standalone: true,\r\n template: `\r\n <div class=\"pecb-card__header\" role=\"heading\" [attr.aria-level]=\"headingLevel\">\r\n <ng-content></ng-content>\r\n </div>\r\n `,\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardHeaderComponent {\r\n /**\r\n * Heading level for accessibility (1-6)\r\n * Only used if the header content doesn't contain a heading element\r\n */\r\n @Input() headingLevel: number | null = null;\r\n}\r\n\r\n/**\r\n * Card body component for main content.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-card-body>\r\n * <p>Card content goes here</p>\r\n * </pecb-card-body>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card-body',\r\n standalone: true,\r\n template: '<div class=\"pecb-card__body\"><ng-content></ng-content></div>',\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardBodyComponent {}\r\n\r\n/**\r\n * Card footer component for actions and additional information.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-card-footer>\r\n * <button>Action</button>\r\n * </pecb-card-footer>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card-footer',\r\n standalone: true,\r\n template: '<div class=\"pecb-card__footer\"><ng-content></ng-content></div>',\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardFooterComponent {}\r\n","<div\r\n [id]=\"id\"\r\n [class]=\"cardClasses.join(' ')\"\r\n [attr.role]=\"roleAttribute\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n>\r\n <ng-content></ng-content>\r\n</div>\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type StatusType = 'warning' | 'action' | 'success' | 'error' | 'different' | 'disabled' | 'neutral';\r\nexport type StatusVariant = 'accent' | 'filled' | 'outline' | 'custom';\r\nexport type StatusSize = 'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'pecb-status',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './status.component.html',\r\n styleUrls: ['./status.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class StatusComponent {\r\n private _id = `status-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n @Input() type: StatusType = 'neutral';\r\n @Input() variant: StatusVariant = 'filled';\r\n @Input() size: StatusSize = 'md';\r\n @Input() ariaLabel?: string;\r\n\r\n /** Text content to display (alternative to ng-content, useful for dynamic components) */\r\n @Input() text?: string;\r\n\r\n /** Custom CSS class(es) to add to the status element */\r\n @Input() customClass?: string;\r\n\r\n get id(): string {\r\n return this._id;\r\n }\r\n\r\n get statusClasses(): string[] {\r\n const classes = [\r\n 'pecb-status',\r\n `pecb-status--${this.size}`\r\n ];\r\n\r\n // Only add type and variant classes if not using custom variant\r\n if (this.variant !== 'custom') {\r\n classes.push(`pecb-status--${this.type}`);\r\n classes.push(`pecb-status--${this.variant}`);\r\n }\r\n\r\n // Add custom class if provided\r\n if (this.customClass) {\r\n classes.push(...this.customClass.split(' ').filter(c => c.trim()));\r\n }\r\n\r\n return classes;\r\n }\r\n}\r\n","<span\r\n [id]=\"id\"\r\n [ngClass]=\"statusClasses\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"status\"\r\n>\r\n <ng-content></ng-content>{{ text }}\r\n</span>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n OnChanges,\r\n SimpleChanges,\r\n HostListener,\r\n ElementRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type PaginationSize = 'sm' | 'md' | 'lg';\r\nexport type PaginationVariant = 'full' | 'compact' | 'minimal' | 'centered';\r\n\r\nexport interface PageChangeEvent {\r\n page: number;\r\n pageSize: number;\r\n startIndex: number;\r\n endIndex: number;\r\n}\r\n\r\n@Component({\r\n selector: 'pecb-pagination',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './pagination.component.html',\r\n styleUrls: ['./pagination.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PaginationComponent implements OnChanges {\r\n @Input() totalItems = 0;\r\n @Input() pageSize = 10;\r\n @Input() currentPage = 1;\r\n @Input() pageSizeOptions: number[] = [10, 25, 50, 75];\r\n @Input() size: PaginationSize = 'md';\r\n @Input() variant: PaginationVariant = 'full';\r\n @Input() showPageSizeSelector = true;\r\n @Input() showItemsInfo = true;\r\n @Input() maxVisiblePages = 3;\r\n @Input() disabled = false;\r\n\r\n @Input('aria-label') ariaLabel = 'Pagination';\r\n\r\n @Output() pageChange = new EventEmitter<PageChangeEvent>();\r\n @Output() pageSizeChange = new EventEmitter<number>();\r\n\r\n totalPages = 0;\r\n visiblePages: (number | string)[] = [];\r\n isDropdownOpen = false;\r\n\r\n constructor(private elementRef: ElementRef) {}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)) {\r\n this.isDropdownOpen = false;\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['totalItems'] || changes['pageSize'] || changes['currentPage']) {\r\n this.calculateTotalPages();\r\n this.updateVisiblePages();\r\n }\r\n }\r\n\r\n get containerClasses(): string[] {\r\n return [\r\n 'pecb-pagination',\r\n `pecb-pagination--${this.size}`,\r\n `pecb-pagination--${this.variant}`,\r\n this.disabled ? 'pecb-pagination--disabled' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n get showPages(): boolean {\r\n return this.variant === 'full' || this.variant === 'compact';\r\n }\r\n\r\n get showPageSize(): boolean {\r\n return this.variant === 'full' && this.showPageSizeSelector;\r\n }\r\n\r\n get itemsInfoText(): string {\r\n if (this.variant === 'minimal' || this.variant === 'centered') {\r\n return `Showing ${this.startIndex}-${this.endIndex} of ${this.totalItems}`;\r\n }\r\n return `${this.startIndex}-${this.endIndex} of ${this.totalItems} items`;\r\n }\r\n\r\n get startIndex(): number {\r\n if (this.totalItems === 0) return 0;\r\n return (this.currentPage - 1) * this.pageSize + 1;\r\n }\r\n\r\n get endIndex(): number {\r\n return Math.min(this.currentPage * this.pageSize, this.totalItems);\r\n }\r\n\r\n get canGoPrevious(): boolean {\r\n return this.currentPage > 1 && !this.disabled;\r\n }\r\n\r\n get canGoNext(): boolean {\r\n return this.currentPage < this.totalPages && !this.disabled;\r\n }\r\n\r\n private calculateTotalPages(): void {\r\n this.totalPages = Math.ceil(this.totalItems / this.pageSize);\r\n if (this.currentPage > this.totalPages && this.totalPages > 0) {\r\n this.goToPage(this.totalPages);\r\n }\r\n }\r\n\r\n private updateVisiblePages(): void {\r\n const pages: (number | string)[] = [];\r\n\r\n if (this.totalPages <= this.maxVisiblePages + 2) {\r\n for (let i = 1; i <= this.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push(1);\r\n\r\n if (this.currentPage <= this.maxVisiblePages) {\r\n for (let i = 2; i <= this.maxVisiblePages + 1; i++) {\r\n pages.push(i);\r\n }\r\n pages.push('...');\r\n pages.push(this.totalPages);\r\n } else if (this.currentPage >= this.totalPages - this.maxVisiblePages + 1) {\r\n pages.push('...');\r\n for (let i = this.totalPages - this.maxVisiblePages; i <= this.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push('...');\r\n for (let i = this.currentPage - 1; i <= this.currentPage + 1; i++) {\r\n pages.push(i);\r\n }\r\n pages.push('...');\r\n pages.push(this.totalPages);\r\n }\r\n }\r\n\r\n this.visiblePages = pages;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (this.disabled || page < 1 || page > this.totalPages || page === this.currentPage) {\r\n return;\r\n }\r\n\r\n this.currentPage = page;\r\n this.updateVisiblePages();\r\n this.emitPageChange();\r\n }\r\n\r\n goToPrevious(): void {\r\n if (this.canGoPrevious) {\r\n this.goToPage(this.currentPage - 1);\r\n }\r\n }\r\n\r\n goToNext(): void {\r\n if (this.canGoNext) {\r\n this.goToPage(this.currentPage + 1);\r\n }\r\n }\r\n\r\n onPageSizeChange(newSize: number): void {\r\n if (this.disabled) return;\r\n\r\n this.pageSize = newSize;\r\n this.currentPage = 1;\r\n this.calculateTotalPages();\r\n this.updateVisiblePages();\r\n this.isDropdownOpen = false;\r\n this.pageSizeChange.emit(newSize);\r\n this.emitPageChange();\r\n }\r\n\r\n toggleDropdown(): void {\r\n if (!this.disabled) {\r\n this.isDropdownOpen = !this.isDropdownOpen;\r\n }\r\n }\r\n\r\n closeDropdown(): void {\r\n this.isDropdownOpen = false;\r\n }\r\n\r\n private emitPageChange(): void {\r\n this.pageChange.emit({\r\n page: this.currentPage,\r\n pageSize: this.pageSize,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n\r\n isNumber(value: number | string): boolean {\r\n return typeof value === 'number';\r\n }\r\n\r\n trackByPage(index: number, page: number | string): number | string {\r\n return typeof page === 'number' ? page : `ellipsis-${index}`;\r\n }\r\n}","<nav\r\n [class]=\"containerClasses.join(' ')\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"navigation\"\r\n>\r\n <!-- V4: Centered variant - prev button on left -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Info section (V1, V2, V3, V4) -->\r\n <div class=\"pecb-pagination__info\" *ngIf=\"showItemsInfo || showPageSize\">\r\n <span *ngIf=\"showItemsInfo\" class=\"pecb-pagination__items-text\">\r\n {{ itemsInfoText }}\r\n </span>\r\n\r\n <!-- Page size dropdown (V1 only) -->\r\n <div *ngIf=\"showPageSize\" class=\"pecb-pagination__page-size\">\r\n <span class=\"pecb-pagination__page-size-label\">Items per page:</span>\r\n <div class=\"pecb-pagination__dropdown\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-pagination__dropdown-trigger\"\r\n [class.pecb-pagination__dropdown-trigger--open]=\"isDropdownOpen\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggleDropdown()\"\r\n >\r\n <span>{{ pageSize }}</span>\r\n <svg\r\n class=\"pecb-pagination__dropdown-icon\"\r\n [class.pecb-pagination__dropdown-icon--open]=\"isDropdownOpen\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M4 6L8 10L12 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <ul\r\n *ngIf=\"isDropdownOpen\"\r\n class=\"pecb-pagination__dropdown-menu\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"'Select items per page'\"\r\n >\r\n <li\r\n *ngFor=\"let option of pageSizeOptions\"\r\n class=\"pecb-pagination__dropdown-item\"\r\n [class.pecb-pagination__dropdown-item--selected]=\"option === pageSize\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"option === pageSize\"\r\n (click)=\"onPageSizeChange(option)\"\r\n >\r\n {{ option }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Controls section -->\r\n <div class=\"pecb-pagination__controls\">\r\n <!-- Previous button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Page numbers (V1, V2) -->\r\n <div *ngIf=\"showPages\" class=\"pecb-pagination__pages\" role=\"group\" aria-label=\"Page navigation\">\r\n <ng-container *ngFor=\"let page of visiblePages; trackBy: trackByPage\">\r\n <button\r\n *ngIf=\"isNumber(page)\"\r\n type=\"button\"\r\n class=\"pecb-pagination__page-button\"\r\n [class.pecb-pagination__page-button--active]=\"page === currentPage\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Page ' + page\"\r\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\r\n (click)=\"goToPage(+page)\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span\r\n *ngIf=\"!isNumber(page)\"\r\n class=\"pecb-pagination__ellipsis\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ page }}\r\n </span>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Next button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- V4: Centered variant - next button on right -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n</nav>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ContentChild,\r\n TemplateRef,\r\n Type,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { PageChangeEvent, PaginationComponent } from '../pagination/pagination.component';\r\nimport { StatusComponent } from '../status/status.component';\r\n\r\n/**\r\n * Defines the available table sizes\r\n */\r\nexport type TableSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Defines the available table variants\r\n */\r\nexport type TableVariant = 'default' | 'striped' | 'bordered';\r\n\r\n/**\r\n * Defines built-in column types\r\n */\r\nexport type PecbTableColumnType = 'text' | 'status' | 'action' | 'user' | 'custom';\r\n\r\n/**\r\n * Defines built-in component names for columns\r\n */\r\nexport type PecbTableColumnComponent = 'status' | 'action' | 'user';\r\n\r\n/**\r\n * Action button definition for action columns\r\n */\r\nexport interface TableAction {\r\n /** Unique identifier for the action */\r\n id: string;\r\n /** Icon name or type */\r\n icon: 'view' | 'edit' | 'delete' | 'download' | 'copy' | 'custom';\r\n /** Tooltip/title text */\r\n tooltip?: string;\r\n /** Custom icon SVG (when icon is 'custom') */\r\n customIcon?: string;\r\n /** Whether the action is disabled */\r\n disabled?: boolean;\r\n /** Variant for styling (e.g., 'danger' for delete) */\r\n variant?: 'default' | 'danger';\r\n /** Click handler for this specific action */\r\n action?: (row: any, index: number) => void;\r\n}\r\n\r\n/**\r\n * Status mapping configuration\r\n */\r\nexport interface TableStatusConfig {\r\n /** Map of value to status type */\r\n typeMap?: Record<string, string>;\r\n /** Status variant */\r\n variant?: 'accent' | 'filled' | 'outline';\r\n /** Status size */\r\n size?: 'sm' | 'md' | 'lg';\r\n}\r\n\r\n/**\r\n * User cell configuration\r\n */\r\nexport interface TableUserConfig {\r\n /** Key for the avatar/image URL */\r\n avatarKey?: string;\r\n /** Key for the name */\r\n nameKey?: string;\r\n /** Key for the secondary text (e.g., email) */\r\n secondaryKey?: string;\r\n}\r\n\r\n/**\r\n * Column definition for the table\r\n */\r\nexport interface PecbTableColumn {\r\n /** Unique key for the column, used to access data */\r\n key: string;\r\n /** Display label for the column header */\r\n label: string;\r\n /** Width of the column (e.g., '200px', '20%', 'auto') */\r\n width?: string;\r\n /** Alignment of the column content */\r\n align?: 'left' | 'center' | 'right';\r\n /** Whether the column is sortable */\r\n sortable?: boolean;\r\n /** Custom template reference for cell content */\r\n cellTemplate?: TemplateRef<any>;\r\n /** Custom template reference for header content */\r\n headerTemplate?: TemplateRef<any>;\r\n /** CSS class to apply to the column */\r\n cssClass?: string;\r\n /** Built-in column type (deprecated, use 'component' instead) */\r\n type?: PecbTableColumnType;\r\n /** Built-in component to render: 'status', 'action', 'user' */\r\n component?: PecbTableColumnComponent;\r\n /** Dynamic component class to render in the cell (e.g., StatusComponent) */\r\n dynamicComponent?: Type<any>;\r\n /** Inputs to pass to the dynamic component */\r\n componentInputs?: Record<string, any>;\r\n /** Function to generate dynamic inputs based on row data */\r\n componentInputsFn?: (row: any, value: any, index: number) => Record<string, any>;\r\n /** Action buttons configuration (when component is 'action') */\r\n actions?: TableAction[];\r\n /** Status configuration (when component is 'status') */\r\n statusConfig?: TableStatusConfig;\r\n /** User cell configuration (when component is 'user') */\r\n userConfig?: TableUserConfig;\r\n}\r\n\r\n/**\r\n * Sort event emitted when a sortable column is clicked\r\n */\r\nexport interface TableSortEvent {\r\n /** Column key that was sorted */\r\n column: string;\r\n /** Sort direction */\r\n direction: 'asc' | 'desc' | null;\r\n}\r\n\r\n/**\r\n * Row action event emitted when an action button is clicked\r\n */\r\nexport interface TableRowActionEvent {\r\n /** Type of action performed */\r\n action: string;\r\n /** Row data for the action */\r\n row: any;\r\n /** Row index */\r\n index: number;\r\n}\r\n\r\n/**\r\n * Row selection event emitted when rows are selected/deselected\r\n */\r\nexport interface TableSelectionEvent {\r\n /** Selected rows data */\r\n selectedRows: any[];\r\n /** Selected row indices */\r\n selectedIndices: number[];\r\n}\r\n\r\n/**\r\n * Table component for displaying tabular data with pagination support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-table\r\n * [columns]=\"columns\"\r\n * [data]=\"tableData\"\r\n * [showPagination]=\"true\"\r\n * [totalItems]=\"500\"\r\n * [pageSize]=\"15\"\r\n * (pageChange)=\"onPageChange($event)\"\r\n * (rowAction)=\"onRowAction($event)\">\r\n * </pecb-table>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'pecb-table',\r\n standalone: true,\r\n imports: [CommonModule, PaginationComponent, StatusComponent],\r\n templateUrl: './table.component.html',\r\n styleUrls: ['./table.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TableComponent {\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n /**\r\n * Column definitions for the table\r\n */\r\n @Input() columns: PecbTableColumn[] = [];\r\n\r\n /**\r\n * Data array to display in the table\r\n */\r\n @Input() data: any[] = [];\r\n\r\n /**\r\n * Size variant of the table\r\n * @default 'md'\r\n */\r\n @Input() size: TableSize = 'md';\r\n\r\n /**\r\n * Visual variant of the table\r\n * @default 'default'\r\n */\r\n @Input() variant: TableVariant = 'default';\r\n\r\n /**\r\n * Whether to show the table header\r\n * @default true\r\n */\r\n @Input() showHeader = true;\r\n\r\n /**\r\n * Whether to enable row hover effect\r\n * @default true\r\n */\r\n @Input() hoverable = true;\r\n\r\n /**\r\n * Whether to show pagination\r\n * @default true\r\n */\r\n @Input() showPagination = true;\r\n\r\n /**\r\n * Total number of items for pagination\r\n */\r\n @Input() totalItems = 0;\r\n\r\n /**\r\n * Current page number (1-based)\r\n * @default 1\r\n */\r\n @Input() currentPage = 1;\r\n\r\n /**\r\n * Number of items per page\r\n * @default 15\r\n */\r\n @Input() pageSize = 15;\r\n\r\n /**\r\n * Available page size options\r\n */\r\n @Input() pageSizeOptions: number[] = [10, 15, 25, 50];\r\n\r\n /**\r\n * Whether to show page size selector in pagination\r\n * @default true\r\n */\r\n @Input() showPageSizeSelector = true;\r\n\r\n /**\r\n * Pagination variant\r\n * @default 'full'\r\n */\r\n @Input() paginationVariant: 'full' | 'compact' | 'minimal' | 'centered' = 'full';\r\n\r\n /**\r\n * Message to display when there is no data\r\n */\r\n @Input() emptyMessage = 'There are no entries yet.';\r\n\r\n /**\r\n * Whether to show loading state\r\n * @default false\r\n */\r\n @Input() loading = false;\r\n\r\n /**\r\n * Whether to enable row selection\r\n * @default false\r\n */\r\n @Input() selectable = false;\r\n\r\n /**\r\n * Currently selected row indices\r\n */\r\n @Input() selectedIndices: number[] = [];\r\n\r\n /**\r\n * Whether the table has a fixed header\r\n * @default false\r\n */\r\n @Input() stickyHeader = false;\r\n\r\n /**\r\n * Maximum height of the table body (enables scrolling)\r\n */\r\n @Input() maxHeight?: string;\r\n\r\n /**\r\n * Column key currently being sorted\r\n */\r\n @Input() sortColumn?: string;\r\n\r\n /**\r\n * Current sort direction\r\n */\r\n @Input() sortDirection: 'asc' | 'desc' | null = null;\r\n\r\n /**\r\n * ARIA label for the table\r\n */\r\n @Input('aria-label') ariaLabel = 'Data table';\r\n\r\n /**\r\n * Emitted when a page change occurs\r\n */\r\n @Output() pageChange = new EventEmitter<PageChangeEvent>();\r\n\r\n /**\r\n * Emitted when page size changes\r\n */\r\n @Output() pageSizeChange = new EventEmitter<number>();\r\n\r\n /**\r\n * Emitted when a row is clicked\r\n */\r\n @Output() rowClick = new EventEmitter<{ row: any; index: number }>();\r\n\r\n /**\r\n * Emitted when a row action is triggered\r\n */\r\n @Output() rowAction = new EventEmitter<TableRowActionEvent>();\r\n\r\n /**\r\n * Emitted when sorting changes\r\n */\r\n @Output() sortChange = new EventEmitter<TableSortEvent>();\r\n\r\n /**\r\n * Emitted when row selection changes\r\n */\r\n @Output() selectionChange = new EventEmitter<TableSelectionEvent>();\r\n\r\n /**\r\n * Custom template for empty state\r\n */\r\n @ContentChild('emptyTemplate') emptyTemplate?: TemplateRef<any>;\r\n\r\n /**\r\n * Custom template for loading state\r\n */\r\n @ContentChild('loadingTemplate') loadingTemplate?: TemplateRef<any>;\r\n\r\n /**\r\n * Gets the CSS classes for the table container\r\n */\r\n get containerClasses(): string {\r\n const classes = ['pecb-table-container'];\r\n\r\n if (this.stickyHeader) {\r\n classes.push('pecb-table-container--sticky');\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Gets the CSS classes for the pagination container\r\n */\r\n get paginationClasses(): string {\r\n const classes = ['pecb-table__pagination'];\r\n\r\n if (this.paginationVariant === 'full' || this.paginationVariant === 'compact') {\r\n classes.push('pecb-table__pagination--bordered');\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Gets the CSS classes for the table element\r\n */\r\n get tableClasses(): string {\r\n const classes = ['pecb-table', `pecb-table--${this.size}`, `pecb-table--${this.variant}`];\r\n\r\n if (this.hoverable) {\r\n classes.push('pecb-table--hoverable');\r\n }\r\n\r\n if (this.selectable) {\r\n classes.push('pecb-table--selectable');\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Gets the value from a row for a given column key\r\n * Supports nested keys like 'user.name'\r\n */\r\n getCellValue(row: any, key: string): any {\r\n if (!row || !key) return '';\r\n\r\n const keys = key.split('.');\r\n let value = row;\r\n\r\n for (const k of keys) {\r\n if (value === null || value === undefined) return '';\r\n value = value[k];\r\n }\r\n\r\n return value ?? '';\r\n }\r\n\r\n /**\r\n * Gets the alignment class for a column\r\n */\r\n getAlignmentClass(column: PecbTableColumn): string {\r\n if (!column.align || column.align === 'left') return '';\r\n return `pecb-table__cell--${column.align}`;\r\n }\r\n\r\n /**\r\n * Handles row click events\r\n */\r\n onRowClick(row: any, index: number): void {\r\n if (this.selectable) {\r\n this.toggleRowSelection(index);\r\n }\r\n this.rowClick.emit({ row, index });\r\n }\r\n\r\n /**\r\n * Handles row action button clicks\r\n */\r\n onRowAction(action: string, row: any, index: number, event: Event): void {\r\n event.stopPropagation();\r\n this.rowAction.emit({ action, row, index });\r\n }\r\n\r\n /**\r\n * Handles column header click for sorting\r\n */\r\n onHeaderClick(column: PecbTableColumn): void {\r\n if (!column.sortable) return;\r\n\r\n let newDirection: 'asc' | 'desc' | null = 'asc';\r\n\r\n if (this.sortColumn === column.key) {\r\n if (this.sortDirection === 'asc') {\r\n newDirection = 'desc';\r\n } else if (this.sortDirection === 'desc') {\r\n newDirection = null;\r\n }\r\n }\r\n\r\n this.sortColumn = newDirection ? column.key : undefined;\r\n this.sortDirection = newDirection;\r\n\r\n this.sortChange.emit({\r\n column: column.key,\r\n direction: newDirection,\r\n });\r\n }\r\n\r\n /**\r\n * Toggles row selection\r\n */\r\n toggleRowSelection(index: number): void {\r\n const newSelection = [...this.selectedIndices];\r\n const existingIndex = newSelection.indexOf(index);\r\n\r\n if (existingIndex > -1) {\r\n newSelection.splice(existingIndex, 1);\r\n } else {\r\n newSelection.push(index);\r\n }\r\n\r\n this.selectedIndices = newSelection;\r\n this.emitSelectionChange();\r\n }\r\n\r\n /**\r\n * Toggles all rows selection\r\n */\r\n toggleAllSelection(): void {\r\n if (this.isAllSelected()) {\r\n this.selectedIndices = [];\r\n } else {\r\n this.selectedIndices = this.data.map((_, index) => index);\r\n }\r\n this.emitSelectionChange();\r\n }\r\n\r\n /**\r\n * Checks if a row is selected\r\n */\r\n isRowSelected(index: number): boolean {\r\n return this.selectedIndices.includes(index);\r\n }\r\n\r\n /**\r\n * Checks if all rows are selected\r\n */\r\n isAllSelected(): boolean {\r\n return this.data.length > 0 && this.selectedIndices.length === this.data.length;\r\n }\r\n\r\n /**\r\n * Checks if some rows are selected (for indeterminate state)\r\n */\r\n isSomeSelected(): boolean {\r\n return this.selectedIndices.length > 0 && this.selectedIndices.length < this.data.length;\r\n }\r\n\r\n /**\r\n * Handles page change from pagination component\r\n */\r\n onPageChange(event: PageChangeEvent): void {\r\n this.currentPage = event.page;\r\n this.pageChange.emit(event);\r\n }\r\n\r\n /**\r\n * Handles page size change from pagination component\r\n */\r\n onPageSizeChange(newSize: number): void {\r\n this.pageSize = newSize;\r\n this.currentPage = 1;\r\n this.pageSizeChange.emit(newSize);\r\n }\r\n\r\n /**\r\n * Gets the sort icon state for a column\r\n */\r\n getSortState(column: PecbTableColumn): 'asc' | 'desc' | 'none' {\r\n if (!column.sortable) return 'none';\r\n if (this.sortColumn !== column.key) return 'none';\r\n return this.sortDirection || 'none';\r\n }\r\n\r\n /**\r\n * Tracks rows by index for ngFor performance\r\n */\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n /**\r\n * Tracks columns by key for ngFor performance\r\n */\r\n trackByKey(_: number, column: PecbTableColumn): string {\r\n return column.key;\r\n }\r\n\r\n /**\r\n * Gets the effective column type (supports both 'type' and 'component' properties)\r\n */\r\n getColumnType(column: PecbTableColumn): string {\r\n return column.component || column.type || 'text';\r\n }\r\n\r\n /**\r\n * Gets the status type for a value based on column config\r\n */\r\n getStatusType(value: any, column: PecbTableColumn): any {\r\n const config = column.statusConfig;\r\n if (config?.typeMap && value in config.typeMap) {\r\n return config.typeMap[value];\r\n }\r\n // Default mappings\r\n const defaultMap: Record<string, string> = {\r\n 'Pending': 'warning',\r\n 'pending': 'warning',\r\n 'Inactive': 'error',\r\n 'inactive': 'error',\r\n 'Approved': 'success',\r\n 'approved': 'success',\r\n 'Active': 'success',\r\n 'active': 'success',\r\n 'Disabled': 'disabled',\r\n 'disabled': 'disabled',\r\n };\r\n return defaultMap[value] || 'neutral';\r\n }\r\n\r\n /**\r\n * Gets the status variant for a column\r\n */\r\n getStatusVariant(column: PecbTableColumn): any {\r\n return column.statusConfig?.variant || 'filled';\r\n }\r\n\r\n /**\r\n * Gets the status size for a column\r\n */\r\n getStatusSize(column: PecbTableColumn): any {\r\n return column.statusConfig?.size || 'sm';\r\n }\r\n\r\n /**\r\n * Gets user display data from row\r\n */\r\n getUserData(row: any, column: PecbTableColumn): { avatar: string; name: string; secondary: string } {\r\n const config = column.userConfig || {};\r\n return {\r\n avatar: row[config.avatarKey || 'avatar'] || '',\r\n name: row[config.nameKey || column.key] || '',\r\n secondary: row[config.secondaryKey || 'email'] || '',\r\n };\r\n }\r\n\r\n /**\r\n * Gets default actions if none specified\r\n */\r\n getActions(column: PecbTableColumn): TableAction[] {\r\n if (column.actions && column.actions.length > 0) {\r\n return column.actions;\r\n }\r\n // Default actions\r\n return [\r\n { id: 'view', icon: 'view', tooltip: 'View' },\r\n { id: 'edit', icon: 'edit', tooltip: 'Edit' },\r\n { id: 'delete', icon: 'delete', tooltip: 'Delete', variant: 'danger' },\r\n ];\r\n }\r\n\r\n /**\r\n * Handles action button click\r\n */\r\n onActionClick(action: TableAction, row: any, index: number, event: Event): void {\r\n event.stopPropagation();\r\n\r\n // Call individual action callback if provided\r\n if (action.action) {\r\n action.action(row, index);\r\n }\r\n\r\n // Always emit the rowAction event\r\n this.rowAction.emit({ action: action.id, row, index });\r\n }\r\n\r\n /**\r\n * Gets the inputs for a dynamic component\r\n * Combines static componentInputs with row-specific data from componentInputsFn\r\n */\r\n getDynamicComponentInputs(row: any, column: PecbTableColumn, index: number): Record<string, any> {\r\n const value = this.getCellValue(row, column.key);\r\n const staticInputs = column.componentInputs || {};\r\n\r\n if (column.componentInputsFn) {\r\n const dynamicInputs = column.componentInputsFn(row, value, index);\r\n return { ...staticInputs, ...dynamicInputs };\r\n }\r\n\r\n return staticInputs;\r\n }\r\n\r\n /**\r\n * Checks if column has a dynamic component\r\n */\r\n hasDynamicComponent(column: PecbTableColumn): boolean {\r\n return !!column.dynamicComponent;\r\n }\r\n\r\n /**\r\n * Sanitizes custom icon SVG for safe rendering\r\n */\r\n getSafeIcon(iconSvg: string | undefined): SafeHtml {\r\n if (!iconSvg) return '';\r\n return this.sanitizer.bypassSecurityTrustHtml(iconSvg);\r\n }\r\n\r\n private emitSelectionChange(): void {\r\n const selectedRows = this.selectedIndices.map(index => this.data[index]);\r\n this.selectionChange.emit({\r\n selectedRows,\r\n selectedIndices: this.selectedIndices,\r\n });\r\n }\r\n}\r\n","<div class=\"pecb-table-wrapper\">\r\n <div [class]=\"containerClasses\" [style.maxHeight]=\"maxHeight\">\r\n <!-- Loading State -->\r\n <div *ngIf=\"loading\" class=\"pecb-table__loading\">\r\n <ng-container *ngIf=\"loadingTemplate; else defaultLoading\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultLoading>\r\n <div class=\"pecb-table__loading-spinner\">\r\n <svg class=\"pecb-table__spinner-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-dasharray=\"31.4 31.4\" />\r\n </svg>\r\n <span>Loading...</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Table -->\r\n <table\r\n *ngIf=\"!loading\"\r\n [class]=\"tableClasses\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"table\">\r\n\r\n <!-- Table Header -->\r\n <thead *ngIf=\"showHeader\" class=\"pecb-table__head\" [class.pecb-table__head--sticky]=\"stickyHeader\">\r\n <tr class=\"pecb-table__row pecb-table__row--header\" role=\"row\">\r\n <!-- Selection Checkbox Column -->\r\n <th\r\n *ngIf=\"selectable\"\r\n class=\"pecb-table__cell pecb-table__cell--header pecb-table__cell--checkbox\"\r\n role=\"columnheader\"\r\n scope=\"col\">\r\n <label class=\"pecb-table__checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"pecb-table__checkbox\"\r\n [checked]=\"isAllSelected()\"\r\n [indeterminate]=\"isSomeSelected()\"\r\n (change)=\"toggleAllSelection()\"\r\n aria-label=\"Select all rows\" />\r\n <span class=\"pecb-table__checkbox-custom\"></span>\r\n </label>\r\n </th>\r\n\r\n <!-- Data Columns -->\r\n <th\r\n *ngFor=\"let column of columns; trackBy: trackByKey\"\r\n class=\"pecb-table__cell pecb-table__cell--header\"\r\n [class.pecb-table__cell--sortable]=\"column.sortable\"\r\n [class]=\"getAlignmentClass(column)\"\r\n [ngClass]=\"column.cssClass\"\r\n [style.width]=\"column.width\"\r\n [attr.aria-sort]=\"column.sortable ? (sortColumn === column.key ? (sortDirection === 'asc' ? 'ascending' : 'descending') : 'none') : null\"\r\n role=\"columnheader\"\r\n scope=\"col\"\r\n (click)=\"onHeaderClick(column)\"\r\n (keydown.enter)=\"onHeaderClick(column)\"\r\n (keydown.space)=\"onHeaderClick(column); $event.preventDefault()\"\r\n [attr.tabindex]=\"column.sortable ? 0 : null\">\r\n <div class=\"pecb-table__header-content\">\r\n <ng-container *ngIf=\"column.headerTemplate; else defaultHeader\">\r\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultHeader>\r\n <span class=\"pecb-table__header-text\">{{ column.label }}</span>\r\n </ng-template>\r\n\r\n <!-- Sort Icon -->\r\n <span *ngIf=\"column.sortable\" class=\"pecb-table__sort-icon\" [attr.data-sort]=\"getSortState(column)\">\r\n <svg *ngIf=\"getSortState(column) === 'none'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n </svg>\r\n <svg *ngIf=\"getSortState(column) === 'asc'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\"/>\r\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n </svg>\r\n <svg *ngIf=\"getSortState(column) === 'desc'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\"/>\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <!-- Table Body -->\r\n <tbody class=\"pecb-table__body\">\r\n <!-- Empty State -->\r\n <tr *ngIf=\"data.length === 0\" class=\"pecb-table__row pecb-table__row--empty\">\r\n <td\r\n [attr.colspan]=\"selectable ? columns.length + 1 : columns.length\"\r\n class=\"pecb-table__cell pecb-table__cell--empty\">\r\n <ng-container *ngIf=\"emptyTemplate; else defaultEmpty\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultEmpty>\r\n <div class=\"pecb-table__empty-content\">\r\n <span class=\"pecb-table__empty-message\">{{ emptyMessage }}</span>\r\n </div>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n\r\n <!-- Data Rows -->\r\n <tr\r\n *ngFor=\"let row of data; let i = index; trackBy: trackByIndex\"\r\n class=\"pecb-table__row pecb-table__row--data\"\r\n [class.pecb-table__row--selected]=\"isRowSelected(i)\"\r\n role=\"row\"\r\n (click)=\"onRowClick(row, i)\"\r\n [attr.tabindex]=\"0\"\r\n (keydown.enter)=\"onRowClick(row, i)\">\r\n\r\n <!-- Selection Checkbox -->\r\n <td\r\n *ngIf=\"selectable\"\r\n class=\"pecb-table__cell pecb-table__cell--checkbox\"\r\n role=\"cell\"\r\n (click)=\"$event.stopPropagation()\">\r\n <label class=\"pecb-table__checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"pecb-table__checkbox\"\r\n [checked]=\"isRowSelected(i)\"\r\n (change)=\"toggleRowSelection(i)\"\r\n [attr.aria-label]=\"'Select row ' + (i + 1)\" />\r\n <span class=\"pecb-table__checkbox-custom\"></span>\r\n </label>\r\n </td>\r\n\r\n <!-- Data Cells -->\r\n <td\r\n *ngFor=\"let column of columns; trackBy: trackByKey\"\r\n class=\"pecb-table__cell\"\r\n [class]=\"getAlignmentClass(column)\"\r\n [ngClass]=\"column.cssClass\"\r\n role=\"cell\">\r\n\r\n <!-- Custom Template -->\r\n <ng-container *ngIf=\"column.cellTemplate\">\r\n <ng-container *ngTemplateOutlet=\"column.cellTemplate; context: { $implicit: getCellValue(row, column.key), row: row, column: column, index: i }\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Dynamic Component - renders any component passed via dynamicComponent -->\r\n <ng-container *ngIf=\"!column.cellTemplate && hasDynamicComponent(column)\">\r\n <ng-container\r\n *ngComponentOutlet=\"column.dynamicComponent!; inputs: getDynamicComponentInputs(row, column, i)\">\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Status Component - renders pecb-status -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'status'\">\r\n <pecb-status\r\n [type]=\"getStatusType(getCellValue(row, column.key), column)\"\r\n [variant]=\"getStatusVariant(column)\"\r\n [size]=\"getStatusSize(column)\">\r\n {{ getCellValue(row, column.key) }}\r\n </pecb-status>\r\n </ng-container>\r\n\r\n <!-- User Component - renders avatar + name + email -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'user'\">\r\n <div class=\"pecb-table__user-cell\">\r\n <img\r\n *ngIf=\"getUserData(row, column).avatar\"\r\n [src]=\"getUserData(row, column).avatar\"\r\n alt=\"\"\r\n class=\"pecb-table__user-avatar\">\r\n <div class=\"pecb-table__user-info\">\r\n <div class=\"pecb-table__user-name\">{{ getUserData(row, column).name }}</div>\r\n <div *ngIf=\"getUserData(row, column).secondary\" class=\"pecb-table__user-secondary\">\r\n {{ getUserData(row, column).secondary }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Action Component - renders action buttons with icons -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'action'\">\r\n <div class=\"pecb-table__action-buttons\">\r\n <button\r\n *ngFor=\"let action of getActions(column)\"\r\n class=\"pecb-table__action-btn\"\r\n [class.pecb-table__action-btn--danger]=\"action.variant === 'danger'\"\r\n [title]=\"action.tooltip || action.id\"\r\n [disabled]=\"action.disabled\"\r\n (click)=\"onActionClick(action, row, i, $event)\">\r\n <!-- View Icon -->\r\n <svg *ngIf=\"action.icon === 'view'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n <!-- Edit Icon -->\r\n <svg *ngIf=\"action.icon === 'edit'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\r\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\r\n </svg>\r\n <!-- Delete Icon -->\r\n <svg *ngIf=\"action.icon === 'delete'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"3 6 5 6 21 6\"></polyline>\r\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\r\n </svg>\r\n <!-- Download Icon -->\r\n <svg *ngIf=\"action.icon === 'download'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\r\n <polyline points=\"7 10 12 15 17 10\"></polyline>\r\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\r\n </svg>\r\n <!-- Copy Icon -->\r\n <svg *ngIf=\"action.icon === 'copy'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n <!-- Custom Icon (SVG string) -->\r\n <span *ngIf=\"action.icon === 'custom' && action.customIcon\" class=\"pecb-table__custom-icon\" [innerHTML]=\"getSafeIcon(action.customIcon)\"></span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Default Text -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'text'\">\r\n {{ getCellValue(row, column.key) }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- Pagination (outside table container) -->\r\n <div *ngIf=\"showPagination && !loading && data.length > 0\" [class]=\"paginationClasses\">\r\n <pecb-pagination\r\n [totalItems]=\"totalItems\"\r\n [pageSize]=\"pageSize\"\r\n [currentPage]=\"currentPage\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [showPageSizeSelector]=\"showPageSizeSelector\"\r\n [variant]=\"paginationVariant\"\r\n size=\"md\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\">\r\n </pecb-pagination>\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type TabStyle = 'rounded' | 'line';\r\nexport type TabSize = 'sm' | 'md';\r\n\r\n/**\r\n * A professional tab component with multiple styles and sizes.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-tab\r\n * label=\"Tab Name\"\r\n * [active]=\"true\"\r\n * style=\"rounded\"\r\n * size=\"md\"\r\n * (clicked)=\"handleClick()\"\r\n * ></pecb-tab>\r\n *\r\n * <!-- With badge number and close button -->\r\n * <pecb-tab\r\n * label=\"Tab Name\"\r\n * [icon]=\"10\"\r\n * [closable]=\"true\"\r\n * [active]=\"true\"\r\n * (closed)=\"handleClose()\"\r\n * ></pecb-tab>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-tab',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './tab.component.html',\r\n styleUrls: ['./tab.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TabComponent {\r\n /**\r\n * Unique ID for the tab element\r\n */\r\n @Input() id: string = generateUniqueId('tab');\r\n\r\n /**\r\n * The visual style of the tab\r\n */\r\n @Input() style: TabStyle = 'rounded';\r\n\r\n /**\r\n * The size of the tab\r\n */\r\n @Input() size: TabSize = 'md';\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label = 'Tab Name';\r\n\r\n /**\r\n * Optional badge number to display after the label\r\n */\r\n @Input() icon?: number;\r\n\r\n /**\r\n * Whether the tab is in active state\r\n */\r\n @Input() active = false;\r\n\r\n /**\r\n * Whether the tab is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether to show close button\r\n */\r\n @Input() closable = true;\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Accessible label for the tab\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of the tab panel this tab controls\r\n */\r\n @Input() ariaControls?: string;\r\n\r\n /**\r\n * Indicates if the tab panel is selected\r\n */\r\n @Input() ariaSelected?: boolean;\r\n\r\n /**\r\n * Event emitted when the tab is clicked\r\n */\r\n @Output() clicked = new EventEmitter<string>();\r\n\r\n /**\r\n * Event emitted when the close button is clicked\r\n */\r\n @Output() closed = new EventEmitter<string>();\r\n\r\n /**\r\n * Get CSS classes for the tab\r\n */\r\n get tabClasses(): string[] {\r\n return [\r\n 'pecb-tab',\r\n `pecb-tab--${this.style}`,\r\n `pecb-tab--${this.size}`,\r\n this.active ? 'pecb-tab--active' : '',\r\n this.disabled ? 'pecb-tab--disabled' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle tab click\r\n */\r\n onClick(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n event.stopPropagation();\r\n this.clicked.emit(this.id);\r\n }\r\n }\r\n\r\n /**\r\n * Handle close button click\r\n */\r\n onClose(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n event.stopPropagation();\r\n this.closed.emit(this.id);\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard events for accessibility\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n // Handle Enter/Space for tab selection\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.clicked.emit(this.id);\r\n }\r\n\r\n // Handle Delete/Backspace for close (if closable)\r\n if (this.closable && (event.key === 'Delete' || event.key === 'Backspace')) {\r\n event.preventDefault();\r\n this.closed.emit(this.id);\r\n }\r\n }\r\n}\r\n","<div\r\n [id]=\"id\"\r\n [class]=\"tabClasses.join(' ')\"\r\n role=\"tab\"\r\n [attr.aria-label]=\"ariaLabel || label\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-selected]=\"ariaSelected !== undefined ? ariaSelected : active\"\r\n [attr.aria-disabled]=\"disabled\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-tab__content\">\r\n <!-- Label -->\r\n <span class=\"pecb-tab__label\">{{ label }}</span>\r\n\r\n <!-- Icon/Badge -->\r\n <span *ngIf=\"icon\" class=\"pecb-tab__icon\" aria-hidden=\"true\">\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Close button -->\r\n <button\r\n *ngIf=\"closable\"\r\n type=\"button\"\r\n class=\"pecb-tab__close\"\r\n [attr.aria-label]=\"'Close ' + label\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClose($event)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n HostListener,\r\n ElementRef,\r\n ViewChild,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type DatepickerSize = 'sm' | 'md' | 'lg';\r\n\r\ninterface CalendarDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isSelected: boolean;\r\n isToday: boolean;\r\n}\r\n\r\n/**\r\n * A professional datepicker component with calendar dropdown.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-datepicker\r\n * label=\"Date\"\r\n * placeholder=\"Choose Date\"\r\n * [(ngModel)]=\"selectedDate\"\r\n * ></pecb-datepicker>\r\n *\r\n * <!-- With custom configuration -->\r\n * <pecb-datepicker\r\n * label=\"Birth Date\"\r\n * [required]=\"true\"\r\n * size=\"lg\"\r\n * (dateChange)=\"handleDateChange($event)\"\r\n * ></pecb-datepicker>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-datepicker',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './datepicker.component.html',\r\n styleUrls: ['./datepicker.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatepickerComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DatepickerComponent implements ControlValueAccessor {\r\n @ViewChild('inputElement') inputElement?: ElementRef<HTMLInputElement>;\r\n\r\n /**\r\n * Unique ID for the datepicker element\r\n */\r\n @Input() id: string = generateUniqueId('datepicker');\r\n\r\n /**\r\n * Label text to display above the input\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Placeholder text for the input\r\n */\r\n @Input() placeholder = 'Choose Date';\r\n\r\n /**\r\n * The size of the datepicker\r\n */\r\n @Input() size: DatepickerSize = 'md';\r\n\r\n /**\r\n * Whether the field is required\r\n */\r\n @Input() required = false;\r\n\r\n /**\r\n * Whether the datepicker is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Date format for display (default: MM/DD/YYYY)\r\n */\r\n @Input() dateFormat = 'MM/DD/YYYY';\r\n\r\n /**\r\n * Minimum selectable date\r\n */\r\n @Input() minDate?: Date;\r\n\r\n /**\r\n * Maximum selectable date\r\n */\r\n @Input() maxDate?: Date;\r\n\r\n /**\r\n * Event emitted when date is selected\r\n */\r\n @Output() dateChange = new EventEmitter<Date | null>();\r\n\r\n /**\r\n * Event emitted when calendar is opened\r\n */\r\n @Output() opened = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when calendar is closed\r\n */\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n // Internal state\r\n selectedDate: Date | null = null;\r\n isCalendarOpen = false;\r\n currentMonth: Date = new Date();\r\n calendarDays: CalendarDay[] = [];\r\n weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\r\n monthNames = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December'\r\n ];\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: Date | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private cdr: ChangeDetectorRef\r\n ) {\r\n this.generateCalendar();\r\n }\r\n\r\n /**\r\n * Get CSS classes for the datepicker wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-datepicker',\r\n `pecb-datepicker--${this.size}`,\r\n this.disabled ? 'pecb-datepicker--disabled' : '',\r\n this.isCalendarOpen ? 'pecb-datepicker--open' : '',\r\n this.selectedDate ? 'pecb-datepicker--has-value' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get formatted display value\r\n */\r\n get displayValue(): string {\r\n if (!this.selectedDate) return '';\r\n return this.formatDate(this.selectedDate);\r\n }\r\n\r\n /**\r\n * Get current month and year display\r\n */\r\n get monthYearDisplay(): string {\r\n return `${this.monthNames[this.currentMonth.getMonth()]} ${this.currentMonth.getFullYear()}`;\r\n }\r\n\r\n /**\r\n * Toggle calendar dropdown\r\n */\r\n toggleCalendar(): void {\r\n if (this.disabled) return;\r\n\r\n this.isCalendarOpen = !this.isCalendarOpen;\r\n\r\n if (this.isCalendarOpen) {\r\n this.opened.emit();\r\n // Set current month to selected date's month or current month\r\n if (this.selectedDate) {\r\n this.currentMonth = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth(), 1);\r\n }\r\n this.generateCalendar();\r\n } else {\r\n this.closed.emit();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Close calendar\r\n */\r\n closeCalendar(): void {\r\n if (this.isCalendarOpen) {\r\n this.isCalendarOpen = false;\r\n this.closed.emit();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Navigate to previous month\r\n */\r\n previousMonth(): void {\r\n this.currentMonth = new Date(\r\n this.currentMonth.getFullYear(),\r\n this.currentMonth.getMonth() - 1,\r\n 1\r\n );\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Navigate to next month\r\n */\r\n nextMonth(): void {\r\n this.currentMonth = new Date(\r\n this.currentMonth.getFullYear(),\r\n this.currentMonth.getMonth() + 1,\r\n 1\r\n );\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Select a date\r\n */\r\n selectDate(day: CalendarDay): void {\r\n if (this.disabled) return;\r\n if (!day.isCurrentMonth) return;\r\n if (this.minDate && day.date < this.minDate) return;\r\n if (this.maxDate && day.date > this.maxDate) return;\r\n\r\n this.selectedDate = day.date;\r\n this.onChange(this.selectedDate);\r\n this.onTouched();\r\n this.dateChange.emit(this.selectedDate);\r\n this.generateCalendar();\r\n this.closeCalendar();\r\n }\r\n\r\n /**\r\n * Generate calendar days\r\n */\r\n private generateCalendar(): void {\r\n const year = this.currentMonth.getFullYear();\r\n const month = this.currentMonth.getMonth();\r\n\r\n // First day of the month\r\n const firstDay = new Date(year, month, 1);\r\n const startingDayOfWeek = firstDay.getDay();\r\n\r\n // Last day of the month\r\n const lastDay = new Date(year, month + 1, 0);\r\n const daysInMonth = lastDay.getDate();\r\n\r\n // Previous month\r\n const prevMonth = new Date(year, month, 0);\r\n const daysInPrevMonth = prevMonth.getDate();\r\n\r\n const days: CalendarDay[] = [];\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n // Previous month days\r\n for (let i = startingDayOfWeek - 1; i >= 0; i--) {\r\n const date = new Date(year, month - 1, daysInPrevMonth - i);\r\n days.push({\r\n date,\r\n day: daysInPrevMonth - i,\r\n isCurrentMonth: false,\r\n isSelected: false,\r\n isToday: false\r\n });\r\n }\r\n\r\n // Current month days\r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const date = new Date(year, month, day);\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const isSelected = this.selectedDate ?\r\n date.getTime() === new Date(this.selectedDate).setHours(0, 0, 0, 0) :\r\n false;\r\n\r\n const isToday = date.getTime() === today.getTime();\r\n\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: true,\r\n isSelected,\r\n isToday\r\n });\r\n }\r\n\r\n // Next month days\r\n const remainingDays = 42 - days.length; // 6 rows * 7 days\r\n for (let day = 1; day <= remainingDays; day++) {\r\n const date = new Date(year, month + 1, day);\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: false,\r\n isSelected: false,\r\n isToday: false\r\n });\r\n }\r\n\r\n this.calendarDays = days;\r\n }\r\n\r\n /**\r\n * Format date for display\r\n */\r\n private formatDate(date: Date): string {\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const year = date.getFullYear();\r\n\r\n return this.dateFormat\r\n .replace('MM', month)\r\n .replace('DD', day)\r\n .replace('YYYY', String(year));\r\n }\r\n\r\n /**\r\n * Listen for clicks outside to close calendar\r\n */\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.closeCalendar();\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard navigation\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.toggleCalendar();\r\n } else if (event.key === 'Escape') {\r\n this.closeCalendar();\r\n }\r\n }\r\n\r\n /**\r\n * Clear selected date\r\n */\r\n clearDate(event: MouseEvent): void {\r\n event.stopPropagation();\r\n if (this.disabled) return;\r\n\r\n this.selectedDate = null;\r\n this.onChange(null);\r\n this.onTouched();\r\n this.dateChange.emit(null);\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: Date | null): void {\r\n this.selectedDate = value;\r\n if (value) {\r\n this.currentMonth = new Date(value.getFullYear(), value.getMonth(), 1);\r\n }\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: Date | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Field -->\r\n <div class=\"pecb-datepicker__input-wrapper\">\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n type=\"text\"\r\n class=\"pecb-datepicker__input\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-datepicker__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-datepicker__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button (shown when has value) -->\r\n <button\r\n *ngIf=\"selectedDate && !disabled\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--clear\"\r\n [attr.aria-label]=\"'Clear date'\"\r\n (click)=\"clearDate($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon (Calendar) -->\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--right\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n (click)=\"toggleCalendar()\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11 2V1H10V2H6V1H5V2H2V15H14V2H11ZM13 14H3V6H13V14ZM13 5H3V3H5V4H6V3H10V4H11V3H13V5Z\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Dropdown -->\r\n <div\r\n *ngIf=\"isCalendarOpen\"\r\n class=\"pecb-datepicker__calendar\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-label]=\"'Choose date'\"\r\n >\r\n <!-- Calendar Header -->\r\n <div class=\"pecb-datepicker__calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Previous month\"\r\n (click)=\"previousMonth()\"\r\n >\r\n «\r\n </button>\r\n\r\n <span class=\"pecb-datepicker__month-year\">{{ monthYearDisplay }}</span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Next month\"\r\n (click)=\"nextMonth()\"\r\n >\r\n »\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"pecb-datepicker__calendar-body\">\r\n <!-- Week Days -->\r\n <div class=\"pecb-datepicker__weekdays\">\r\n <div\r\n *ngFor=\"let day of weekDays\"\r\n class=\"pecb-datepicker__weekday\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"pecb-datepicker__days\">\r\n <button\r\n *ngFor=\"let day of calendarDays\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__day\"\r\n [class.pecb-datepicker__day--other-month]=\"!day.isCurrentMonth\"\r\n [class.pecb-datepicker__day--selected]=\"day.isSelected\"\r\n [class.pecb-datepicker__day--today]=\"day.isToday\"\r\n [attr.aria-label]=\"day.date.toDateString()\"\r\n [attr.aria-selected]=\"day.isSelected\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search';\r\nexport type InputSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * A professional input component with floating label and multiple types.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-input\r\n * label=\"Email\"\r\n * type=\"email\"\r\n * placeholder=\"Enter your email\"\r\n * [(ngModel)]=\"email\"\r\n * ></pecb-input>\r\n *\r\n * <!-- With predefined icon -->\r\n * <pecb-input\r\n * label=\"Email\"\r\n * type=\"email\"\r\n * icon=\"email\"\r\n * iconPosition=\"left\"\r\n * ></pecb-input>\r\n *\r\n * <!-- With custom SVG icon -->\r\n * <pecb-input\r\n * label=\"Phone\"\r\n * type=\"tel\"\r\n * [icon]=\"'<svg>...</svg>'\"\r\n * iconPosition=\"left\"\r\n * ></pecb-input>\r\n *\r\n * <!-- With error state -->\r\n * <pecb-input\r\n * label=\"Password\"\r\n * type=\"password\"\r\n * [error]=\"true\"\r\n * errorMessage=\"Password is required\"\r\n * ></pecb-input>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-input',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './input.component.html',\r\n styleUrls: ['./input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class InputComponent implements ControlValueAccessor {\r\n @ViewChild('inputElement') inputElement?: ElementRef<HTMLInputElement>;\r\n\r\n /**\r\n * Unique ID for the input element\r\n */\r\n @Input() id: string = generateUniqueId('input');\r\n\r\n /**\r\n * Input type\r\n */\r\n @Input() type: InputType = 'text';\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Placeholder text (shown when label is not present)\r\n */\r\n @Input() placeholder = '';\r\n\r\n /**\r\n * The size of the input\r\n */\r\n @Input() size: InputSize = 'md';\r\n\r\n /**\r\n * Whether the field is required\r\n */\r\n @Input() required = false;\r\n\r\n /**\r\n * Whether the input is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether the input is readonly\r\n */\r\n @Input() readonly = false;\r\n\r\n /**\r\n * Whether to show error state\r\n */\r\n @Input() error = false;\r\n\r\n /**\r\n * Error message to display\r\n */\r\n @Input() errorMessage?: string;\r\n\r\n /**\r\n * Helper text to display below input\r\n */\r\n @Input() helperText?: string;\r\n\r\n /**\r\n * Icon to display - can be a predefined name ('email', 'search', 'user') or custom SVG string\r\n */\r\n @Input() icon?: string;\r\n\r\n /**\r\n * Icon position (left or right)\r\n */\r\n @Input() iconPosition: 'left' | 'right' = 'left';\r\n\r\n /**\r\n * Left icon name or HTML (deprecated - use icon with iconPosition instead)\r\n */\r\n @Input() leftIcon?: string;\r\n\r\n /**\r\n * Right icon name or HTML (deprecated - use icon with iconPosition instead)\r\n */\r\n @Input() rightIcon?: string;\r\n\r\n /**\r\n * Whether to show clear button\r\n */\r\n @Input() clearable = false;\r\n\r\n /**\r\n * Maximum length of input\r\n */\r\n @Input() maxLength?: number;\r\n\r\n /**\r\n * Minimum value (for number type)\r\n */\r\n @Input() min?: number;\r\n\r\n /**\r\n * Maximum value (for number type)\r\n */\r\n @Input() max?: number;\r\n\r\n /**\r\n * Step value (for number type)\r\n */\r\n @Input() step?: number;\r\n\r\n /**\r\n * Autocomplete attribute\r\n */\r\n @Input() autocomplete?: string;\r\n\r\n /**\r\n * Event emitted when value changes\r\n */\r\n @Output() valueChange = new EventEmitter<string>();\r\n\r\n /**\r\n * Event emitted on blur\r\n */\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted on focus\r\n */\r\n @Output() focused = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when clear button is clicked\r\n */\r\n @Output() cleared = new EventEmitter<void>();\r\n\r\n // Internal state\r\n value: string = '';\r\n isFocused = false;\r\n showPassword = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: string) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private sanitizer: DomSanitizer\r\n ) {}\r\n\r\n /**\r\n * Get CSS classes for the input wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-input',\r\n `pecb-input--${this.size}`,\r\n this.disabled ? 'pecb-input--disabled' : '',\r\n this.error ? 'pecb-input--error' : '',\r\n this.readonly ? 'pecb-input--readonly' : '',\r\n this.isFocused ? 'pecb-input--focused' : '',\r\n this.value ? 'pecb-input--has-value' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get the actual input type (handles password visibility toggle)\r\n */\r\n get inputType(): string {\r\n if (this.type === 'password' && this.showPassword) {\r\n return 'text';\r\n }\r\n return this.type;\r\n }\r\n\r\n /**\r\n * Check if clear button should be shown\r\n */\r\n get showClearButton(): boolean {\r\n return this.clearable && !!this.value && !this.disabled && !this.readonly;\r\n }\r\n\r\n /**\r\n * Check if password toggle should be shown\r\n */\r\n get showPasswordToggle(): boolean {\r\n return this.type === 'password' && !!this.value && !this.disabled && !this.readonly;\r\n }\r\n\r\n /**\r\n * Get computed left icon\r\n */\r\n get computedLeftIcon(): string | undefined {\r\n // New API takes precedence\r\n if (this.icon && this.iconPosition === 'left') {\r\n return this.icon;\r\n }\r\n // Fallback to old API\r\n return this.leftIcon;\r\n }\r\n\r\n /**\r\n * Get computed right icon\r\n */\r\n get computedRightIcon(): string | undefined {\r\n // New API takes precedence\r\n if (this.icon && this.iconPosition === 'right') {\r\n return this.icon;\r\n }\r\n // Fallback to old API\r\n return this.rightIcon;\r\n }\r\n\r\n /**\r\n * Handle input change\r\n */\r\n onInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n this.value = target.value;\r\n this.onChange(this.value);\r\n this.valueChange.emit(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle focus event\r\n */\r\n onFocus(): void {\r\n this.isFocused = true;\r\n this.focused.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.blurred.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Clear input value\r\n */\r\n clearValue(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.value = '';\r\n this.onChange(this.value);\r\n this.valueChange.emit(this.value);\r\n this.cleared.emit();\r\n this.inputElement?.nativeElement.focus();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Toggle password visibility\r\n */\r\n togglePasswordVisibility(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.showPassword = !this.showPassword;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Focus the input\r\n */\r\n focus(): void {\r\n this.inputElement?.nativeElement.focus();\r\n }\r\n\r\n /**\r\n * Sanitize custom icon HTML/SVG\r\n */\r\n sanitizeIcon(icon: string | undefined): SafeHtml {\r\n if (!icon) return '';\r\n return this.sanitizer.bypassSecurityTrustHtml(icon);\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: string): void {\r\n this.value = value || '';\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Wrapper -->\r\n <div class=\"pecb-input__wrapper\">\r\n <!-- Left Icon -->\r\n <span\r\n *ngIf=\"computedLeftIcon\"\r\n class=\"pecb-input__icon pecb-input__icon--left\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedLeftIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedLeftIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n [type]=\"inputType\"\r\n class=\"pecb-input__field\"\r\n [value]=\"value\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [attr.maxlength]=\"maxLength\"\r\n [attr.min]=\"min\"\r\n [attr.max]=\"max\"\r\n [attr.step]=\"step\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-invalid]=\"error\"\r\n [attr.aria-describedby]=\"helperText || errorMessage ? id + '-description' : null\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-input__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-input__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button -->\r\n <button\r\n *ngIf=\"showClearButton\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--clear\"\r\n [attr.aria-label]=\"'Clear input'\"\r\n (click)=\"clearValue($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Password Toggle -->\r\n <button\r\n *ngIf=\"showPasswordToggle\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--password\"\r\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\"\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <svg *ngIf=\"!showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C4.5 3 1.5 5.5 0 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 16 8C14.5 5.5 11.5 3 8 3ZM8 11C6.34 11 5 9.66 5 8C5 6.34 6.34 5 8 5C9.66 5 11 6.34 11 8C11 9.66 9.66 11 8 11ZM8 6.5C7.17 6.5 6.5 7.17 6.5 8C6.5 8.83 7.17 9.5 8 9.5C8.83 9.5 9.5 8.83 9.5 8C9.5 7.17 8.83 6.5 8 6.5Z\"/>\r\n </svg>\r\n <svg *ngIf=\"showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C11.5 3 14.5 5.5 16 8C15.4 9.1 14.5 10 13.5 10.7L11.9 9.1C12.3 8.8 12.5 8.4 12.5 8C12.5 6.62 11.38 5.5 10 5.5C9.6 5.5 9.2 5.7 8.9 5.9L7.3 4.3C7.5 4.1 7.7 4 8 4C8 4 8 4 8 3ZM1.3 2.3L3 4C1.8 4.9 0.8 6.1 0 8C1.5 10.5 4.5 13 8 13C9.3 13 10.5 12.6 11.6 12L13.7 14.1L15.1 12.7L2.7 0.3L1.3 2.3ZM5.5 6.8L7.2 8.5C7.1 8.6 7 8.8 7 9C7 9.83 7.67 10.5 8.5 10.5C8.7 10.5 8.9 10.4 9 10.3L10.7 12C9.9 12.3 9 12.5 8 12.5C4.5 12.5 1.5 10 0 7.5C0.7 6.4 1.6 5.4 2.7 4.8L5.5 6.8Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon -->\r\n <span\r\n *ngIf=\"computedRightIcon && !showClearButton && !showPasswordToggle\"\r\n class=\"pecb-input__icon pecb-input__icon--right\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedRightIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedRightIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Helper Text / Error Message -->\r\n <div\r\n *ngIf=\"helperText || errorMessage\"\r\n [id]=\"id + '-description'\"\r\n class=\"pecb-input__description\"\r\n [class.pecb-input__description--error]=\"error && errorMessage\"\r\n >\r\n <span *ngIf=\"error && errorMessage\">{{ errorMessage }}</span>\r\n <span *ngIf=\"!error && helperText\">{{ helperText }}</span>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type RadioVariant = 'dot' | 'filled';\r\nexport type RadioLabelPosition = 'right' | 'left';\r\n\r\n/**\r\n * A professional radio button component with label and description support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Default variant with inner dot -->\r\n * <pecb-radio\r\n * label=\"Option 1\"\r\n * description=\"This is a description\"\r\n * [(ngModel)]=\"selectedValue\"\r\n * value=\"option1\"\r\n * ></pecb-radio>\r\n *\r\n * <!-- Filled variant -->\r\n * <pecb-radio\r\n * label=\"Option 1\"\r\n * variant=\"filled\"\r\n * [(ngModel)]=\"selectedValue\"\r\n * value=\"option1\"\r\n * ></pecb-radio>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-radio',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './radio.component.html',\r\n styleUrls: ['./radio.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RadioComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class RadioComponent implements ControlValueAccessor {\r\n /**\r\n * Unique ID for the radio element\r\n */\r\n @Input() id: string = generateUniqueId('radio');\r\n\r\n /**\r\n * Name attribute for the radio group\r\n */\r\n @Input() name?: string;\r\n\r\n /**\r\n * Value of this radio button\r\n */\r\n @Input() value: unknown;\r\n\r\n /**\r\n * Visual variant of the radio button\r\n */\r\n @Input() variant: RadioVariant = 'dot';\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Description text to display below label\r\n */\r\n @Input() description?: string;\r\n\r\n /**\r\n * Position of the label relative to the radio control.\r\n * 'right' (default): [radio] Title Description\r\n * 'left': Title Description [radio]\r\n */\r\n @Input() labelPosition: RadioLabelPosition = 'right';\r\n\r\n /**\r\n * Whether the radio is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Event emitted when selection changes\r\n */\r\n @Output() selectionChange = new EventEmitter<unknown>();\r\n\r\n // Internal state\r\n checked = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: unknown) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n /**\r\n * Get CSS classes for the radio wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-radio',\r\n `pecb-radio--${this.variant}`,\r\n this.disabled ? 'pecb-radio--disabled' : '',\r\n this.checked ? 'pecb-radio--checked' : '',\r\n this.labelPosition === 'left' ? 'pecb-radio--label-left' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle radio selection\r\n */\r\n onRadioChange(event: Event): void {\r\n if (this.disabled) return;\r\n\r\n const checked = (event.target as HTMLInputElement).checked;\r\n if (checked) {\r\n this.checked = true;\r\n this.onChange(this.value);\r\n this.selectionChange.emit(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: unknown): void {\r\n this.checked = value === this.value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-radio__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"radio\"\r\n class=\"pecb-radio__input\"\r\n [name]=\"name\"\r\n [value]=\"value\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onRadioChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-radio__control\"></span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type CheckboxLabelPosition = 'right' | 'left';\r\n\r\n/**\r\n * A professional checkbox component with label and description support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-checkbox\r\n * label=\"Accept terms\"\r\n * description=\"I agree to the terms and conditions\"\r\n * [(ngModel)]=\"accepted\"\r\n * ></pecb-checkbox>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './checkbox.component.html',\r\n styleUrls: ['./checkbox.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CheckboxComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CheckboxComponent implements ControlValueAccessor {\r\n /**\r\n * Unique ID for the checkbox element\r\n */\r\n @Input() id: string = generateUniqueId('checkbox');\r\n\r\n /**\r\n * Name attribute for the checkbox\r\n */\r\n @Input() name?: string;\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Description text to display below label\r\n */\r\n @Input() description?: string;\r\n\r\n /**\r\n * Position of the label relative to the checkbox control.\r\n * 'right' (default): [checkbox] Title Description\r\n * 'left': Title Description [checkbox]\r\n */\r\n @Input() labelPosition: CheckboxLabelPosition = 'right';\r\n\r\n /**\r\n * Whether the checkbox is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Event emitted when checked state changes\r\n */\r\n @Output() checkedChange = new EventEmitter<boolean>();\r\n\r\n // Internal state\r\n checked = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: boolean) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n /**\r\n * Get CSS classes for the checkbox wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-checkbox',\r\n this.disabled ? 'pecb-checkbox--disabled' : '',\r\n this.checked ? 'pecb-checkbox--checked' : '',\r\n this.labelPosition === 'left' ? 'pecb-checkbox--label-left' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle checkbox change\r\n */\r\n onCheckboxChange(event: Event): void {\r\n if (this.disabled) return;\r\n\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.checked = checked;\r\n this.onChange(this.checked);\r\n this.checkedChange.emit(this.checked);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: boolean): void {\r\n this.checked = !!value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-checkbox__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n class=\"pecb-checkbox__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-checkbox__control\">\r\n <svg class=\"pecb-checkbox__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type ToggleLabelPosition = 'right' | 'left';\r\n\r\n/**\r\n * A professional toggle/switch component with label and description support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-toggle\r\n * label=\"Enable notifications\"\r\n * description=\"Receive email notifications\"\r\n * [(ngModel)]=\"notificationsEnabled\"\r\n * ></pecb-toggle>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-toggle',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './toggle.component.html',\r\n styleUrls: ['./toggle.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ToggleComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class ToggleComponent implements ControlValueAccessor {\r\n /**\r\n * Unique ID for the toggle element\r\n */\r\n @Input() id: string = generateUniqueId('toggle');\r\n\r\n /**\r\n * Name attribute for the toggle\r\n */\r\n @Input() name?: string;\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Description text to display below label\r\n */\r\n @Input() description?: string;\r\n\r\n /**\r\n * Position of the label relative to the toggle control.\r\n * 'right' (default): [toggle] Title Description\r\n * 'left': Title Description [toggle]\r\n */\r\n @Input() labelPosition: ToggleLabelPosition = 'right';\r\n\r\n /**\r\n * Whether the toggle is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Event emitted when toggle state changes\r\n */\r\n @Output() toggleChange = new EventEmitter<boolean>();\r\n\r\n // Internal state\r\n checked = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: boolean) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n /**\r\n * Get CSS classes for the toggle wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-toggle',\r\n this.disabled ? 'pecb-toggle--disabled' : '',\r\n this.checked ? 'pecb-toggle--checked' : '',\r\n this.labelPosition === 'left' ? 'pecb-toggle--label-left' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle toggle change\r\n */\r\n onToggleChange(event: Event): void {\r\n if (this.disabled) return;\r\n\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.checked = checked;\r\n this.onChange(this.checked);\r\n this.toggleChange.emit(this.checked);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: boolean): void {\r\n this.checked = !!value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-toggle__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n class=\"pecb-toggle__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n [attr.aria-checked]=\"checked\"\r\n (change)=\"onToggleChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-toggle__content\">\r\n <span *ngIf=\"label\" class=\"pecb-toggle__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-toggle__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-toggle__control\">\r\n <span class=\"pecb-toggle__thumb\"></span>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-toggle__content\">\r\n <span *ngIf=\"label\" class=\"pecb-toggle__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-toggle__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n HostListener,\r\n ElementRef,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport interface DropdownOption {\r\n label: string;\r\n value: unknown;\r\n disabled?: boolean;\r\n}\r\n\r\nexport type DropdownSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * A professional dropdown/select component with multi-select and search support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Single select -->\r\n * <pecb-dropdown\r\n * label=\"Select option\"\r\n * [options]=\"options\"\r\n * [(ngModel)]=\"selectedValue\"\r\n * ></pecb-dropdown>\r\n *\r\n * <!-- Multi-select with search -->\r\n * <pecb-dropdown\r\n * label=\"Select multiple\"\r\n * [options]=\"options\"\r\n * [multiple]=\"true\"\r\n * [searchable]=\"true\"\r\n * [(ngModel)]=\"selectedValues\"\r\n * ></pecb-dropdown>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-dropdown',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './dropdown.component.html',\r\n styleUrls: ['./dropdown.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DropdownComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DropdownComponent implements ControlValueAccessor {\r\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\r\n\r\n /**\r\n * Unique ID for the dropdown element\r\n */\r\n @Input() id: string = generateUniqueId('dropdown');\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * The size of the dropdown\r\n */\r\n @Input() size: DropdownSize = 'md';\r\n\r\n /**\r\n * List of options\r\n */\r\n @Input() options: DropdownOption[] = [];\r\n\r\n /**\r\n * Whether multiple selection is enabled\r\n */\r\n @Input() multiple = false;\r\n\r\n /**\r\n * Whether search is enabled\r\n */\r\n @Input() searchable = false;\r\n\r\n /**\r\n * Maximum height for dropdown panel (in pixels)\r\n */\r\n @Input() maxHeight = 300;\r\n\r\n /**\r\n * Whether the dropdown is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether the field is required\r\n */\r\n @Input() required = false;\r\n\r\n /**\r\n * Whether to show error state\r\n */\r\n @Input() error = false;\r\n\r\n /**\r\n * Error message to display\r\n */\r\n @Input() errorMessage?: string;\r\n\r\n /**\r\n * Helper text to display below dropdown\r\n */\r\n @Input() helperText?: string;\r\n\r\n /**\r\n * Event emitted when selection changes\r\n */\r\n @Output() selectionChange = new EventEmitter<unknown | unknown[]>();\r\n\r\n // Internal state\r\n isOpen = false;\r\n searchQuery = '';\r\n selectedValues: unknown[] = [];\r\n focusedIndex = -1;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: unknown) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private elementRef: ElementRef\r\n ) {}\r\n\r\n /**\r\n * Get CSS classes for the dropdown wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-dropdown',\r\n `pecb-dropdown--${this.size}`,\r\n this.disabled ? 'pecb-dropdown--disabled' : '',\r\n this.error ? 'pecb-dropdown--error' : '',\r\n this.isOpen ? 'pecb-dropdown--open' : '',\r\n this.hasValue ? 'pecb-dropdown--has-value' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Check if dropdown has value\r\n */\r\n get hasValue(): boolean {\r\n return this.multiple ? this.selectedValues.length > 0 : this.selectedValues.length > 0;\r\n }\r\n\r\n /**\r\n * Get filtered options based on search query\r\n */\r\n get filteredOptions(): DropdownOption[] {\r\n if (!this.searchQuery) {\r\n return this.options;\r\n }\r\n const query = this.searchQuery.toLowerCase();\r\n return this.options.filter(option =>\r\n option.label.toLowerCase().includes(query)\r\n );\r\n }\r\n\r\n /**\r\n * Get display text for selected value(s)\r\n */\r\n get displayText(): string {\r\n if (!this.hasValue) {\r\n return '';\r\n }\r\n\r\n if (this.multiple) {\r\n const selectedOptions = this.options.filter(opt =>\r\n this.selectedValues.includes(opt.value)\r\n );\r\n return selectedOptions.map(opt => opt.label).join(', ');\r\n } else {\r\n const selectedOption = this.options.find(opt =>\r\n opt.value === this.selectedValues[0]\r\n );\r\n return selectedOption?.label || '';\r\n }\r\n }\r\n\r\n /**\r\n * Toggle dropdown open/close\r\n */\r\n toggleDropdown(): void {\r\n if (this.disabled) return;\r\n\r\n this.isOpen = !this.isOpen;\r\n\r\n if (this.isOpen) {\r\n this.onTouched();\r\n this.focusedIndex = -1;\r\n\r\n // Focus search input if searchable\r\n if (this.searchable) {\r\n setTimeout(() => {\r\n this.searchInput?.nativeElement.focus();\r\n }, 0);\r\n }\r\n } else {\r\n this.searchQuery = '';\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Select an option\r\n */\r\n selectOption(option: DropdownOption): void {\r\n if (option.disabled) return;\r\n\r\n if (this.multiple) {\r\n const index = this.selectedValues.indexOf(option.value);\r\n if (index > -1) {\r\n this.selectedValues.splice(index, 1);\r\n } else {\r\n this.selectedValues.push(option.value);\r\n }\r\n this.onChange([...this.selectedValues]);\r\n this.selectionChange.emit([...this.selectedValues]);\r\n } else {\r\n this.selectedValues = [option.value];\r\n this.onChange(option.value);\r\n this.selectionChange.emit(option.value);\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Check if option is selected\r\n */\r\n isSelected(option: DropdownOption): boolean {\r\n return this.selectedValues.includes(option.value);\r\n }\r\n\r\n /**\r\n * Handle search input\r\n */\r\n onSearchInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n this.searchQuery = target.value;\r\n this.focusedIndex = -1;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle keyboard navigation\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n const filteredOptions = this.filteredOptions;\r\n\r\n switch (event.key) {\r\n case 'Enter':\r\n case ' ':\r\n if (!this.isOpen) {\r\n event.preventDefault();\r\n this.toggleDropdown();\r\n } else if (this.focusedIndex >= 0 && this.focusedIndex < filteredOptions.length) {\r\n event.preventDefault();\r\n this.selectOption(filteredOptions[this.focusedIndex]);\r\n }\r\n break;\r\n\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (!this.isOpen) {\r\n this.toggleDropdown();\r\n } else {\r\n this.focusedIndex = Math.min(this.focusedIndex + 1, filteredOptions.length - 1);\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n if (this.isOpen) {\r\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (this.isOpen) {\r\n event.preventDefault();\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n\r\n case 'Tab':\r\n if (this.isOpen) {\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Close dropdown when clicking outside\r\n */\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n if (this.isOpen) {\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: unknown): void {\r\n if (this.multiple) {\r\n this.selectedValues = Array.isArray(value) ? value : [];\r\n } else {\r\n this.selectedValues = value != null ? [value] : [];\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Dropdown Trigger -->\r\n <div\r\n class=\"pecb-dropdown__trigger\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-expanded]=\"isOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n [attr.aria-disabled]=\"disabled\"\r\n (click)=\"toggleDropdown()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n >\r\n <span class=\"pecb-dropdown__value\">{{ displayText }}</span>\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-dropdown__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-dropdown__required\">*</span>\r\n </label>\r\n\r\n <!-- Dropdown Arrow -->\r\n <span class=\"pecb-dropdown__arrow\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\r\n <path d=\"M6 8L2 4H10L6 8Z\"/>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Dropdown Panel -->\r\n <div\r\n *ngIf=\"isOpen\"\r\n class=\"pecb-dropdown__panel\"\r\n [style.max-height.px]=\"maxHeight\"\r\n >\r\n <!-- Search Input -->\r\n <div *ngIf=\"searchable\" class=\"pecb-dropdown__search\">\r\n <svg class=\"pecb-dropdown__search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"pecb-dropdown__search-input\"\r\n placeholder=\"Search\"\r\n [value]=\"searchQuery\"\r\n (input)=\"onSearchInput($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Options List -->\r\n <div class=\"pecb-dropdown__options\">\r\n <div\r\n *ngFor=\"let option of filteredOptions; let i = index\"\r\n class=\"pecb-dropdown__option\"\r\n [class.pecb-dropdown__option--selected]=\"isSelected(option)\"\r\n [class.pecb-dropdown__option--disabled]=\"option.disabled\"\r\n [class.pecb-dropdown__option--focused]=\"i === focusedIndex\"\r\n (click)=\"selectOption(option)\"\r\n >\r\n <!-- Checkbox for multi-select -->\r\n <span *ngIf=\"multiple\" class=\"pecb-dropdown__checkbox\">\r\n <span class=\"pecb-dropdown__checkbox-control\" [class.pecb-dropdown__checkbox-control--checked]=\"isSelected(option)\">\r\n <svg *ngIf=\"isSelected(option)\" class=\"pecb-dropdown__checkbox-icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </span>\r\n\r\n <!-- Option Label -->\r\n <span class=\"pecb-dropdown__option-label\">{{ option.label }}</span>\r\n </div>\r\n\r\n <!-- No results message -->\r\n <div *ngIf=\"filteredOptions.length === 0\" class=\"pecb-dropdown__no-results\">\r\n No results found\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Helper Text / Error Message -->\r\n <div\r\n *ngIf=\"helperText || errorMessage\"\r\n [id]=\"id + '-description'\"\r\n class=\"pecb-dropdown__description\"\r\n [class.pecb-dropdown__description--error]=\"error && errorMessage\"\r\n >\r\n <span *ngIf=\"error && errorMessage\">{{ errorMessage }}</span>\r\n <span *ngIf=\"!error && helperText\">{{ helperText }}</span>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Directive,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { generateUniqueId, trapFocus, disableBodyScroll } from '../../shared/utils/dom.utils';\r\n\r\nexport type RightModalSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * A right-side sliding modal/drawer component.\r\n * Slides in from the right edge of the screen with backdrop overlay.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-right-modal\r\n * [isOpen]=\"isModalOpen\"\r\n * (closed)=\"onModalClose()\"\r\n * ariaLabel=\"Exam Details\"\r\n * >\r\n * <div pecbRightModalHeader>\r\n * <h2>Exam Details</h2>\r\n * </div>\r\n * <div pecbRightModalContent>\r\n * <p>Modal content goes here</p>\r\n * </div>\r\n * <div pecbRightModalFooter>\r\n * <button>Action</button>\r\n * </div>\r\n * </pecb-right-modal>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-right-modal',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './right-modal.component.html',\r\n styleUrls: ['./right-modal.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class RightModalComponent implements OnInit, OnDestroy, AfterViewInit {\r\n /**\r\n * Unique ID for the modal element\r\n */\r\n @Input() id: string = generateUniqueId('right-modal');\r\n\r\n /**\r\n * Whether the modal is open\r\n */\r\n @Input() isOpen = false;\r\n\r\n /**\r\n * Size of the modal panel\r\n */\r\n @Input() size: RightModalSize = 'md';\r\n\r\n /**\r\n * Whether clicking the backdrop closes the modal\r\n */\r\n @Input() closeOnBackdropClick = true;\r\n\r\n /**\r\n * Whether pressing Escape closes the modal\r\n */\r\n @Input() closeOnEscape = true;\r\n\r\n /**\r\n * Whether to show the close button\r\n */\r\n @Input() showCloseButton = true;\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Accessible label for the modal\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of element that labels this modal\r\n */\r\n @Input() ariaLabelledBy?: string;\r\n\r\n /**\r\n * ID of element that describes this modal\r\n */\r\n @Input() ariaDescribedBy?: string;\r\n\r\n /**\r\n * Emitted when the modal is closed\r\n */\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n /**\r\n * Emitted when the modal is opened\r\n */\r\n @Output() opened = new EventEmitter<void>();\r\n\r\n @ViewChild('modalPanel') modalPanel!: ElementRef<HTMLElement>;\r\n\r\n private cleanupFocusTrap: (() => void) | null = null;\r\n private cleanupBodyScroll: (() => void) | null = null;\r\n private previousActiveElement: Element | null = null;\r\n\r\n ngOnInit(): void {\r\n if (this.isOpen) {\r\n this.onOpen();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.isOpen && this.modalPanel) {\r\n this.setupFocusTrap();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cleanup();\r\n }\r\n\r\n /**\r\n * Get CSS classes for the modal container\r\n */\r\n get modalClasses(): string[] {\r\n return [\r\n 'pecb-right-modal',\r\n this.isOpen ? 'pecb-right-modal--open' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get CSS classes for the modal panel\r\n */\r\n get panelClasses(): string[] {\r\n return [\r\n 'pecb-right-modal__panel',\r\n `pecb-right-modal__panel--${this.size}`\r\n ];\r\n }\r\n\r\n /**\r\n * Handle backdrop click\r\n */\r\n onBackdropClick(event: MouseEvent): void {\r\n if (this.closeOnBackdropClick && event.target === event.currentTarget) {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard events\r\n */\r\n onKeydown(event: KeyboardEvent): void {\r\n if (this.closeOnEscape && event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Close the modal\r\n */\r\n close(): void {\r\n this.cleanup();\r\n this.closed.emit();\r\n }\r\n\r\n /**\r\n * Called when modal opens\r\n */\r\n private onOpen(): void {\r\n this.previousActiveElement = document.activeElement;\r\n this.cleanupBodyScroll = disableBodyScroll();\r\n this.opened.emit();\r\n }\r\n\r\n /**\r\n * Setup focus trap after view is ready\r\n */\r\n private setupFocusTrap(): void {\r\n if (this.modalPanel?.nativeElement) {\r\n this.cleanupFocusTrap = trapFocus(this.modalPanel.nativeElement);\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup resources\r\n */\r\n private cleanup(): void {\r\n if (this.cleanupFocusTrap) {\r\n this.cleanupFocusTrap();\r\n this.cleanupFocusTrap = null;\r\n }\r\n if (this.cleanupBodyScroll) {\r\n this.cleanupBodyScroll();\r\n this.cleanupBodyScroll = null;\r\n }\r\n if (this.previousActiveElement instanceof HTMLElement) {\r\n this.previousActiveElement.focus();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Header directive for right modal\r\n */\r\n@Directive({\r\n selector: '[pecbRightModalHeader]',\r\n standalone: true,\r\n host: { class: 'pecb-right-modal__header' }\r\n})\r\nexport class RightModalHeaderDirective {}\r\n\r\n/**\r\n * Content directive for right modal\r\n */\r\n@Directive({\r\n selector: '[pecbRightModalContent]',\r\n standalone: true,\r\n host: { class: 'pecb-right-modal__content' }\r\n})\r\nexport class RightModalContentDirective {}\r\n\r\n/**\r\n * Footer directive for right modal\r\n */\r\n@Directive({\r\n selector: '[pecbRightModalFooter]',\r\n standalone: true,\r\n host: { class: 'pecb-right-modal__footer' }\r\n})\r\nexport class RightModalFooterDirective {}","<div\r\n *ngIf=\"isOpen\"\r\n [id]=\"id\"\r\n [class]=\"modalClasses.join(' ')\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n (click)=\"onBackdropClick($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <div\r\n #modalPanel\r\n [class]=\"panelClasses.join(' ')\"\r\n tabindex=\"-1\"\r\n >\r\n <button\r\n *ngIf=\"showCloseButton\"\r\n type=\"button\"\r\n class=\"pecb-right-modal__close-btn\"\r\n aria-label=\"Close modal\"\r\n (click)=\"close()\"\r\n >\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ng-content select=\"[pecbRightModalHeader]\"></ng-content>\r\n <ng-content select=\"[pecbRightModalContent]\"></ng-content>\r\n <ng-content></ng-content>\r\n <ng-content select=\"[pecbRightModalFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\n\r\nexport interface SidebarMenuItem {\r\n id: string;\r\n label: string;\r\n icon?: string;\r\n route?: string;\r\n active?: boolean;\r\n children?: SidebarMenuItem[];\r\n expanded?: boolean;\r\n}\r\n\r\nexport interface SidebarSection {\r\n id: string;\r\n title?: string;\r\n items: SidebarMenuItem[];\r\n}\r\n\r\n/**\r\n * A professional sidebar navigation component with collapsible sections and nested items.\r\n * Perfect for application navigation with hierarchical menu structures.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic sidebar -->\r\n * <pecb-sidebar\r\n * [sections]=\"menuSections\"\r\n * (itemClick)=\"onMenuItemClick($event)\"\r\n * ></pecb-sidebar>\r\n *\r\n * <!-- With logo header -->\r\n * <pecb-sidebar\r\n * [sections]=\"menuSections\"\r\n * [showHeader]=\"true\"\r\n * [sidebarLogo]=\"logoSvg\"\r\n * ></pecb-sidebar>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-sidebar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './sidebar.component.html',\r\n styleUrls: ['./sidebar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SidebarComponent {\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n /**\r\n * Array of sidebar sections with menu items\r\n */\r\n @Input() sections: SidebarSection[] = [];\r\n\r\n /**\r\n * Whether to show the header section\r\n */\r\n @Input() showHeader = true;\r\n\r\n /**\r\n * Sidebar logo as an SVG string. Rendered in the header area.\r\n */\r\n @Input() sidebarLogo?: string;\r\n\r\n /**\r\n * Whether to show the footer section\r\n */\r\n @Input() showFooter = false;\r\n\r\n /**\r\n * Whether the sidebar is collapsed\r\n */\r\n @Input() collapsed = false;\r\n\r\n /**\r\n * Event emitted when a menu item is clicked\r\n */\r\n @Output() itemClick = new EventEmitter<SidebarMenuItem>();\r\n\r\n /**\r\n * Event emitted when the sidebar collapse state changes\r\n */\r\n @Output() collapseChange = new EventEmitter<boolean>();\r\n\r\n /**\r\n * Handle menu item click\r\n */\r\n onItemClick(item: SidebarMenuItem, event: Event): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Check if this is a top-level item\r\n const isTopLevel = this.sections.some(section =>\r\n section.items.includes(item)\r\n );\r\n\r\n if (isTopLevel) {\r\n // Collapse all other top-level items\r\n this.sections.forEach(section => {\r\n section.items.forEach(sectionItem => {\r\n if (sectionItem !== item && sectionItem.expanded) {\r\n sectionItem.expanded = false;\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (item.children && item.children.length > 0) {\r\n item.expanded = !item.expanded;\r\n }\r\n\r\n // Always emit the click event, even for items with children\r\n this.itemClick.emit(item);\r\n }\r\n\r\n /**\r\n * Toggle sidebar collapse state\r\n */\r\n toggleCollapse(): void {\r\n this.collapsed = !this.collapsed;\r\n this.collapseChange.emit(this.collapsed);\r\n }\r\n\r\n /**\r\n * Sanitize icon SVG HTML to prevent Angular from stripping SVG elements\r\n */\r\n getSafeIcon(icon: string): SafeHtml {\r\n return this.sanitizer.bypassSecurityTrustHtml(icon);\r\n }\r\n\r\n /**\r\n * TrackBy for sections\r\n */\r\n trackBySection(_index: number, section: SidebarSection): string {\r\n return section.id;\r\n }\r\n\r\n /**\r\n * TrackBy for menu items\r\n */\r\n trackByItem(_index: number, item: SidebarMenuItem): string {\r\n return item.id;\r\n }\r\n\r\n /**\r\n * Get CSS classes for a menu item\r\n */\r\n getItemClasses(item: SidebarMenuItem, isChild = false, isNested = false): string[] {\r\n const classes = [\r\n isChild ? 'pecb-sidebar__subitem' : 'pecb-sidebar__item'\r\n ];\r\n\r\n if (isNested) {\r\n classes.push('pecb-sidebar__subitem--nested');\r\n }\r\n\r\n if (item.active) {\r\n classes.push(isChild ? 'pecb-sidebar__subitem--active' : 'pecb-sidebar__item--active');\r\n }\r\n\r\n if (item.children && item.children.length > 0) {\r\n if (!isChild) {\r\n classes.push('pecb-sidebar__item--has-children');\r\n if (item.expanded) {\r\n classes.push('pecb-sidebar__item--expanded');\r\n }\r\n } else if (isChild && !isNested) {\r\n // Second-level items with children\r\n if (item.expanded) {\r\n classes.push('pecb-sidebar__item--expanded');\r\n }\r\n }\r\n }\r\n\r\n return classes;\r\n }\r\n}\r\n","<aside class=\"pecb-sidebar\" [class.pecb-sidebar--collapsed]=\"collapsed\">\r\n <!-- Collapse Toggle Button -->\r\n <button\r\n class=\"pecb-sidebar__toggle\"\r\n [class.pecb-sidebar__toggle--collapsed]=\"collapsed\"\r\n (click)=\"toggleCollapse()\"\r\n [attr.aria-label]=\"collapsed ? 'Expand sidebar' : 'Collapse sidebar'\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Header Section -->\r\n <div *ngIf=\"showHeader\" class=\"pecb-sidebar__header\">\r\n <ng-content select=\"[sidebar-header]\"></ng-content>\r\n <div *ngIf=\"sidebarLogo\" class=\"pecb-sidebar__header-content\">\r\n <span class=\"pecb-sidebar__logo\" [innerHTML]=\"getSafeIcon(sidebarLogo)\"></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Navigation Sections -->\r\n <nav class=\"pecb-sidebar__nav\">\r\n <div *ngFor=\"let section of sections; trackBy: trackBySection\" class=\"pecb-sidebar__section\">\r\n <!-- Section Title -->\r\n <div *ngIf=\"section.title\" class=\"pecb-sidebar__section-title\">\r\n {{ section.title }}\r\n </div>\r\n\r\n <!-- Menu Items -->\r\n <ul class=\"pecb-sidebar__menu\">\r\n <li *ngFor=\"let item of section.items; trackBy: trackByItem\">\r\n <!-- Parent Item -->\r\n <a\r\n [class]=\"getItemClasses(item).join(' ')\"\r\n [attr.href]=\"item.route || '#'\"\r\n (click)=\"onItemClick(item, $event)\"\r\n >\r\n <span *ngIf=\"item.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(item.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ item.label }}</span>\r\n </a>\r\n\r\n <!-- Child Items -->\r\n <ul\r\n *ngIf=\"item.children && item.children.length > 0 && !collapsed\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"item.expanded\"\r\n >\r\n <li *ngFor=\"let child of item.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(child, true, false).join(' ')\"\r\n [attr.href]=\"child.route || '#'\"\r\n (click)=\"onItemClick(child, $event)\"\r\n >\r\n <span *ngIf=\"child.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(child.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ child.label }}</span>\r\n <span\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__arrow\"\r\n [class.pecb-sidebar__arrow--expanded]=\"child.expanded\"\r\n >\r\n <!-- Minus icon (expanded) -->\r\n <svg *ngIf=\"child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <!-- Plus icon (collapsed) -->\r\n <svg *ngIf=\"!child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 4v8M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </span>\r\n </a>\r\n\r\n <!-- Nested Child Items (Third Level) -->\r\n <ul\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"child.expanded\"\r\n >\r\n <li *ngFor=\"let nestedChild of child.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(nestedChild, true, true).join(' ')\"\r\n [attr.href]=\"nestedChild.route || '#'\"\r\n (click)=\"onItemClick(nestedChild, $event)\"\r\n >\r\n <span class=\"pecb-sidebar__label\">{{ nestedChild.label }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n </nav>\r\n\r\n <!-- Footer Section -->\r\n <div *ngIf=\"showFooter\" class=\"pecb-sidebar__footer\">\r\n <ng-content select=\"[sidebar-footer]\"></ng-content>\r\n </div>\r\n</aside>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { ButtonComponent } from './components/button/button.component';\r\nimport {\r\n CardComponent,\r\n CardHeaderComponent,\r\n CardBodyComponent,\r\n CardFooterComponent\r\n} from './components/card/card.component';\r\nimport { StatusComponent } from './components/status/status.component';\r\nimport { PaginationComponent } from './components/pagination/pagination.component';\r\nimport { TableComponent } from './components/table/table.component';\r\nimport { TabComponent } from './components/tab/tab.component';\r\nimport { DatepickerComponent } from './components/datepicker/datepicker.component';\r\nimport { InputComponent } from './components/input/input.component';\r\nimport { RadioComponent } from './components/radio/radio.component';\r\nimport { CheckboxComponent } from './components/checkbox/checkbox.component';\r\nimport { ToggleComponent } from './components/toggle/toggle.component';\r\nimport { DropdownComponent } from './components/dropdown/dropdown.component';\r\nimport {\r\n RightModalComponent,\r\n RightModalHeaderDirective,\r\n RightModalContentDirective,\r\n RightModalFooterDirective\r\n} from './components/right-modal/right-modal.component';\r\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\r\n\r\nconst COMPONENTS = [\r\n ButtonComponent,\r\n CardComponent,\r\n CardHeaderComponent,\r\n CardBodyComponent,\r\n CardFooterComponent,\r\n StatusComponent,\r\n PaginationComponent,\r\n TableComponent,\r\n TabComponent,\r\n DatepickerComponent,\r\n InputComponent,\r\n RadioComponent,\r\n CheckboxComponent,\r\n ToggleComponent,\r\n DropdownComponent,\r\n RightModalComponent,\r\n RightModalHeaderDirective,\r\n RightModalContentDirective,\r\n RightModalFooterDirective,\r\n SidebarComponent\r\n];\r\n\r\n/**\r\n * PECB UI Components Module\r\n *\r\n * A professional Angular components library with TypeScript and SCSS.\r\n * Import this module to use all PECB UI components in your application.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { PecbComponentsModule } from '@pecb-ui/components';\r\n *\r\n * @NgModule({\r\n * imports: [PecbComponentsModule]\r\n * })\r\n * export class AppModule { }\r\n * ```\r\n */\r\n@NgModule({\r\n imports: [CommonModule, ...COMPONENTS],\r\n exports: COMPONENTS\r\n})\r\nexport class PecbComponentsModule {}\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Notification types supported by the service\r\n */\r\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\r\n\r\n/**\r\n * Notification position on screen\r\n */\r\nexport type NotificationPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\r\n\r\n/**\r\n * Notification configuration options\r\n */\r\nexport interface NotificationConfig {\r\n /** Notification message */\r\n message: string;\r\n /** Notification title (optional) */\r\n title?: string;\r\n /** Type of notification */\r\n type: NotificationType;\r\n /** Duration in milliseconds (0 for persistent) */\r\n duration?: number;\r\n /** Whether the notification can be dismissed */\r\n dismissible?: boolean;\r\n /** Position on screen */\r\n position?: NotificationPosition;\r\n /** Custom CSS class */\r\n customClass?: string;\r\n /** Unique identifier */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Notification object with all properties\r\n */\r\nexport interface Notification extends Required<Omit<NotificationConfig, 'title' | 'customClass'>> {\r\n title?: string;\r\n customClass?: string;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * A stateless, injectable notification service for displaying toast notifications.\r\n *\r\n * This service provides a reactive way to manage notifications across the application.\r\n * It uses RxJS Subjects to emit notification events that can be consumed by notification\r\n * display components.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { NotificationService } from '@pecb-ui/components';\r\n *\r\n * @Component({...})\r\n * export class MyComponent {\r\n * constructor(private notificationService: NotificationService) {}\r\n *\r\n * showSuccess(): void {\r\n * this.notificationService.success('Operation completed successfully!');\r\n * }\r\n *\r\n * showError(): void {\r\n * this.notificationService.error('An error occurred', 'Error Title');\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService {\r\n private readonly notificationSubject = new Subject<Notification>();\r\n private readonly dismissSubject = new Subject<string>();\r\n private readonly clearSubject = new Subject<void>();\r\n\r\n /** Default duration for notifications in milliseconds */\r\n private readonly defaultDuration = 5000;\r\n /** Default position for notifications */\r\n private readonly defaultPosition: NotificationPosition = 'top-right';\r\n\r\n /**\r\n * Observable stream of notifications\r\n */\r\n get notifications$(): Observable<Notification> {\r\n return this.notificationSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Observable stream of dismissed notification IDs\r\n */\r\n get dismiss$(): Observable<string> {\r\n return this.dismissSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Observable stream for clear all events\r\n */\r\n get clear$(): Observable<void> {\r\n return this.clearSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Show a success notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n success(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'success' });\r\n }\r\n\r\n /**\r\n * Show an error notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n error(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'error' });\r\n }\r\n\r\n /**\r\n * Show a warning notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n warning(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'warning' });\r\n }\r\n\r\n /**\r\n * Show an info notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n info(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'info' });\r\n }\r\n\r\n /**\r\n * Show a notification with custom configuration\r\n * @param config - Full notification configuration\r\n * @returns The notification ID\r\n */\r\n show(config: NotificationConfig): string {\r\n const id = config.id || this.generateId();\r\n\r\n const notification: Notification = {\r\n id,\r\n message: config.message,\r\n title: config.title,\r\n type: config.type,\r\n duration: config.duration ?? this.defaultDuration,\r\n dismissible: config.dismissible ?? true,\r\n position: config.position ?? this.defaultPosition,\r\n customClass: config.customClass,\r\n timestamp: new Date()\r\n };\r\n\r\n this.notificationSubject.next(notification);\r\n return id;\r\n }\r\n\r\n /**\r\n * Dismiss a specific notification by ID\r\n * @param id - The notification ID to dismiss\r\n */\r\n dismiss(id: string): void {\r\n this.dismissSubject.next(id);\r\n }\r\n\r\n /**\r\n * Clear all notifications\r\n */\r\n clearAll(): void {\r\n this.clearSubject.next();\r\n }\r\n\r\n /**\r\n * Generate a unique notification ID\r\n */\r\n private generateId(): string {\r\n return `notification-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n }\r\n}\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Available theme modes\r\n */\r\nexport type ThemeMode = 'light' | 'dark' | 'system';\r\n\r\n/**\r\n * Theme configuration interface\r\n */\r\nexport interface ThemeConfig {\r\n /** Current theme mode */\r\n mode: ThemeMode;\r\n /** Resolved theme (light or dark, never system) */\r\n resolvedTheme: 'light' | 'dark';\r\n /** CSS class to apply to the document */\r\n cssClass: string;\r\n}\r\n\r\n/**\r\n * Custom theme variables that can be overridden\r\n */\r\nexport interface ThemeVariables {\r\n /** Primary color */\r\n primaryColor?: string;\r\n /** Secondary color */\r\n secondaryColor?: string;\r\n /** Background color */\r\n backgroundColor?: string;\r\n /** Text color */\r\n textColor?: string;\r\n /** Border radius */\r\n borderRadius?: string;\r\n /** Font family */\r\n fontFamily?: string;\r\n /** Custom CSS variables */\r\n [key: string]: string | undefined;\r\n}\r\n\r\n/**\r\n * Storage key for persisting theme preference\r\n */\r\nconst THEME_STORAGE_KEY = 'pecb-ui-theme';\r\n\r\n/**\r\n * A stateless, injectable theme service for managing application themes.\r\n *\r\n * This service provides reactive theme management with support for light/dark modes,\r\n * system preference detection, and custom CSS variable overrides.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { ThemeService } from '@pecb-ui/components';\r\n *\r\n * @Component({...})\r\n * export class MyComponent {\r\n * constructor(private themeService: ThemeService) {}\r\n *\r\n * toggleTheme(): void {\r\n * this.themeService.toggleTheme();\r\n * }\r\n *\r\n * setDarkMode(): void {\r\n * this.themeService.setTheme('dark');\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n private readonly themeSubject: BehaviorSubject<ThemeConfig>;\r\n private readonly isBrowser: boolean;\r\n private mediaQuery: MediaQueryList | null = null;\r\n\r\n constructor(@Inject(PLATFORM_ID) platformId: object) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n\r\n const initialTheme = this.getInitialTheme();\r\n this.themeSubject = new BehaviorSubject<ThemeConfig>(this.createThemeConfig(initialTheme));\r\n\r\n if (this.isBrowser) {\r\n this.setupSystemThemeListener();\r\n this.applyTheme(this.themeSubject.value);\r\n }\r\n }\r\n\r\n /**\r\n * Observable stream of theme configuration changes\r\n */\r\n get theme$(): Observable<ThemeConfig> {\r\n return this.themeSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Get the current theme configuration\r\n */\r\n get currentTheme(): ThemeConfig {\r\n return this.themeSubject.value;\r\n }\r\n\r\n /**\r\n * Get the current theme mode\r\n */\r\n get currentMode(): ThemeMode {\r\n return this.themeSubject.value.mode;\r\n }\r\n\r\n /**\r\n * Check if the current resolved theme is dark\r\n */\r\n get isDarkMode(): boolean {\r\n return this.themeSubject.value.resolvedTheme === 'dark';\r\n }\r\n\r\n /**\r\n * Set the theme mode\r\n * @param mode - The theme mode to set (light, dark, or system)\r\n */\r\n setTheme(mode: ThemeMode): void {\r\n const config = this.createThemeConfig(mode);\r\n this.themeSubject.next(config);\r\n this.persistTheme(mode);\r\n\r\n if (this.isBrowser) {\r\n this.applyTheme(config);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle between light and dark themes\r\n * If currently using system preference, switches to the opposite of the resolved theme\r\n */\r\n toggleTheme(): void {\r\n const current = this.themeSubject.value;\r\n const newMode: ThemeMode = current.resolvedTheme === 'light' ? 'dark' : 'light';\r\n this.setTheme(newMode);\r\n }\r\n\r\n /**\r\n * Reset to system preference\r\n */\r\n useSystemTheme(): void {\r\n this.setTheme('system');\r\n }\r\n\r\n /**\r\n * Apply custom CSS variables to the document\r\n * @param variables - Object containing CSS variable overrides\r\n */\r\n setCustomVariables(variables: ThemeVariables): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const root = document.documentElement;\r\n Object.entries(variables).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n const cssVarName = this.toCssVariableName(key);\r\n root.style.setProperty(cssVarName, value);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove custom CSS variables from the document\r\n * @param variableNames - Array of variable names to remove\r\n */\r\n removeCustomVariables(variableNames: string[]): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const root = document.documentElement;\r\n variableNames.forEach(name => {\r\n const cssVarName = this.toCssVariableName(name);\r\n root.style.removeProperty(cssVarName);\r\n });\r\n }\r\n\r\n /**\r\n * Get the initial theme from storage or system preference\r\n */\r\n private getInitialTheme(): ThemeMode {\r\n if (!this.isBrowser) {\r\n return 'light';\r\n }\r\n\r\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\r\n if (stored && ['light', 'dark', 'system'].includes(stored)) {\r\n return stored as ThemeMode;\r\n }\r\n\r\n return 'system';\r\n }\r\n\r\n /**\r\n * Create a theme configuration object\r\n */\r\n private createThemeConfig(mode: ThemeMode): ThemeConfig {\r\n const resolvedTheme = this.resolveTheme(mode);\r\n return {\r\n mode,\r\n resolvedTheme,\r\n cssClass: `pecb-theme-${resolvedTheme}`\r\n };\r\n }\r\n\r\n /**\r\n * Resolve the actual theme from mode (handles 'system' mode)\r\n */\r\n private resolveTheme(mode: ThemeMode): 'light' | 'dark' {\r\n if (mode === 'system') {\r\n return this.getSystemPreference();\r\n }\r\n return mode;\r\n }\r\n\r\n /**\r\n * Get the system color scheme preference\r\n */\r\n private getSystemPreference(): 'light' | 'dark' {\r\n if (!this.isBrowser) {\r\n return 'light';\r\n }\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\r\n }\r\n\r\n /**\r\n * Setup listener for system theme changes\r\n */\r\n private setupSystemThemeListener(): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n\r\n const listener = (): void => {\r\n if (this.themeSubject.value.mode === 'system') {\r\n const config = this.createThemeConfig('system');\r\n this.themeSubject.next(config);\r\n this.applyTheme(config);\r\n }\r\n };\r\n\r\n // Use addEventListener for modern browsers\r\n if (this.mediaQuery.addEventListener) {\r\n this.mediaQuery.addEventListener('change', listener);\r\n }\r\n }\r\n\r\n /**\r\n * Apply the theme to the document\r\n */\r\n private applyTheme(config: ThemeConfig): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const root = document.documentElement;\r\n\r\n // Remove existing theme classes\r\n root.classList.remove('pecb-theme-light', 'pecb-theme-dark');\r\n\r\n // Add new theme class\r\n root.classList.add(config.cssClass);\r\n\r\n // Set data attribute for CSS selectors\r\n root.setAttribute('data-pecb-theme', config.resolvedTheme);\r\n }\r\n\r\n /**\r\n * Persist theme preference to storage\r\n */\r\n private persistTheme(mode: ThemeMode): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n localStorage.setItem(THEME_STORAGE_KEY, mode);\r\n }\r\n\r\n /**\r\n * Convert camelCase property name to CSS variable name\r\n */\r\n private toCssVariableName(name: string): string {\r\n const kebabCase = name.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n return `--pecb-${kebabCase}`;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n/**\r\n * Loading state for a specific operation\r\n */\r\nexport interface LoadingState {\r\n /** Unique identifier for the loading operation */\r\n id: string;\r\n /** Whether this operation is currently loading */\r\n isLoading: boolean;\r\n /** Optional message to display */\r\n message?: string;\r\n /** Optional progress percentage (0-100) */\r\n progress?: number;\r\n}\r\n\r\n/**\r\n * A stateless, injectable loading service for managing loading states.\r\n *\r\n * This service provides a centralized way to track loading states across\r\n * the application, supporting multiple concurrent loading operations with\r\n * individual tracking capabilities.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { LoadingService } from '@pecb-ui/components';\r\n *\r\n * @Component({...})\r\n * export class MyComponent {\r\n * isLoading$ = this.loadingService.isLoading$('my-operation');\r\n *\r\n * constructor(private loadingService: LoadingService) {}\r\n *\r\n * async loadData(): Promise<void> {\r\n * this.loadingService.start('my-operation', 'Loading data...');\r\n * try {\r\n * await this.fetchData();\r\n * } finally {\r\n * this.loadingService.stop('my-operation');\r\n * }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LoadingService {\r\n private readonly loadingStates = new Map<string, LoadingState>();\r\n private readonly statesSubject = new BehaviorSubject<Map<string, LoadingState>>(new Map());\r\n\r\n /** Default loading operation ID */\r\n private readonly defaultId = 'global';\r\n\r\n /**\r\n * Observable of all loading states\r\n */\r\n get states$(): Observable<Map<string, LoadingState>> {\r\n return this.statesSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Observable that emits true when any loading operation is active\r\n */\r\n get isAnyLoading$(): Observable<boolean> {\r\n return this.statesSubject.pipe(\r\n map(states => Array.from(states.values()).some(state => state.isLoading))\r\n );\r\n }\r\n\r\n /**\r\n * Get observable for a specific loading operation\r\n * @param id - The loading operation identifier\r\n */\r\n isLoading$(id: string = this.defaultId): Observable<boolean> {\r\n return this.statesSubject.pipe(\r\n map(states => states.get(id)?.isLoading ?? false)\r\n );\r\n }\r\n\r\n /**\r\n * Get observable for loading state with message\r\n * @param id - The loading operation identifier\r\n */\r\n getState$(id: string = this.defaultId): Observable<LoadingState | undefined> {\r\n return this.statesSubject.pipe(\r\n map(states => states.get(id))\r\n );\r\n }\r\n\r\n /**\r\n * Check if a specific operation is currently loading (synchronous)\r\n * @param id - The loading operation identifier\r\n */\r\n isLoading(id: string = this.defaultId): boolean {\r\n return this.loadingStates.get(id)?.isLoading ?? false;\r\n }\r\n\r\n /**\r\n * Check if any operation is currently loading (synchronous)\r\n */\r\n isAnyLoading(): boolean {\r\n return Array.from(this.loadingStates.values()).some(state => state.isLoading);\r\n }\r\n\r\n /**\r\n * Start a loading operation\r\n * @param id - The loading operation identifier\r\n * @param message - Optional message to display\r\n */\r\n start(id: string = this.defaultId, message?: string): void {\r\n this.updateState(id, { isLoading: true, message, progress: undefined });\r\n }\r\n\r\n /**\r\n * Stop a loading operation\r\n * @param id - The loading operation identifier\r\n */\r\n stop(id: string = this.defaultId): void {\r\n this.updateState(id, { isLoading: false, message: undefined, progress: undefined });\r\n }\r\n\r\n /**\r\n * Update progress for a loading operation\r\n * @param id - The loading operation identifier\r\n * @param progress - Progress percentage (0-100)\r\n * @param message - Optional updated message\r\n */\r\n setProgress(id: string, progress: number, message?: string): void {\r\n const currentState = this.loadingStates.get(id);\r\n if (currentState) {\r\n this.updateState(id, {\r\n isLoading: true,\r\n progress: Math.min(100, Math.max(0, progress)),\r\n message: message ?? currentState.message\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update the message for a loading operation\r\n * @param id - The loading operation identifier\r\n * @param message - New message to display\r\n */\r\n setMessage(id: string, message: string): void {\r\n const currentState = this.loadingStates.get(id);\r\n if (currentState) {\r\n this.updateState(id, { ...currentState, id, message });\r\n }\r\n }\r\n\r\n /**\r\n * Stop all loading operations\r\n */\r\n stopAll(): void {\r\n this.loadingStates.clear();\r\n this.statesSubject.next(new Map());\r\n }\r\n\r\n /**\r\n * Remove a loading state completely\r\n * @param id - The loading operation identifier\r\n */\r\n remove(id: string): void {\r\n this.loadingStates.delete(id);\r\n this.emitStates();\r\n }\r\n\r\n /**\r\n * Execute an async operation with automatic loading state management\r\n * @param id - The loading operation identifier\r\n * @param operation - The async operation to execute\r\n * @param message - Optional loading message\r\n * @returns The result of the operation\r\n */\r\n async withLoading<T>(\r\n id: string,\r\n operation: () => Promise<T>,\r\n message?: string\r\n ): Promise<T> {\r\n this.start(id, message);\r\n try {\r\n return await operation();\r\n } finally {\r\n this.stop(id);\r\n }\r\n }\r\n\r\n /**\r\n * Update a loading state\r\n */\r\n private updateState(id: string, partialState: Partial<LoadingState> & { isLoading: boolean }): void {\r\n const state: LoadingState = {\r\n id,\r\n isLoading: partialState.isLoading,\r\n message: partialState.message,\r\n progress: partialState.progress\r\n };\r\n\r\n this.loadingStates.set(id, state);\r\n this.emitStates();\r\n }\r\n\r\n /**\r\n * Emit current states to subscribers\r\n */\r\n private emitStates(): void {\r\n this.statesSubject.next(new Map(this.loadingStates));\r\n }\r\n}\r\n","/**\r\n * Common type definitions for PECB UI Components\r\n * @module types\r\n */\r\n\r\n/**\r\n * Standard size variants used across components\r\n */\r\nexport type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Standard component size mapping\r\n */\r\nexport type ComponentSize = 'small' | 'medium' | 'large';\r\n\r\n/**\r\n * Semantic color variants\r\n */\r\nexport type ColorVariant = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info';\r\n\r\n/**\r\n * Extended color variants including neutral options\r\n */\r\nexport type ExtendedColorVariant = ColorVariant | 'neutral' | 'muted';\r\n\r\n/**\r\n * Component state variants\r\n */\r\nexport type StateVariant = 'default' | 'hover' | 'active' | 'focus' | 'disabled';\r\n\r\n/**\r\n * Position options for overlays and popups\r\n */\r\nexport type Position =\r\n | 'top'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right'\r\n | 'right-start'\r\n | 'right-end';\r\n\r\n/**\r\n * Alignment options\r\n */\r\nexport type Alignment = 'start' | 'center' | 'end' | 'stretch';\r\n\r\n/**\r\n * Direction options for layouts\r\n */\r\nexport type Direction = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * Orientation alias for direction\r\n */\r\nexport type Orientation = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * Spacing scale values\r\n */\r\nexport type SpacingScale = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n\r\n/**\r\n * Border radius scale values\r\n */\r\nexport type RadiusScale = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\r\n\r\n/**\r\n * Shadow elevation levels\r\n */\r\nexport type ElevationLevel = 'none' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Animation timing presets\r\n */\r\nexport type AnimationTiming = 'instant' | 'fast' | 'normal' | 'slow';\r\n\r\n/**\r\n * Breakpoint names\r\n */\r\nexport type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n\r\n/**\r\n * Form validation state\r\n */\r\nexport type ValidationState = 'valid' | 'invalid' | 'pending' | 'pristine';\r\n\r\n/**\r\n * Generic callback function type\r\n */\r\nexport type Callback<T = void> = () => T;\r\n\r\n/**\r\n * Generic event handler type\r\n */\r\nexport type EventHandler<T = Event> = (event: T) => void;\r\n\r\n/**\r\n * Make specific properties required\r\n */\r\nexport type RequireProps<T, K extends keyof T> = T & Required<Pick<T, K>>;\r\n\r\n/**\r\n * Make specific properties optional\r\n */\r\nexport type OptionalProps<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\r\n\r\n/**\r\n * Extract non-nullable type\r\n */\r\nexport type NonNullableProps<T> = {\r\n [K in keyof T]: NonNullable<T[K]>;\r\n};\r\n","/**\r\n * String utility functions for PECB UI Components\r\n * @module utils/string\r\n */\r\n\r\n/**\r\n * Convert a string to kebab-case\r\n * @param str - The string to convert\r\n * @returns The kebab-case string\r\n *\r\n * @example\r\n * toKebabCase('myComponentName') // 'my-component-name'\r\n * toKebabCase('MyComponentName') // 'my-component-name'\r\n */\r\nexport function toKebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n}\r\n\r\n/**\r\n * Convert a string to camelCase\r\n * @param str - The string to convert\r\n * @returns The camelCase string\r\n *\r\n * @example\r\n * toCamelCase('my-component-name') // 'myComponentName'\r\n * toCamelCase('my_component_name') // 'myComponentName'\r\n */\r\nexport function toCamelCase(str: string): string {\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\r\n .replace(/^[A-Z]/, char => char.toLowerCase());\r\n}\r\n\r\n/**\r\n * Convert a string to PascalCase\r\n * @param str - The string to convert\r\n * @returns The PascalCase string\r\n *\r\n * @example\r\n * toPascalCase('my-component-name') // 'MyComponentName'\r\n */\r\nexport function toPascalCase(str: string): string {\r\n const camel = toCamelCase(str);\r\n return camel.charAt(0).toUpperCase() + camel.slice(1);\r\n}\r\n\r\n/**\r\n * Convert a string to snake_case\r\n * @param str - The string to convert\r\n * @returns The snake_case string\r\n *\r\n * @example\r\n * toSnakeCase('myComponentName') // 'my_component_name'\r\n */\r\nexport function toSnakeCase(str: string): string {\r\n return toKebabCase(str).replace(/-/g, '_');\r\n}\r\n\r\n/**\r\n * Capitalize the first letter of a string\r\n * @param str - The string to capitalize\r\n * @returns The capitalized string\r\n *\r\n * @example\r\n * capitalize('hello world') // 'Hello world'\r\n */\r\nexport function capitalize(str: string): string {\r\n if (!str) return str;\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * Truncate a string to a specified length\r\n * @param str - The string to truncate\r\n * @param maxLength - Maximum length\r\n * @param suffix - Suffix to append when truncated (default: '...')\r\n * @returns The truncated string\r\n *\r\n * @example\r\n * truncate('Hello World', 8) // 'Hello...'\r\n * truncate('Hello World', 8, '…') // 'Hello W…'\r\n */\r\nexport function truncate(str: string, maxLength: number, suffix = '...'): string {\r\n if (!str || str.length <= maxLength) return str;\r\n return str.slice(0, maxLength - suffix.length) + suffix;\r\n}\r\n\r\n/**\r\n * Check if a string is empty or contains only whitespace\r\n * @param str - The string to check\r\n * @returns True if the string is empty or whitespace\r\n *\r\n * @example\r\n * isBlank('') // true\r\n * isBlank(' ') // true\r\n * isBlank('hello') // false\r\n */\r\nexport function isBlank(str: string | null | undefined): boolean {\r\n return !str || str.trim().length === 0;\r\n}\r\n\r\n/**\r\n * Check if a string is not empty and contains non-whitespace characters\r\n * @param str - The string to check\r\n * @returns True if the string is not empty\r\n */\r\nexport function isNotBlank(str: string | null | undefined): str is string {\r\n return !isBlank(str);\r\n}\r\n\r\n/**\r\n * Generate a slug from a string (URL-friendly)\r\n * @param str - The string to convert\r\n * @returns URL-friendly slug\r\n *\r\n * @example\r\n * slugify('Hello World!') // 'hello-world'\r\n * slugify('Café Latte') // 'cafe-latte'\r\n */\r\nexport function slugify(str: string): string {\r\n return str\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\r\n .replace(/[^a-z0-9\\s-]/g, '') // Remove non-alphanumeric\r\n .replace(/[\\s_]+/g, '-') // Replace spaces with hyphens\r\n .replace(/-+/g, '-') // Remove consecutive hyphens\r\n .replace(/^-|-$/g, ''); // Trim hyphens from ends\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n * @param str - The string to escape\r\n * @returns The escaped string\r\n *\r\n * @example\r\n * escapeHtml('<script>alert(\"XSS\")</script>') // '&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;'\r\n */\r\nexport function escapeHtml(str: string): string {\r\n const htmlEscapes: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;'\r\n };\r\n return str.replace(/[&<>\"']/g, char => htmlEscapes[char]);\r\n}\r\n\r\n/**\r\n * Strip HTML tags from a string\r\n * @param str - The string containing HTML\r\n * @returns The string without HTML tags\r\n *\r\n * @example\r\n * stripHtml('<p>Hello <strong>World</strong></p>') // 'Hello World'\r\n */\r\nexport function stripHtml(str: string): string {\r\n return str.replace(/<[^>]*>/g, '');\r\n}\r\n\r\n/**\r\n * Generate initials from a name\r\n * @param name - The name to extract initials from\r\n * @param maxLength - Maximum number of initials (default: 2)\r\n * @returns The initials in uppercase\r\n *\r\n * @example\r\n * getInitials('John Doe') // 'JD'\r\n * getInitials('John Michael Doe', 3) // 'JMD'\r\n */\r\nexport function getInitials(name: string, maxLength = 2): string {\r\n if (!name) return '';\r\n\r\n return name\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .slice(0, maxLength)\r\n .map(word => word.charAt(0).toUpperCase())\r\n .join('');\r\n}\r\n\r\n/**\r\n * Pluralize a word based on count\r\n * @param count - The count to check\r\n * @param singular - Singular form\r\n * @param plural - Plural form (optional, defaults to singular + 's')\r\n * @returns The appropriate form of the word\r\n *\r\n * @example\r\n * pluralize(1, 'item') // 'item'\r\n * pluralize(5, 'item') // 'items'\r\n * pluralize(2, 'child', 'children') // 'children'\r\n */\r\nexport function pluralize(count: number, singular: string, plural?: string): string {\r\n return count === 1 ? singular : (plural ?? `${singular}s`);\r\n}\r\n\r\n/**\r\n * Format a number as a string with count and pluralized label\r\n * @param count - The count\r\n * @param singular - Singular form of the label\r\n * @param plural - Plural form (optional)\r\n * @returns Formatted string like \"5 items\"\r\n *\r\n * @example\r\n * formatCount(1, 'item') // '1 item'\r\n * formatCount(5, 'item') // '5 items'\r\n */\r\nexport function formatCount(count: number, singular: string, plural?: string): string {\r\n return `${count} ${pluralize(count, singular, plural)}`;\r\n}\r\n","/**\r\n * Accessibility utility functions for PECB UI Components\r\n * Helps ensure WCAG 2.1 compliance\r\n * @module utils/accessibility\r\n */\r\n\r\nimport { generateUniqueId } from './dom.utils';\r\n\r\n/**\r\n * ARIA live region politeness levels\r\n */\r\nexport type AriaLive = 'off' | 'polite' | 'assertive';\r\n\r\n/**\r\n * ARIA roles commonly used in components\r\n */\r\nexport type AriaRole =\r\n | 'alert'\r\n | 'alertdialog'\r\n | 'button'\r\n | 'checkbox'\r\n | 'combobox'\r\n | 'dialog'\r\n | 'grid'\r\n | 'gridcell'\r\n | 'link'\r\n | 'listbox'\r\n | 'menu'\r\n | 'menubar'\r\n | 'menuitem'\r\n | 'menuitemcheckbox'\r\n | 'menuitemradio'\r\n | 'option'\r\n | 'progressbar'\r\n | 'radio'\r\n | 'radiogroup'\r\n | 'scrollbar'\r\n | 'searchbox'\r\n | 'slider'\r\n | 'spinbutton'\r\n | 'status'\r\n | 'switch'\r\n | 'tab'\r\n | 'tablist'\r\n | 'tabpanel'\r\n | 'textbox'\r\n | 'tooltip'\r\n | 'tree'\r\n | 'treegrid'\r\n | 'treeitem';\r\n\r\n/**\r\n * Standard ARIA attributes interface for components\r\n */\r\nexport interface AriaAttributes {\r\n role?: AriaRole;\r\n 'aria-label'?: string;\r\n 'aria-labelledby'?: string;\r\n 'aria-describedby'?: string;\r\n 'aria-expanded'?: boolean;\r\n 'aria-selected'?: boolean;\r\n 'aria-checked'?: boolean | 'mixed';\r\n 'aria-disabled'?: boolean;\r\n 'aria-hidden'?: boolean;\r\n 'aria-invalid'?: boolean;\r\n 'aria-required'?: boolean;\r\n 'aria-readonly'?: boolean;\r\n 'aria-pressed'?: boolean | 'mixed';\r\n 'aria-current'?: boolean | 'page' | 'step' | 'location' | 'date' | 'time';\r\n 'aria-haspopup'?: boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\r\n 'aria-controls'?: string;\r\n 'aria-owns'?: string;\r\n 'aria-live'?: AriaLive;\r\n 'aria-atomic'?: boolean;\r\n 'aria-busy'?: boolean;\r\n 'aria-valuemin'?: number;\r\n 'aria-valuemax'?: number;\r\n 'aria-valuenow'?: number;\r\n 'aria-valuetext'?: string;\r\n 'aria-orientation'?: 'horizontal' | 'vertical';\r\n 'aria-activedescendant'?: string;\r\n 'aria-autocomplete'?: 'none' | 'inline' | 'list' | 'both';\r\n 'aria-multiselectable'?: boolean;\r\n 'aria-sort'?: 'none' | 'ascending' | 'descending' | 'other';\r\n 'aria-level'?: number;\r\n 'aria-setsize'?: number;\r\n 'aria-posinset'?: number;\r\n tabindex?: number;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a button component\r\n * @param options - Button accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getButtonAriaAttributes(options: {\r\n label?: string;\r\n pressed?: boolean;\r\n expanded?: boolean;\r\n disabled?: boolean;\r\n controls?: string;\r\n haspopup?: AriaAttributes['aria-haspopup'];\r\n describedby?: string;\r\n}): AriaAttributes {\r\n const attrs: AriaAttributes = {};\r\n\r\n if (options.label) {\r\n attrs['aria-label'] = options.label;\r\n }\r\n if (options.pressed !== undefined) {\r\n attrs['aria-pressed'] = options.pressed;\r\n }\r\n if (options.expanded !== undefined) {\r\n attrs['aria-expanded'] = options.expanded;\r\n }\r\n if (options.disabled) {\r\n attrs['aria-disabled'] = true;\r\n }\r\n if (options.controls) {\r\n attrs['aria-controls'] = options.controls;\r\n }\r\n if (options.haspopup) {\r\n attrs['aria-haspopup'] = options.haspopup;\r\n }\r\n if (options.describedby) {\r\n attrs['aria-describedby'] = options.describedby;\r\n }\r\n\r\n return attrs;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a dialog/modal component\r\n * @param options - Dialog accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getDialogAriaAttributes(options: {\r\n labelledby?: string;\r\n describedby?: string;\r\n modal?: boolean;\r\n}): AriaAttributes {\r\n return {\r\n role: 'dialog',\r\n 'aria-labelledby': options.labelledby,\r\n 'aria-describedby': options.describedby,\r\n 'aria-modal': options.modal\r\n } as AriaAttributes;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a form input\r\n * @param options - Input accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getInputAriaAttributes(options: {\r\n label?: string;\r\n labelledby?: string;\r\n describedby?: string;\r\n invalid?: boolean;\r\n required?: boolean;\r\n readonly?: boolean;\r\n disabled?: boolean;\r\n errorId?: string;\r\n helperId?: string;\r\n}): AriaAttributes {\r\n const attrs: AriaAttributes = {};\r\n\r\n if (options.label) {\r\n attrs['aria-label'] = options.label;\r\n }\r\n if (options.labelledby) {\r\n attrs['aria-labelledby'] = options.labelledby;\r\n }\r\n\r\n // Build aria-describedby from multiple sources\r\n const describedbyParts: string[] = [];\r\n if (options.describedby) {\r\n describedbyParts.push(options.describedby);\r\n }\r\n if (options.invalid && options.errorId) {\r\n describedbyParts.push(options.errorId);\r\n }\r\n if (options.helperId) {\r\n describedbyParts.push(options.helperId);\r\n }\r\n if (describedbyParts.length > 0) {\r\n attrs['aria-describedby'] = describedbyParts.join(' ');\r\n }\r\n\r\n if (options.invalid !== undefined) {\r\n attrs['aria-invalid'] = options.invalid;\r\n }\r\n if (options.required) {\r\n attrs['aria-required'] = true;\r\n }\r\n if (options.readonly) {\r\n attrs['aria-readonly'] = true;\r\n }\r\n if (options.disabled) {\r\n attrs['aria-disabled'] = true;\r\n }\r\n\r\n return attrs;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a progress bar\r\n * @param options - Progress accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getProgressAriaAttributes(options: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n label?: string;\r\n valueText?: string;\r\n}): AriaAttributes {\r\n return {\r\n role: 'progressbar',\r\n 'aria-valuenow': options.value,\r\n 'aria-valuemin': options.min ?? 0,\r\n 'aria-valuemax': options.max ?? 100,\r\n 'aria-label': options.label,\r\n 'aria-valuetext': options.valueText ?? `${options.value}%`\r\n };\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a tab component\r\n * @param options - Tab accessibility options\r\n * @returns ARIA attributes for tab and tabpanel\r\n */\r\nexport function getTabAriaAttributes(options: {\r\n tabId: string;\r\n panelId: string;\r\n selected: boolean;\r\n disabled?: boolean;\r\n}): { tab: AriaAttributes; panel: AriaAttributes } {\r\n return {\r\n tab: {\r\n role: 'tab',\r\n 'aria-selected': options.selected,\r\n 'aria-controls': options.panelId,\r\n 'aria-disabled': options.disabled,\r\n tabindex: options.selected ? 0 : -1\r\n },\r\n panel: {\r\n role: 'tabpanel',\r\n 'aria-labelledby': options.tabId,\r\n 'aria-hidden': !options.selected,\r\n tabindex: 0\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a listbox option\r\n * @param options - Option accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getOptionAriaAttributes(options: {\r\n selected: boolean;\r\n disabled?: boolean;\r\n setsize?: number;\r\n posinset?: number;\r\n}): AriaAttributes {\r\n return {\r\n role: 'option',\r\n 'aria-selected': options.selected,\r\n 'aria-disabled': options.disabled,\r\n 'aria-setsize': options.setsize,\r\n 'aria-posinset': options.posinset\r\n };\r\n}\r\n\r\n/**\r\n * Generate linked IDs for label and input association\r\n * @param baseName - Base name for generating IDs\r\n * @returns Object with inputId, labelId, errorId, and helperId\r\n */\r\nexport function generateLinkedIds(baseName?: string): {\r\n inputId: string;\r\n labelId: string;\r\n errorId: string;\r\n helperId: string;\r\n} {\r\n const base = baseName || generateUniqueId('input');\r\n return {\r\n inputId: base,\r\n labelId: `${base}-label`,\r\n errorId: `${base}-error`,\r\n helperId: `${base}-helper`\r\n };\r\n}\r\n\r\n/**\r\n * Create a visually hidden element for screen readers\r\n * @returns CSS styles for visually hidden content\r\n */\r\nexport function getVisuallyHiddenStyles(): Record<string, string> {\r\n return {\r\n position: 'absolute',\r\n width: '1px',\r\n height: '1px',\r\n padding: '0',\r\n margin: '-1px',\r\n overflow: 'hidden',\r\n clip: 'rect(0, 0, 0, 0)',\r\n whiteSpace: 'nowrap',\r\n border: '0'\r\n };\r\n}\r\n\r\n/**\r\n * Check if the user has enabled reduced motion preference\r\n * @returns True if user prefers reduced motion\r\n */\r\nexport function prefersReducedMotion(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n}\r\n\r\n/**\r\n * Check if the user has enabled high contrast mode\r\n * @returns True if high contrast mode is enabled\r\n */\r\nexport function prefersHighContrast(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n return window.matchMedia('(prefers-contrast: more)').matches;\r\n}\r\n\r\n/**\r\n * Announce a message to screen readers using aria-live regions\r\n * @param message - The message to announce\r\n * @param politeness - The urgency level (polite or assertive)\r\n */\r\nexport function announceToScreenReader(\r\n message: string,\r\n politeness: 'polite' | 'assertive' = 'polite'\r\n): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n const announcement = document.createElement('div');\r\n announcement.setAttribute('role', 'status');\r\n announcement.setAttribute('aria-live', politeness);\r\n announcement.setAttribute('aria-atomic', 'true');\r\n Object.assign(announcement.style, getVisuallyHiddenStyles());\r\n\r\n document.body.appendChild(announcement);\r\n\r\n // Delay slightly to ensure screen readers pick up the change\r\n setTimeout(() => {\r\n announcement.textContent = message;\r\n }, 100);\r\n\r\n // Clean up after announcement is read\r\n setTimeout(() => {\r\n document.body.removeChild(announcement);\r\n }, 1000);\r\n}\r\n\r\n/**\r\n * Get the appropriate aria-current value for navigation items\r\n * @param isActive - Whether the item is active/current\r\n * @param type - The type of current indicator\r\n * @returns The aria-current value or undefined\r\n */\r\nexport function getAriaCurrent(\r\n isActive: boolean,\r\n type: 'page' | 'step' | 'location' | 'date' | 'time' = 'page'\r\n): AriaAttributes['aria-current'] {\r\n return isActive ? type : undefined;\r\n}\r\n","/**\r\n * Error handling utility functions for PECB UI Components\r\n * Provides standardized error handling patterns\r\n * @module utils/error\r\n */\r\n\r\n/**\r\n * Error severity levels\r\n */\r\nexport type ErrorSeverity = 'info' | 'warning' | 'error' | 'critical';\r\n\r\n/**\r\n * Error categories for classification\r\n */\r\nexport type ErrorCategory =\r\n | 'validation'\r\n | 'network'\r\n | 'authentication'\r\n | 'authorization'\r\n | 'configuration'\r\n | 'runtime'\r\n | 'unknown';\r\n\r\n/**\r\n * Standard error interface for PECB components\r\n */\r\nexport interface PecbError {\r\n /** Unique error code */\r\n code: string;\r\n /** Human-readable error message */\r\n message: string;\r\n /** Error severity level */\r\n severity: ErrorSeverity;\r\n /** Error category */\r\n category: ErrorCategory;\r\n /** Original error if wrapping another error */\r\n originalError?: Error;\r\n /** Additional context data */\r\n context?: Record<string, unknown>;\r\n /** Timestamp when error occurred */\r\n timestamp: Date;\r\n /** Suggested recovery action */\r\n recoveryAction?: string;\r\n /** Whether the error is recoverable */\r\n recoverable: boolean;\r\n}\r\n\r\n/**\r\n * Validation error details\r\n */\r\nexport interface ValidationError {\r\n /** Field name that failed validation */\r\n field: string;\r\n /** Validation rule that failed */\r\n rule: string;\r\n /** Error message */\r\n message: string;\r\n /** Expected value or format */\r\n expected?: string;\r\n /** Actual value received */\r\n actual?: unknown;\r\n}\r\n\r\n/**\r\n * Error factory options\r\n */\r\nexport interface ErrorOptions {\r\n code?: string;\r\n severity?: ErrorSeverity;\r\n category?: ErrorCategory;\r\n context?: Record<string, unknown>;\r\n recoveryAction?: string;\r\n recoverable?: boolean;\r\n originalError?: Error;\r\n}\r\n\r\n/**\r\n * Create a standardized PECB error\r\n * @param message - Error message\r\n * @param options - Additional error options\r\n * @returns A standardized PecbError object\r\n *\r\n * @example\r\n * const error = createError('Invalid input', {\r\n * code: 'VALIDATION_001',\r\n * category: 'validation',\r\n * severity: 'warning',\r\n * recoverable: true\r\n * });\r\n */\r\nexport function createError(message: string, options: ErrorOptions = {}): PecbError {\r\n return {\r\n code: options.code ?? 'PECB_ERROR',\r\n message,\r\n severity: options.severity ?? 'error',\r\n category: options.category ?? 'unknown',\r\n originalError: options.originalError,\r\n context: options.context,\r\n timestamp: new Date(),\r\n recoveryAction: options.recoveryAction,\r\n recoverable: options.recoverable ?? false\r\n };\r\n}\r\n\r\n/**\r\n * Create a validation error\r\n * @param field - Field name that failed validation\r\n * @param rule - Validation rule that failed\r\n * @param message - Error message\r\n * @returns A ValidationError object\r\n *\r\n * @example\r\n * const error = createValidationError('email', 'format', 'Invalid email format');\r\n */\r\nexport function createValidationError(\r\n field: string,\r\n rule: string,\r\n message: string,\r\n details?: { expected?: string; actual?: unknown }\r\n): ValidationError {\r\n return {\r\n field,\r\n rule,\r\n message,\r\n expected: details?.expected,\r\n actual: details?.actual\r\n };\r\n}\r\n\r\n/**\r\n * Wrap an unknown error in a PecbError\r\n * @param error - The error to wrap\r\n * @param options - Additional options\r\n * @returns A standardized PecbError\r\n *\r\n * @example\r\n * try {\r\n * await riskyOperation();\r\n * } catch (e) {\r\n * const error = wrapError(e, { category: 'network' });\r\n * handleError(error);\r\n * }\r\n */\r\nexport function wrapError(error: unknown, options: ErrorOptions = {}): PecbError {\r\n if (isPecbError(error)) {\r\n return error;\r\n }\r\n\r\n let message = 'An unknown error occurred';\r\n let originalError: Error | undefined;\r\n\r\n if (error instanceof Error) {\r\n message = error.message;\r\n originalError = error;\r\n } else if (typeof error === 'string') {\r\n message = error;\r\n } else if (error && typeof error === 'object' && 'message' in error) {\r\n message = String((error as { message: unknown }).message);\r\n }\r\n\r\n return createError(message, {\r\n ...options,\r\n originalError\r\n });\r\n}\r\n\r\n/**\r\n * Type guard to check if an object is a PecbError\r\n * @param error - The object to check\r\n * @returns True if the object is a PecbError\r\n */\r\nexport function isPecbError(error: unknown): error is PecbError {\r\n return (\r\n error !== null &&\r\n typeof error === 'object' &&\r\n 'code' in error &&\r\n 'message' in error &&\r\n 'severity' in error &&\r\n 'category' in error &&\r\n 'timestamp' in error\r\n );\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is recoverable\r\n * @param error - The error to check\r\n * @returns True if the error is recoverable\r\n */\r\nexport function isRecoverableError(error: PecbError): boolean {\r\n return error.recoverable;\r\n}\r\n\r\n/**\r\n * Format an error for display to users\r\n * @param error - The error to format\r\n * @param includeCode - Whether to include the error code\r\n * @returns Formatted error message\r\n */\r\nexport function formatErrorMessage(error: PecbError, includeCode = false): string {\r\n if (includeCode) {\r\n return `[${error.code}] ${error.message}`;\r\n }\r\n return error.message;\r\n}\r\n\r\n/**\r\n * Format an error for logging\r\n * @param error - The error to format\r\n * @returns Formatted error string for logging\r\n */\r\nexport function formatErrorForLog(error: PecbError): string {\r\n const parts = [\r\n `[${error.timestamp.toISOString()}]`,\r\n `[${error.severity.toUpperCase()}]`,\r\n `[${error.code}]`,\r\n error.message\r\n ];\r\n\r\n if (error.context) {\r\n parts.push(`Context: ${JSON.stringify(error.context)}`);\r\n }\r\n\r\n if (error.originalError?.stack) {\r\n parts.push(`Stack: ${error.originalError.stack}`);\r\n }\r\n\r\n return parts.join(' ');\r\n}\r\n\r\n/**\r\n * Create a network error\r\n * @param message - Error message\r\n * @param statusCode - HTTP status code if applicable\r\n * @param originalError - Original error\r\n * @returns A network category PecbError\r\n */\r\nexport function createNetworkError(\r\n message: string,\r\n statusCode?: number,\r\n originalError?: Error\r\n): PecbError {\r\n return createError(message, {\r\n code: statusCode ? `NETWORK_${statusCode}` : 'NETWORK_ERROR',\r\n category: 'network',\r\n severity: 'error',\r\n context: statusCode ? { statusCode } : undefined,\r\n recoverable: true,\r\n recoveryAction: 'Please check your connection and try again',\r\n originalError\r\n });\r\n}\r\n\r\n/**\r\n * Create an authentication error\r\n * @param message - Error message\r\n * @param originalError - Original error\r\n * @returns An authentication category PecbError\r\n */\r\nexport function createAuthError(message: string, originalError?: Error): PecbError {\r\n return createError(message, {\r\n code: 'AUTH_ERROR',\r\n category: 'authentication',\r\n severity: 'error',\r\n recoverable: true,\r\n recoveryAction: 'Please sign in again',\r\n originalError\r\n });\r\n}\r\n\r\n/**\r\n * Create an authorization error\r\n * @param message - Error message\r\n * @param resource - The resource that access was denied to\r\n * @returns An authorization category PecbError\r\n */\r\nexport function createAuthorizationError(message: string, resource?: string): PecbError {\r\n return createError(message, {\r\n code: 'AUTHZ_ERROR',\r\n category: 'authorization',\r\n severity: 'warning',\r\n context: resource ? { resource } : undefined,\r\n recoverable: false,\r\n recoveryAction: 'Contact an administrator for access'\r\n });\r\n}\r\n\r\n/**\r\n * Create a configuration error\r\n * @param message - Error message\r\n * @param configKey - The configuration key that is invalid\r\n * @returns A configuration category PecbError\r\n */\r\nexport function createConfigError(message: string, configKey?: string): PecbError {\r\n return createError(message, {\r\n code: 'CONFIG_ERROR',\r\n category: 'configuration',\r\n severity: 'critical',\r\n context: configKey ? { configKey } : undefined,\r\n recoverable: false,\r\n recoveryAction: 'Check your configuration settings'\r\n });\r\n}\r\n\r\n/**\r\n * Error handler type\r\n */\r\nexport type ErrorHandler = (error: PecbError) => void;\r\n\r\n/**\r\n * Global error handler registry\r\n */\r\nconst errorHandlers: Map<ErrorCategory, ErrorHandler[]> = new Map();\r\n\r\n/**\r\n * Register an error handler for a category\r\n * @param category - The error category to handle\r\n * @param handler - The handler function\r\n * @returns Cleanup function to unregister\r\n */\r\nexport function registerErrorHandler(category: ErrorCategory, handler: ErrorHandler): () => void {\r\n const handlers = errorHandlers.get(category) ?? [];\r\n handlers.push(handler);\r\n errorHandlers.set(category, handlers);\r\n\r\n return () => {\r\n const currentHandlers = errorHandlers.get(category);\r\n if (currentHandlers) {\r\n const index = currentHandlers.indexOf(handler);\r\n if (index > -1) {\r\n currentHandlers.splice(index, 1);\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Handle an error by invoking registered handlers\r\n * @param error - The error to handle\r\n */\r\nexport function handleError(error: PecbError): void {\r\n const handlers = errorHandlers.get(error.category) ?? [];\r\n const globalHandlers = errorHandlers.get('unknown') ?? [];\r\n\r\n [...handlers, ...globalHandlers].forEach(handler => {\r\n try {\r\n handler(error);\r\n } catch (e) {\r\n console.error('Error in error handler:', e);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Try to execute an operation and return a result or error\r\n * @param operation - The operation to execute\r\n * @param errorOptions - Options for error wrapping\r\n * @returns A tuple of [result, null] or [null, error]\r\n */\r\nexport async function tryAsync<T>(\r\n operation: () => Promise<T>,\r\n errorOptions?: ErrorOptions\r\n): Promise<[T, null] | [null, PecbError]> {\r\n try {\r\n const result = await operation();\r\n return [result, null];\r\n } catch (e) {\r\n return [null, wrapError(e, errorOptions)];\r\n }\r\n}\r\n\r\n/**\r\n * Synchronous version of tryAsync\r\n * @param operation - The operation to execute\r\n * @param errorOptions - Options for error wrapping\r\n * @returns A tuple of [result, null] or [null, error]\r\n */\r\nexport function trySync<T>(\r\n operation: () => T,\r\n errorOptions?: ErrorOptions\r\n): [T, null] | [null, PecbError] {\r\n try {\r\n const result = operation();\r\n return [result, null];\r\n } catch (e) {\r\n return [null, wrapError(e, errorOptions)];\r\n }\r\n}\r\n","/*\r\n * Public API Surface of @pecb-ui/components\r\n *\r\n * This file defines the public API of the library.\r\n * Only exports from this file will be accessible to consumers.\r\n */\r\n\r\n// =============================================================================\r\n// MODULE\r\n// =============================================================================\r\nexport * from './lib/pecb-components.module';\r\n\r\n// =============================================================================\r\n// COMPONENTS\r\n// =============================================================================\r\nexport * from './lib/components/button/button.component';\r\nexport * from './lib/components/card/card.component';\r\nexport * from './lib/components/status/status.component';\r\nexport * from './lib/components/pagination/pagination.component';\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/tab/tab.component';\r\nexport * from './lib/components/datepicker/datepicker.component';\r\nexport * from './lib/components/input/input.component';\r\nexport * from './lib/components/radio/radio.component';\r\nexport * from './lib/components/checkbox/checkbox.component';\r\nexport * from './lib/components/toggle/toggle.component';\r\nexport * from './lib/components/dropdown/dropdown.component';\r\nexport * from './lib/components/right-modal/right-modal.component';\r\nexport * from './lib/components/sidebar/sidebar.component';\r\n\r\n// =============================================================================\r\n// SERVICES\r\n// =============================================================================\r\nexport * from './lib/services/notification.service';\r\nexport * from './lib/services/theme.service';\r\nexport * from './lib/services/loading.service';\r\n\r\n// =============================================================================\r\n// SHARED TYPES\r\n// =============================================================================\r\nexport * from './lib/shared/types/common.types';\r\n\r\n// =============================================================================\r\n// SHARED INTERFACES\r\n// =============================================================================\r\nexport * from './lib/shared/interfaces/component.interfaces';\r\n\r\n// =============================================================================\r\n// SHARED UTILITIES\r\n// =============================================================================\r\n\r\n// String utilities\r\nexport {\r\n toKebabCase,\r\n toCamelCase,\r\n toPascalCase,\r\n toSnakeCase,\r\n capitalize,\r\n truncate,\r\n isBlank,\r\n isNotBlank,\r\n slugify,\r\n escapeHtml,\r\n stripHtml,\r\n getInitials,\r\n pluralize,\r\n formatCount\r\n} from './lib/shared/utils/string.utils';\r\n\r\n// DOM utilities\r\nexport {\r\n isBrowser,\r\n generateUniqueId,\r\n matchesSelector,\r\n closestElement,\r\n isElementVisible,\r\n getFocusableElements,\r\n trapFocus,\r\n scrollIntoView,\r\n getScrollParent,\r\n disableBodyScroll,\r\n copyToClipboard,\r\n hasClass,\r\n addClass,\r\n removeClass,\r\n toggleClass,\r\n getComputedStyleValue\r\n} from './lib/shared/utils/dom.utils';\r\n\r\n// Accessibility utilities\r\nexport {\r\n AriaLive,\r\n AriaRole,\r\n AriaAttributes,\r\n getButtonAriaAttributes,\r\n getDialogAriaAttributes,\r\n getInputAriaAttributes,\r\n getProgressAriaAttributes,\r\n getTabAriaAttributes,\r\n getOptionAriaAttributes,\r\n generateLinkedIds,\r\n getVisuallyHiddenStyles,\r\n prefersReducedMotion,\r\n prefersHighContrast,\r\n announceToScreenReader,\r\n getAriaCurrent\r\n} from './lib/shared/utils/accessibility.utils';\r\n\r\n// Error handling utilities\r\nexport {\r\n ErrorSeverity,\r\n ErrorCategory,\r\n PecbError,\r\n ValidationError,\r\n ErrorOptions,\r\n ErrorHandler,\r\n createError,\r\n createValidationError,\r\n wrapError,\r\n isPecbError,\r\n isRecoverableError,\r\n formatErrorMessage,\r\n formatErrorForLog,\r\n createNetworkError,\r\n createAuthError,\r\n createAuthorizationError,\r\n createConfigError,\r\n registerErrorHandler,\r\n handleError,\r\n tryAsync,\r\n trySync\r\n} from './lib/shared/utils/error.utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"pecb-ui-components.mjs","sources":["../../../projects/ui-components/src/lib/shared/utils/dom.utils.ts","../../../projects/ui-components/src/lib/components/button/button.component.ts","../../../projects/ui-components/src/lib/components/button/button.component.html","../../../projects/ui-components/src/lib/components/card/card.component.ts","../../../projects/ui-components/src/lib/components/card/card.component.html","../../../projects/ui-components/src/lib/components/status/status.component.ts","../../../projects/ui-components/src/lib/components/status/status.component.html","../../../projects/ui-components/src/lib/components/pagination/pagination.component.ts","../../../projects/ui-components/src/lib/components/pagination/pagination.component.html","../../../projects/ui-components/src/lib/components/table/table.component.ts","../../../projects/ui-components/src/lib/components/table/table.component.html","../../../projects/ui-components/src/lib/components/tab/tab.component.ts","../../../projects/ui-components/src/lib/components/tab/tab.component.html","../../../projects/ui-components/src/lib/components/datepicker/datepicker.component.ts","../../../projects/ui-components/src/lib/components/datepicker/datepicker.component.html","../../../projects/ui-components/src/lib/components/input/input.component.ts","../../../projects/ui-components/src/lib/components/input/input.component.html","../../../projects/ui-components/src/lib/components/radio/radio.component.ts","../../../projects/ui-components/src/lib/components/radio/radio.component.html","../../../projects/ui-components/src/lib/components/checkbox/checkbox.component.ts","../../../projects/ui-components/src/lib/components/checkbox/checkbox.component.html","../../../projects/ui-components/src/lib/components/toggle/toggle.component.ts","../../../projects/ui-components/src/lib/components/toggle/toggle.component.html","../../../projects/ui-components/src/lib/components/dropdown/dropdown.component.ts","../../../projects/ui-components/src/lib/components/dropdown/dropdown.component.html","../../../projects/ui-components/src/lib/components/right-modal/right-modal.component.ts","../../../projects/ui-components/src/lib/components/right-modal/right-modal.component.html","../../../projects/ui-components/src/lib/components/sidebar/sidebar.component.ts","../../../projects/ui-components/src/lib/components/sidebar/sidebar.component.html","../../../projects/ui-components/src/lib/components/confirmation/confirmation.component.ts","../../../projects/ui-components/src/lib/components/confirmation/confirmation.component.html","../../../projects/ui-components/src/lib/components/bottom-sheet/bottom-sheet.component.ts","../../../projects/ui-components/src/lib/components/bottom-sheet/bottom-sheet.component.html","../../../projects/ui-components/src/lib/components/accordion/accordion.component.ts","../../../projects/ui-components/src/lib/components/accordion/accordion-item.component.html","../../../projects/ui-components/src/lib/components/accordion/accordion-small.component.html","../../../projects/ui-components/src/lib/components/button-group/button-group.component.ts","../../../projects/ui-components/src/lib/components/button-group/button-group-item.component.html","../../../projects/ui-components/src/lib/components/tooltip/tooltip.component.ts","../../../projects/ui-components/src/lib/components/tooltip/tooltip.component.html","../../../projects/ui-components/src/lib/components/tooltip/tooltip.directive.ts","../../../projects/ui-components/src/lib/components/messaging/messaging.component.ts","../../../projects/ui-components/src/lib/components/messaging/message-item.component.html","../../../projects/ui-components/src/lib/components/messaging/message-bubble.component.html","../../../projects/ui-components/src/lib/components/fullscreen-modal/fullscreen-modal.component.ts","../../../projects/ui-components/src/lib/components/fullscreen-modal/fullscreen-modal.component.html","../../../projects/ui-components/src/lib/components/stepper/stepper.component.ts","../../../projects/ui-components/src/lib/components/stepper/stepper.component.html","../../../projects/ui-components/src/lib/components/grid/grid.component.ts","../../../projects/ui-components/src/lib/components/grid/grid.component.html","../../../projects/ui-components/src/lib/components/dashboard-grid/dashboard-grid.component.ts","../../../projects/ui-components/src/lib/components/dashboard-grid/dashboard-grid.component.html","../../../projects/ui-components/src/lib/components/progress/progress.component.ts","../../../projects/ui-components/src/lib/components/code-input/code-input.component.ts","../../../projects/ui-components/src/lib/components/code-input/code-input.component.html","../../../projects/ui-components/src/lib/components/shadow/shadow.directive.ts","../../../projects/ui-components/src/lib/components/divider/divider.component.ts","../../../projects/ui-components/src/lib/components/divider/divider.component.html","../../../projects/ui-components/src/lib/components/code-snippet/code-snippet.component.ts","../../../projects/ui-components/src/lib/components/code-snippet/code-snippet.component.html","../../../projects/ui-components/src/lib/components/icon/icon-registry.ts","../../../projects/ui-components/src/lib/components/breadcrumbs/breadcrumbs.component.ts","../../../projects/ui-components/src/lib/components/breadcrumbs/breadcrumbs.component.html","../../../projects/ui-components/src/lib/components/general/general.component.ts","../../../projects/ui-components/src/lib/components/general/general.component.html","../../../projects/ui-components/src/lib/pecb-components.module.ts","../../../projects/ui-components/src/lib/components/alert/alert.component.ts","../../../projects/ui-components/src/lib/components/alert/alert.component.html","../../../projects/ui-components/src/lib/components/metrics-card/metrics-card.component.ts","../../../projects/ui-components/src/lib/components/metrics-card/metrics-card.component.html","../../../projects/ui-components/src/lib/components/float-button/float-button.component.ts","../../../projects/ui-components/src/lib/components/float-button/float-button.component.html","../../../projects/ui-components/src/lib/components/skeleton/skeleton.component.ts","../../../projects/ui-components/src/lib/components/skeleton/skeleton.component.html","../../../projects/ui-components/src/lib/components/color-palette/color-palette.component.ts","../../../projects/ui-components/src/lib/components/color-palette/color-palette.component.html","../../../projects/ui-components/src/lib/components/profile/profile.component.ts","../../../projects/ui-components/src/lib/components/profile/profile.component.html","../../../projects/ui-components/src/lib/components/profile/profile-group.component.ts","../../../projects/ui-components/src/lib/components/profile/profile-group.component.html","../../../projects/ui-components/src/lib/components/typography/typography.component.ts","../../../projects/ui-components/src/lib/components/typography/typography.component.html","../../../projects/ui-components/src/lib/services/notification.service.ts","../../../projects/ui-components/src/lib/services/theme.service.ts","../../../projects/ui-components/src/lib/services/loading.service.ts","../../../projects/ui-components/src/lib/shared/types/common.types.ts","../../../projects/ui-components/src/lib/shared/utils/string.utils.ts","../../../projects/ui-components/src/lib/shared/utils/accessibility.utils.ts","../../../projects/ui-components/src/lib/shared/utils/error.utils.ts","../../../projects/ui-components/src/lib/components/icon/icon.component.ts","../../../projects/ui-components/src/lib/components/icon/icon.component.html","../../../projects/ui-components/src/public-api.ts","../../../projects/ui-components/src/pecb-ui-components.ts"],"sourcesContent":["/**\n * DOM utility functions for PECB UI Components\n * @module utils/dom\n */\n\n/**\n * Check if code is running in a browser environment\n * @returns True if running in browser\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Generate a unique ID for DOM elements\n * @param prefix - Optional prefix for the ID\n * @returns A unique ID string\n *\n * @example\n * generateUniqueId('btn') // 'btn-a1b2c3d4'\n */\nexport function generateUniqueId(prefix = 'pecb'): string {\n const random = Math.random().toString(36).substring(2, 9);\n return `${prefix}-${random}`;\n}\n\n/**\n * Check if an element matches a CSS selector\n * @param element - The element to check\n * @param selector - The CSS selector\n * @returns True if the element matches\n */\nexport function matchesSelector(element: Element, selector: string): boolean {\n return element.matches(selector);\n}\n\n/**\n * Find the closest ancestor matching a selector\n * @param element - Starting element\n * @param selector - CSS selector to match\n * @returns The matching ancestor or null\n */\nexport function closestElement<T extends Element>(element: Element, selector: string): T | null {\n return element.closest(selector) as T | null;\n}\n\n/**\n * Check if an element is visible in the viewport\n * @param element - The element to check\n * @param partial - Whether partial visibility counts\n * @returns True if visible\n */\nexport function isElementVisible(element: Element, partial = true): boolean {\n if (!isBrowser()) return false;\n\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n if (partial) {\n return (\n rect.top < windowHeight &&\n rect.bottom > 0 &&\n rect.left < windowWidth &&\n rect.right > 0\n );\n }\n\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= windowHeight &&\n rect.right <= windowWidth\n );\n}\n\n/**\n * Get all focusable elements within a container\n * @param container - The container element\n * @returns Array of focusable elements\n */\nexport function getFocusableElements(container: Element): HTMLElement[] {\n const focusableSelectors = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]'\n ].join(',');\n\n return Array.from(container.querySelectorAll<HTMLElement>(focusableSelectors));\n}\n\n/**\n * Trap focus within a container (useful for modals)\n * @param container - The container to trap focus in\n * @returns Cleanup function to remove the trap\n */\nexport function trapFocus(container: HTMLElement): () => void {\n const focusableElements = getFocusableElements(container);\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab') return;\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleKeyDown);\n firstElement?.focus();\n\n return () => {\n container.removeEventListener('keydown', handleKeyDown);\n };\n}\n\n/**\n * Scroll an element into view smoothly\n * @param element - The element to scroll to\n * @param options - Scroll options\n */\nexport function scrollIntoView(\n element: Element,\n options: ScrollIntoViewOptions = { behavior: 'smooth', block: 'nearest' }\n): void {\n element.scrollIntoView(options);\n}\n\n/**\n * Get the scroll parent of an element\n * @param element - The element to find scroll parent for\n * @returns The scroll parent element\n */\nexport function getScrollParent(element: Element): Element | null {\n if (!isBrowser()) return null;\n\n let parent: Element | null = element.parentElement;\n\n while (parent) {\n const style = getComputedStyle(parent);\n const overflow = style.overflow + style.overflowY + style.overflowX;\n\n if (/auto|scroll|overlay/.test(overflow)) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return document.scrollingElement || document.documentElement;\n}\n\n/**\n * Disable body scroll (useful for modals)\n * @returns Cleanup function to re-enable scroll\n */\nexport function disableBodyScroll(): () => void {\n if (!isBrowser()) return () => {};\n\n const scrollY = window.scrollY;\n const body = document.body;\n const originalStyles = {\n position: body.style.position,\n top: body.style.top,\n width: body.style.width,\n overflow: body.style.overflow\n };\n\n body.style.position = 'fixed';\n body.style.top = `-${scrollY}px`;\n body.style.width = '100%';\n body.style.overflow = 'hidden';\n\n return () => {\n body.style.position = originalStyles.position;\n body.style.top = originalStyles.top;\n body.style.width = originalStyles.width;\n body.style.overflow = originalStyles.overflow;\n window.scrollTo(0, scrollY);\n };\n}\n\n/**\n * Copy text to clipboard\n * @param text - The text to copy\n * @returns Promise that resolves when copied\n */\nexport async function copyToClipboard(text: string): Promise<void> {\n if (!isBrowser()) {\n throw new Error('Clipboard API not available in this environment');\n }\n\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(text);\n } else {\n // Fallback for older browsers\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n textArea.style.top = '-9999px';\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n }\n}\n\n/**\n * Check if an element has a specific CSS class\n * @param element - The element to check\n * @param className - The class name\n * @returns True if the element has the class\n */\nexport function hasClass(element: Element, className: string): boolean {\n return element.classList.contains(className);\n}\n\n/**\n * Add CSS class(es) to an element\n * @param element - The element to modify\n * @param classNames - Class name(s) to add\n */\nexport function addClass(element: Element, ...classNames: string[]): void {\n element.classList.add(...classNames);\n}\n\n/**\n * Remove CSS class(es) from an element\n * @param element - The element to modify\n * @param classNames - Class name(s) to remove\n */\nexport function removeClass(element: Element, ...classNames: string[]): void {\n element.classList.remove(...classNames);\n}\n\n/**\n * Toggle a CSS class on an element\n * @param element - The element to modify\n * @param className - The class name to toggle\n * @param force - Optional force add (true) or remove (false)\n * @returns True if the class is now present\n */\nexport function toggleClass(element: Element, className: string, force?: boolean): boolean {\n return element.classList.toggle(className, force);\n}\n\n/**\n * Get computed CSS property value\n * @param element - The element to check\n * @param property - CSS property name\n * @returns The computed value\n */\nexport function getComputedStyleValue(element: Element, property: string): string {\n if (!isBrowser()) return '';\n return getComputedStyle(element).getPropertyValue(property);\n}\n","import { Component, input, output, HostBinding, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type ButtonVariant =\n | 'primary'\n | 'primary-outline'\n | 'primary-2'\n | 'primary-2-outline'\n | 'neutral'\n | 'neutral-outline'\n | 'secondary'\n | 'text'\n | 'text-muted'\n | 'text-brand'\n | 'destructive'\n | 'destructive-outline';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\nexport type ButtonIconStyle = 'none' | 'leading' | 'trailing' | 'icon-only';\n\n@Component({\n selector: 'pecb-button',\n imports: [CommonModule],\n templateUrl: './button.component.html',\n styleUrls: ['./button.component.scss'],\n host: { '[attr.id]': 'null' }\n})\nexport class ButtonComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n id = input<string>(generateUniqueId('btn'));\n\n /**\n * The visual style variant of the button\n */\n variant = input<ButtonVariant>('primary');\n\n /**\n * The size of the button\n */\n size = input<ButtonSize>('md');\n\n /**\n * Icon placement style\n */\n iconStyle = input<ButtonIconStyle>('none');\n\n /**\n * Icon to display (used with iconStyle)\n */\n icon = input<string | undefined>(undefined);\n\n /**\n * Whether the button is disabled\n */\n disabled = input(false);\n\n /**\n * Whether the button should take full width\n */\n fullWidth = input(false);\n\n /**\n * Whether the button is in loading state\n */\n loading = input(false);\n\n /**\n * Button type attribute\n */\n type = input<'button' | 'submit' | 'reset'>('button');\n\n // --- ARIA Accessibility Properties ---\n\n /**\n * Accessible label for the button (required for icon-only buttons)\n */\n ariaLabel = input<string | undefined>(undefined);\n\n /**\n * ID of element that labels this button\n */\n ariaLabelledBy = input<string | undefined>(undefined);\n\n /**\n * ID of element that describes this button\n */\n ariaDescribedBy = input<string | undefined>(undefined);\n\n /**\n * Indicates the button controls an expandable element\n */\n ariaExpanded = input<boolean | undefined>(undefined);\n\n /**\n * Indicates the pressed state for toggle buttons\n */\n ariaPressed = input<boolean | undefined>(undefined);\n\n /**\n * Indicates the button opens a popup (menu, listbox, dialog, etc.)\n */\n ariaHasPopup = input<boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog' | undefined>(undefined);\n\n /**\n * ID of the element controlled by this button\n */\n ariaControls = input<string | undefined>(undefined);\n\n /**\n * Event emitted when the button is clicked\n */\n clicked = output<MouseEvent>();\n\n /**\n * Host binding for the component's ID\n */\n @HostBinding('attr.id') get hostId(): null {\n return null; // ID is on the button element, not the host\n }\n\n /**\n * Get CSS classes for the button\n */\n get buttonClasses(): string[] {\n return [\n 'pecb-button',\n `pecb-button--${this.variant()}`,\n `pecb-button--${this.size()}`,\n this.iconStyle() !== 'none' ? `pecb-button--icon-${this.iconStyle()}` : '',\n this.fullWidth() ? 'pecb-button--full-width' : '',\n this.loading() ? 'pecb-button--loading' : ''\n ].filter(Boolean);\n }\n\n get showLeadingIcon(): boolean {\n return this.iconStyle() === 'leading' && !!this.icon() && !this.loading();\n }\n\n get showTrailingIcon(): boolean {\n return this.iconStyle() === 'trailing' && !!this.icon() && !this.loading();\n }\n\n get isIconOnly(): boolean {\n return this.iconStyle() === 'icon-only';\n }\n\n get loadingText(): string {\n return 'Loading, please wait';\n }\n\n get isSvgIcon(): boolean {\n return !!this.icon() && this.icon()!.trimStart().startsWith('<');\n }\n\n get safeIconHtml(): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(this.icon() ?? '');\n }\n\n onClick(event: MouseEvent): void {\n if (!this.disabled() && !this.loading()) {\n this.clicked.emit(event);\n }\n }\n\n onKeyDown(event: KeyboardEvent): void {\n if ((event.key === 'Enter' || event.key === ' ') && !this.disabled() && !this.loading()) {\n event.preventDefault();\n this.clicked.emit(event as unknown as MouseEvent);\n }\n }\n}\n","<button\n [id]=\"id()\"\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [class]=\"buttonClasses.join(' ')\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n [attr.aria-expanded]=\"ariaExpanded() !== undefined ? ariaExpanded() : null\"\n [attr.aria-pressed]=\"ariaPressed() !== undefined ? ariaPressed() : null\"\n [attr.aria-haspopup]=\"ariaHasPopup()\"\n [attr.aria-controls]=\"ariaControls()\"\n [attr.aria-busy]=\"loading() ? true : null\"\n [attr.aria-disabled]=\"disabled() ? true : null\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeyDown($event)\"\n>\n <span class=\"pecb-button__content\">\n @if (loading()) {\n <span class=\"pecb-button__spinner\" aria-hidden=\"true\"></span>\n <span class=\"pecb-button__sr-only\">{{ loadingText }}</span>\n }\n\n @if (showLeadingIcon) {\n <span class=\"pecb-button__icon pecb-button__icon--leading\" aria-hidden=\"true\">\n @if (isSvgIcon) {\n <span [innerHTML]=\"safeIconHtml\"></span>\n } @else {\n <span>{{ icon }}</span>\n }\n </span>\n }\n\n @if (isIconOnly && icon() && !loading()) {\n <span class=\"pecb-button__icon\" aria-hidden=\"true\">\n @if (isSvgIcon) {\n <span [innerHTML]=\"safeIconHtml\"></span>\n } @else {\n <span>{{ icon }}</span>\n }\n </span>\n }\n\n @if (!isIconOnly) {\n <span class=\"pecb-button__text\">\n <ng-content></ng-content>\n </span>\n }\n\n @if (showTrailingIcon) {\n <span class=\"pecb-button__icon pecb-button__icon--trailing\" aria-hidden=\"true\">\n @if (isSvgIcon) {\n <span [innerHTML]=\"safeIconHtml\"></span>\n } @else {\n <span>{{ icon }}</span>\n }\n </span>\n }\n </span>\n</button>\n","import { Component, input } from '@angular/core';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type CardElevation = 'none' | 'sm' | 'md' | 'lg' | 'xl';\nexport type CardRadius = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'full';\n\nconst RADIUS_MAP: Record<CardRadius, string> = {\n none: '0',\n xs: '6px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n full: '9999px',\n};\n\n/**\n * Semantic role for the card component\n */\nexport type CardRole = 'article' | 'region' | 'group' | 'listitem' | 'none';\n\n@Component({\n selector: 'pecb-card',\n standalone: true,\n templateUrl: './card.component.html',\n styleUrls: ['./card.component.scss']\n})\nexport class CardComponent {\n /**\n * Unique ID for the card element\n */\n id = input<string>(generateUniqueId('card'));\n\n /**\n * The elevation level (shadow depth) of the card\n */\n elevation = input<CardElevation>('md');\n\n /**\n * Whether the card should be hoverable with elevation change\n */\n hoverable = input(false);\n\n /**\n * Whether to add padding to the card\n */\n noPadding = input(false);\n\n /**\n * Border-radius: predefined token ('xs'|'sm'|'md'|'lg'|'none'|'full')\n * or any CSS value e.g. '20px', '50%'\n */\n radius = input<CardRadius | string>('lg');\n\n // --- ARIA Accessibility Properties ---\n\n /**\n * Semantic role for the card (article, region, group, listitem, or none)\n * Use 'article' for self-contained content, 'region' for significant sections\n */\n role = input<CardRole>('none');\n\n /**\n * Accessible label for the card\n */\n ariaLabel = input<string | undefined>(undefined);\n\n /**\n * ID of element that labels this card\n */\n ariaLabelledBy = input<string | undefined>(undefined);\n\n /**\n * ID of element that describes this card\n */\n ariaDescribedBy = input<string | undefined>(undefined);\n\n /**\n * Get CSS classes for the card\n */\n get cardClasses(): string[] {\n return [\n 'pecb-card',\n `pecb-card--elevation-${this.elevation()}`,\n this.hoverable() ? 'pecb-card--hoverable' : '',\n this.noPadding() ? 'pecb-card--no-padding' : ''\n ].filter(Boolean);\n }\n\n get borderRadiusStyle(): string {\n return RADIUS_MAP[this.radius() as CardRadius] ?? this.radius();\n }\n\n get roleAttribute(): string | null {\n return this.role() !== 'none' ? this.role() : null;\n }\n}\n\n@Component({\n selector: 'pecb-card-header',\n standalone: true,\n template: `\n <div class=\"pecb-card__header\" role=\"heading\" [attr.aria-level]=\"headingLevel()\">\n <ng-content></ng-content>\n </div>\n `,\n styleUrls: ['./card.component.scss']\n})\nexport class CardHeaderComponent {\n headingLevel = input<number | null>(null);\n}\n\n@Component({\n selector: 'pecb-card-body',\n standalone: true,\n template: '<div class=\"pecb-card__body\"><ng-content></ng-content></div>',\n styleUrls: ['./card.component.scss']\n})\nexport class CardBodyComponent {}\n\n@Component({\n selector: 'pecb-card-footer',\n standalone: true,\n template: '<div class=\"pecb-card__footer\"><ng-content></ng-content></div>',\n styleUrls: ['./card.component.scss']\n})\nexport class CardFooterComponent {}\n","<div\n [id]=\"id()\"\n [class]=\"cardClasses.join(' ')\"\n [style.border-radius]=\"borderRadiusStyle\"\n [attr.role]=\"roleAttribute\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n>\n <ng-content></ng-content>\n</div>\n","import { Component, input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type StatusType = 'warning' | 'action' | 'success' | 'error' | 'different' | 'disabled' | 'neutral';\nexport type StatusVariant = 'accent' | 'filled' | 'outline' | 'custom';\nexport type StatusSize = 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'pecb-status',\n imports: [CommonModule],\n templateUrl: './status.component.html',\n styleUrls: ['./status.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class StatusComponent {\n private readonly _id = `status-${Math.random().toString(36).substring(2, 9)}`;\n\n type = input<StatusType>('neutral');\n variant = input<StatusVariant>('filled');\n size = input<StatusSize>('md');\n ariaLabel = input<string>();\n text = input<string>();\n customClass = input<string>();\n\n get id(): string {\n return this._id;\n }\n\n get statusClasses(): string[] {\n const classes = [\n 'pecb-status',\n `pecb-status--${this.size()}`\n ];\n\n if (this.variant() !== 'custom') {\n classes.push(`pecb-status--${this.type()}`);\n classes.push(`pecb-status--${this.variant()}`);\n }\n\n const customClass = this.customClass();\n if (customClass) {\n classes.push(...customClass.split(' ').filter(c => c.trim()));\n }\n\n return classes;\n }\n}\n","<span\n [id]=\"id\"\n [ngClass]=\"statusClasses\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"status\"\n>\n <ng-content></ng-content>{{ text() }}\n</span>\n","import {\n Component,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n HostListener,\n ElementRef,\n input,\n output,\n model,\n signal,\n computed\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type PaginationSize = 'sm' | 'md' | 'lg';\nexport type PaginationVariant = 'full' | 'compact' | 'minimal' | 'centered';\n\nexport interface PageChangeEvent {\n page: number;\n pageSize: number;\n startIndex: number;\n endIndex: number;\n}\n\n@Component({\n selector: 'pecb-pagination',\n imports: [CommonModule],\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PaginationComponent {\n totalItems = input(0);\n pageSize = model(10);\n currentPage = model(1);\n pageSizeOptions = input<number[]>([10, 25, 50, 75]);\n size = input<PaginationSize>('md');\n variant = input<PaginationVariant>('full');\n showPageSizeSelector = input(true);\n showItemsInfo = input(true);\n maxVisiblePages = input(3);\n disabled = input(false);\n ariaLabel = input('Pagination', { alias: 'aria-label' });\n\n pageChange = output<PageChangeEvent>();\n pageSizeChange = output<number>();\n\n readonly totalPages = computed(() => Math.ceil(this.totalItems() / this.pageSize()) || 0);\n readonly visiblePages = computed(() => this.computeVisiblePages());\n isDropdownOpen = signal(false);\n\n constructor(private elementRef: ElementRef, private cdr: ChangeDetectorRef) {}\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.isDropdownOpen() && !this.elementRef.nativeElement.contains(event.target)) {\n this.isDropdownOpen.set(false);\n this.cdr.markForCheck();\n }\n }\n\n get containerClasses(): string[] {\n return [\n 'pecb-pagination',\n `pecb-pagination--${this.size()}`,\n `pecb-pagination--${this.variant()}`,\n this.disabled() ? 'pecb-pagination--disabled' : ''\n ].filter(Boolean);\n }\n\n get showPages(): boolean {\n return this.variant() === 'full' || this.variant() === 'compact';\n }\n\n get showPageSize(): boolean {\n return this.variant() === 'full' && this.showPageSizeSelector();\n }\n\n get itemsInfoText(): string {\n if (this.variant() === 'minimal' || this.variant() === 'centered') {\n return `Showing ${this.startIndex}-${this.endIndex} of ${this.totalItems()}`;\n }\n return `${this.startIndex}-${this.endIndex} of ${this.totalItems()} items`;\n }\n\n get startIndex(): number {\n if (this.totalItems() === 0) return 0;\n return (this.currentPage() - 1) * this.pageSize() + 1;\n }\n\n get endIndex(): number {\n return Math.min(this.currentPage() * this.pageSize(), this.totalItems());\n }\n\n get canGoPrevious(): boolean {\n return this.currentPage() > 1 && !this.disabled();\n }\n\n get canGoNext(): boolean {\n return this.currentPage() < this.totalPages() && !this.disabled();\n }\n\n goToPage(page: number): void {\n if (this.disabled() || page < 1 || page > this.totalPages() || page === this.currentPage()) {\n return;\n }\n this.currentPage.set(page);\n this.emitPageChange();\n this.cdr.markForCheck();\n }\n\n goToPrevious(): void {\n if (this.canGoPrevious) {\n this.goToPage(this.currentPage() - 1);\n }\n }\n\n goToNext(): void {\n if (this.canGoNext) {\n this.goToPage(this.currentPage() + 1);\n }\n }\n\n onPageSizeChange(newSize: number): void {\n if (this.disabled()) return;\n this.pageSize.set(newSize);\n this.currentPage.set(1);\n this.isDropdownOpen.set(false);\n this.pageSizeChange.emit(newSize);\n this.emitPageChange();\n this.cdr.markForCheck();\n }\n\n toggleDropdown(): void {\n if (!this.disabled()) {\n this.isDropdownOpen.set(!this.isDropdownOpen());\n this.cdr.markForCheck();\n }\n }\n\n closeDropdown(): void {\n this.isDropdownOpen.set(false);\n }\n\n isNumber(value: number | string): boolean {\n return typeof value === 'number';\n }\n\n trackByPage(index: number, page: number | string): number | string {\n return typeof page === 'number' ? page : `ellipsis-${index}`;\n }\n\n private emitPageChange(): void {\n this.pageChange.emit({\n page: this.currentPage(),\n pageSize: this.pageSize(),\n startIndex: this.startIndex,\n endIndex: this.endIndex\n });\n }\n\n private computeVisiblePages(): (number | string)[] {\n const pages: (number | string)[] = [];\n const totalPages = this.totalPages();\n const currentPage = this.currentPage();\n const maxVisible = this.maxVisiblePages();\n\n if (totalPages <= maxVisible + 2) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n if (currentPage <= maxVisible) {\n for (let i = 2; i <= maxVisible + 1; i++) pages.push(i);\n pages.push('...');\n pages.push(totalPages);\n } else if (currentPage >= totalPages - maxVisible + 1) {\n pages.push('...');\n for (let i = totalPages - maxVisible; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push('...');\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i);\n pages.push('...');\n pages.push(totalPages);\n }\n }\n\n return pages;\n }\n}\n","<nav\n [class]=\"containerClasses.join(' ')\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"navigation\"\n>\n <!-- V4: Centered variant - prev button on left -->\n <button\n *ngIf=\"variant() === 'centered'\"\n type=\"button\"\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev pecb-pagination__nav-button--bordered\"\n [disabled]=\"!canGoPrevious\"\n [attr.aria-label]=\"'Go to previous page'\"\n (click)=\"goToPrevious()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <!-- Info section (V1, V2, V3, V4) -->\n <div class=\"pecb-pagination__info\" *ngIf=\"showItemsInfo()\">\n <span class=\"pecb-pagination__items-text\">\n {{ itemsInfoText }}\n </span>\n </div>\n\n <!-- Page size dropdown (V1 only) -->\n <div *ngIf=\"showPageSize\" class=\"pecb-pagination__page-size\">\n <span class=\"pecb-pagination__page-size-label\">Items per page:</span>\n <div class=\"pecb-pagination__dropdown\">\n <button\n type=\"button\"\n class=\"pecb-pagination__dropdown-trigger\"\n [class.pecb-pagination__dropdown-trigger--open]=\"isDropdownOpen()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isDropdownOpen()\"\n aria-haspopup=\"listbox\"\n (click)=\"toggleDropdown()\"\n >\n <span>{{ pageSize() }}</span>\n <svg\n class=\"pecb-pagination__dropdown-icon\"\n [class.pecb-pagination__dropdown-icon--open]=\"isDropdownOpen()\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <ul\n *ngIf=\"isDropdownOpen()\"\n class=\"pecb-pagination__dropdown-menu\"\n role=\"listbox\"\n [attr.aria-label]=\"'Select items per page'\"\n >\n <li\n *ngFor=\"let option of pageSizeOptions()\"\n class=\"pecb-pagination__dropdown-item\"\n [class.pecb-pagination__dropdown-item--selected]=\"option === pageSize()\"\n role=\"option\"\n [attr.aria-selected]=\"option === pageSize()\"\n (click)=\"onPageSizeChange(option)\"\n >\n {{ option }}\n </li>\n </ul>\n </div>\n </div>\n\n <!-- Controls section -->\n <div class=\"pecb-pagination__controls\">\n <!-- Previous button (V1, V2, V3) -->\n <button\n *ngIf=\"variant() !== 'centered'\"\n type=\"button\"\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev\"\n [class.pecb-pagination__nav-button--bordered]=\"variant() === 'minimal'\"\n [disabled]=\"!canGoPrevious\"\n [attr.aria-label]=\"'Go to previous page'\"\n (click)=\"goToPrevious()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <!-- Page numbers (V1, V2) -->\n <div *ngIf=\"showPages\" class=\"pecb-pagination__pages\" role=\"group\" aria-label=\"Page navigation\">\n <ng-container *ngFor=\"let page of visiblePages(); trackBy: trackByPage\">\n <button\n *ngIf=\"isNumber(page)\"\n type=\"button\"\n class=\"pecb-pagination__page-button\"\n [class.pecb-pagination__page-button--active]=\"page === currentPage()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Page ' + page\"\n [attr.aria-current]=\"page === currentPage() ? 'page' : null\"\n (click)=\"goToPage(+page)\"\n >\n {{ page }}\n </button>\n <span\n *ngIf=\"!isNumber(page)\"\n class=\"pecb-pagination__ellipsis\"\n aria-hidden=\"true\"\n >\n {{ page }}\n </span>\n </ng-container>\n </div>\n\n <!-- Next button (V1, V2, V3) -->\n <button\n *ngIf=\"variant() !== 'centered'\"\n type=\"button\"\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next\"\n [class.pecb-pagination__nav-button--bordered]=\"variant() === 'minimal'\"\n [disabled]=\"!canGoNext\"\n [attr.aria-label]=\"'Go to next page'\"\n (click)=\"goToNext()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <!-- V4: Centered variant - next button on right -->\n <button\n *ngIf=\"variant() === 'centered'\"\n type=\"button\"\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next pecb-pagination__nav-button--bordered\"\n [disabled]=\"!canGoNext\"\n [attr.aria-label]=\"'Go to next page'\"\n (click)=\"goToNext()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n</nav>\n","import {\n Component,\n input,\n output,\n model,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n ContentChild,\n TemplateRef,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { PageChangeEvent, PaginationComponent } from '../pagination/pagination.component';\nimport { StatusComponent } from '../status/status.component';\n\nexport type TableSize = 'sm' | 'md' | 'lg';\nexport type TableVariant = 'default' | 'striped' | 'bordered';\n\n/**\n * Defines built-in column types\n */\nexport type PecbTableColumnType = 'text' | 'link' | 'status' | 'action' | 'user' | 'custom';\n\n/**\n * Defines built-in component names for columns\n */\nexport type PecbTableColumnComponent = 'status' | 'action' | 'user';\n\nexport interface TableAction {\n id: string;\n icon: 'view' | 'edit' | 'delete' | 'download' | 'copy' | 'custom';\n tooltip?: string;\n customIcon?: string;\n disabled?: boolean;\n variant?: 'default' | 'danger';\n /** Whether to show a vertical divider before this action */\n dividerBefore?: boolean;\n /** Click handler for this specific action */\n action?: (row: any, index: number) => void;\n}\n\nexport interface TableStatusConfig {\n typeMap?: Record<string, string>;\n variant?: 'accent' | 'filled' | 'outline';\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport interface TableUserConfig {\n avatarKey?: string;\n nameKey?: string;\n secondaryKey?: string;\n}\n\nexport interface PecbTableColumn {\n key: string;\n label: string;\n width?: string;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n cellTemplate?: TemplateRef<any>;\n headerTemplate?: TemplateRef<any>;\n cssClass?: string;\n type?: PecbTableColumnType;\n component?: PecbTableColumnComponent;\n dynamicComponent?: Type<any>;\n componentInputs?: Record<string, any>;\n componentInputsFn?: (row: any, value: any, index: number) => Record<string, any>;\n actions?: TableAction[];\n statusConfig?: TableStatusConfig;\n userConfig?: TableUserConfig;\n}\n\nexport interface TableSortEvent {\n column: string;\n direction: 'asc' | 'desc' | null;\n}\n\nexport interface TableRowActionEvent {\n action: string;\n row: any;\n index: number;\n}\n\nexport interface TableSelectionEvent {\n selectedRows: any[];\n selectedIndices: number[];\n}\n\n@Component({\n selector: 'pecb-table',\n imports: [CommonModule, PaginationComponent, StatusComponent],\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TableComponent {\n constructor(private sanitizer: DomSanitizer, private cdr: ChangeDetectorRef) {}\n\n /**\n * Column definitions for the table\n */\n columns = input<PecbTableColumn[]>([]);\n\n /**\n * Data array to display in the table\n */\n data = input<any[]>([]);\n\n /**\n * Size variant of the table\n * @default 'md'\n */\n size = input<TableSize>('md');\n\n /**\n * Visual variant of the table\n * @default 'default'\n */\n variant = input<TableVariant>('default');\n\n /**\n * Whether to show the table header\n * @default true\n */\n showHeader = input(true);\n\n /**\n * Whether to enable row hover effect\n * @default true\n */\n hoverable = input(true);\n\n /**\n * Whether to show pagination\n * @default true\n */\n showPagination = input(true);\n\n /**\n * Total number of items for pagination\n */\n totalItems = input(0);\n\n /**\n * Current page number (1-based)\n * @default 1\n */\n currentPage = model(1);\n\n /**\n * Number of items per page\n * @default 15\n */\n pageSize = model(15);\n\n /**\n * Available page size options\n */\n pageSizeOptions = input<number[]>([10, 15, 25, 50]);\n\n /**\n * Whether to show page size selector in pagination\n * @default true\n */\n showPageSizeSelector = input(true);\n\n /**\n * Pagination variant\n * @default 'full'\n */\n paginationVariant = input<'full' | 'compact' | 'minimal' | 'centered'>('full');\n\n /**\n * Message to display when there is no data\n */\n emptyMessage = input('There are no entries yet.');\n\n /**\n * Whether to show loading state\n * @default false\n */\n loading = input(false);\n\n /**\n * Whether to enable row selection\n * @default false\n */\n selectable = input(false);\n\n /**\n * Currently selected row indices\n */\n selectedIndices = model<number[]>([]);\n\n /**\n * Whether the table has a fixed header\n * @default false\n */\n stickyHeader = input(false);\n\n /**\n * Maximum height of the table body (enables scrolling)\n */\n maxHeight = input<string | undefined>(undefined);\n\n /**\n * Column key currently being sorted\n */\n sortColumn = model<string | undefined>(undefined);\n\n /**\n * Current sort direction\n */\n sortDirection = model<'asc' | 'desc' | null>(null);\n\n /**\n * ARIA label for the table\n */\n ariaLabel = input('Data table', { alias: 'aria-label' });\n\n /**\n * Emitted when a page change occurs\n */\n pageChange = output<PageChangeEvent>();\n\n /**\n * Emitted when page size changes\n */\n pageSizeChange = output<number>();\n\n /**\n * Emitted when a row is clicked\n */\n rowClick = output<{ row: any; index: number }>();\n\n /**\n * Emitted when a row action is triggered\n */\n rowAction = output<TableRowActionEvent>();\n\n /**\n * Emitted when sorting changes\n */\n sortChange = output<TableSortEvent>();\n\n /**\n * Emitted when row selection changes\n */\n selectionChange = output<TableSelectionEvent>();\n\n @ContentChild('emptyTemplate') emptyTemplate?: TemplateRef<any>;\n @ContentChild('loadingTemplate') loadingTemplate?: TemplateRef<any>;\n\n get containerClasses(): string {\n const classes = ['pecb-table-container'];\n if (this.stickyHeader()) classes.push('pecb-table-container--sticky');\n return classes.join(' ');\n }\n\n get paginationClasses(): string {\n const classes = ['pecb-table__pagination'];\n if (this.paginationVariant() === 'full' || this.paginationVariant() === 'compact') {\n classes.push('pecb-table__pagination--bordered');\n }\n return classes.join(' ');\n }\n\n get tableClasses(): string {\n const classes = ['pecb-table', `pecb-table--${this.size()}`, `pecb-table--${this.variant()}`];\n if (this.hoverable()) classes.push('pecb-table--hoverable');\n if (this.selectable()) classes.push('pecb-table--selectable');\n return classes.join(' ');\n }\n\n getCellValue(row: any, key: string): any {\n if (!row || !key) return '';\n const keys = key.split('.');\n let value = row;\n for (const k of keys) {\n if (value === null || value === undefined) return '';\n value = value[k];\n }\n return value ?? '';\n }\n\n getAlignmentClass(column: PecbTableColumn): string {\n if (!column.align || column.align === 'left') return '';\n return `pecb-table__cell--${column.align}`;\n }\n\n onRowClick(row: any, index: number): void {\n if (this.selectable()) this.toggleRowSelection(index);\n this.rowClick.emit({ row, index });\n }\n\n onRowAction(action: string, row: any, index: number, event: Event): void {\n event.stopPropagation();\n this.rowAction.emit({ action, row, index });\n }\n\n onHeaderClick(column: PecbTableColumn): void {\n if (!column.sortable) return;\n let newDirection: 'asc' | 'desc' | null = 'asc';\n\n if (this.sortColumn() === column.key) {\n if (this.sortDirection() === 'asc') {\n newDirection = 'desc';\n } else if (this.sortDirection() === 'desc') {\n newDirection = null;\n }\n }\n\n this.sortColumn.set(newDirection ? column.key : undefined);\n this.sortDirection.set(newDirection);\n\n this.sortChange.emit({\n column: column.key,\n direction: newDirection,\n });\n this.cdr.markForCheck();\n }\n\n toggleRowSelection(index: number): void {\n const newSelection = [...this.selectedIndices()];\n const existingIndex = newSelection.indexOf(index);\n if (existingIndex > -1) newSelection.splice(existingIndex, 1);\n else newSelection.push(index);\n this.selectedIndices.set(newSelection);\n this.emitSelectionChange();\n }\n\n toggleAllSelection(): void {\n if (this.isAllSelected()) this.selectedIndices.set([]);\n else this.selectedIndices.set(this.data().map((_, index) => index));\n this.emitSelectionChange();\n }\n\n isRowSelected(index: number): boolean {\n return this.selectedIndices().includes(index);\n }\n\n isAllSelected(): boolean {\n return this.data().length > 0 && this.selectedIndices().length === this.data().length;\n }\n\n isSomeSelected(): boolean {\n return this.selectedIndices().length > 0 && this.selectedIndices().length < this.data().length;\n }\n\n onPageChange(event: PageChangeEvent): void {\n this.currentPage.set(event.page);\n this.pageChange.emit(event);\n }\n\n onPageSizeChange(newSize: number): void {\n this.pageSize.set(newSize);\n this.currentPage.set(1);\n this.pageSizeChange.emit(newSize);\n }\n\n getSortState(column: PecbTableColumn): 'asc' | 'desc' | 'none' {\n if (!column.sortable) return 'none';\n if (this.sortColumn() !== column.key) return 'none';\n return this.sortDirection() || 'none';\n }\n\n trackByIndex(index: number): number { return index; }\n trackByKey(_: number, column: PecbTableColumn): string { return column.key; }\n\n getColumnType(column: PecbTableColumn): string {\n return column.component || column.type || 'text';\n }\n\n getStatusType(value: any, column: PecbTableColumn): any {\n const config = column.statusConfig;\n if (config?.typeMap && value in config.typeMap) return config.typeMap[value];\n const defaultMap: Record<string, string> = {\n 'Pending': 'warning', 'pending': 'warning',\n 'Inactive': 'error', 'inactive': 'error',\n 'Approved': 'success', 'approved': 'success',\n 'Active': 'success', 'active': 'success',\n 'Disabled': 'disabled', 'disabled': 'disabled',\n };\n return defaultMap[value] || 'neutral';\n }\n\n getStatusVariant(column: PecbTableColumn): any { return column.statusConfig?.variant || 'filled'; }\n getStatusSize(column: PecbTableColumn): any { return column.statusConfig?.size || 'sm'; }\n\n getUserData(row: any, column: PecbTableColumn): { avatar: string; name: string; secondary: string } {\n const config = column.userConfig || {};\n return {\n avatar: row[config.avatarKey || 'avatar'] || '',\n name: row[config.nameKey || column.key] || '',\n secondary: row[config.secondaryKey || 'email'] || '',\n };\n }\n\n getActions(column: PecbTableColumn): TableAction[] {\n if (column.actions && column.actions.length > 0) return column.actions;\n return [\n { id: 'view', icon: 'view', tooltip: 'View' },\n { id: 'edit', icon: 'edit', tooltip: 'Edit' },\n { id: 'delete', icon: 'delete', tooltip: 'Delete', variant: 'danger' },\n ];\n }\n\n onActionClick(action: TableAction, row: any, index: number, event: Event): void {\n event.stopPropagation();\n if (action.action) action.action(row, index);\n this.rowAction.emit({ action: action.id, row, index });\n }\n\n getDynamicComponentInputs(row: any, column: PecbTableColumn, index: number): Record<string, any> {\n const value = this.getCellValue(row, column.key);\n const staticInputs = column.componentInputs || {};\n if (column.componentInputsFn) {\n return { ...staticInputs, ...column.componentInputsFn(row, value, index) };\n }\n return staticInputs;\n }\n\n hasDynamicComponent(column: PecbTableColumn): boolean { return !!column.dynamicComponent; }\n\n getSafeIcon(iconSvg: string | undefined): SafeHtml {\n if (!iconSvg) return '';\n return this.sanitizer.bypassSecurityTrustHtml(iconSvg);\n }\n\n /**\n * Builds a safe href from a URL string, prepending https:// if missing\n */\n getLinkHref(value: string): string {\n if (!value) return '#';\n if (value.startsWith('http://') || value.startsWith('https://')) return value;\n return `https://${value}`;\n }\n\n private emitSelectionChange(): void {\n const selectedRows = this.selectedIndices().map(index => this.data()[index]);\n this.selectionChange.emit({ selectedRows, selectedIndices: this.selectedIndices() });\n }\n}\n","<div class=\"pecb-table-wrapper\">\n <div [class]=\"containerClasses\" [style.maxHeight]=\"maxHeight()\">\n <!-- Loading State -->\n <div *ngIf=\"loading()\" class=\"pecb-table__loading\">\n <ng-container *ngIf=\"loadingTemplate; else defaultLoading\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultLoading>\n <div class=\"pecb-table__loading-spinner\">\n <svg class=\"pecb-table__spinner-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-dasharray=\"31.4 31.4\" />\n </svg>\n <span>Loading...</span>\n </div>\n </ng-template>\n </div>\n\n <!-- Table -->\n <table\n *ngIf=\"!loading()\"\n [class]=\"tableClasses\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"table\">\n\n <!-- Table Header -->\n <thead *ngIf=\"showHeader()\" class=\"pecb-table__head\" [class.pecb-table__head--sticky]=\"stickyHeader()\">\n <tr class=\"pecb-table__row pecb-table__row--header\" role=\"row\">\n <!-- Selection Checkbox Column -->\n <th\n *ngIf=\"selectable()\"\n class=\"pecb-table__cell pecb-table__cell--header pecb-table__cell--checkbox\"\n role=\"columnheader\"\n scope=\"col\">\n <label class=\"pecb-table__checkbox-wrapper\">\n <input\n type=\"checkbox\"\n class=\"pecb-table__checkbox\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (change)=\"toggleAllSelection()\"\n aria-label=\"Select all rows\" />\n <span class=\"pecb-table__checkbox-custom\"></span>\n </label>\n </th>\n\n <!-- Data Columns -->\n <th\n *ngFor=\"let column of columns(); trackBy: trackByKey\"\n class=\"pecb-table__cell pecb-table__cell--header\"\n [class.pecb-table__cell--sortable]=\"column.sortable\"\n [class]=\"getAlignmentClass(column)\"\n [ngClass]=\"column.cssClass\"\n [style.width]=\"column.width\"\n [attr.aria-sort]=\"column.sortable ? (sortColumn() === column.key ? (sortDirection() === 'asc' ? 'ascending' : 'descending') : 'none') : null\"\n role=\"columnheader\"\n scope=\"col\"\n (click)=\"onHeaderClick(column)\"\n (keydown.enter)=\"onHeaderClick(column)\"\n (keydown.space)=\"onHeaderClick(column); $event.preventDefault()\"\n [attr.tabindex]=\"column.sortable ? 0 : null\">\n <div class=\"pecb-table__header-content\">\n <ng-container *ngIf=\"column.headerTemplate; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <span class=\"pecb-table__header-text\">{{ column.label }}</span>\n </ng-template>\n\n <!-- Sort Icon -->\n <span *ngIf=\"column.sortable\" class=\"pecb-table__sort-icon\" [attr.data-sort]=\"getSortState(column)\">\n <svg *ngIf=\"getSortState(column) === 'none'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\" opacity=\"0.4\"/>\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\" opacity=\"0.4\"/>\n </svg>\n <svg *ngIf=\"getSortState(column) === 'asc'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\"/>\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\" opacity=\"0.4\"/>\n </svg>\n <svg *ngIf=\"getSortState(column) === 'desc'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\" opacity=\"0.4\"/>\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\"/>\n </svg>\n </span>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- Table Body -->\n <tbody class=\"pecb-table__body\">\n <!-- Empty State -->\n <tr *ngIf=\"data().length === 0\" class=\"pecb-table__row pecb-table__row--empty\">\n <td\n [attr.colspan]=\"selectable() ? columns().length + 1 : columns().length\"\n class=\"pecb-table__cell pecb-table__cell--empty\">\n <ng-container *ngIf=\"emptyTemplate; else defaultEmpty\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultEmpty>\n <div class=\"pecb-table__empty-content\">\n <span class=\"pecb-table__empty-message\">{{ emptyMessage() }}</span>\n </div>\n </ng-template>\n </td>\n </tr>\n\n <!-- Data Rows -->\n <tr\n *ngFor=\"let row of data(); let i = index; trackBy: trackByIndex\"\n class=\"pecb-table__row pecb-table__row--data\"\n [class.pecb-table__row--selected]=\"isRowSelected(i)\"\n role=\"row\"\n (click)=\"onRowClick(row, i)\"\n [attr.tabindex]=\"0\"\n (keydown.enter)=\"onRowClick(row, i)\">\n\n <!-- Selection Checkbox -->\n <td\n *ngIf=\"selectable()\"\n class=\"pecb-table__cell pecb-table__cell--checkbox\"\n role=\"cell\"\n (click)=\"$event.stopPropagation()\">\n <label class=\"pecb-table__checkbox-wrapper\">\n <input\n type=\"checkbox\"\n class=\"pecb-table__checkbox\"\n [checked]=\"isRowSelected(i)\"\n (change)=\"toggleRowSelection(i)\"\n [attr.aria-label]=\"'Select row ' + (i + 1)\" />\n <span class=\"pecb-table__checkbox-custom\"></span>\n </label>\n </td>\n\n <!-- Data Cells -->\n <td\n *ngFor=\"let column of columns(); trackBy: trackByKey\"\n class=\"pecb-table__cell\"\n [class]=\"getAlignmentClass(column)\"\n [ngClass]=\"column.cssClass\"\n role=\"cell\">\n\n <!-- Custom Template -->\n <ng-container *ngIf=\"column.cellTemplate\">\n <ng-container *ngTemplateOutlet=\"column.cellTemplate; context: { $implicit: getCellValue(row, column.key), row: row, column: column, index: i }\"></ng-container>\n </ng-container>\n\n <!-- Dynamic Component - renders any component passed via dynamicComponent -->\n <ng-container *ngIf=\"!column.cellTemplate && hasDynamicComponent(column)\">\n <ng-container\n *ngComponentOutlet=\"column.dynamicComponent!; inputs: getDynamicComponentInputs(row, column, i)\">\n </ng-container>\n </ng-container>\n\n <!-- Status Component - renders pecb-status -->\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'status'\">\n <pecb-status\n [type]=\"getStatusType(getCellValue(row, column.key), column)\"\n [variant]=\"getStatusVariant(column)\"\n [size]=\"getStatusSize(column)\">\n {{ getCellValue(row, column.key) }}\n </pecb-status>\n </ng-container>\n\n <!-- User Component - renders avatar + name + email -->\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'user'\">\n <div class=\"pecb-table__user-cell\">\n <img\n *ngIf=\"getUserData(row, column).avatar\"\n [src]=\"getUserData(row, column).avatar\"\n alt=\"\"\n class=\"pecb-table__user-avatar\">\n <div class=\"pecb-table__user-info\">\n <div class=\"pecb-table__user-name\">{{ getUserData(row, column).name }}</div>\n <div *ngIf=\"getUserData(row, column).secondary\" class=\"pecb-table__user-secondary\">\n {{ getUserData(row, column).secondary }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Action Component - renders action buttons with icons -->\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'action'\">\n <div class=\"pecb-table__action-buttons\">\n <ng-container *ngFor=\"let action of getActions(column)\">\n <!-- Divider before this action (consumer-controlled grouping) -->\n <span *ngIf=\"action.dividerBefore\" class=\"pecb-table__action-divider\"></span>\n <button\n class=\"pecb-table__action-btn\"\n [class.pecb-table__action-btn--danger]=\"action.variant === 'danger'\"\n [title]=\"action.tooltip || action.id\"\n [disabled]=\"action.disabled\"\n (click)=\"onActionClick(action, row, i, $event)\">\n <!-- View Icon -->\n <svg *ngIf=\"action.icon === 'view'\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path>\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n </svg>\n <!-- Edit Icon -->\n <svg *ngIf=\"action.icon === 'edit'\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\n </svg>\n <!-- Delete Icon -->\n <svg *ngIf=\"action.icon === 'delete'\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\"></polyline>\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\n </svg>\n <!-- Download Icon -->\n <svg *ngIf=\"action.icon === 'download'\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n <!-- Copy Icon -->\n <svg *ngIf=\"action.icon === 'copy'\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n <!-- Custom Icon (SVG string) -->\n <span *ngIf=\"action.icon === 'custom' && action.customIcon\" class=\"pecb-table__custom-icon\" [innerHTML]=\"getSafeIcon(action.customIcon)\"></span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Link Cell -->\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'link'\">\n <a\n [href]=\"getLinkHref(getCellValue(row, column.key))\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"pecb-table__link\"\n (click)=\"$event.stopPropagation()\">\n {{ getCellValue(row, column.key) }}\n </a>\n </ng-container>\n\n <!-- Default Text -->\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'text'\">\n {{ getCellValue(row, column.key) }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Pagination (outside table container) -->\n <div *ngIf=\"showPagination() && !loading() && data().length > 0\" [class]=\"paginationClasses\">\n <pecb-pagination\n [totalItems]=\"totalItems()\"\n [pageSize]=\"pageSize()\"\n [currentPage]=\"currentPage()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [showPageSizeSelector]=\"showPageSizeSelector()\"\n [variant]=\"paginationVariant()\"\n size=\"md\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\">\n </pecb-pagination>\n </div>\n</div>\n","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type TabStyle = 'rounded' | 'line';\nexport type TabSize = 'sm' | 'md';\n\n@Component({\n selector: 'pecb-tab',\n imports: [CommonModule],\n templateUrl: './tab.component.html',\n styleUrls: ['./tab.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TabComponent {\n id = input(generateUniqueId('tab'));\n tabStyle = input<TabStyle>('rounded');\n size = input<TabSize>('md');\n label = input('Tab Name');\n icon = input<number>();\n active = input(false);\n disabled = input(false);\n closable = input(true);\n ariaLabel = input<string>();\n ariaControls = input<string>();\n ariaSelected = input<boolean>();\n\n clicked = output<string>();\n closed = output<string>();\n\n get tabClasses(): string[] {\n return [\n 'pecb-tab',\n `pecb-tab--${this.tabStyle()}`,\n `pecb-tab--${this.size()}`,\n this.active() ? 'pecb-tab--active' : '',\n this.disabled() ? 'pecb-tab--disabled' : ''\n ].filter(Boolean);\n }\n\n onClick(event: MouseEvent): void {\n if (!this.disabled()) {\n event.stopPropagation();\n this.clicked.emit(this.id());\n }\n }\n\n onClose(event: MouseEvent): void {\n if (!this.disabled()) {\n event.stopPropagation();\n this.closed.emit(this.id());\n }\n }\n\n onKeyDown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.clicked.emit(this.id());\n }\n\n if (this.closable() && (event.key === 'Delete' || event.key === 'Backspace')) {\n event.preventDefault();\n this.closed.emit(this.id());\n }\n }\n}\n","<div\n [id]=\"id()\"\n [class]=\"tabClasses.join(' ')\"\n role=\"tab\"\n [attr.aria-label]=\"ariaLabel() || label()\"\n [attr.aria-controls]=\"ariaControls()\"\n [attr.aria-selected]=\"ariaSelected() !== undefined ? ariaSelected() : active()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeyDown($event)\"\n>\n <span class=\"pecb-tab__content\">\n <!-- Label -->\n <span class=\"pecb-tab__label\">{{ label() }}</span>\n\n <!-- Icon/Badge -->\n <span *ngIf=\"icon()\" class=\"pecb-tab__icon\" aria-hidden=\"true\">\n {{ icon() }}\n </span>\n\n <!-- Close button -->\n <button\n *ngIf=\"closable()\"\n type=\"button\"\n class=\"pecb-tab__close\"\n [attr.aria-label]=\"'Close ' + label()\"\n [disabled]=\"disabled()\"\n (click)=\"onClose($event)\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M13.725 4.28249C13.4325 3.98999 12.96 3.98999 12.6675 4.28249L9.00004 7.94249L5.33254 4.27499C5.04004 3.98249 4.56754 3.98249 4.27504 4.27499C3.98254 4.56749 3.98254 5.03999 4.27504 5.33249L7.94254 8.99999L4.27504 12.6675C3.98254 12.96 3.98254 13.4325 4.27504 13.725C4.56754 14.0175 5.04004 14.0175 5.33254 13.725L9.00004 10.0575L12.6675 13.725C12.96 14.0175 13.4325 14.0175 13.725 13.725C14.0175 13.4325 14.0175 12.96 13.725 12.6675L10.0575 8.99999L13.725 5.33249C14.01 5.04749 14.01 4.56749 13.725 4.28249Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n </span>\n</div>\n","import {\n Component,\n input,\n output,\n model,\n signal,\n inject,\n ChangeDetectionStrategy,\n HostListener,\n ElementRef,\n ViewChild,\n forwardRef\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type DatepickerSize = 'sm' | 'md' | 'lg' | 'xl';\n\ninterface CalendarDay {\n date: Date;\n day: number;\n isCurrentMonth: boolean;\n isSelected: boolean;\n isToday: boolean;\n}\n\n@Component({\n selector: 'pecb-datepicker',\n imports: [CommonModule],\n templateUrl: './datepicker.component.html',\n styleUrls: ['./datepicker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatepickerComponent),\n multi: true\n }\n ]\n})\nexport class DatepickerComponent implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef);\n\n @ViewChild('inputElement') inputElement?: ElementRef<HTMLInputElement>;\n\n /**\n * Unique ID for the datepicker element\n */\n id = input<string>(generateUniqueId('datepicker'));\n\n /**\n * Label text to display above the input\n */\n label = input<string | undefined>(undefined);\n\n /**\n * Placeholder text for the input\n */\n placeholder = input('Choose Date');\n\n /**\n * The size of the datepicker\n */\n size = input<DatepickerSize>('lg');\n\n /**\n * Width of the datepicker (any valid CSS value, e.g. '300px', '50%', '100%')\n * Defaults to 100% via CSS\n */\n width = input<string | undefined>(undefined);\n\n /**\n * Whether the field is required\n */\n required = input(false);\n\n /**\n * Whether the datepicker is disabled\n */\n disabled = model(false);\n\n /**\n * Date format for display (default: MM/DD/YYYY)\n */\n dateFormat = input('MM/DD/YYYY');\n\n /**\n * Minimum selectable date\n */\n minDate = input<Date | undefined>(undefined);\n\n /**\n * Maximum selectable date\n */\n maxDate = input<Date | undefined>(undefined);\n\n /**\n * Event emitted when date is selected\n */\n dateChange = output<Date | null>();\n\n /**\n * Event emitted when calendar is opened\n */\n opened = output<void>();\n\n /**\n * Event emitted when calendar is closed\n */\n closed = output<void>();\n\n // Internal state\n selectedDate = signal<Date | null>(null);\n isCalendarOpen = signal(false);\n currentMonth = signal<Date>(new Date());\n calendarDays = signal<CalendarDay[]>([]);\n weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n\n private onChange: (value: Date | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n this.generateCalendar();\n }\n\n get wrapperClasses(): string[] {\n return [\n 'pecb-datepicker',\n `pecb-datepicker--${this.size()}`,\n this.disabled() ? 'pecb-datepicker--disabled' : '',\n this.isCalendarOpen() ? 'pecb-datepicker--open' : '',\n this.selectedDate() ? 'pecb-datepicker--has-value' : ''\n ].filter(Boolean);\n }\n\n get displayValue(): string {\n if (!this.selectedDate()) return '';\n return this.formatDate(this.selectedDate()!);\n }\n\n get monthYearDisplay(): string {\n return `${this.monthNames[this.currentMonth().getMonth()]} ${this.currentMonth().getFullYear()}`;\n }\n\n toggleCalendar(): void {\n if (this.disabled()) return;\n this.isCalendarOpen.set(!this.isCalendarOpen());\n if (this.isCalendarOpen()) {\n this.opened.emit();\n const sd = this.selectedDate();\n if (sd) this.currentMonth.set(new Date(sd.getFullYear(), sd.getMonth(), 1));\n this.generateCalendar();\n } else {\n this.closed.emit();\n }\n }\n\n closeCalendar(): void {\n if (this.isCalendarOpen()) {\n this.isCalendarOpen.set(false);\n this.closed.emit();\n }\n }\n\n previousMonth(): void {\n const cm = this.currentMonth();\n this.currentMonth.set(new Date(cm.getFullYear(), cm.getMonth() - 1, 1));\n this.generateCalendar();\n }\n\n nextMonth(): void {\n const cm = this.currentMonth();\n this.currentMonth.set(new Date(cm.getFullYear(), cm.getMonth() + 1, 1));\n this.generateCalendar();\n }\n\n selectDate(day: CalendarDay): void {\n if (this.disabled() || !day.isCurrentMonth) return;\n const minDate = this.minDate();\n const maxDate = this.maxDate();\n if (minDate && day.date < minDate) return;\n if (maxDate && day.date > maxDate) return;\n this.selectedDate.set(day.date);\n this.onChange(this.selectedDate());\n this.onTouched();\n this.dateChange.emit(this.selectedDate());\n this.generateCalendar();\n this.closeCalendar();\n }\n\n clearDate(event: MouseEvent): void {\n event.stopPropagation();\n if (this.disabled()) return;\n this.selectedDate.set(null);\n this.onChange(null);\n this.onTouched();\n this.dateChange.emit(null);\n this.generateCalendar();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target)) {\n this.closeCalendar();\n }\n }\n\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleCalendar();\n } else if (event.key === 'Escape') {\n this.closeCalendar();\n }\n }\n\n private generateCalendar(): void {\n const year = this.currentMonth().getFullYear();\n const month = this.currentMonth().getMonth();\n const firstDay = new Date(year, month, 1);\n const startingDayOfWeek = firstDay.getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n const days: CalendarDay[] = [];\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n for (let i = startingDayOfWeek - 1; i >= 0; i--) {\n days.push({ date: new Date(year, month - 1, daysInPrevMonth - i), day: daysInPrevMonth - i, isCurrentMonth: false, isSelected: false, isToday: false });\n }\n\n const sd = this.selectedDate();\n for (let day = 1; day <= daysInMonth; day++) {\n const date = new Date(year, month, day);\n date.setHours(0, 0, 0, 0);\n const isSelected = sd ? date.getTime() === new Date(sd).setHours(0, 0, 0, 0) : false;\n days.push({ date, day, isCurrentMonth: true, isSelected, isToday: date.getTime() === today.getTime() });\n }\n\n const remainingDays = 42 - days.length;\n for (let day = 1; day <= remainingDays; day++) {\n days.push({ date: new Date(year, month + 1, day), day, isCurrentMonth: false, isSelected: false, isToday: false });\n }\n\n this.calendarDays.set(days);\n }\n\n private formatDate(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const year = date.getFullYear();\n return this.dateFormat().replace('MM', month).replace('DD', day).replace('YYYY', String(year));\n }\n\n writeValue(value: Date | null): void {\n this.selectedDate.set(value);\n if (value) this.currentMonth.set(new Date(value.getFullYear(), value.getMonth(), 1));\n this.generateCalendar();\n }\n\n registerOnChange(fn: (value: Date | null) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n setDisabledState(isDisabled: boolean): void { this.disabled.set(isDisabled); }\n}\n","<div [class]=\"wrapperClasses.join(' ')\" [style.width]=\"width || null\">\n <!-- Input Field -->\n <div class=\"pecb-datepicker__input-wrapper\">\n <!-- Input -->\n <input\n #inputElement\n [id]=\"id()\"\n type=\"text\"\n class=\"pecb-datepicker__input\"\n [value]=\"displayValue\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label() || placeholder()\"\n [attr.aria-required]=\"required()\"\n readonly\n (click)=\"toggleCalendar()\"\n (keydown)=\"onKeyDown($event)\"\n />\n\n <!-- Floating Label -->\n <label\n *ngIf=\"label()\"\n [attr.for]=\"id()\"\n class=\"pecb-datepicker__label\"\n >\n {{ label() }}<span *ngIf=\"required()\" class=\"pecb-datepicker__required\">*</span>\n </label>\n\n <!-- Clear Button (shown when has value) -->\n <button\n *ngIf=\"selectedDate() && !disabled()\"\n type=\"button\"\n class=\"pecb-datepicker__icon pecb-datepicker__icon--clear\"\n [attr.aria-label]=\"'Clear date'\"\n (click)=\"clearDate($event)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\n </svg>\n </button>\n\n <!-- Right Icon (Calendar) -->\n <button\n type=\"button\"\n class=\"pecb-datepicker__icon pecb-datepicker__icon--right\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Open calendar'\"\n (click)=\"toggleCalendar()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 1.5V4.5M6 1.5V4.5M2.25 7.5H15.75M3.75 3H14.25C15.0784 3 15.75 3.67157 15.75 4.5V15C15.75 15.8284 15.0784 16.5 14.25 16.5H3.75C2.92157 16.5 2.25 15.8284 2.25 15V4.5C2.25 3.67157 2.92157 3 3.75 3Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <!-- Calendar Dropdown -->\n <div\n *ngIf=\"isCalendarOpen()\"\n class=\"pecb-datepicker__calendar\"\n role=\"dialog\"\n aria-modal=\"false\"\n [attr.aria-label]=\"'Choose date'\"\n >\n <!-- Calendar Header -->\n <div class=\"pecb-datepicker__calendar-header\">\n <button\n type=\"button\"\n class=\"pecb-datepicker__nav-button\"\n aria-label=\"Previous month\"\n (click)=\"previousMonth()\"\n >\n «\n </button>\n\n <span class=\"pecb-datepicker__month-year\">{{ monthYearDisplay }}</span>\n\n <button\n type=\"button\"\n class=\"pecb-datepicker__nav-button\"\n aria-label=\"Next month\"\n (click)=\"nextMonth()\"\n >\n »\n </button>\n </div>\n\n <!-- Calendar Grid -->\n <div class=\"pecb-datepicker__calendar-body\">\n <!-- Week Days -->\n <div class=\"pecb-datepicker__weekdays\">\n <div\n *ngFor=\"let day of weekDays\"\n class=\"pecb-datepicker__weekday\"\n >\n {{ day }}\n </div>\n </div>\n\n <!-- Days Grid -->\n <div class=\"pecb-datepicker__days\">\n <button\n *ngFor=\"let day of calendarDays()\"\n type=\"button\"\n class=\"pecb-datepicker__day\"\n [class.pecb-datepicker__day--other-month]=\"!day.isCurrentMonth\"\n [class.pecb-datepicker__day--selected]=\"day.isSelected\"\n [class.pecb-datepicker__day--today]=\"day.isToday\"\n [attr.aria-label]=\"day.date.toDateString()\"\n [attr.aria-selected]=\"day.isSelected\"\n (click)=\"selectDate(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n</div>\n","import {\n Component,\n input,\n output,\n model,\n signal,\n inject,\n ChangeDetectionStrategy,\n forwardRef,\n ViewChild,\n ElementRef\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search';\nexport type InputSize = 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * A professional input component with floating label and multiple types.\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\n *\n * @example\n * ```html\n * <pecb-input\n * label=\"Email\"\n * type=\"email\"\n * placeholder=\"Enter your email\"\n * [(ngModel)]=\"email\"\n * ></pecb-input>\n *\n * <!-- With predefined icon -->\n * <pecb-input\n * label=\"Email\"\n * type=\"email\"\n * icon=\"email\"\n * iconPosition=\"left\"\n * ></pecb-input>\n *\n * <!-- With custom SVG icon -->\n * <pecb-input\n * label=\"Phone\"\n * type=\"tel\"\n * [icon]=\"'<svg>...</svg>'\"\n * iconPosition=\"left\"\n * ></pecb-input>\n *\n * <!-- With error state -->\n * <pecb-input\n * label=\"Password\"\n * type=\"password\"\n * [error]=\"true\"\n * errorMessage=\"Password is required\"\n * ></pecb-input>\n * ```\n *\n * @publicApi\n */\n@Component({\n selector: 'pecb-input',\n imports: [CommonModule],\n templateUrl: './input.component.html',\n styleUrls: ['./input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputComponent),\n multi: true\n }\n ]\n})\nexport class InputComponent implements ControlValueAccessor {\n private readonly sanitizer = inject(DomSanitizer);\n\n @ViewChild('inputElement') inputElement?: ElementRef<HTMLInputElement>;\n\n /**\n * Unique ID for the input element\n */\n id = input<string>(generateUniqueId('input'));\n\n /**\n * Input type\n */\n type = input<InputType>('text');\n\n /**\n * Label text to display\n */\n label = input<string | undefined>(undefined);\n\n /**\n * Placeholder text (shown when label is not present)\n */\n placeholder = input('');\n\n /**\n * The size of the input\n */\n size = input<InputSize>('lg');\n\n /**\n * Width of the input wrapper — any valid CSS value e.g. '300px', '50%', '100%'\n * Defaults to 100% (full width of parent)\n */\n width = input<string | undefined>(undefined);\n\n /**\n * Whether the field is required\n */\n required = input(false);\n\n /**\n * Whether the input is disabled\n */\n disabled = model(false);\n\n /**\n * Whether the input is readonly\n */\n readonly = input(false);\n\n /**\n * Whether to show error state\n */\n error = input(false);\n\n /**\n * Error message to display\n */\n errorMessage = input<string | undefined>(undefined);\n\n /**\n * Helper text to display below input\n */\n helperText = input<string | undefined>(undefined);\n\n /**\n * Icon to display - can be a predefined name ('email', 'search', 'user') or custom SVG string\n */\n icon = input<string | undefined>(undefined);\n\n /**\n * Icon position (left or right)\n */\n iconPosition = input<'left' | 'right'>('left');\n\n /**\n * Left icon name or HTML (deprecated - use icon with iconPosition instead)\n */\n leftIcon = input<string | undefined>(undefined);\n\n /**\n * Right icon name or HTML (deprecated - use icon with iconPosition instead)\n */\n rightIcon = input<string | undefined>(undefined);\n\n /**\n * Whether to show clear button\n */\n clearable = input(false);\n\n /**\n * Maximum length of input\n */\n maxLength = input<number | undefined>(undefined);\n\n /**\n * Minimum value (for number type)\n */\n min = input<number | undefined>(undefined);\n\n /**\n * Maximum value (for number type)\n */\n max = input<number | undefined>(undefined);\n\n /**\n * Step value (for number type)\n */\n step = input<number | undefined>(undefined);\n\n /**\n * Autocomplete attribute\n */\n autocomplete = input<string | undefined>(undefined);\n\n /**\n * Show info icon next to the label\n */\n showInfoIcon = input(false);\n\n /**\n * Event emitted when value changes\n */\n valueChange = output<string>();\n\n /**\n * Event emitted on blur\n */\n blurred = output<void>();\n\n /**\n * Event emitted on focus\n */\n focused = output<void>();\n\n /**\n * Event emitted when clear button is clicked\n */\n cleared = output<void>();\n\n // Internal state\n value = signal('');\n isFocused = signal(false);\n showPassword = signal(false);\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n get wrapperClasses(): string[] {\n return [\n 'pecb-input',\n `pecb-input--${this.size()}`,\n this.label() ? 'pecb-input--has-label' : '',\n this.disabled() ? 'pecb-input--disabled' : '',\n this.error() ? 'pecb-input--error' : '',\n this.readonly() ? 'pecb-input--readonly' : '',\n this.isFocused() ? 'pecb-input--focused' : '',\n this.value() ? 'pecb-input--has-value' : ''\n ].filter(Boolean);\n }\n\n get inputType(): string {\n if (this.type() === 'password' && this.showPassword()) return 'text';\n return this.type();\n }\n\n get showClearButton(): boolean {\n return this.clearable() && !!this.value() && !this.disabled() && !this.readonly();\n }\n\n get showPasswordToggle(): boolean {\n return this.type() === 'password' && !!this.value() && !this.disabled() && !this.readonly();\n }\n\n get computedLeftIcon(): string | undefined {\n if (this.icon() && this.iconPosition() === 'left') return this.icon();\n return this.leftIcon();\n }\n\n get computedRightIcon(): string | undefined {\n if (this.icon() && this.iconPosition() === 'right') return this.icon();\n return this.rightIcon();\n }\n\n onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.value.set(target.value);\n this.onChange(this.value());\n this.valueChange.emit(this.value());\n }\n\n onFocus(): void {\n this.isFocused.set(true);\n this.focused.emit();\n }\n\n onBlur(): void {\n this.isFocused.set(false);\n this.onTouched();\n this.blurred.emit();\n }\n\n clearValue(event: MouseEvent): void {\n event.stopPropagation();\n this.value.set('');\n this.onChange(this.value());\n this.valueChange.emit(this.value());\n this.cleared.emit();\n this.inputElement?.nativeElement.focus();\n }\n\n togglePasswordVisibility(event: MouseEvent): void {\n event.stopPropagation();\n this.showPassword.set(!this.showPassword());\n }\n\n focus(): void {\n this.inputElement?.nativeElement.focus();\n }\n\n sanitizeIcon(icon: string | undefined): SafeHtml {\n if (!icon) return '';\n return this.sanitizer.bypassSecurityTrustHtml(icon);\n }\n\n writeValue(value: string): void {\n this.value.set(value || '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n}\n","<div [class]=\"wrapperClasses.join(' ')\" [style.width]=\"width() || null\">\n <!-- Input Wrapper -->\n <div class=\"pecb-input__wrapper\">\n\n <!-- Left Icon -->\n @if (computedLeftIcon) {\n <span class=\"pecb-input__icon pecb-input__icon--left\" aria-hidden=\"true\">\n @switch (computedLeftIcon) {\n @case ('email') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\n </svg>\n }\n @case ('search') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/>\n </svg>\n }\n @case ('user') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\n </svg>\n }\n @default {\n <span [innerHTML]=\"sanitizeIcon(computedLeftIcon)\"></span>\n }\n }\n </span>\n }\n\n <!-- Input Field -->\n <input\n #inputElement\n [id]=\"id()\"\n [type]=\"inputType\"\n class=\"pecb-input__field\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [attr.maxlength]=\"maxLength()\"\n [attr.min]=\"min()\"\n [attr.max]=\"max()\"\n [attr.step]=\"step()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-label]=\"label() || placeholder() || null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"error() || null\"\n [attr.aria-describedby]=\"helperText() || errorMessage() ? id() + '-description' : null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Floating Label -->\n @if (label()) {\n <label [attr.for]=\"id()\" class=\"pecb-input__label\">\n <span class=\"pecb-input__label-text\">{{ label() }}@if (required()) {<span class=\"pecb-input__required\">*</span>}</span>\n @if (showInfoIcon()) {\n <span class=\"pecb-input__label-icon\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.84998 9.35001V6.85001M6.84998 4.35001H6.85623M13.1 6.85001C13.1 10.3018 10.3018 13.1 6.84998 13.1C3.3982 13.1 0.599976 10.3018 0.599976 6.85001C0.599976 3.39823 3.3982 0.600006 6.84998 0.600006C10.3018 0.600006 13.1 3.39823 13.1 6.85001Z\" stroke=\"#A11E29\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n }\n </label>\n }\n\n <!-- Clear Button -->\n @if (showClearButton) {\n <button\n type=\"button\"\n class=\"pecb-input__icon pecb-input__icon--clear\"\n aria-label=\"Clear input\"\n (click)=\"clearValue($event)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\n </svg>\n </button>\n }\n\n <!-- Password Toggle -->\n @if (showPasswordToggle) {\n <button\n type=\"button\"\n class=\"pecb-input__icon pecb-input__icon--password\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\"\n (click)=\"togglePasswordVisibility($event)\"\n >\n @if (!showPassword()) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n } @else {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>\n </svg>\n }\n </button>\n }\n\n <!-- Right Icon -->\n @if (computedRightIcon && !showClearButton && !showPasswordToggle) {\n <span class=\"pecb-input__icon pecb-input__icon--right\" aria-hidden=\"true\">\n @switch (computedRightIcon) {\n @case ('email') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\n </svg>\n }\n @case ('search') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/>\n </svg>\n }\n @case ('user') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\n </svg>\n }\n @default {\n <span [innerHTML]=\"sanitizeIcon(computedRightIcon)\"></span>\n }\n }\n </span>\n }\n\n </div>\n\n <!-- Helper Text / Error Message -->\n @if (helperText() || errorMessage()) {\n <div\n [id]=\"id() + '-description'\"\n class=\"pecb-input__description\"\n [class.pecb-input__description--error]=\"error()\"\n >\n @if (helperText()) {\n <span class=\"pecb-input__description-helper\">{{ helperText() }}</span>\n }\n @if (error() && errorMessage()) {\n <span class=\"pecb-input__description-error\">{{ errorMessage() }}</span>\n }\n </div>\n }\n</div>\n","import { Component, input, output, model, signal, ChangeDetectionStrategy, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type RadioVariant = 'dot' | 'filled';\nexport type RadioLabelPosition = 'right' | 'left';\n\n@Component({\n selector: 'pecb-radio',\n imports: [CommonModule],\n templateUrl: './radio.component.html',\n styleUrls: ['./radio.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RadioComponent),\n multi: true\n }\n ]\n})\nexport class RadioComponent implements ControlValueAccessor {\n id = input(generateUniqueId('radio'));\n name = input<string>();\n value = input<unknown>();\n variant = input<RadioVariant>('dot');\n label = input<string>();\n description = input<string>();\n labelPosition = input<RadioLabelPosition>('right');\n disabled = model(false);\n\n selectionChange = output<unknown>();\n\n checked = signal(false);\n\n private onChange: (value: unknown) => void = () => {};\n private onTouched: () => void = () => {};\n\n get wrapperClasses(): string[] {\n return [\n 'pecb-radio',\n `pecb-radio--${this.variant()}`,\n this.disabled() ? 'pecb-radio--disabled' : '',\n this.checked() ? 'pecb-radio--checked' : '',\n this.labelPosition() === 'left' ? 'pecb-radio--label-left' : ''\n ].filter(Boolean);\n }\n\n onRadioChange(event: Event): void {\n if (this.disabled()) return;\n const checked = (event.target as HTMLInputElement).checked;\n if (checked) {\n this.checked.set(true);\n this.onChange(this.value());\n this.selectionChange.emit(this.value());\n }\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n writeValue(value: unknown): void {\n this.checked.set(value === this.value());\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n}\n","<div [class]=\"wrapperClasses.join(' ')\">\n <label [attr.for]=\"id()\" class=\"pecb-radio__label\">\n <input\n [id]=\"id()\"\n type=\"radio\"\n class=\"pecb-radio__input\"\n [name]=\"name()\"\n [value]=\"value()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-describedby]=\"description() ? id() + '-description' : null\"\n (change)=\"onRadioChange($event)\"\n (blur)=\"onBlur()\"\n />\n <span *ngIf=\"labelPosition() === 'left' && (label() || description())\" class=\"pecb-radio__content\">\n <span *ngIf=\"label()\" class=\"pecb-radio__text\">{{ label() }}</span>\n <span *ngIf=\"description()\" [id]=\"id() + '-description'\" class=\"pecb-radio__description\">{{ description() }}</span>\n </span>\n <span class=\"pecb-radio__control\"></span>\n <span *ngIf=\"labelPosition() === 'right' && (label() || description())\" class=\"pecb-radio__content\">\n <span *ngIf=\"label()\" class=\"pecb-radio__text\">{{ label() }}</span>\n <span *ngIf=\"description()\" [id]=\"id() + '-description'\" class=\"pecb-radio__description\">{{ description() }}</span>\n </span>\n </label>\n</div>\n","import { Component, input, output, model, signal, ChangeDetectionStrategy, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type CheckboxLabelPosition = 'right' | 'left';\n\n@Component({\n selector: 'pecb-checkbox',\n imports: [CommonModule],\n templateUrl: './checkbox.component.html',\n styleUrls: ['./checkbox.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true\n }\n ]\n})\nexport class CheckboxComponent implements ControlValueAccessor {\n id = input(generateUniqueId('checkbox'));\n name = input<string>();\n label = input<string>();\n description = input<string>();\n labelPosition = input<CheckboxLabelPosition>('right');\n disabled = model(false);\n\n checkedChange = output<boolean>();\n\n checked = signal(false);\n\n private onChange: (value: boolean) => void = () => {};\n private onTouched: () => void = () => {};\n\n get wrapperClasses(): string[] {\n return [\n 'pecb-checkbox',\n this.disabled() ? 'pecb-checkbox--disabled' : '',\n this.checked() ? 'pecb-checkbox--checked' : '',\n this.labelPosition() === 'left' ? 'pecb-checkbox--label-left' : ''\n ].filter(Boolean);\n }\n\n onCheckboxChange(event: Event): void {\n if (this.disabled()) return;\n const checked = (event.target as HTMLInputElement).checked;\n this.checked.set(checked);\n this.onChange(this.checked());\n this.checkedChange.emit(this.checked());\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n writeValue(value: boolean): void {\n this.checked.set(!!value);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n}\n","<div [class]=\"wrapperClasses.join(' ')\">\n <label [attr.for]=\"id()\" class=\"pecb-checkbox__label\">\n <input\n [id]=\"id()\"\n type=\"checkbox\"\n class=\"pecb-checkbox__input\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-describedby]=\"description() ? id() + '-description' : null\"\n (change)=\"onCheckboxChange($event)\"\n (blur)=\"onBlur()\"\n />\n <span *ngIf=\"labelPosition() === 'left' && (label() || description())\" class=\"pecb-checkbox__content\">\n <span *ngIf=\"label()\" class=\"pecb-checkbox__text\">{{ label() }}</span>\n <span *ngIf=\"description()\" [id]=\"id() + '-description'\" class=\"pecb-checkbox__description\">{{ description() }}</span>\n </span>\n <span class=\"pecb-checkbox__control\">\n <svg class=\"pecb-checkbox__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span *ngIf=\"labelPosition() === 'right' && (label() || description())\" class=\"pecb-checkbox__content\">\n <span *ngIf=\"label()\" class=\"pecb-checkbox__text\">{{ label() }}</span>\n <span *ngIf=\"description()\" [id]=\"id() + '-description'\" class=\"pecb-checkbox__description\">{{ description() }}</span>\n </span>\n </label>\n</div>\n","import { Component, input, output, model, signal, ChangeDetectionStrategy, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport type ToggleLabelPosition = 'right' | 'left';\n\n@Component({\n selector: 'pecb-toggle',\n imports: [CommonModule],\n templateUrl: './toggle.component.html',\n styleUrls: ['./toggle.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ToggleComponent),\n multi: true\n }\n ]\n})\nexport class ToggleComponent implements ControlValueAccessor {\n id = input(generateUniqueId('toggle'));\n name = input<string>();\n label = input<string>();\n description = input<string>();\n labelPosition = input<ToggleLabelPosition>('right');\n disabled = model(false);\n\n toggleChange = output<boolean>();\n\n checked = signal(false);\n\n private onChange: (value: boolean) => void = () => {};\n private onTouched: () => void = () => {};\n\n get wrapperClasses(): string[] {\n return [\n 'pecb-toggle',\n this.disabled() ? 'pecb-toggle--disabled' : '',\n this.checked() ? 'pecb-toggle--checked' : '',\n this.labelPosition() === 'left' ? 'pecb-toggle--label-left' : ''\n ].filter(Boolean);\n }\n\n onToggleChange(event: Event): void {\n if (this.disabled()) return;\n const checked = (event.target as HTMLInputElement).checked;\n this.checked.set(checked);\n this.onChange(this.checked());\n this.toggleChange.emit(this.checked());\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n writeValue(value: boolean): void {\n this.checked.set(!!value);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n}\n","<div [class]=\"wrapperClasses.join(' ')\">\n <label [attr.for]=\"id()\" class=\"pecb-toggle__label\">\n <input\n [id]=\"id()\"\n type=\"checkbox\"\n role=\"switch\"\n class=\"pecb-toggle__input\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-describedby]=\"description() ? id() + '-description' : null\"\n [attr.aria-checked]=\"checked()\"\n (change)=\"onToggleChange($event)\"\n (blur)=\"onBlur()\"\n />\n <span *ngIf=\"labelPosition() === 'left' && (label() || description())\" class=\"pecb-toggle__content\">\n <span *ngIf=\"label()\" class=\"pecb-toggle__text\">{{ label() }}</span>\n <span *ngIf=\"description()\" [id]=\"id() + '-description'\" class=\"pecb-toggle__description\">{{ description() }}</span>\n </span>\n <span class=\"pecb-toggle__control\">\n <span class=\"pecb-toggle__thumb\"></span>\n </span>\n <span *ngIf=\"labelPosition() === 'right' && (label() || description())\" class=\"pecb-toggle__content\">\n <span *ngIf=\"label()\" class=\"pecb-toggle__text\">{{ label() }}</span>\n <span *ngIf=\"description()\" [id]=\"id() + '-description'\" class=\"pecb-toggle__description\">{{ description() }}</span>\n </span>\n </label>\n</div>\n","import {\n Component,\n input,\n output,\n model,\n signal,\n inject,\n ChangeDetectionStrategy,\n forwardRef,\n HostListener,\n ElementRef,\n ViewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\nexport interface DropdownOption {\n label: string;\n value: unknown;\n disabled?: boolean;\n}\n\nexport type DropdownSize = 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'pecb-dropdown',\n imports: [CommonModule],\n templateUrl: './dropdown.component.html',\n styleUrls: ['./dropdown.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DropdownComponent),\n multi: true\n }\n ]\n})\nexport class DropdownComponent implements ControlValueAccessor {\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n private readonly elementRef = inject(ElementRef);\n\n id = input(generateUniqueId('dropdown'));\n label = input<string>();\n size = input<DropdownSize>('md');\n options = input<DropdownOption[]>([]);\n multiple = input(false);\n searchable = input(false);\n maxHeight = input(300);\n disabled = model(false);\n required = input(false);\n error = input(false);\n errorMessage = input<string>();\n helperText = input<string>();\n\n selectionChange = output<unknown | unknown[]>();\n\n isOpen = signal(false);\n searchQuery = signal('');\n selectedValues = signal<unknown[]>([]);\n focusedIndex = signal(-1);\n\n private onChange: (value: unknown) => void = () => {};\n private onTouched: () => void = () => {};\n\n get wrapperClasses(): string[] {\n return [\n 'pecb-dropdown',\n `pecb-dropdown--${this.size()}`,\n this.disabled() ? 'pecb-dropdown--disabled' : '',\n this.error() ? 'pecb-dropdown--error' : '',\n this.isOpen() ? 'pecb-dropdown--open' : '',\n this.hasValue ? 'pecb-dropdown--has-value' : '',\n this.multiple() ? 'pecb-dropdown--multiple' : ''\n ].filter(Boolean);\n }\n\n get hasValue(): boolean {\n return this.selectedValues().length > 0;\n }\n\n get filteredOptions(): DropdownOption[] {\n if (!this.searchQuery()) return this.options();\n const query = this.searchQuery().toLowerCase();\n return this.options().filter(option => option.label.toLowerCase().includes(query));\n }\n\n get displayText(): string {\n if (!this.hasValue) return '';\n if (this.multiple()) {\n const selectedOptions = this.options().filter(opt => this.selectedValues().includes(opt.value));\n return selectedOptions.map(opt => opt.label).join(', ');\n }\n const selectedOption = this.options().find(opt => opt.value === this.selectedValues()[0]);\n return selectedOption?.label || '';\n }\n\n clearAll(event: MouseEvent): void {\n event.stopPropagation();\n this.selectedValues.set([]);\n this.onChange([]);\n this.selectionChange.emit([]);\n }\n\n toggleDropdown(): void {\n if (this.disabled()) return;\n this.isOpen.set(!this.isOpen());\n if (this.isOpen()) {\n this.onTouched();\n this.focusedIndex.set(-1);\n if (this.searchable()) {\n setTimeout(() => this.searchInput?.nativeElement.focus(), 0);\n }\n } else {\n this.searchQuery.set('');\n }\n }\n\n selectOption(option: DropdownOption): void {\n if (option.disabled) return;\n if (this.multiple()) {\n const current = [...this.selectedValues()];\n const index = current.indexOf(option.value);\n if (index > -1) current.splice(index, 1);\n else current.push(option.value);\n this.selectedValues.set(current);\n this.onChange([...this.selectedValues()]);\n this.selectionChange.emit([...this.selectedValues()]);\n } else {\n this.selectedValues.set([option.value]);\n this.onChange(option.value);\n this.selectionChange.emit(option.value);\n this.isOpen.set(false);\n this.searchQuery.set('');\n }\n }\n\n isSelected(option: DropdownOption): boolean {\n return this.selectedValues().includes(option.value);\n }\n\n onSearchInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.searchQuery.set(target.value);\n this.focusedIndex.set(-1);\n }\n\n onKeyDown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const filteredOptions = this.filteredOptions;\n switch (event.key) {\n case 'Enter':\n case ' ':\n if (!this.isOpen()) {\n event.preventDefault();\n this.toggleDropdown();\n } else if (this.focusedIndex() >= 0 && this.focusedIndex() < filteredOptions.length) {\n event.preventDefault();\n this.selectOption(filteredOptions[this.focusedIndex()]);\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) this.toggleDropdown();\n else this.focusedIndex.set(Math.min(this.focusedIndex() + 1, filteredOptions.length - 1));\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (this.isOpen()) this.focusedIndex.set(Math.max(this.focusedIndex() - 1, 0));\n break;\n case 'Escape':\n if (this.isOpen()) {\n event.preventDefault();\n this.isOpen.set(false);\n this.searchQuery.set('');\n }\n break;\n case 'Tab':\n if (this.isOpen()) {\n this.isOpen.set(false);\n this.searchQuery.set('');\n }\n break;\n }\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target)) {\n if (this.isOpen()) {\n this.isOpen.set(false);\n this.searchQuery.set('');\n }\n }\n }\n\n writeValue(value: unknown): void {\n if (this.multiple()) {\n this.selectedValues.set(Array.isArray(value) ? value : []);\n } else {\n this.selectedValues.set(value != null ? [value] : []);\n }\n }\n\n registerOnChange(fn: (value: unknown) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n setDisabledState(isDisabled: boolean): void { this.disabled.set(isDisabled); }\n}\n","<div [class]=\"wrapperClasses.join(' ')\">\n <!-- Dropdown Trigger -->\n <div\n class=\"pecb-dropdown__trigger\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"label()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"toggleDropdown()\"\n (keydown)=\"onKeyDown($event)\"\n >\n <span class=\"pecb-dropdown__value\">{{ displayText }}</span>\n\n <!-- Clear button (multi-select with value) -->\n <span *ngIf=\"multiple() && hasValue\" class=\"pecb-dropdown__clear\" (click)=\"clearAll($event)\" aria-label=\"Clear selection\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11 1L1 11M1 1L11 11\" stroke=\"#616161\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n\n <!-- Floating Label -->\n <label\n *ngIf=\"label()\"\n [attr.for]=\"id()\"\n class=\"pecb-dropdown__label\"\n >\n {{ label() }}<span *ngIf=\"required()\" class=\"pecb-dropdown__required\">*</span>\n </label>\n\n <!-- Dropdown Arrow -->\n <span class=\"pecb-dropdown__arrow\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 6.75L9 11.25L13.5 6.75\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n\n <!-- Dropdown Panel -->\n <div\n *ngIf=\"isOpen()\"\n class=\"pecb-dropdown__panel\"\n [style.max-height.px]=\"maxHeight()\"\n >\n <!-- Search Input -->\n <div *ngIf=\"searchable()\" class=\"pecb-dropdown__search\">\n <svg class=\"pecb-dropdown__search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\n </svg>\n <input\n #searchInput\n type=\"text\"\n class=\"pecb-dropdown__search-input\"\n placeholder=\"Search\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n />\n </div>\n\n <!-- Options List -->\n <div class=\"pecb-dropdown__options\">\n <div\n *ngFor=\"let option of filteredOptions; let i = index\"\n class=\"pecb-dropdown__option\"\n [class.pecb-dropdown__option--selected]=\"isSelected(option)\"\n [class.pecb-dropdown__option--disabled]=\"option.disabled\"\n [class.pecb-dropdown__option--focused]=\"i === focusedIndex()\"\n (click)=\"selectOption(option)\"\n >\n <!-- Checkbox for multi-select -->\n <span *ngIf=\"multiple()\" class=\"pecb-dropdown__checkbox\">\n <span class=\"pecb-dropdown__checkbox-control\" [class.pecb-dropdown__checkbox-control--checked]=\"isSelected(option)\">\n <svg *ngIf=\"isSelected(option)\" class=\"pecb-dropdown__checkbox-icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </span>\n\n <!-- Option Label -->\n <span class=\"pecb-dropdown__option-label\">{{ option.label }}</span>\n </div>\n\n <!-- No results message -->\n <div *ngIf=\"filteredOptions.length === 0\" class=\"pecb-dropdown__no-results\">\n No results found\n </div>\n </div>\n </div>\n\n <!-- Helper Text / Error Message -->\n <div\n *ngIf=\"helperText() || errorMessage()\"\n [id]=\"id() + '-description'\"\n class=\"pecb-dropdown__description\"\n [class.pecb-dropdown__description--error]=\"error() && errorMessage()\"\n >\n <span *ngIf=\"error() && errorMessage()\">{{ errorMessage() }}</span>\n <span *ngIf=\"!error() && helperText()\">{{ helperText() }}</span>\n </div>\n</div>\n","import {\n Component,\n Directive,\n input,\n output,\n OnInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild,\n AfterViewInit\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId, trapFocus, disableBodyScroll } from '../../shared/utils/dom.utils';\n\nexport type RightModalSize = 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'pecb-right-modal',\n imports: [CommonModule],\n templateUrl: './right-modal.component.html',\n styleUrls: ['./right-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class RightModalComponent implements OnInit, OnDestroy, AfterViewInit {\n id = input(generateUniqueId('right-modal'));\n isOpen = input(false);\n size = input<RightModalSize>('md');\n closeOnBackdropClick = input(true);\n closeOnEscape = input(true);\n showCloseButton = input(true);\n ariaLabel = input<string>();\n ariaLabelledBy = input<string>();\n ariaDescribedBy = input<string>();\n\n closed = output<void>();\n opened = output<void>();\n\n @ViewChild('modalPanel') modalPanel!: ElementRef<HTMLElement>;\n\n private cleanupFocusTrap: (() => void) | null = null;\n private cleanupBodyScroll: (() => void) | null = null;\n private previousActiveElement: Element | null = null;\n\n ngOnInit(): void {\n if (this.isOpen()) {\n this.onOpen();\n }\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen() && this.modalPanel) {\n this.setupFocusTrap();\n }\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n get modalClasses(): string[] {\n return [\n 'pecb-right-modal',\n this.isOpen() ? 'pecb-right-modal--open' : ''\n ].filter(Boolean);\n }\n\n get panelClasses(): string[] {\n return [\n 'pecb-right-modal__panel',\n `pecb-right-modal__panel--${this.size()}`\n ];\n }\n\n onBackdropClick(event: MouseEvent): void {\n if (this.closeOnBackdropClick() && event.target === event.currentTarget) {\n this.close();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.closeOnEscape() && event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }\n\n close(): void {\n this.cleanup();\n this.closed.emit();\n }\n\n private onOpen(): void {\n this.previousActiveElement = document.activeElement;\n this.cleanupBodyScroll = disableBodyScroll();\n this.opened.emit();\n }\n\n private setupFocusTrap(): void {\n if (this.modalPanel?.nativeElement) {\n this.cleanupFocusTrap = trapFocus(this.modalPanel.nativeElement);\n }\n }\n\n private cleanup(): void {\n if (this.cleanupFocusTrap) {\n this.cleanupFocusTrap();\n this.cleanupFocusTrap = null;\n }\n if (this.cleanupBodyScroll) {\n this.cleanupBodyScroll();\n this.cleanupBodyScroll = null;\n }\n if (this.previousActiveElement instanceof HTMLElement) {\n this.previousActiveElement.focus();\n }\n }\n}\n\n@Directive({\n selector: '[pecbRightModalHeader]',\n standalone: true,\n host: { class: 'pecb-right-modal__header' }\n})\nexport class RightModalHeaderDirective {}\n\n@Directive({\n selector: '[pecbRightModalContent]',\n standalone: true,\n host: { class: 'pecb-right-modal__content' }\n})\nexport class RightModalContentDirective {}\n\n@Directive({\n selector: '[pecbRightModalFooter]',\n standalone: true,\n host: { class: 'pecb-right-modal__footer' }\n})\nexport class RightModalFooterDirective {}\n","<div\n *ngIf=\"isOpen()\"\n [id]=\"id()\"\n [class]=\"modalClasses.join(' ')\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n (click)=\"onBackdropClick($event)\"\n (keydown)=\"onKeydown($event)\"\n>\n <div\n #modalPanel\n [class]=\"panelClasses.join(' ')\"\n tabindex=\"-1\"\n >\n <button\n *ngIf=\"showCloseButton()\"\n type=\"button\"\n class=\"pecb-right-modal__close-btn\"\n aria-label=\"Close modal\"\n (click)=\"close()\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <ng-content select=\"[pecbRightModalHeader]\"></ng-content>\n <ng-content select=\"[pecbRightModalContent]\"></ng-content>\n <ng-content></ng-content>\n <ng-content select=\"[pecbRightModalFooter]\"></ng-content>\n </div>\n</div>\n","import { Component, input, output, model, signal, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nexport interface SidebarMenuItem {\n id: string;\n label: string;\n icon?: string;\n route?: string;\n active?: boolean;\n children?: SidebarMenuItem[];\n expanded?: boolean;\n}\n\nexport interface SidebarSection {\n id: string;\n title?: string;\n items: SidebarMenuItem[];\n}\n\n@Component({\n selector: 'pecb-sidebar',\n imports: [],\n templateUrl: './sidebar.component.html',\n styleUrls: ['./sidebar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SidebarComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n sections = input<SidebarSection[]>([]);\n showHeader = input(true);\n logoSrc = input<string>();\n sidebarLogo = input<string>();\n collapsedLogo = input<string>();\n showFooter = input(false);\n collapsed = model(false);\n\n itemClick = output<SidebarMenuItem>();\n collapseChange = output<boolean>();\n\n activePopupItem = signal<SidebarMenuItem | null>(null);\n popupTopPosition = signal(0);\n\n onItemClick(item: SidebarMenuItem, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.collapsed() && item.children && item.children.length > 0) {\n const target = event.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n this.popupTopPosition.set(rect.top);\n this.activePopupItem.set(this.activePopupItem() === item ? null : item);\n return;\n }\n\n const isTopLevel = this.sections().some(section =>\n section.items.includes(item)\n );\n\n if (isTopLevel) {\n this.sections().forEach(section => {\n section.items.forEach(sectionItem => {\n if (sectionItem !== item && sectionItem.expanded) {\n sectionItem.expanded = false;\n }\n });\n });\n }\n\n if (item.children && item.children.length > 0) {\n item.expanded = !item.expanded;\n }\n\n this.itemClick.emit(item);\n }\n\n closePopup(): void {\n this.activePopupItem.set(null);\n }\n\n onPopupItemClick(child: SidebarMenuItem, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (child.children && child.children.length > 0) {\n child.expanded = !child.expanded;\n } else {\n this.onItemClick(child, event);\n this.closePopup();\n }\n }\n\n toggleCollapse(): void {\n this.collapsed.set(!this.collapsed());\n this.collapseChange.emit(this.collapsed());\n }\n\n getSafeIcon(icon: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(icon);\n }\n\n trackBySection(_index: number, section: SidebarSection): string {\n return section.id;\n }\n\n trackByItem(_index: number, item: SidebarMenuItem): string {\n return item.id;\n }\n\n hasActiveDescendant(item: SidebarMenuItem): boolean {\n if (item.active) return true;\n if (item.children && item.children.length > 0) {\n return item.children.some(child => this.hasActiveDescendant(child));\n }\n return false;\n }\n\n getItemClasses(item: SidebarMenuItem, isChild = false, isNested = false): string[] {\n const classes = [isChild ? 'pecb-sidebar__subitem' : 'pecb-sidebar__item'];\n\n if (isNested) classes.push('pecb-sidebar__subitem--nested');\n\n const isActiveOrHasActiveChild = this.hasActiveDescendant(item);\n if (isActiveOrHasActiveChild) {\n classes.push(isChild ? 'pecb-sidebar__subitem--active' : 'pecb-sidebar__item--active');\n }\n\n if (item.children && item.children.length > 0) {\n if (!isChild) {\n classes.push('pecb-sidebar__item--has-children');\n if (item.expanded) classes.push('pecb-sidebar__item--expanded');\n } else if (isChild && !isNested) {\n if (item.expanded) classes.push('pecb-sidebar__item--expanded');\n }\n }\n\n return classes;\n }\n}\n","<aside class=\"pecb-sidebar\" [class.pecb-sidebar--collapsed]=\"collapsed()\">\n <!-- Collapse Toggle Button -->\n <button\n class=\"pecb-sidebar__toggle\"\n [class.pecb-sidebar__toggle--collapsed]=\"collapsed()\"\n (click)=\"toggleCollapse()\"\n [attr.aria-label]=\"collapsed() ? 'Expand sidebar' : 'Collapse sidebar'\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Header Section -->\n @if (showHeader()) {\n <div class=\"pecb-sidebar__header\">\n <ng-content select=\"[sidebar-header]\"></ng-content>\n @if (logoSrc() || sidebarLogo() || collapsedLogo()) {\n <div class=\"pecb-sidebar__header-content\">\n @if (logoSrc()) {\n <img class=\"pecb-sidebar__logo\" [src]=\"logoSrc()\" alt=\"Logo\" />\n } @else if (sidebarLogo()) {\n <span class=\"pecb-sidebar__logo\" [innerHTML]=\"getSafeIcon(sidebarLogo()!)\"></span>\n }\n @if (collapsedLogo()) {\n <span class=\"pecb-sidebar__logo-collapsed\" [innerHTML]=\"getSafeIcon(collapsedLogo()!)\"></span>\n }\n </div>\n }\n </div>\n }\n\n <!-- Navigation Sections -->\n <nav class=\"pecb-sidebar__nav\">\n @for (section of sections(); track section.id) {\n <div class=\"pecb-sidebar__section\">\n <!-- Section Title -->\n @if (section.title) {\n <div class=\"pecb-sidebar__section-title\">\n {{ section.title }}\n </div>\n }\n\n <!-- Menu Items -->\n <ul class=\"pecb-sidebar__menu\">\n @for (item of section.items; track item.id) {\n <li>\n <!-- Parent Item -->\n <a\n [class]=\"getItemClasses(item).join(' ')\"\n [attr.href]=\"item.route || '#'\"\n [attr.title]=\"collapsed() ? item.label : null\"\n (click)=\"onItemClick(item, $event)\"\n >\n @if (item.icon) {\n <span class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(item.icon)\"></span>\n }\n <span class=\"pecb-sidebar__label\">{{ item.label }}</span>\n </a>\n\n <!-- Child Items -->\n @if (item.children && item.children.length > 0 && !collapsed()) {\n <ul\n class=\"pecb-sidebar__submenu\"\n [class.pecb-sidebar__submenu--open]=\"item.expanded\"\n >\n @for (child of item.children; track child.id) {\n <li>\n <a\n [class]=\"getItemClasses(child, true, false).join(' ')\"\n [attr.href]=\"child.route || '#'\"\n (click)=\"onItemClick(child, $event)\"\n >\n @if (child.icon) {\n <span class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(child.icon)\"></span>\n }\n <span class=\"pecb-sidebar__label\">{{ child.label }}</span>\n @if (child.children && child.children.length > 0) {\n <span\n class=\"pecb-sidebar__arrow\"\n [class.pecb-sidebar__arrow--expanded]=\"child.expanded\"\n >\n <!-- Minus icon (expanded) -->\n @if (child.expanded) {\n <svg width=\"12\" height=\"10\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path d=\"M10.35 4.80005L0.75 4.80005\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n }\n <!-- Plus icon (collapsed) -->\n @if (!child.expanded) {\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M5.55 0.75L5.55 10.35M10.35 5.55L0.75 5.55\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n }\n </span>\n }\n </a>\n\n <!-- Nested Child Items (Third Level) -->\n @if (child.children && child.children.length > 0) {\n <ul\n class=\"pecb-sidebar__submenu\"\n [class.pecb-sidebar__submenu--open]=\"child.expanded\"\n >\n @for (nestedChild of child.children; track nestedChild.id) {\n <li>\n <a\n [class]=\"getItemClasses(nestedChild, true, true).join(' ')\"\n [attr.href]=\"nestedChild.route || '#'\"\n (click)=\"onItemClick(nestedChild, $event)\"\n >\n <span class=\"pecb-sidebar__label\">{{ nestedChild.label }}</span>\n </a>\n </li>\n }\n </ul>\n }\n </li>\n }\n </ul>\n }\n </li>\n }\n </ul>\n </div>\n }\n </nav>\n\n <!-- Footer Section -->\n @if (showFooter()) {\n <div class=\"pecb-sidebar__footer\">\n <ng-content select=\"[sidebar-footer]\"></ng-content>\n </div>\n }\n\n <!-- Collapsed Menu Popup -->\n @if (collapsed() && activePopupItem()) {\n <div\n class=\"pecb-sidebar__popup\"\n [style.top.px]=\"popupTopPosition()\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"pecb-sidebar__popup-header\">\n {{ activePopupItem()?.label }}\n </div>\n <ul class=\"pecb-sidebar__popup-menu\">\n @for (child of activePopupItem()!.children!; track child.id) {\n <li>\n <!-- Child Item -->\n <a\n [class]=\"'pecb-sidebar__popup-item ' + ((child.active || child.expanded) ? 'pecb-sidebar__popup-item--active' : '')\"\n [attr.href]=\"child.route || '#'\"\n (click)=\"onPopupItemClick(child, $event)\"\n >\n {{ child.label }}\n <!-- Plus/Minus icon for items with nested children -->\n @if (child.children && child.children.length > 0) {\n <span class=\"pecb-sidebar__popup-icon\">\n <!-- Minus icon when expanded -->\n @if (child.expanded) {\n <svg width=\"12\" height=\"10\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path d=\"M10.35 4.80005L0.75 4.80005\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n }\n <!-- Plus icon when collapsed -->\n @if (!child.expanded) {\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M5.55 0.75L5.55 10.35M10.35 5.55L0.75 5.55\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n }\n </span>\n }\n </a>\n\n <!-- Nested Children (3rd level) - Only show when expanded -->\n @if (child.children && child.children.length > 0 && child.expanded) {\n <ul class=\"pecb-sidebar__popup-submenu\">\n @for (nestedChild of child.children; track nestedChild.id) {\n <li>\n <a\n [class]=\"'pecb-sidebar__popup-subitem ' + (nestedChild.active ? 'pecb-sidebar__popup-subitem--active' : '')\"\n [attr.href]=\"nestedChild.route || '#'\"\n (click)=\"onItemClick(nestedChild, $event); closePopup()\"\n >\n {{ nestedChild.label }}\n </a>\n </li>\n }\n </ul>\n }\n </li>\n }\n </ul>\n </div>\n }\n</aside>\n\n<!-- Overlay to close popup when clicking outside -->\n@if (collapsed() && activePopupItem()) {\n <div\n class=\"pecb-sidebar__overlay\"\n (click)=\"closePopup()\"\n ></div>\n}\n","import {\n Component,\n input,\n output,\n model,\n effect,\n OnDestroy,\n AfterViewInit,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild\n} from '@angular/core';\nimport { generateUniqueId, trapFocus, disableBodyScroll } from '../../shared/utils/dom.utils';\n\nexport type ConfirmationIconType = 'success' | 'warning' | 'error' | 'info';\n\n@Component({\n selector: 'pecb-confirmation',\n imports: [],\n templateUrl: './confirmation.component.html',\n styleUrls: ['./confirmation.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ConfirmationComponent implements OnDestroy, AfterViewInit {\n id = input(generateUniqueId('confirmation'));\n /**\n * Whether the dialog is visible. Manages its own state internally —\n * no consumer binding required. Supports [(isOpen)] for controlled mode.\n */\n isOpen = model(false);\n title = input('Confirmation');\n message = input('');\n confirmText = input('Yes');\n cancelText = input('No');\n iconType = input<ConfirmationIconType>('success');\n showCloseButton = input(true);\n closeOnBackdropClick = input(true);\n closeOnEscape = input(true);\n ariaLabel = input<string | undefined>(undefined);\n ariaDescribedBy = input<string | undefined>(undefined);\n\n confirmed = output<void>();\n cancelled = output<void>();\n closed = output<void>();\n\n @ViewChild('dialogPanel') dialogPanel!: ElementRef<HTMLElement>;\n\n private cleanupFocusTrap: (() => void) | null = null;\n private cleanupBodyScroll: (() => void) | null = null;\n private previousActiveElement: Element | null = null;\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.onOpen();\n } else {\n this.cleanup();\n }\n });\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen()) {\n this.setupFocusTrap();\n }\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n get dialogClasses(): string[] {\n return [\n 'pecb-confirmation',\n this.isOpen() ? 'pecb-confirmation--open' : ''\n ].filter(Boolean);\n }\n\n get iconContainerClass(): string {\n return `pecb-confirmation__icon pecb-confirmation__icon--${this.iconType()}`;\n }\n\n get titleId(): string {\n return `${this.id()}-title`;\n }\n\n get messageId(): string {\n return `${this.id()}-message`;\n }\n\n onBackdropClick(event: MouseEvent): void {\n if (this.closeOnBackdropClick() && event.target === event.currentTarget) {\n this.close();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.closeOnEscape() && event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }\n\n onConfirm(): void {\n this.confirmed.emit();\n this.close();\n }\n\n onCancel(): void {\n this.cancelled.emit();\n this.close();\n }\n\n close(): void {\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n private onOpen(): void {\n this.previousActiveElement = document.activeElement;\n this.cleanupBodyScroll = disableBodyScroll();\n this.setupFocusTrap();\n }\n\n private setupFocusTrap(): void {\n if (this.dialogPanel?.nativeElement && !this.cleanupFocusTrap) {\n this.cleanupFocusTrap = trapFocus(this.dialogPanel.nativeElement);\n }\n }\n\n private cleanup(): void {\n if (this.cleanupFocusTrap) {\n this.cleanupFocusTrap();\n this.cleanupFocusTrap = null;\n }\n if (this.cleanupBodyScroll) {\n this.cleanupBodyScroll();\n this.cleanupBodyScroll = null;\n }\n if (this.previousActiveElement instanceof HTMLElement) {\n this.previousActiveElement.focus();\n }\n }\n}\n","@if (isOpen()) {\n <div\n [id]=\"id()\"\n [class]=\"dialogClasses.join(' ')\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"message() ? messageId : ariaDescribedBy() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (click)=\"onBackdropClick($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n <div\n #dialogPanel\n class=\"pecb-confirmation__panel\"\n tabindex=\"-1\"\n >\n \n @if (showCloseButton()) {\n <div class=\"pecb-confirmation__header\">\n <button\n type=\"button\"\n class=\"pecb-confirmation__close-btn\"\n aria-label=\"Close dialog\"\n (click)=\"close()\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M9 1L1 9M1 1L9 9\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n }\n\n \n <div [class]=\"iconContainerClass\" aria-hidden=\"true\">\n @switch (iconType()) {\n @case ('success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\">\n <path d=\"M0 12C0 5.37258 5.37258 0 12 0H52C58.6274 0 64 5.37258 64 12V52C64 58.6274 58.6274 64 52 64H12C5.37258 64 0 58.6274 0 52V12Z\" fill=\"#E6F4EA\"/>\n <circle cx=\"31.8243\" cy=\"31.8243\" r=\"18.2857\" fill=\"white\"/>\n <path d=\"M31.9991 9.84625C19.7635 9.84625 9.84521 19.7645 9.84521 32.0001C9.84521 44.2357 19.7635 54.1539 31.9991 54.1539C44.2347 54.1539 54.1529 44.2357 54.1529 32.0001C54.1426 19.7645 44.2244 9.84625 31.9991 9.84625ZM43.8227 26.3458L31.8137 41.3725C31.2781 42.0316 30.4954 42.4436 29.6508 42.4951C29.5993 42.4951 29.5375 42.4951 29.486 42.4951C28.693 42.4951 27.9308 42.1861 27.3747 41.6197L20.3917 34.6367C19.2279 33.4729 19.2279 31.5778 20.3917 30.414C21.5555 29.2502 23.4506 29.2502 24.6144 30.414L29.2285 35.0281L39.1571 22.6174C40.187 21.33 42.0615 21.1137 43.3592 22.1539C44.6466 23.1736 44.8526 25.0584 43.8227 26.3458Z\" fill=\"#57BC57\"/>\n </svg>\n }\n @case ('warning') {\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0 12C0 5.37258 5.37258 0 12 0H52C58.6274 0 64 5.37258 64 12V52C64 58.6274 58.6274 64 52 64H12C5.37258 64 0 58.6274 0 52V12Z\" fill=\"#FFF4E5\"/>\n <circle cx=\"32.5303\" cy=\"32.5281\" r=\"18.989\" fill=\"white\"/>\n <path d=\"M32.0012 9.84668C44.2362 9.84668 54.1543 19.765 54.1545 32C54.1545 44.2352 44.2364 54.1543 32.0012 54.1543C19.766 54.1543 9.8479 44.2352 9.8479 32C9.84815 19.765 19.7662 9.84668 32.0012 9.84668ZM32.0823 40.2266C30.0029 40.2266 28.3108 41.9187 28.3108 43.998C28.5007 48.9935 35.6636 48.9922 35.8528 43.998C35.8528 41.9188 34.1615 40.2266 32.0823 40.2266ZM35.7727 18.9727C33.9014 16.6513 30.1067 16.6501 28.2346 18.9727C27.2974 20.0886 26.9044 21.5514 27.1555 22.9863C27.9048 27.2673 28.9622 33.3099 29.4368 36.0234C29.9687 38.8793 34.0404 38.8785 34.5715 36.0234L36.8528 22.9863C37.1039 21.5514 36.7101 20.0887 35.7727 18.9727Z\" fill=\"#FF9C4A\"/>\n </svg>\n }\n @case ('error') {\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0 12C0 5.37258 5.37258 0 12 0H52C58.6274 0 64 5.37258 64 12V52C64 58.6274 58.6274 64 52 64H12C5.37258 64 0 58.6274 0 52V12Z\" fill=\"#FDECEA\"/>\n <circle cx=\"31.8243\" cy=\"31.8243\" r=\"18.2857\" fill=\"white\"/>\n <path d=\"M47.6652 16.3349C56.3168 24.9865 56.3168 39.0136 47.6652 47.6652C39.0136 56.3168 24.9865 56.3168 16.3349 47.6652C7.68329 39.0136 7.68329 24.9865 16.3349 16.3349C24.9865 7.68329 39.0136 7.68329 47.6652 16.3349ZM40.2677 22.862C39.3666 21.9609 37.9053 21.9609 37.0042 22.862L31.4561 28.4101C31.2759 28.5903 30.9836 28.5903 30.8034 28.4101L25.2553 22.862C24.3542 21.9609 22.8929 21.9609 21.9918 22.862C21.0906 23.7632 21.0906 25.2245 21.9918 26.1256L27.5398 31.6737C27.7201 31.8539 27.7201 32.1462 27.5398 32.3264L21.9918 37.8745C21.0906 38.7756 21.0906 40.2369 21.9918 41.138C22.8929 42.0392 24.3542 42.0392 25.2553 41.138L30.8034 35.59C30.9836 35.4097 31.2759 35.4097 31.4561 35.59L37.0042 41.138C37.9053 42.0392 39.3666 42.0392 40.2677 41.138C41.1689 40.2369 41.1689 38.7756 40.2677 37.8745L34.7197 32.3264C34.5394 32.1462 34.5394 31.8539 34.7197 31.6737L40.2677 26.1256C41.1689 25.2245 41.1689 23.7632 40.2677 22.862Z\" fill=\"#FF606F\"/>\n </svg>\n }\n @case ('info') {\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0 12C0 5.37258 5.37258 0 12 0H52C58.6274 0 64 5.37258 64 12V52C64 58.6274 58.6274 64 52 64H12C5.37258 64 0 58.6274 0 52V12Z\" fill=\"#E6F0FA\"/>\n <circle cx=\"32.5283\" cy=\"32.5281\" r=\"18.989\" fill=\"white\"/>\n <path d=\"M31.9995 9.84668C44.2348 9.84668 54.1534 19.7653 54.1534 32.0005C54.1534 44.2358 44.2348 54.1544 31.9995 54.1544C19.7643 54.1544 9.8457 44.2358 9.8457 32.0005C9.8457 19.7653 19.7643 9.84668 31.9995 9.84668ZM28.3072 26.0943C26.8347 26.0945 25.8457 27.0832 25.8457 28.5558C25.8459 30.0282 26.8349 31.0171 28.3072 31.0174H31.758L28.3072 42.5835C28.0603 43.8088 28.3077 45.2811 29.0488 46.2698C29.7903 47.4952 31.0265 47.9896 32.252 47.9897H36.187C37.67 47.9896 38.6486 47.0112 38.6486 45.5282C38.6484 44.0558 37.6595 43.0668 36.187 43.0666H33.2303L36.681 31.5005C36.9281 30.2751 36.6808 28.8028 35.9395 27.8142C35.1979 26.5886 33.9619 26.0943 32.7363 26.0943H28.3072ZM33.4779 16.0005C31.4387 16.0006 29.7904 17.6488 29.7904 19.688C29.7906 21.7271 31.4388 23.3743 33.4779 23.3743C35.5171 23.3743 37.1652 21.7271 37.1654 19.688C37.1654 17.6488 35.5172 16.0005 33.4779 16.0005Z\" fill=\"#5EACFF\"/>\n </svg>\n }\n }\n </div>\n\n \n <div class=\"pecb-confirmation__content\">\n <h2 [id]=\"titleId\" class=\"pecb-confirmation__title\">{{ title() }}</h2>\n\n @if (message()) {\n <p [id]=\"messageId\" class=\"pecb-confirmation__message\">{{ message() }}</p>\n }\n </div>\n\n \n <div class=\"pecb-confirmation__actions\">\n <button\n type=\"button\"\n class=\"pecb-confirmation__btn pecb-confirmation__btn--confirm\"\n (click)=\"onConfirm()\"\n >\n {{ confirmText() }}\n </button>\n <button\n type=\"button\"\n class=\"pecb-confirmation__btn pecb-confirmation__btn--cancel\"\n (click)=\"onCancel()\"\n >\n {{ cancelText() }}\n </button>\n </div>\n </div>\n </div>\n}\n","import {\n Component,\n input,\n output,\n model,\n effect,\n OnDestroy,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild,\n AfterViewInit\n} from '@angular/core';\nimport { generateUniqueId, trapFocus, disableBodyScroll } from '../../shared/utils/dom.utils';\n\n@Component({\n selector: 'pecb-bottom-sheet',\n imports: [],\n templateUrl: './bottom-sheet.component.html',\n styleUrls: ['./bottom-sheet.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class BottomSheetComponent implements OnDestroy, AfterViewInit {\n id = input(generateUniqueId('bottom-sheet'));\n /**\n * Whether the sheet is visible. Manages its own state internally —\n * no consumer binding required. Supports [(isOpen)] for controlled mode.\n */\n isOpen = model(false);\n title = input('');\n primaryText = input('Primary Button');\n secondaryText = input('Secondary Button');\n showCloseButton = input(true);\n closeOnBackdropClick = input(true);\n closeOnEscape = input(true);\n\n primaryClicked = output<void>();\n secondaryClicked = output<void>();\n closed = output<void>();\n\n @ViewChild('sheetPanel') sheetPanel!: ElementRef<HTMLElement>;\n\n private cleanupFocusTrap: (() => void) | null = null;\n private cleanupBodyScroll: (() => void) | null = null;\n private previousActiveElement: Element | null = null;\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.onOpen();\n } else {\n this.cleanup();\n }\n });\n }\n\n get titleId(): string {\n return `${this.id()}-title`;\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen()) {\n this.setupFocusTrap();\n }\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if (this.closeOnBackdropClick() && event.target === event.currentTarget) {\n this.close();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.closeOnEscape() && event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }\n\n close(): void {\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n private onOpen(): void {\n this.previousActiveElement = document.activeElement;\n this.cleanupBodyScroll = disableBodyScroll();\n this.setupFocusTrap();\n }\n\n private setupFocusTrap(): void {\n if (this.sheetPanel?.nativeElement && !this.cleanupFocusTrap) {\n this.cleanupFocusTrap = trapFocus(this.sheetPanel.nativeElement);\n }\n }\n\n private cleanup(): void {\n if (this.cleanupFocusTrap) {\n this.cleanupFocusTrap();\n this.cleanupFocusTrap = null;\n }\n if (this.cleanupBodyScroll) {\n this.cleanupBodyScroll();\n this.cleanupBodyScroll = null;\n }\n if (this.previousActiveElement instanceof HTMLElement) {\n this.previousActiveElement.focus();\n }\n }\n}\n","@if (isOpen()) {\n <div\n class=\"pecb-bottom-sheet\"\n [id]=\"id()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"titleId\"\n (click)=\"onBackdropClick($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n <div #sheetPanel class=\"pecb-bottom-sheet__panel\" tabindex=\"-1\">\n\n <div class=\"pecb-bottom-sheet__header\">\n <h3 [id]=\"titleId\" class=\"pecb-bottom-sheet__title\">{{ title() }}</h3>\n @if (showCloseButton()) {\n <button\n type=\"button\"\n class=\"pecb-bottom-sheet__close-btn\"\n aria-label=\"Close\"\n (click)=\"close()\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n </div>\n\n <hr class=\"pecb-bottom-sheet__divider\" />\n\n <div class=\"pecb-bottom-sheet__body\">\n <ng-content></ng-content>\n </div>\n\n <hr class=\"pecb-bottom-sheet__divider\" />\n\n <div class=\"pecb-bottom-sheet__footer\">\n <button type=\"button\" class=\"pecb-bottom-sheet__btn pecb-bottom-sheet__btn--primary\" (click)=\"primaryClicked.emit()\">\n {{ primaryText() }}\n </button>\n <button type=\"button\" class=\"pecb-bottom-sheet__btn pecb-bottom-sheet__btn--secondary\" (click)=\"secondaryClicked.emit()\">\n {{ secondaryText() }}\n </button>\n </div>\n\n </div>\n </div>\n}\n","import {\n Component,\n input,\n output,\n model,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ToggleComponent } from '../toggle/toggle.component';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type QuizType =\n | 'Multiple Choice'\n | 'True/False'\n | 'Scenario'\n | 'Essay'\n | string;\n\nexport type AccordionVariant = 'basic' | 'actions';\n\n// ─── AccordionItemComponent ───────────────────────────────────────────────────\n\n/**\n * Large accordion item — used for exam questions / evaluation sections.\n *\n * Works standalone with no consumer state management needed:\n * @example\n * <pecb-accordion-item [number]=\"1\" title=\"Question title\">\n * Body content goes here.\n * </pecb-accordion-item>\n *\n * Supports two-way binding for controlled state:\n * @example\n * <pecb-accordion-item [(isOpen)]=\"expanded\" (editClicked)=\"onEdit()\" (deleteClicked)=\"onDelete()\">\n * Body content goes here.\n * </pecb-accordion-item>\n */\n@Component({\n selector: 'pecb-accordion-item',\n imports: [],\n templateUrl: './accordion-item.component.html',\n styleUrls: ['./accordion.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AccordionItemComponent {\n /** Variant: 'basic' keeps full radius when open, 'actions' changes radius and adds body background */\n variant = input<AccordionVariant>('basic');\n /** Number displayed in the left badge */\n number = input(1);\n /** Show/hide the number badge */\n showNumber = input(true);\n /** Small subtitle text (12px, muted colour) */\n label = input('');\n /** Primary title text (13px, medium weight) */\n title = input('');\n /** Quiz type badge — 'Multiple Choice' | 'True/False' | 'Scenario' | 'Essay'. Leave empty to hide. */\n quizType = input<QuizType>('');\n /**\n * Whether the item is expanded. Manages its own state internally —\n * no consumer binding required. Supports [(isOpen)] for controlled mode.\n */\n isOpen = model(false);\n /** Show/hide the move icon button */\n showMove = input(true);\n /** Show/hide the edit icon button */\n showEdit = input(true);\n /** Show/hide the expand/collapse chevron button */\n showToggleBtn = input(true);\n /** Show/hide the delete icon button */\n showDelete = input(true);\n\n moveClicked = output<void>();\n editClicked = output<void>();\n deleteClicked = output<void>();\n\n toggle(): void {\n this.isOpen.set(!this.isOpen());\n }\n}\n\n// ─── AccordionSmallComponent ──────────────────────────────────────────────────\n\n/**\n * Small accordion item — used for language / domain list rows.\n *\n * Works standalone with no consumer state management needed:\n * @example\n * <pecb-accordion-small label=\"English\" parentId=\"519456\">\n * <span pecbLeading>🇬🇧</span>\n * Body content here.\n * </pecb-accordion-small>\n *\n * Supports two-way binding for controlled state:\n * @example\n * <pecb-accordion-small label=\"English\" [(isActive)]=\"active\">\n * <span pecbLeading>🇬🇧</span>\n * </pecb-accordion-small>\n */\n@Component({\n selector: 'pecb-accordion-small',\n imports: [ToggleComponent, FormsModule],\n templateUrl: './accordion-small.component.html',\n styleUrls: ['./accordion.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AccordionSmallComponent {\n /** Main label text */\n label = input('');\n /** Optional metadata value displayed next to the prefix — leave empty to hide */\n parentId = input('');\n /** Prefix text shown before the parentId value */\n metaLabel = input('Parent ID');\n /**\n * Whether the item is expanded. Manages its own state internally —\n * no consumer binding required. Supports [(isActive)] for controlled mode.\n */\n isActive = model(false);\n /** Show/hide the toggle switch */\n showToggle = input(true);\n /** Two-way bindable toggle switch value. Supports [(toggleValue)]. */\n toggleValue = model(false);\n /** Show/hide the download icon */\n showDownload = input(true);\n /** Show/hide the save icon */\n showSave = input(true);\n /** Show/hide the edit icon */\n showEdit = input(true);\n /** Show/hide the delete icon */\n showDelete = input(true);\n /** Show/hide the move icon */\n showMove = input(true);\n\n downloadClicked = output<void>();\n saveClicked = output<void>();\n editClicked = output<void>();\n deleteClicked = output<void>();\n moveClicked = output<void>();\n\n onHeaderClick(): void {\n this.isActive.set(!this.isActive());\n }\n\n /** ngModel bridge for the toggle */\n get toggleChecked(): boolean {\n return this.toggleValue();\n }\n set toggleChecked(value: boolean) {\n this.toggleValue.set(value);\n }\n}\n","<div\n class=\"pecb-accordion-item\"\n [class.pecb-accordion-item--open]=\"isOpen()\"\n [class.pecb-accordion-item--actions]=\"variant() === 'actions'\"\n>\n <!-- Header row -->\n <div class=\"pecb-accordion-item__header\" role=\"button\" [attr.aria-expanded]=\"isOpen()\" tabindex=\"0\" (click)=\"toggle()\" (keydown.enter)=\"toggle()\" (keydown.space)=\"toggle()\">\n @if (showNumber()) {\n <div class=\"pecb-accordion-item__number\" aria-hidden=\"true\">{{ number() }}</div>\n }\n\n <div class=\"pecb-accordion-item__content\">\n @if (quizType()) {\n @switch (quizType()) {\n @case ('Multiple Choice') {\n <div class=\"pecb-accordion-item__badge pecb-accordion-item__badge--multiple-choice\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7.93331 4.59995L4.95018 7.2666L3.93331 6.35762M11.2666 2.59996L11.2666 9.26665C11.2666 10.3712 10.3712 11.2666 9.26664 11.2666H2.59998C1.49541 11.2666 0.599976 10.3712 0.599976 9.26665V2.59996C0.599976 1.4954 1.49541 0.599976 2.59998 0.599976H9.26664C10.3712 0.599976 11.2666 1.4954 11.2666 2.59996Z\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Multiple Choice</span>\n </div>\n }\n @case ('True/False') {\n <div class=\"pecb-accordion-item__badge pecb-accordion-item__badge--true-false\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5.16665 5.16669L10.8333 5.16669C12.3981 5.16669 13.6666 6.43521 13.6666 8.00002C13.6666 9.56483 12.3981 10.8334 10.8333 10.8334L5.16665 10.8334M5.16665 5.16669C3.60184 5.16669 2.33331 6.43521 2.33331 8.00002C2.33331 9.56483 3.60184 10.8334 5.16665 10.8334M5.16665 5.16669C6.73145 5.16669 7.99998 6.43521 7.99998 8.00002C7.99998 9.56483 6.73145 10.8334 5.16665 10.8334\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\n </svg>\n <span>True/False</span>\n </div>\n }\n @case ('Essay') {\n <div class=\"pecb-accordion-item__badge pecb-accordion-item__badge--essay\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10.0001 1.59998V3.99998C10.0001 4.4418 10.3583 4.79998 10.8001 4.79998H13.2001M5.60012 4.79998H7.20012M5.60012 7.19997H10.4001M5.60012 9.59997H10.4001M12.0001 2.79998C11.6441 2.4814 11.2746 2.10356 11.0413 1.85816C10.8861 1.69487 10.6717 1.59998 10.4464 1.59998H4.39993C3.51628 1.59998 2.79993 2.31631 2.79993 3.19997L2.79987 12.7999C2.79986 13.6836 3.5162 14.3999 4.39986 14.3999L11.5999 14.4C12.4835 14.4 13.1999 13.6837 13.1999 12.8L13.2001 4.31853C13.2001 4.11397 13.1221 3.91733 12.9801 3.77006C12.7176 3.49774 12.2792 3.04965 12.0001 2.79998Z\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Essay</span>\n </div>\n }\n @case ('Scenario') {\n <div class=\"pecb-accordion-item__badge pecb-accordion-item__badge--scenario\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5.09998 3.22498L3.22498 3.22498M5.09998 5.47498L3.22498 5.47498M9.97498 3.22498H8.09998M9.97498 5.47498L8.09998 5.47498M5.09998 7.72498H3.22498M5.09998 9.97498H3.22498M0.599976 2.84998L0.599976 10.35C0.599976 11.5926 1.60733 12.6 2.84998 12.6C4.09262 12.6 9.10733 12.6 10.35 12.6C11.5926 12.6 12.6 11.5926 12.6 10.35V2.84998C12.6 1.60733 11.5926 0.599976 10.35 0.599976L2.84998 0.599976C1.60734 0.599976 0.599976 1.60733 0.599976 2.84998Z\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Scenario</span>\n </div>\n }\n @default {\n <div class=\"pecb-accordion-item__badge pecb-accordion-item__badge--multiple-choice\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7.93331 4.59995L4.95018 7.2666L3.93331 6.35762M11.2666 2.59996L11.2666 9.26665C11.2666 10.3712 10.3712 11.2666 9.26664 11.2666H2.59998C1.49541 11.2666 0.599976 10.3712 0.599976 9.26665V2.59996C0.599976 1.4954 1.49541 0.599976 2.59998 0.599976H9.26664C10.3712 0.599976 11.2666 1.4954 11.2666 2.59996Z\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ quizType() }}</span>\n </div>\n }\n }\n }\n @if (label()) {\n <p class=\"pecb-accordion-item__label\">{{ label() }}</p>\n }\n @if (title()) {\n <p class=\"pecb-accordion-item__title\">{{ title() }}</p>\n }\n </div>\n\n <div class=\"pecb-accordion-item__actions\" (click)=\"$event.stopPropagation()\">\n @if (showMove()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-item__action-btn\"\n aria-label=\"Move\"\n (click)=\"moveClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 12h18M3 6h18M3 18h18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n @if (showEdit()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-item__action-btn\"\n aria-label=\"Edit\"\n (click)=\"editClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n @if (showToggleBtn()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-item__action-btn\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-label=\"Toggle expand\"\n (click)=\"toggle()\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n class=\"pecb-accordion-item__chevron\"\n [class.pecb-accordion-item__chevron--up]=\"isOpen()\"\n >\n <polyline points=\"6 9 12 15 18 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n @if (showDelete()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-item__action-btn pecb-accordion-item__action-btn--danger\"\n aria-label=\"Delete\"\n (click)=\"deleteClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n </div>\n </div>\n\n <!-- Body panel — animated via CSS grid -->\n <div class=\"pecb-accordion-item__body-wrap\" [attr.aria-hidden]=\"!isOpen()\">\n <div class=\"pecb-accordion-item__body\">\n <div class=\"pecb-accordion-item__body-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n","<div\n class=\"pecb-accordion-small\"\n [class.pecb-accordion-small--active]=\"isActive()\"\n>\n <!-- Header row -->\n <div class=\"pecb-accordion-small__header\">\n <div class=\"pecb-accordion-small__main\" (click)=\"onHeaderClick()\" role=\"button\" [attr.aria-expanded]=\"isActive()\" tabindex=\"0\" (keydown.enter)=\"onHeaderClick()\" (keydown.space)=\"onHeaderClick()\">\n <ng-content select=\"[pecbLeading]\"></ng-content>\n <span class=\"pecb-accordion-small__label\">{{ label() }}</span>\n </div>\n\n <div class=\"pecb-accordion-small__actions\">\n @if (parentId()) {\n <span class=\"pecb-accordion-small__parent-id\">{{ metaLabel() }}: {{ parentId() }}</span>\n }\n\n @if (showToggle()) {\n <pecb-toggle [(ngModel)]=\"toggleChecked\"></pecb-toggle>\n }\n\n @if (showDownload()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-small__action-btn\"\n aria-label=\"Download\"\n (click)=\"downloadClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"7 10 12 15 17 10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n @if (showSave()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-small__action-btn\"\n aria-label=\"Save\"\n (click)=\"saveClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"17 21 17 13 7 13 7 21\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"7 3 7 8 15 8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n @if (showEdit()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-small__action-btn\"\n aria-label=\"Edit\"\n (click)=\"editClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n @if (showDelete()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-small__action-btn pecb-accordion-small__action-btn--danger\"\n aria-label=\"Delete\"\n (click)=\"deleteClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n @if (showMove()) {\n <button\n type=\"button\"\n class=\"pecb-accordion-small__action-btn\"\n aria-label=\"Move\"\n (click)=\"moveClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 12h18M3 6h18M3 18h18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n </div>\n </div>\n\n <!-- Body panel — animated via CSS grid -->\n <div class=\"pecb-accordion-small__body-wrap\" [attr.aria-hidden]=\"!isActive()\">\n <div class=\"pecb-accordion-small__body\">\n <div class=\"pecb-accordion-small__body-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n","import {\n Component,\n inject,\n computed,\n input,\n output,\n model,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nexport type ButtonGroupItemPosition = 'first' | 'middle' | 'last' | 'more';\nexport type ButtonGroupIconMode = 'both' | 'leading' | 'trailing' | 'none';\n\n@Component({\n selector: 'pecb-button-group-item',\n imports: [],\n templateUrl: './button-group-item.component.html',\n styleUrls: ['./button-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ButtonGroupItemComponent {\n private sanitizer = inject(DomSanitizer);\n\n label = input('Button');\n position = input<ButtonGroupItemPosition>('middle');\n /** Custom SVG string for the leading icon. When set, overrides the default chevron. */\n leadingIconSvg = input('');\n /** Custom SVG string for the trailing icon. When set, overrides the default chevron. */\n trailingIconSvg = input('');\n\n safeLeadingIconSvg = computed(() => this.sanitizer.bypassSecurityTrustHtml(this.leadingIconSvg()));\n safeTrailingIconSvg = computed(() => this.sanitizer.bypassSecurityTrustHtml(this.trailingIconSvg()));\n /**\n * Whether this item is selected/active. Manages its own state internally —\n * no consumer binding required. Supports [(selected)] for controlled mode.\n */\n selected = model(false);\n disabled = input(false);\n iconMode = input<ButtonGroupIconMode>('none');\n\n clicked = output<void>();\n\n onClick(): void {\n if (!this.disabled()) {\n this.selected.set(!this.selected());\n this.clicked.emit();\n }\n }\n\n get hostClasses(): string {\n return [\n 'pecb-button-group-item',\n `pecb-button-group-item--${this.position()}`,\n this.selected() ? 'pecb-button-group-item--selected' : '',\n this.disabled() ? 'pecb-button-group-item--disabled' : '',\n ].filter(Boolean).join(' ');\n }\n}\n\n@Component({\n selector: 'pecb-button-group',\n imports: [],\n template: `\n <div class=\"pecb-button-group\" role=\"group\" [attr.aria-label]=\"ariaLabel() || null\">\n <ng-content></ng-content>\n </div>\n `,\n styleUrls: ['./button-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ButtonGroupComponent {\n ariaLabel = input<string | undefined>(undefined);\n}\n","<button\n type=\"button\"\n [class]=\"hostClasses\"\n [disabled]=\"disabled()\"\n [attr.aria-pressed]=\"selected()\"\n (click)=\"onClick()\"\n>\n @if (iconMode() === 'both' || iconMode() === 'leading') {\n @if (leadingIconSvg()) {\n <span class=\"pecb-button-group-item__icon\" [innerHTML]=\"safeLeadingIconSvg()\" aria-hidden=\"true\"></span>\n } @else {\n <svg\n class=\"pecb-button-group-item__icon\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n }\n\n <span class=\"pecb-button-group-item__label\">{{ label() }}</span>\n\n @if (iconMode() === 'both' || iconMode() === 'trailing') {\n @if (trailingIconSvg()) {\n <span class=\"pecb-button-group-item__icon\" [innerHTML]=\"safeTrailingIconSvg()\" aria-hidden=\"true\"></span>\n } @else {\n <svg\n class=\"pecb-button-group-item__icon\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M7.5 5L12.5 10L7.5 15\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n }\n</button>\n","import {\n Component,\n input,\n output,\n model,\n ChangeDetectionStrategy\n} from '@angular/core';\n\nexport type TooltipPointerPosition =\n | 'top-left' | 'top-center' | 'top-right'\n | 'bottom-left' | 'bottom-center' | 'bottom-right'\n | 'left-top' | 'left-center' | 'left-bottom'\n | 'right-top' | 'right-center' | 'right-bottom';\n\nexport type TooltipTheme = 'dark' | 'light';\n\n@Component({\n selector: 'pecb-tooltip',\n imports: [],\n templateUrl: './tooltip.component.html',\n styleUrls: ['./tooltip.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TooltipComponent {\n title = input('');\n message = input('');\n pointerPosition = input<TooltipPointerPosition>('top-left');\n theme = input<TooltipTheme>('dark');\n primaryCta = input<string | undefined>(undefined);\n secondaryCta = input<string | undefined>(undefined);\n showClose = input(true);\n /**\n * Whether the tooltip is visible. Manages its own state internally —\n * no consumer binding required. Supports [(visible)] for controlled mode.\n */\n visible = model(true);\n\n closed = output<void>();\n primaryCtaClick = output<void>();\n secondaryCtaClick = output<void>();\n\n close(): void {\n this.visible.set(false);\n this.closed.emit();\n }\n\n get hasButtons(): boolean {\n return !!(this.primaryCta() || this.secondaryCta());\n }\n\n get pointerSide(): 'top' | 'bottom' | 'left' | 'right' {\n return this.pointerPosition().split('-')[0] as 'top' | 'bottom' | 'left' | 'right';\n }\n\n /** SVG fill for the outer (border) triangle layer */\n get ptrBorderFill(): string {\n return this.theme() === 'light' ? '#ececec' : 'none';\n }\n\n /** SVG fill for the inner (body) triangle layer */\n get ptrBodyFill(): string {\n return this.theme() === 'light' ? '#ffffff' : '#313131';\n }\n\n get hostClasses(): string {\n return [\n 'pecb-tooltip',\n `pecb-tooltip--${this.theme()}`,\n `pecb-tooltip--${this.pointerPosition()}`\n ].join(' ');\n }\n}\n","@if (visible()) {\n <div [class]=\"hostClasses\">\n\n <!-- ── Pointer TOP (above container) ──────────────────────────────── -->\n @if (pointerSide === 'top') {\n <div class=\"pecb-tooltip__pointer pecb-tooltip__pointer--top\">\n <svg width=\"20\" height=\"12\" viewBox=\"0 0 20 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path [attr.fill]=\"ptrBorderFill\" d=\"M0 12L10 0L20 12Z\"/>\n <path [attr.fill]=\"ptrBodyFill\" d=\"M1.8 12L10 1.8L18.2 12Z\"/>\n </svg>\n </div>\n }\n\n <!-- ── Pointer LEFT (left of container) ───────────────────────────── -->\n @if (pointerSide === 'left') {\n <div class=\"pecb-tooltip__pointer pecb-tooltip__pointer--left\">\n <svg width=\"12\" height=\"20\" viewBox=\"0 0 12 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path [attr.fill]=\"ptrBorderFill\" d=\"M12 0L0 10L12 20Z\"/>\n <path [attr.fill]=\"ptrBodyFill\" d=\"M12 1.8L1.8 10L12 18.2Z\"/>\n </svg>\n </div>\n }\n\n <!-- ── Main container ─────────────────────────────────────────────── -->\n <div class=\"pecb-tooltip__container\">\n <div class=\"pecb-tooltip__body\">\n\n <div class=\"pecb-tooltip__content\">\n <div class=\"pecb-tooltip__texts\">\n @if (title()) {\n <p class=\"pecb-tooltip__title\">{{ title() }}</p>\n }\n <p class=\"pecb-tooltip__message\">{{ message() }}</p>\n </div>\n\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"pecb-tooltip__close\"\n aria-label=\"Close tooltip\"\n (click)=\"close()\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path class=\"pecb-tooltip__close-icon\" d=\"M15 5L5 15M5 5L15 15\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n </div>\n\n @if (hasButtons) {\n <div class=\"pecb-tooltip__buttons\">\n @if (secondaryCta()) {\n <button type=\"button\" class=\"pecb-tooltip__btn pecb-tooltip__btn--secondary\" (click)=\"secondaryCtaClick.emit()\">{{ secondaryCta() }}</button>\n }\n @if (primaryCta()) {\n <button type=\"button\" class=\"pecb-tooltip__btn pecb-tooltip__btn--primary\" (click)=\"primaryCtaClick.emit()\">{{ primaryCta() }}</button>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ── Pointer RIGHT (right of container) ─────────────────────────── -->\n @if (pointerSide === 'right') {\n <div class=\"pecb-tooltip__pointer pecb-tooltip__pointer--right\">\n <svg width=\"12\" height=\"20\" viewBox=\"0 0 12 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path [attr.fill]=\"ptrBorderFill\" d=\"M0 0L12 10L0 20Z\"/>\n <path [attr.fill]=\"ptrBodyFill\" d=\"M0 1.8L10.2 10L0 18.2Z\"/>\n </svg>\n </div>\n }\n\n <!-- ── Pointer BOTTOM (below container) ───────────────────────────── -->\n @if (pointerSide === 'bottom') {\n <div class=\"pecb-tooltip__pointer pecb-tooltip__pointer--bottom\">\n <svg width=\"20\" height=\"12\" viewBox=\"0 0 20 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path [attr.fill]=\"ptrBorderFill\" d=\"M0 0L10 12L20 0Z\"/>\n <path [attr.fill]=\"ptrBodyFill\" d=\"M1.8 0L10 10.2L18.2 0Z\"/>\n </svg>\n </div>\n }\n\n </div>\n}\n","import {\n Directive,\n ElementRef,\n HostListener,\n ApplicationRef,\n ComponentRef,\n EnvironmentInjector,\n OnDestroy,\n createComponent,\n inject,\n input,\n output\n} from '@angular/core';\nimport { TooltipComponent, TooltipPointerPosition, TooltipTheme } from './tooltip.component';\n\nconst GAP = 2; // px gap between tooltip pointer tip and the host element\n\n@Directive({\n selector: '[pecbTooltip]',\n standalone: true\n})\nexport class TooltipDirective implements OnDestroy {\n /** Tooltip body message */\n pecbTooltip = input('');\n /** Optional bold title above the message */\n tooltipTitle = input('');\n /** dark (default) or light */\n tooltipTheme = input<TooltipTheme>('dark');\n /** Where the pointer arrow appears relative to the tooltip body */\n tooltipPosition = input<TooltipPointerPosition>('top-left');\n /** hover (default) or click */\n tooltipTrigger = input<'hover' | 'click'>('hover');\n /** Optional primary CTA label (red link) */\n tooltipPrimaryCta = input('');\n /** Optional secondary CTA label (muted link) */\n tooltipSecondaryCta = input('');\n\n /** Emits when the primary CTA is clicked */\n tooltipPrimaryCtaClick = output<void>();\n /** Emits when the secondary CTA is clicked */\n tooltipSecondaryCtaClick = output<void>();\n\n private el = inject(ElementRef<HTMLElement>);\n private appRef = inject(ApplicationRef);\n private injector = inject(EnvironmentInjector);\n private ref?: ComponentRef<TooltipComponent>;\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.tooltipTrigger() === 'hover') this.show();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.tooltipTrigger() === 'hover') this.hide();\n }\n\n @HostListener('click')\n onClick(): void {\n if (this.tooltipTrigger() === 'click') {\n this.ref ? this.hide() : this.show();\n }\n }\n\n ngOnDestroy(): void {\n this.hide();\n }\n\n /** Flip the side so the arrow points back toward the trigger element. */\n private invertedPointerPosition(): TooltipPointerPosition {\n const pos = this.tooltipPosition();\n const [side, align] = pos.split('-');\n const flipped: Record<string, string> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n return `${flipped[side]}-${align}` as TooltipPointerPosition;\n }\n\n private show(): void {\n if (this.ref) return;\n\n this.ref = createComponent(TooltipComponent, { environmentInjector: this.injector });\n this.ref.setInput('message', this.pecbTooltip());\n this.ref.setInput('title', this.tooltipTitle());\n this.ref.setInput('theme', this.tooltipTheme());\n // Invert the side so the arrow points TOWARD the trigger.\n // e.g. tooltipPosition='top-left' places tooltip ABOVE → arrow must be at bottom → 'bottom-left'\n this.ref.setInput('pointerPosition', this.invertedPointerPosition());\n this.ref.setInput('primaryCta', this.tooltipPrimaryCta());\n this.ref.setInput('secondaryCta', this.tooltipSecondaryCta());\n this.ref.setInput('showClose', this.tooltipTrigger() === 'click');\n\n // Subscribe to close output so click-trigger tooltips can self-close\n this.ref.instance.closed.subscribe(() => this.hide());\n this.ref.instance.primaryCtaClick.subscribe(() => this.tooltipPrimaryCtaClick.emit());\n this.ref.instance.secondaryCtaClick.subscribe(() => this.tooltipSecondaryCtaClick.emit());\n\n this.appRef.attachView(this.ref.hostView);\n document.body.appendChild(this.ref.location.nativeElement);\n this.ref.changeDetectorRef.detectChanges();\n this.position();\n }\n\n private hide(): void {\n if (!this.ref) return;\n this.appRef.detachView(this.ref.hostView);\n this.ref.destroy();\n this.ref = undefined;\n }\n\n private position(): void {\n if (!this.ref) return;\n\n const tooltipEl = this.ref.location.nativeElement as HTMLElement;\n const host = this.el.nativeElement.getBoundingClientRect();\n const pos = this.tooltipPosition();\n const [side, align] = pos.split('-') as [string, string];\n\n tooltipEl.style.position = 'fixed';\n tooltipEl.style.zIndex = '9999';\n\n // ── Vertical ─────────────────────────────────────────────────────────────\n // \"top-*\" → tooltip appears ABOVE the trigger\n // \"bottom-*\" → tooltip appears BELOW the trigger\n if (side === 'top') {\n tooltipEl.style.bottom = `${window.innerHeight - host.top + GAP}px`;\n } else if (side === 'bottom') {\n tooltipEl.style.top = `${host.bottom + GAP}px`;\n } else {\n // left / right: vertical alignment along the host\n if (align === 'top') {\n tooltipEl.style.top = `${host.top}px`;\n } else if (align === 'center') {\n tooltipEl.style.top = `${host.top + host.height / 2}px`;\n tooltipEl.style.transform = 'translateY(-50%)';\n } else {\n tooltipEl.style.bottom = `${window.innerHeight - host.bottom}px`;\n }\n }\n\n // ── Horizontal ───────────────────────────────────────────────────────────\n if (side === 'top' || side === 'bottom') {\n if (align === 'left') {\n tooltipEl.style.left = `${host.left}px`;\n } else if (align === 'center') {\n tooltipEl.style.left = `${host.left + host.width / 2}px`;\n tooltipEl.style.transform = 'translateX(-50%)';\n } else {\n // right-aligned: right edge of tooltip = right edge of host\n tooltipEl.style.right = `${window.innerWidth - host.right}px`;\n }\n } else if (side === 'left') {\n // \"left-*\" → tooltip appears to the LEFT of the trigger\n tooltipEl.style.right = `${window.innerWidth - host.left + GAP}px`;\n } else {\n // \"right-*\" → tooltip appears to the RIGHT of the trigger\n tooltipEl.style.left = `${host.right + GAP}px`;\n }\n }\n}\n","import {\n Component,\n input,\n output,\n computed,\n ChangeDetectionStrategy\n} from '@angular/core';\n\nexport type MessageItemStatus = 'default' | 'read' | 'typing' | 'unread' | 'warning';\nexport type MessageBubbleType = 'text' | 'document' | 'audio' | 'image';\nexport type MessageDirection = 'incoming' | 'outgoing';\n\n// ─── Conversation List Item ────────────────────────────────────────────────────\n\n@Component({\n selector: 'pecb-message-item',\n standalone: true,\n imports: [],\n templateUrl: './message-item.component.html',\n styleUrls: ['./messaging.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MessageItemComponent {\n /** Avatar image URL — if empty, falls back to initials */\n avatarSrc = input<string>('');\n /** Explicit initials override — auto-derived from name when empty */\n avatarInitials = input<string>('');\n /** Sender / contact display name */\n name = input<string>('Chelsea Hagon');\n /** Timestamp string, e.g. \"12:30\" */\n time = input<string>('12:30');\n /** Message preview text shown below the name */\n preview = input<string>(\"I'd definitely shoot any opportunities...\");\n /** Visual state of the list item */\n status = input<MessageItemStatus>('default');\n /** Unread badge count — shown when status is \"unread\" */\n unreadCount = input<number>(0);\n /** Whether this item is currently selected / active */\n selected = input<boolean>(false);\n\n /** Emitted when the item is clicked */\n itemClicked = output<void>();\n\n initials = computed<string>(() => {\n const explicit = this.avatarInitials();\n if (explicit) return explicit.substring(0, 2).toUpperCase();\n return (this.name() ?? '')\n .split(' ')\n .map(w => w[0] ?? '')\n .join('')\n .substring(0, 2)\n .toUpperCase();\n });\n\n get hostClasses(): string {\n return [\n 'pecb-message-item',\n this.status() !== 'default' ? `pecb-message-item--${this.status()}` : '',\n this.selected() ? 'pecb-message-item--selected' : ''\n ].filter(Boolean).join(' ');\n }\n}\n\n// ─── Message Bubble ───────────────────────────────────────────────────────────\n\n@Component({\n selector: 'pecb-message-bubble',\n standalone: true,\n imports: [],\n templateUrl: './message-bubble.component.html',\n styleUrls: ['./messaging.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MessageBubbleComponent {\n /** Visual type of the message */\n type = input<MessageBubbleType>('text');\n /** Whether the message was sent by the current user or received */\n direction = input<MessageDirection>('incoming');\n\n // ── Text / content ──────────────────────────────────────────────────────────\n /** Single text message string — alias for passing one item via messages */\n text = input<string>('');\n /**\n * Array of text strings to render as stacked bubbles.\n * When provided, takes precedence over `text`.\n */\n messages = input<string[]>([]);\n\n // ── Sender info ─────────────────────────────────────────────────────────────\n /** Sender display name (shown for incoming) */\n senderName = input<string>('James Daniel');\n /** Timestamp string, e.g. \"4:59 PM\" */\n time = input<string>('4:59 PM');\n /** Show read-receipt checkmark below the bubble (outgoing only) */\n showReadReceipt = input<boolean>(false);\n\n // ── Avatar (incoming only) ───────────────────────────────────────────────────\n /** Avatar image URL */\n avatarSrc = input<string>('');\n /** Explicit initials override — auto-derived from senderName when empty */\n avatarInitials = input<string>('');\n\n // ── Document type ────────────────────────────────────────────────────────────\n /** File name, e.g. \"Filename.pdf\" */\n fileName = input<string>('Filename.pdf');\n /** File metadata string, e.g. \"1 page • PDF • 4MB\" */\n fileMeta = input<string>('1 page • PDF • 4MB');\n /** Thumbnail image URL for document / image types */\n thumbnailSrc = input<string>('');\n\n // ── Audio type ───────────────────────────────────────────────────────────────\n /** Audio duration string, e.g. \"0:30\" */\n audioDuration = input<string>('0:30');\n /**\n * Custom waveform bar heights (values 1–20).\n * Defaults to a built-in decorative pattern when not supplied.\n */\n waveformData = input<number[]>([]);\n\n // ── Image type ────────────────────────────────────────────────────────────────\n /** Image URL for image-type messages */\n imageSrc = input<string>('');\n /** Alt text for image */\n imageAlt = input<string>('Image attachment');\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n /** Emitted when the download button is clicked (document type, incoming) */\n downloadClicked = output<void>();\n /** Emitted when the play button is clicked (audio type) */\n playClicked = output<void>();\n\n // ── Computed ─────────────────────────────────────────────────────────────────\n\n initials = computed<string>(() => {\n const explicit = this.avatarInitials();\n if (explicit) return explicit.substring(0, 2).toUpperCase();\n return (this.senderName() ?? '')\n .split(' ')\n .map(w => w[0] ?? '')\n .join('')\n .substring(0, 2)\n .toUpperCase();\n });\n\n displayMessages = computed<string[]>(() => {\n const msgs = this.messages();\n if (msgs.length > 0) return msgs;\n const t = this.text();\n return t ? [t] : [];\n });\n\n waveformBars = computed<number[]>(() => {\n const custom = this.waveformData();\n if (custom.length > 0) return custom;\n // Default decorative waveform pattern\n return [4, 8, 6, 12, 9, 15, 7, 10, 14, 6, 12, 8, 5, 16, 9, 11, 7, 13, 8, 5, 14, 10, 6, 12, 9, 7, 11, 8, 15, 6, 10, 9, 5];\n });\n\n get hostClasses(): string {\n return [\n 'pecb-message-bubble',\n `pecb-message-bubble--${this.direction()}`,\n `pecb-message-bubble--${this.type()}`\n ].join(' ');\n }\n\n get senderLabel(): string {\n return this.direction() === 'outgoing' ? 'You' : this.senderName();\n }\n}\n","<div\n [class]=\"hostClasses\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"itemClicked.emit()\"\n (keydown.enter)=\"itemClicked.emit()\"\n (keydown.space)=\"itemClicked.emit()\"\n>\n\n <!-- Avatar -->\n <div class=\"pecb-message-item__avatar\" aria-hidden=\"true\">\n @if (avatarSrc()) {\n <img [src]=\"avatarSrc()\" [alt]=\"name()\" class=\"pecb-message-item__avatar-img\" />\n } @else {\n <span class=\"pecb-message-item__avatar-initials\">{{ initials() }}</span>\n }\n </div>\n\n <!-- Content -->\n <div class=\"pecb-message-item__content\">\n\n <!-- Header row: name + timestamp -->\n <div class=\"pecb-message-item__header\">\n <span class=\"pecb-message-item__name\">{{ name() }}</span>\n <span class=\"pecb-message-item__time\">{{ time() }}</span>\n </div>\n\n <!-- Footer row: preview / typing + status indicator -->\n <div class=\"pecb-message-item__footer\">\n\n @if (status() === 'typing') {\n <span class=\"pecb-message-item__typing\">is typing\n <span class=\"pecb-message-item__typing-dots\" aria-hidden=\"true\">\n <span></span><span></span><span></span>\n </span>\n </span>\n } @else {\n <span class=\"pecb-message-item__preview\">{{ preview() }}</span>\n }\n\n <!-- Status indicator -->\n @if (status() === 'unread' && unreadCount() > 0) {\n <span class=\"pecb-message-item__badge\" aria-label=\"{{ unreadCount() }} unread messages\">\n {{ unreadCount() }}\n </span>\n } @else if (status() === 'warning') {\n <span class=\"pecb-message-item__status-icon pecb-message-item__status-icon--warning\" aria-label=\"Warning\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.25\"/>\n <path d=\"M8 4.5V8.5\" stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\"/>\n <circle cx=\"8\" cy=\"11\" r=\"0.75\" fill=\"currentColor\"/>\n </svg>\n </span>\n } @else if (status() === 'read') {\n <span class=\"pecb-message-item__status-icon pecb-message-item__status-icon--read\" aria-label=\"Read\">\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M1 5L5 9L13 1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n }\n\n </div>\n </div>\n\n</div>\n","<div [class]=\"hostClasses\">\n\n <!-- Avatar — incoming messages only -->\n @if (direction() === 'incoming') {\n <div class=\"pecb-message-bubble__avatar\" aria-hidden=\"true\">\n @if (avatarSrc()) {\n <img [src]=\"avatarSrc()\" [alt]=\"senderName()\" class=\"pecb-message-bubble__avatar-img\" />\n } @else {\n <span class=\"pecb-message-bubble__avatar-initials\">{{ initials() }}</span>\n }\n </div>\n }\n\n <!-- Content wrapper -->\n <div class=\"pecb-message-bubble__content\">\n\n <!-- ════════════════════════════════════\n TEXT — stacked bubbles\n ════════════════════════════════════ -->\n @if (type() === 'text') {\n <div class=\"pecb-message-bubble__bubbles\">\n @for (msg of displayMessages(); track $index) {\n <div class=\"pecb-message-bubble__bubble pecb-message-bubble__bubble--text\">\n {{ msg }}\n </div>\n }\n </div>\n }\n\n <!-- ════════════════════════════════════\n DOCUMENT\n ════════════════════════════════════ -->\n @if (type() === 'document') {\n <div class=\"pecb-message-bubble__bubble pecb-message-bubble__bubble--document\">\n\n <!-- Thumbnail -->\n @if (thumbnailSrc()) {\n <div class=\"pecb-message-bubble__doc-thumb\">\n <img [src]=\"thumbnailSrc()\" [alt]=\"fileName()\" class=\"pecb-message-bubble__doc-thumb-img\" />\n </div>\n }\n\n <!-- File info row -->\n <div class=\"pecb-message-bubble__doc-row\">\n <!-- File-type icon badge -->\n <span class=\"pecb-message-bubble__doc-icon\" aria-hidden=\"true\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"32\" height=\"32\" rx=\"6\" fill=\"#FFF4E5\"/>\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" rx=\"3\" fill=\"#FFD59E\" fill-opacity=\"0.4\"/>\n <!-- Mountains / image icon -->\n <path d=\"M8 22L13 15L17 19L20 16L24 22H8Z\" fill=\"#FF9C4A\" fill-opacity=\"0.7\"/>\n <circle cx=\"21\" cy=\"13\" r=\"2\" fill=\"#FF9C4A\" fill-opacity=\"0.7\"/>\n </svg>\n </span>\n\n <!-- Name + meta -->\n <div class=\"pecb-message-bubble__doc-info\">\n <span class=\"pecb-message-bubble__doc-name\">{{ fileName() }}</span>\n <span class=\"pecb-message-bubble__doc-meta\">{{ fileMeta() }}</span>\n </div>\n\n <!-- Download action (both directions) -->\n <button\n type=\"button\"\n class=\"pecb-message-bubble__doc-action\"\n aria-label=\"Download {{ fileName() }}\"\n (click)=\"downloadClicked.emit()\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M9 2V12M9 12L5.5 8.5M9 12L12.5 8.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 15H15\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n </div>\n\n </div>\n }\n\n <!-- ════════════════════════════════════\n AUDIO\n ════════════════════════════════════ -->\n @if (type() === 'audio') {\n <div class=\"pecb-message-bubble__bubble pecb-message-bubble__bubble--audio\">\n\n <!-- Play button -->\n <button\n type=\"button\"\n class=\"pecb-message-bubble__play-btn\"\n aria-label=\"Play audio message\"\n (click)=\"playClicked.emit()\"\n >\n <svg width=\"12\" height=\"14\" viewBox=\"0 0 12 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M1 1L11 7L1 13V1Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n\n <!-- Waveform -->\n <div class=\"pecb-message-bubble__waveform\" aria-hidden=\"true\">\n @for (bar of waveformBars(); track $index) {\n <span\n class=\"pecb-message-bubble__waveform-bar\"\n [style.height.px]=\"bar\"\n ></span>\n }\n </div>\n\n <!-- Duration -->\n <span class=\"pecb-message-bubble__duration\">{{ audioDuration() }}</span>\n\n </div>\n }\n\n <!-- ════════════════════════════════════\n IMAGE\n ════════════════════════════════════ -->\n @if (type() === 'image') {\n <div class=\"pecb-message-bubble__bubble pecb-message-bubble__bubble--image\">\n <img\n [src]=\"imageSrc()\"\n [alt]=\"imageAlt()\"\n class=\"pecb-message-bubble__image\"\n />\n </div>\n }\n\n <!-- ════════════════════════════════════\n Footer: sender label + timestamp + read receipt\n ════════════════════════════════════ -->\n <div class=\"pecb-message-bubble__footer\">\n <span class=\"pecb-message-bubble__meta\">{{ senderLabel }} • {{ time() }}</span>\n @if (showReadReceipt()) {\n <span class=\"pecb-message-bubble__check\" aria-label=\"Read\">\n <svg width=\"14\" height=\"11\" viewBox=\"0 0 14 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M1 5.5L5 9.5L13 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n }\n </div>\n\n </div>\n\n</div>\n","import {\n Component,\n Directive,\n input,\n model,\n output,\n OnInit,\n OnDestroy,\n AfterViewInit,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild\n} from '@angular/core';\nimport { generateUniqueId, trapFocus, disableBodyScroll } from '../../shared/utils/dom.utils';\n\n// ── Content / Footer slot directives ──────────────────────────────────────────\n\n@Directive({\n selector: '[pecbFullscreenModalContent]',\n standalone: true,\n host: { class: 'pecb-fullscreen-modal__content' }\n})\nexport class FullscreenModalContentDirective {}\n\n@Directive({\n selector: '[pecbFullscreenModalFooter]',\n standalone: true\n})\nexport class FullscreenModalFooterDirective {}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\n@Component({\n selector: 'pecb-fullscreen-modal',\n standalone: true,\n imports: [],\n templateUrl: './fullscreen-modal.component.html',\n styleUrls: ['./fullscreen-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FullscreenModalComponent implements OnInit, OnDestroy, AfterViewInit {\n /** Unique id forwarded to the dialog element */\n id = input(generateUniqueId('fullscreen-modal'));\n\n /** Controls visibility */\n isOpen = model(false);\n\n /** Title rendered in the modal header */\n title = input<string>('');\n\n /** Show or hide the built-in close (×) button */\n showCloseButton = input(true);\n\n /** Close modal when clicking the backdrop */\n closeOnBackdropClick = input(true);\n\n /** Close modal when pressing Escape */\n closeOnEscape = input(true);\n\n /** Accessible label for the dialog (used when no visible title exists) */\n ariaLabel = input<string | undefined>(undefined);\n\n /** ID of the element that labels this dialog */\n ariaLabelledBy = input<string | undefined>(undefined);\n\n /** ID of the element that describes this dialog */\n ariaDescribedBy = input<string | undefined>(undefined);\n\n /** Emitted when the modal has been closed */\n closed = output<void>();\n\n /** Emitted when the modal has been opened */\n opened = output<void>();\n\n @ViewChild('modalPanel') modalPanel!: ElementRef<HTMLElement>;\n\n private cleanupFocusTrap: (() => void) | null = null;\n private cleanupBodyScroll: (() => void) | null = null;\n private previousActiveElement: Element | null = null;\n\n ngOnInit(): void {\n if (this.isOpen()) {\n this.onOpen();\n }\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen() && this.modalPanel) {\n this.setupFocusTrap();\n }\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if (this.closeOnBackdropClick() && event.target === event.currentTarget) {\n this.close();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.closeOnEscape() && event.key === 'Escape') {\n event.preventDefault();\n this.close();\n }\n }\n\n close(): void {\n this.isOpen.set(false);\n this.cleanup();\n this.closed.emit();\n }\n\n /** Generated title id used for aria-labelledby when no override is given */\n get titleId(): string {\n return `${this.id()}-title`;\n }\n\n get resolvedLabelledBy(): string | undefined {\n return this.ariaLabelledBy() ?? (this.title() ? this.titleId : undefined);\n }\n\n private onOpen(): void {\n this.previousActiveElement = document.activeElement;\n this.cleanupBodyScroll = disableBodyScroll();\n this.opened.emit();\n }\n\n private setupFocusTrap(): void {\n if (this.modalPanel?.nativeElement) {\n this.cleanupFocusTrap = trapFocus(this.modalPanel.nativeElement);\n }\n }\n\n private cleanup(): void {\n if (this.cleanupFocusTrap) {\n this.cleanupFocusTrap();\n this.cleanupFocusTrap = null;\n }\n if (this.cleanupBodyScroll) {\n this.cleanupBodyScroll();\n this.cleanupBodyScroll = null;\n }\n if (this.previousActiveElement instanceof HTMLElement) {\n this.previousActiveElement.focus();\n }\n }\n}\n","@if (isOpen()) {\n<div\n [id]=\"id()\"\n class=\"pecb-fullscreen-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"resolvedLabelledBy\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n (click)=\"onBackdropClick($event)\"\n (keydown)=\"onKeydown($event)\"\n>\n <div\n #modalPanel\n class=\"pecb-fullscreen-modal__panel\"\n tabindex=\"-1\"\n >\n\n <!-- ── Header ──────────────────────────────────────────────────── -->\n <div class=\"pecb-fullscreen-modal__header\">\n @if (title()) {\n <h2 [id]=\"titleId\" class=\"pecb-fullscreen-modal__title\">{{ title() }}</h2>\n }\n <ng-content select=\"[pecbFullscreenModalHeader]\"></ng-content>\n\n @if (showCloseButton()) {\n <button\n type=\"button\"\n class=\"pecb-fullscreen-modal__close-btn\"\n aria-label=\"Close modal\"\n (click)=\"close()\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n </div>\n\n <!-- ── Divider ─────────────────────────────────────────────────── -->\n <div class=\"pecb-fullscreen-modal__divider\" aria-hidden=\"true\"></div>\n\n <!-- ── Body (scrollable) ──────────────────────────────────────── -->\n <div class=\"pecb-fullscreen-modal__body\">\n <ng-content select=\"[pecbFullscreenModalContent]\"></ng-content>\n <ng-content></ng-content>\n </div>\n\n <!-- ── Footer ─────────────────────────────────────────────────── -->\n <div class=\"pecb-fullscreen-modal__footer\">\n <ng-content select=\"[pecbFullscreenModalFooter]\"></ng-content>\n </div>\n\n </div>\n</div>\n}\n","import { Component, input, output, computed, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type StepperType = 'basic' | 'dot' | 'custom-icon' | 'navigation' | 'inline';\nexport type StepperSize = 'sm' | 'md';\nexport type StepperDirection = 'horizontal' | 'vertical';\nexport type StepState = 'finish' | 'process' | 'progress' | 'wait' | 'error';\nexport type StepperTailStyle = 'default' | 'bold';\nexport type StepOrder = 'first' | 'center' | 'last' | 'only';\n\nexport interface StepItem {\n label: string;\n description?: string;\n icon?: string;\n time?: string;\n state?: StepState;\n}\n\n// =============================================================================\n// STEPPER COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-stepper',\n imports: [CommonModule],\n templateUrl: './stepper.component.html',\n styleUrls: ['./stepper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class StepperComponent {\n id = input(generateUniqueId('stepper'));\n type = input<StepperType>('basic');\n size = input<StepperSize>('md');\n direction = input<StepperDirection>('horizontal');\n tailStyle = input<StepperTailStyle>('default');\n steps = input<StepItem[]>([]);\n currentStep = input(0);\n ariaLabel = input<string>('Progress');\n\n stepClicked = output<number>();\n\n resolvedSteps = computed(() => {\n const stepsValue = this.steps();\n const current = this.currentStep();\n const total = stepsValue.length;\n return stepsValue.map((step, index) => ({\n ...step,\n index,\n resolvedState: step.state || this.computeState(index, current),\n order: this.computeOrder(index, total)\n }));\n });\n\n get stepperClasses(): string[] {\n return [\n 'pecb-stepper',\n `pecb-stepper--${this.type()}`,\n `pecb-stepper--${this.size()}`,\n `pecb-stepper--${this.direction()}`,\n `pecb-stepper--tail-${this.tailStyle()}`\n ];\n }\n\n getStepClasses(step: { resolvedState: StepState; index: number; order: StepOrder }): string[] {\n return [\n 'pecb-stepper__step',\n `pecb-stepper__step--${step.resolvedState}`,\n `pecb-stepper__step--${step.order}`,\n step.index === this.currentStep() ? 'pecb-stepper__step--current' : ''\n ].filter(Boolean);\n }\n\n getConnectorClasses(step: { resolvedState: StepState }): string[] {\n return [\n 'pecb-stepper__connector',\n step.resolvedState === 'finish' ? 'pecb-stepper__connector--completed' : ''\n ].filter(Boolean);\n }\n\n getLeftConnectorClasses(step: { resolvedState: StepState; index: number }): string[] {\n const prevStep = this.resolvedSteps()[step.index - 1];\n return [\n 'pecb-stepper__tail',\n 'pecb-stepper__tail--left',\n prevStep && prevStep.resolvedState === 'finish' ? 'pecb-stepper__tail--active' : 'pecb-stepper__tail--waiting'\n ];\n }\n\n getRightConnectorClasses(step: { resolvedState: StepState }): string[] {\n return [\n 'pecb-stepper__tail',\n 'pecb-stepper__tail--right',\n step.resolvedState === 'finish' ? 'pecb-stepper__tail--active' : 'pecb-stepper__tail--waiting'\n ];\n }\n\n onStepClick(index: number): void {\n this.stepClicked.emit(index);\n }\n\n onStepKeyDown(event: KeyboardEvent, index: number): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.stepClicked.emit(index);\n }\n }\n\n private computeState(index: number, current: number): StepState {\n if (index < current) return 'finish';\n if (index === current) return 'process';\n return 'wait';\n }\n\n private computeOrder(index: number, total: number): StepOrder {\n if (total === 1) return 'only';\n if (index === 0) return 'first';\n if (index === total - 1) return 'last';\n return 'center';\n }\n}\n","<div\n [id]=\"id()\"\n [class]=\"stepperClasses.join(' ')\"\n role=\"navigation\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <ol class=\"pecb-stepper__list\">\n @for (step of resolvedSteps(); track step.index; let first = $first; let last = $last) {\n <li\n [class]=\"getStepClasses(step).join(' ')\"\n [attr.aria-current]=\"step.resolvedState === 'process' ? 'step' : null\"\n >\n @switch (type()) {\n\n <!-- ============================================ -->\n <!-- DOT HORIZONTAL: dot with integrated tails -->\n <!-- ============================================ -->\n @case ('dot') {\n @if (direction() === 'horizontal') {\n <div class=\"pecb-stepper__dot-wrapper\">\n <!-- Left tail -->\n @if (!first) {\n <span [class]=\"getLeftConnectorClasses(step).join(' ')\" aria-hidden=\"true\"></span>\n }\n <!-- Dot -->\n <span class=\"pecb-stepper__dot\" aria-hidden=\"true\"></span>\n <!-- Right tail -->\n @if (!last) {\n <span [class]=\"getRightConnectorClasses(step).join(' ')\" aria-hidden=\"true\"></span>\n }\n </div>\n <!-- Text below dot -->\n <div\n class=\"pecb-stepper__step-content pecb-stepper__step-content--below\"\n role=\"button\"\n [attr.tabindex]=\"0\"\n [attr.aria-label]=\"step.label + (step.description ? ', ' + step.description : '') + ', Step ' + (step.index + 1) + ' of ' + resolvedSteps().length + ', ' + step.resolvedState\"\n (click)=\"onStepClick(step.index)\"\n (keydown)=\"onStepKeyDown($event, step.index)\"\n >\n <div class=\"pecb-stepper__text pecb-stepper__text--center\">\n <span class=\"pecb-stepper__label\">{{ step.label }}</span>\n @if (step.description) {\n <span class=\"pecb-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n } @else {\n <!-- Vertical dot -->\n <div\n class=\"pecb-stepper__step-content\"\n role=\"button\"\n [attr.tabindex]=\"0\"\n [attr.aria-label]=\"step.label + (step.description ? ', ' + step.description : '') + ', Step ' + (step.index + 1) + ' of ' + resolvedSteps().length + ', ' + step.resolvedState\"\n (click)=\"onStepClick(step.index)\"\n (keydown)=\"onStepKeyDown($event, step.index)\"\n >\n <span class=\"pecb-stepper__dot\" aria-hidden=\"true\"></span>\n <div class=\"pecb-stepper__text\">\n <span class=\"pecb-stepper__label\">{{ step.label }}</span>\n @if (step.description) {\n <span class=\"pecb-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n @if (!last) {\n <span [class]=\"getConnectorClasses(step).join(' ')\" aria-hidden=\"true\"></span>\n }\n }\n }\n\n <!-- ============================================ -->\n <!-- INLINE: dot with label, no connectors -->\n <!-- ============================================ -->\n @case ('inline') {\n <div\n class=\"pecb-stepper__step-content pecb-stepper__step-content--inline\"\n role=\"button\"\n [attr.tabindex]=\"0\"\n [attr.aria-label]=\"step.label + ', Step ' + (step.index + 1) + ' of ' + resolvedSteps().length + ', ' + step.resolvedState\"\n (click)=\"onStepClick(step.index)\"\n (keydown)=\"onStepKeyDown($event, step.index)\"\n >\n <span class=\"pecb-stepper__dot\" aria-hidden=\"true\"></span>\n <span class=\"pecb-stepper__label\">{{ step.label }}</span>\n </div>\n }\n\n <!-- ============================================ -->\n <!-- CUSTOM ICON -->\n <!-- ============================================ -->\n @case ('custom-icon') {\n <div\n class=\"pecb-stepper__step-content\"\n role=\"button\"\n [attr.tabindex]=\"0\"\n [attr.aria-label]=\"step.label + (step.description ? ', ' + step.description : '') + ', Step ' + (step.index + 1) + ' of ' + resolvedSteps().length + ', ' + step.resolvedState\"\n (click)=\"onStepClick(step.index)\"\n (keydown)=\"onStepKeyDown($event, step.index)\"\n >\n <span class=\"pecb-stepper__icon-custom\" aria-hidden=\"true\">\n @if (step.icon) {\n <span class=\"pecb-stepper__icon-svg\" [innerHTML]=\"step.icon\"></span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 12C14.21 12 16 10.21 16 8C16 5.79 14.21 4 12 4C9.79 4 8 5.79 8 8C8 10.21 9.79 12 12 12ZM12 14C9.33 14 4 15.34 4 18V20H20V18C20 15.34 14.67 14 12 14Z\" fill=\"currentColor\"/>\n </svg>\n }\n </span>\n <div class=\"pecb-stepper__text\">\n <span class=\"pecb-stepper__label\">{{ step.label }}</span>\n @if (step.description) {\n <span class=\"pecb-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n @if (!last) {\n <span [class]=\"getConnectorClasses(step).join(' ')\" aria-hidden=\"true\"></span>\n }\n }\n\n <!-- ============================================ -->\n <!-- NAVIGATION -->\n <!-- ============================================ -->\n @case ('navigation') {\n <div\n class=\"pecb-stepper__step-content\"\n role=\"button\"\n [attr.tabindex]=\"0\"\n [attr.aria-label]=\"step.label + (step.description ? ', ' + step.description : '') + (step.time ? ', ' + step.time : '') + ', Step ' + (step.index + 1) + ' of ' + resolvedSteps().length + ', ' + step.resolvedState\"\n (click)=\"onStepClick(step.index)\"\n (keydown)=\"onStepKeyDown($event, step.index)\"\n >\n <span class=\"pecb-stepper__icon-circle\" aria-hidden=\"true\">\n @if (step.resolvedState === 'finish') {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.25 9.4475L2.8525 7.05L2.0275 7.8675L5.25 11.09L12.25 4.09L11.4325 3.2725L5.25 9.4475Z\" fill=\"currentColor\"/>\n </svg>\n } @else if (step.resolvedState === 'error') {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.0825 2.9225L10.0775 1.9175L6.5 5.495L2.9225 1.9175L1.9175 2.9225L5.495 6.5L1.9175 10.0775L2.9225 11.0825L6.5 7.505L10.0775 11.0825L11.0825 10.0775L7.505 6.5L11.0825 2.9225Z\" fill=\"currentColor\"/>\n </svg>\n } @else {\n <span class=\"pecb-stepper__number\">{{ step.index + 1 }}</span>\n }\n </span>\n <div class=\"pecb-stepper__text\">\n <div class=\"pecb-stepper__label-row\">\n <span class=\"pecb-stepper__label\">{{ step.label }}</span>\n @if (step.time) {\n <span class=\"pecb-stepper__time\">{{ step.time }}</span>\n }\n </div>\n @if (step.description) {\n <span class=\"pecb-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n @if (!last) {\n <span class=\"pecb-stepper__chevron\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 12L10 8L6 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n }\n }\n\n <!-- ============================================ -->\n <!-- BASIC (default) -->\n <!-- ============================================ -->\n @default {\n <div\n class=\"pecb-stepper__step-content\"\n role=\"button\"\n [attr.tabindex]=\"0\"\n [attr.aria-label]=\"step.label + (step.description ? ', ' + step.description : '') + ', Step ' + (step.index + 1) + ' of ' + resolvedSteps().length + ', ' + step.resolvedState\"\n (click)=\"onStepClick(step.index)\"\n (keydown)=\"onStepKeyDown($event, step.index)\"\n >\n <span class=\"pecb-stepper__icon-circle\" aria-hidden=\"true\">\n @if (step.resolvedState === 'finish') {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.25 9.4475L2.8525 7.05L2.0275 7.8675L5.25 11.09L12.25 4.09L11.4325 3.2725L5.25 9.4475Z\" fill=\"currentColor\"/>\n </svg>\n } @else if (step.resolvedState === 'error') {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.0825 2.9225L10.0775 1.9175L6.5 5.495L2.9225 1.9175L1.9175 2.9225L5.495 6.5L1.9175 10.0775L2.9225 11.0825L6.5 7.505L10.0775 11.0825L11.0825 10.0775L7.505 6.5L11.0825 2.9225Z\" fill=\"currentColor\"/>\n </svg>\n } @else if (step.resolvedState === 'progress') {\n <span class=\"pecb-stepper__progress-ring\" aria-hidden=\"true\"></span>\n <span class=\"pecb-stepper__number\">{{ step.index + 1 }}</span>\n } @else {\n <span class=\"pecb-stepper__number\">{{ step.index + 1 }}</span>\n }\n </span>\n <div class=\"pecb-stepper__text\">\n <span class=\"pecb-stepper__label\">{{ step.label }}</span>\n @if (step.description) {\n <span class=\"pecb-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n @if (!last) {\n <span [class]=\"getConnectorClasses(step).join(' ')\" aria-hidden=\"true\"></span>\n }\n }\n }\n </li>\n }\n </ol>\n</div>\n","import { Component, input, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Predefined gap sizes mapped to the PECB spacing tokens.\n *\n * | Token | Value |\n * |-------|-------|\n * | none | 0 |\n * | xs | 6px |\n * | sm | 8px |\n * | md | 16px |\n * | lg | 20px |\n * | xl | 24px |\n * | 2xl | 32px |\n */\nexport type GridGap = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/**\n * Predefined padding sizes mapped to the PECB spacing tokens.\n *\n * | Token | Value |\n * |-------|-------|\n * | none | 0 |\n * | xs | 6px |\n * | sm | 8px |\n * | md | 16px |\n * | lg | 20px |\n * | xl | 24px |\n * | 2xl | 32px |\n */\nexport type GridPadding = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/**\n * Number of columns the grid can display.\n * Use 'auto' for auto-fit behaviour based on minChildWidth.\n */\nexport type GridColumns = 1 | 2 | 3 | 4 | 6 | 12 | 'auto';\n\n/**\n * Horizontal alignment of grid items.\n */\nexport type GridAlign = 'start' | 'center' | 'end' | 'stretch';\n\n/**\n * Vertical alignment of grid items.\n */\nexport type GridVerticalAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\n\n/**\n * Number of columns a single grid item can span.\n */\nexport type GridItemSpan = 1 | 2 | 3 | 4 | 6 | 12 | 'full';\n\n/**\n * Predefined spacer sizes.\n *\n * | Token | Value |\n * |-------|-------|\n * | xs | 6px |\n * | sm | 8px |\n * | md | 16px |\n * | lg | 20px |\n * | xl | 24px |\n * | 2xl | 32px |\n * | 3xl | 40px |\n * | 4xl | 48px |\n */\nexport type SpacerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n\n// =============================================================================\n// GRID COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-grid',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './grid.component.html',\n styleUrls: ['./grid.component.scss']\n})\nexport class GridComponent {\n /** Unique element ID */\n id = input<string>(generateUniqueId('grid'));\n\n /** Number of columns (1-12 or 'auto' for auto-fit) */\n columns = input<GridColumns>(1);\n\n /**\n * Minimum child width when columns='auto'.\n * Accepts any CSS length value. Defaults to '200px'.\n */\n minChildWidth = input<string>('200px');\n\n /** Gap between all grid items (row and column). Overridden by rowGap / columnGap. */\n gap = input<GridGap>('md');\n\n /** Row gap — overrides `gap` for the vertical axis */\n rowGap = input<GridGap | undefined>(undefined);\n\n /** Column gap — overrides `gap` for the horizontal axis */\n columnGap = input<GridGap | undefined>(undefined);\n\n /** Padding inside the grid container */\n padding = input<GridPadding>('none');\n\n /** Horizontal alignment of items within their cells */\n align = input<GridAlign>('stretch');\n\n /** Vertical alignment of items within their cells */\n verticalAlign = input<GridVerticalAlign>('stretch');\n\n /** Accessible label for the grid region */\n ariaLabel = input<string | undefined>(undefined);\n\n /** CSS classes for the grid container */\n gridClasses = computed(() => {\n const cols = this.columns();\n const gapVal = this.gap();\n const rGap = this.rowGap();\n const cGap = this.columnGap();\n const pad = this.padding();\n const hAlign = this.align();\n const vAlign = this.verticalAlign();\n\n return [\n 'pecb-grid',\n cols !== 'auto' ? `pecb-grid--cols-${cols}` : 'pecb-grid--cols-auto',\n // Gap (only if rowGap/columnGap are not both set)\n rGap === undefined && cGap === undefined ? `pecb-grid--gap-${gapVal}` : '',\n rGap !== undefined ? `pecb-grid--row-gap-${rGap}` : '',\n cGap !== undefined ? `pecb-grid--col-gap-${cGap}` : '',\n pad !== 'none' ? `pecb-grid--padding-${pad}` : '',\n hAlign !== 'stretch' ? `pecb-grid--align-${hAlign}` : '',\n vAlign !== 'stretch' ? `pecb-grid--valign-${vAlign}` : ''\n ].filter(Boolean);\n });\n\n /** Inline style for auto-fit min width */\n gridStyle = computed(() => {\n if (this.columns() === 'auto') {\n return { '--pecb-grid-min-child-width': this.minChildWidth() };\n }\n return {};\n });\n}\n\n// =============================================================================\n// GRID ITEM COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-grid-item',\n standalone: true,\n template: `\n <div [class]=\"itemClasses()\" [attr.role]=\"role()\">\n <ng-content></ng-content>\n </div>\n `,\n styleUrls: ['./grid.component.scss']\n})\nexport class GridItemComponent {\n /** Number of columns this item should span */\n span = input<GridItemSpan>(1);\n\n /** Number of columns to span on small screens (>=768px) */\n spanSm = input<GridItemSpan | undefined>(undefined);\n\n /** Number of columns to span on medium screens (>=1024px) */\n spanMd = input<GridItemSpan | undefined>(undefined);\n\n /** Number of columns to span on large screens (>=1280px) */\n spanLg = input<GridItemSpan | undefined>(undefined);\n\n /** Semantic role for the grid item */\n role = input<string | null>(null);\n\n /** CSS classes for the grid item */\n itemClasses = computed(() => {\n const base = this.span();\n const sm = this.spanSm();\n const md = this.spanMd();\n const lg = this.spanLg();\n\n return [\n 'pecb-grid__item',\n base === 'full' ? 'pecb-grid__item--span-full' : `pecb-grid__item--span-${base}`,\n sm !== undefined ? (sm === 'full' ? 'pecb-grid__item--sm-span-full' : `pecb-grid__item--sm-span-${sm}`) : '',\n md !== undefined ? (md === 'full' ? 'pecb-grid__item--md-span-full' : `pecb-grid__item--md-span-${md}`) : '',\n lg !== undefined ? (lg === 'full' ? 'pecb-grid__item--lg-span-full' : `pecb-grid__item--lg-span-${lg}`) : ''\n ].filter(Boolean).join(' ');\n });\n}\n\n// =============================================================================\n// SPACER COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-spacer',\n standalone: true,\n template: `<div [class]=\"spacerClasses()\" [attr.aria-hidden]=\"true\"></div>`,\n styleUrls: ['./grid.component.scss']\n})\nexport class SpacerComponent {\n /** Vertical space size */\n size = input<SpacerSize>('md');\n\n /** Whether the spacer is horizontal (inline) instead of vertical */\n inline = input(false);\n\n /** CSS classes for the spacer */\n spacerClasses = computed(() => {\n return [\n 'pecb-spacer',\n `pecb-spacer--${this.size()}`,\n this.inline() ? 'pecb-spacer--inline' : ''\n ].filter(Boolean).join(' ');\n });\n}\n","<div\n [id]=\"id()\"\n [class]=\"gridClasses().join(' ')\"\n [ngStyle]=\"gridStyle()\"\n [attr.role]=\"ariaLabel() ? 'region' : null\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <ng-content></ng-content>\n</div>\n","import { Component, input, computed, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type DashboardGridLayout =\n | '1'\n | '2'\n | '3'\n | '4'\n | 'sidebar-1col'\n | 'sidebar-2col'\n | 'sidebar-3col'\n | 'sidebar-4col'\n | 'custom';\n\nexport type DashboardGridGap = 'none' | 'sm' | 'md' | 'lg';\n\n// =============================================================================\n// DASHBOARD GRID COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-dashboard-grid',\n imports: [CommonModule],\n templateUrl: './dashboard-grid.component.html',\n styleUrls: ['./dashboard-grid.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardGridComponent {\n id = input(generateUniqueId('grid'));\n layout = input<DashboardGridLayout>('1');\n gap = input<DashboardGridGap>('md');\n columns = input<string>('');\n minHeight = input<string>('');\n ariaLabel = input<string>('Dashboard grid');\n\n gridStyle = computed(() => {\n const styles: Record<string, string> = {};\n const customColumns = this.columns();\n\n if (customColumns) {\n styles['grid-template-columns'] = customColumns;\n }\n\n const height = this.minHeight();\n if (height) {\n styles['min-height'] = height;\n }\n\n return styles;\n });\n\n get gridClasses(): string[] {\n return [\n 'pecb-dashboard-grid',\n `pecb-dashboard-grid--${this.layout()}`,\n `pecb-dashboard-grid--gap-${this.gap()}`\n ];\n }\n}\n","<div\n [id]=\"id()\"\n [class]=\"gridClasses.join(' ')\"\n [ngStyle]=\"gridStyle()\"\n role=\"region\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <ng-content></ng-content>\n</div>\n","import { Component, input, computed, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type ProgressType = 'bar' | 'circle' | 'spinner';\nexport type ProgressBarSize = 'sm' | 'lg';\nexport type ProgressCircleSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n// =============================================================================\n// SPINNER COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-spinner',\n imports: [CommonModule],\n template: `\n <div\n [id]=\"id()\"\n class=\"pecb-spinner\"\n [style.width.px]=\"sizeValue()\"\n [style.height.px]=\"sizeValue()\"\n role=\"status\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <svg [attr.viewBox]=\"'0 0 ' + sizeValue() + ' ' + sizeValue()\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle\n class=\"pecb-spinner__track\"\n [attr.cx]=\"sizeValue() / 2\"\n [attr.cy]=\"sizeValue() / 2\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"strokeWidth()\"\n />\n <circle\n class=\"pecb-spinner__arc\"\n [attr.cx]=\"sizeValue() / 2\"\n [attr.cy]=\"sizeValue() / 2\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"strokeWidth()\"\n [attr.stroke-dasharray]=\"circumference()\"\n [attr.stroke-dashoffset]=\"circumference() * 0.75\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"pecb-spinner__sr-only\">{{ ariaLabel() }}</span>\n </div>\n `,\n styleUrls: ['./progress.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SpinnerComponent {\n id = input(generateUniqueId('spinner'));\n size = input(48);\n ariaLabel = input('Loading');\n\n sizeValue = computed(() => this.size());\n strokeWidth = computed(() => Math.max(3, this.sizeValue() * 0.08));\n radius = computed(() => (this.sizeValue() - this.strokeWidth()) / 2);\n circumference = computed(() => 2 * Math.PI * this.radius());\n}\n\n// =============================================================================\n// PROGRESS BAR COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-progress-bar',\n imports: [CommonModule],\n template: `\n <div\n [id]=\"id()\"\n [class]=\"barClasses.join(' ')\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-label]=\"ariaLabel() || label()\"\n >\n @if (label()) {\n <div class=\"pecb-progress-bar__header\">\n <span class=\"pecb-progress-bar__label\">{{ label() }}</span>\n </div>\n }\n <div class=\"pecb-progress-bar__track\">\n <div\n class=\"pecb-progress-bar__fill\"\n [style.width.%]=\"clampedValue()\"\n [style.background-color]=\"fillColor()\"\n ></div>\n </div>\n <div class=\"pecb-progress-bar__footer\">\n @if (metadata()) {\n <span class=\"pecb-progress-bar__metadata\">{{ metadata() }}</span>\n }\n @if (showPercentage()) {\n <span class=\"pecb-progress-bar__percentage\">{{ clampedValue() }}%</span>\n }\n </div>\n </div>\n `,\n styleUrls: ['./progress.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ProgressBarComponent {\n id = input(generateUniqueId('progress-bar'));\n value = input(0);\n size = input<ProgressBarSize>('lg');\n label = input('');\n metadata = input('');\n showPercentage = input(true);\n color = input<string>('');\n ariaLabel = input<string>('');\n\n clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\n\n fillColor = computed(() => {\n const custom = this.color();\n if (custom) return custom;\n return this.getColorForProgress(this.clampedValue());\n });\n\n get barClasses(): string[] {\n return [\n 'pecb-progress-bar',\n `pecb-progress-bar--${this.size()}`\n ];\n }\n\n private getColorForProgress(value: number): string {\n if (value === 0) return '#c2c2c2';\n if (value <= 30) return '#ff606f';\n if (value <= 70) return '#fd7e14';\n if (value < 100) return '#fd7e14';\n return '#008000';\n }\n}\n\n// =============================================================================\n// PROGRESS CIRCLE COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-progress-circle',\n imports: [CommonModule],\n template: `\n <div\n [id]=\"id()\"\n [class]=\"circleClasses.join(' ')\"\n [style.width.px]=\"sizeValue()\"\n [style.height.px]=\"sizeValue()\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-label]=\"ariaLabel() || (clampedValue() + '% progress')\"\n >\n <svg [attr.viewBox]=\"'0 0 ' + sizeValue() + ' ' + sizeValue()\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle\n class=\"pecb-progress-circle__track\"\n [attr.cx]=\"sizeValue() / 2\"\n [attr.cy]=\"sizeValue() / 2\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"strokeWidth()\"\n />\n <circle\n class=\"pecb-progress-circle__fill\"\n [attr.cx]=\"sizeValue() / 2\"\n [attr.cy]=\"sizeValue() / 2\"\n [attr.r]=\"radius()\"\n fill=\"none\"\n [attr.stroke-width]=\"strokeWidth()\"\n [attr.stroke-dasharray]=\"circumference()\"\n [attr.stroke-dashoffset]=\"dashOffset()\"\n [style.stroke]=\"fillColor()\"\n stroke-linecap=\"round\"\n [attr.transform]=\"'rotate(-90 ' + sizeValue() / 2 + ' ' + sizeValue() / 2 + ')'\"\n />\n </svg>\n @if (showPercentage()) {\n <span class=\"pecb-progress-circle__text\" [style.font-size.px]=\"fontSize()\">\n {{ clampedValue() }}%\n </span>\n }\n </div>\n `,\n styleUrls: ['./progress.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ProgressCircleComponent {\n id = input(generateUniqueId('progress-circle'));\n value = input(0);\n size = input<ProgressCircleSize>('lg');\n showPercentage = input(true);\n color = input<string>('');\n ariaLabel = input<string>('');\n\n private readonly sizeMap: Record<ProgressCircleSize, number> = {\n xs: 48,\n sm: 56,\n md: 72,\n lg: 90,\n xl: 120\n };\n\n private readonly fontSizeMap: Record<ProgressCircleSize, number> = {\n xs: 10,\n sm: 11,\n md: 13,\n lg: 16,\n xl: 20\n };\n\n sizeValue = computed(() => this.sizeMap[this.size()]);\n fontSize = computed(() => this.fontSizeMap[this.size()]);\n strokeWidth = computed(() => {\n const s = this.size();\n if (s === 'xs') return 4;\n if (s === 'sm') return 5;\n if (s === 'md') return 6;\n if (s === 'lg') return 7;\n return 9;\n });\n radius = computed(() => (this.sizeValue() - this.strokeWidth()) / 2);\n circumference = computed(() => 2 * Math.PI * this.radius());\n clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\n dashOffset = computed(() => {\n const progress = this.clampedValue() / 100;\n return this.circumference() * (1 - progress);\n });\n\n fillColor = computed(() => {\n const custom = this.color();\n if (custom) return custom;\n return this.getColorForProgress(this.clampedValue());\n });\n\n get circleClasses(): string[] {\n return [\n 'pecb-progress-circle',\n `pecb-progress-circle--${this.size()}`\n ];\n }\n\n private getColorForProgress(value: number): string {\n if (value === 0) return '#c2c2c2';\n if (value <= 30) return '#ff606f';\n if (value <= 70) return '#fd7e14';\n if (value < 100) return '#fd7e14';\n return '#008000';\n }\n}\n","import {\n Component,\n input,\n output,\n signal,\n computed,\n forwardRef,\n ChangeDetectionStrategy,\n ElementRef,\n QueryList,\n ViewChildren,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type CodeInputState = 'default' | 'error';\nexport type CodeInputDirection = 'horizontal' | 'vertical';\n\n// =============================================================================\n// CODE INPUT COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-code-input',\n imports: [CommonModule],\n templateUrl: './code-input.component.html',\n styleUrls: ['./code-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CodeInputComponent),\n multi: true\n }\n ]\n})\nexport class CodeInputComponent implements ControlValueAccessor {\n @ViewChildren('cellInput') cellInputs!: QueryList<ElementRef<HTMLInputElement>>;\n\n id = input(generateUniqueId('code-input'));\n length = input(6);\n direction = input<CodeInputDirection>('horizontal');\n state = input<CodeInputState>('default');\n errorMessage = input('');\n showClearAll = input(false);\n disabled = input(false);\n ariaLabel = input('Verification code');\n\n completed = output<string>();\n cleared = output<void>();\n\n cells = signal<string[]>([]);\n focusedIndex = signal<number>(-1);\n\n cellIndices = computed(() => Array.from({ length: this.length() }, (_, i) => i));\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n this.initCells();\n }\n\n writeValue(value: string | null): void {\n const val = value || '';\n const chars = val.split('').slice(0, this.length());\n const newCells = Array.from({ length: this.length() }, (_, i) => chars[i] || '');\n this.cells.set(newCells);\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n getCellClasses(index: number): string[] {\n const cellValue = this.cells()[index];\n const isFocused = this.focusedIndex() === index;\n const currentState = this.state();\n\n return [\n 'pecb-code-input__cell',\n isFocused ? 'pecb-code-input__cell--active' : '',\n currentState === 'error' && cellValue ? 'pecb-code-input__cell--error' : '',\n cellValue && currentState !== 'error' ? 'pecb-code-input__cell--filled' : '',\n !cellValue && !isFocused ? 'pecb-code-input__cell--empty' : ''\n ].filter(Boolean);\n }\n\n onCellInput(event: Event, index: number): void {\n const target = event.target as HTMLInputElement;\n const value = target.value.replace(/\\D/g, '');\n const char = value.slice(-1);\n\n const currentCells = [...this.cells()];\n currentCells[index] = char;\n this.cells.set(currentCells);\n target.value = char;\n\n this.emitValue();\n\n if (char && index < this.length() - 1) {\n this.focusCell(index + 1);\n }\n\n if (currentCells.every(c => c !== '')) {\n this.completed.emit(currentCells.join(''));\n }\n }\n\n onCellKeyDown(event: KeyboardEvent, index: number): void {\n const currentCells = [...this.cells()];\n\n if (event.key === 'Backspace') {\n event.preventDefault();\n if (currentCells[index]) {\n currentCells[index] = '';\n this.cells.set(currentCells);\n this.emitValue();\n const target = event.target as HTMLInputElement;\n target.value = '';\n } else if (index > 0) {\n currentCells[index - 1] = '';\n this.cells.set(currentCells);\n this.emitValue();\n this.focusCell(index - 1);\n }\n return;\n }\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowUp') && index > 0) {\n event.preventDefault();\n this.focusCell(index - 1);\n return;\n }\n\n if ((event.key === 'ArrowRight' || event.key === 'ArrowDown') && index < this.length() - 1) {\n event.preventDefault();\n this.focusCell(index + 1);\n return;\n }\n\n if (event.key === 'Delete') {\n event.preventDefault();\n currentCells[index] = '';\n this.cells.set(currentCells);\n this.emitValue();\n const target = event.target as HTMLInputElement;\n target.value = '';\n return;\n }\n }\n\n onCellPaste(event: ClipboardEvent, index: number): void {\n event.preventDefault();\n const pasted = event.clipboardData?.getData('text')?.replace(/\\D/g, '') || '';\n if (!pasted) return;\n\n const currentCells = [...this.cells()];\n const chars = pasted.split('');\n let cellIndex = index;\n\n for (const char of chars) {\n if (cellIndex >= this.length()) break;\n currentCells[cellIndex] = char;\n cellIndex++;\n }\n\n this.cells.set(currentCells);\n this.syncInputValues();\n this.emitValue();\n\n const focusTarget = Math.min(cellIndex, this.length() - 1);\n this.focusCell(focusTarget);\n\n if (currentCells.every(c => c !== '')) {\n this.completed.emit(currentCells.join(''));\n }\n }\n\n onCellFocus(index: number): void {\n this.focusedIndex.set(index);\n this.onTouched();\n }\n\n onCellBlur(): void {\n this.focusedIndex.set(-1);\n }\n\n onClearAll(): void {\n const emptyCells = Array.from({ length: this.length() }, () => '');\n this.cells.set(emptyCells);\n this.syncInputValues();\n this.emitValue();\n this.focusCell(0);\n this.cleared.emit();\n }\n\n private initCells(): void {\n this.cells.set(Array.from({ length: this.length() }, () => ''));\n }\n\n private focusCell(index: number): void {\n setTimeout(() => {\n const inputs = this.cellInputs?.toArray();\n if (inputs && inputs[index]) {\n inputs[index].nativeElement.focus();\n inputs[index].nativeElement.select();\n }\n });\n }\n\n private syncInputValues(): void {\n setTimeout(() => {\n const inputs = this.cellInputs?.toArray();\n const currentCells = this.cells();\n if (inputs) {\n inputs.forEach((inputRef, i) => {\n inputRef.nativeElement.value = currentCells[i] || '';\n });\n }\n });\n }\n\n private emitValue(): void {\n const value = this.cells().join('');\n this.onChange(value);\n }\n}\n","<div\n [id]=\"id()\"\n [class]=\"'pecb-code-input pecb-code-input--' + direction()\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <div class=\"pecb-code-input__cells\">\n @for (index of cellIndices(); track index) {\n <input\n #cellInput\n type=\"text\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n maxlength=\"1\"\n [class]=\"getCellClasses(index).join(' ')\"\n [value]=\"cells()[index]\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Digit ' + (index + 1) + ' of ' + length()\"\n (input)=\"onCellInput($event, index)\"\n (keydown)=\"onCellKeyDown($event, index)\"\n (paste)=\"onCellPaste($event, index)\"\n (focus)=\"onCellFocus(index)\"\n (blur)=\"onCellBlur()\"\n />\n }\n </div>\n\n @if (errorMessage() || showClearAll()) {\n <div class=\"pecb-code-input__footer\">\n @if (errorMessage()) {\n <span class=\"pecb-code-input__error\" role=\"alert\">{{ errorMessage() }}</span>\n }\n @if (showClearAll()) {\n <button\n type=\"button\"\n class=\"pecb-code-input__clear\"\n (click)=\"onClearAll()\"\n [disabled]=\"disabled()\"\n >\n Clear all\n </button>\n }\n </div>\n }\n</div>\n","import {\n Directive,\n ElementRef,\n Renderer2,\n OnInit,\n OnChanges,\n inject,\n input\n} from '@angular/core';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Shadow type — soft (diffused) or hard (sharp, pronounced).\n */\nexport type ShadowType = 'soft' | 'hard';\n\n/**\n * Shadow Soft sizes — 8 levels of increasing depth.\n *\n * | Token | Description |\n * |-----------|--------------------------|\n * | xxsmall | Barely visible lift |\n * | xsmall | Subtle depth hint |\n * | small | Light card shadow |\n * | medium | Default card elevation |\n * | large | Raised element |\n * | xlarge | Floating panel |\n * | xxlarge | Modal / overlay |\n * | xxxlarge | Maximum depth |\n */\nexport type ShadowSoftSize =\n | 'xxsmall'\n | 'xsmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'xlarge'\n | 'xxlarge'\n | 'xxxlarge';\n\n/**\n * Shadow Hard sizes — 4 levels of increasing depth.\n *\n * | Token | Description |\n * |---------|----------------------------|\n * | xxsmall | Tight hard edge |\n * | xsmall | Defined border shadow |\n * | small | Prominent hard shadow |\n * | medium | Maximum hard shadow depth |\n */\nexport type ShadowHardSize = 'xxsmall' | 'xsmall' | 'small' | 'medium';\n\n/**\n * Combined shadow size (used when type is specified separately).\n */\nexport type ShadowSize = ShadowSoftSize | ShadowHardSize;\n\n/**\n * Blur intensity levels.\n *\n * | Token | Value | Description |\n * |---------|-------|------------------------|\n * | none | 0 | No blur |\n * | xsmall | 2px | Barely noticeable |\n * | small | 4px | Slight softening |\n * | medium | 8px | Moderate blur |\n * | large | 16px | Heavy blur |\n * | xlarge | 32px | Near-opaque blur |\n */\nexport type BlurSize = 'none' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';\n\n// Valid sizes for runtime validation\nconst VALID_SOFT_SIZES = new Set<string>([\n 'xxsmall', 'xsmall', 'small', 'medium', 'large', 'xlarge', 'xxlarge', 'xxxlarge'\n]);\nconst VALID_HARD_SIZES = new Set<string>([\n 'xxsmall', 'xsmall', 'small', 'medium'\n]);\nconst VALID_BLUR_SIZES = new Set<string>([\n 'none', 'xsmall', 'small', 'medium', 'large', 'xlarge'\n]);\n\n// =============================================================================\n// SHADOW DIRECTIVE\n// =============================================================================\n\n/**\n * Applies a shadow to the host element.\n *\n * @example\n * ```html\n * <!-- Soft shadow (default) -->\n * <div pecbShadow=\"medium\">Soft medium shadow</div>\n *\n * <!-- Specify type explicitly -->\n * <div pecbShadow=\"small\" shadowType=\"hard\">Hard small shadow</div>\n *\n * <!-- Dynamic binding -->\n * <div [pecbShadow]=\"currentSize\" [shadowType]=\"currentType\">Dynamic</div>\n * ```\n */\n@Directive({\n selector: '[pecbShadow]',\n standalone: true\n})\nexport class ShadowDirective implements OnInit, OnChanges {\n /** Shadow size token */\n pecbShadow = input<ShadowSize>('medium');\n\n /** Shadow type — 'soft' (default) or 'hard' */\n shadowType = input<ShadowType>('soft');\n\n private el = inject(ElementRef<HTMLElement>);\n private renderer = inject(Renderer2);\n private currentClass = '';\n\n ngOnInit(): void {\n this.applyClass();\n }\n\n ngOnChanges(): void {\n this.applyClass();\n }\n\n private applyClass(): void {\n const type = this.shadowType();\n const size = this.pecbShadow();\n const validSizes = type === 'hard' ? VALID_HARD_SIZES : VALID_SOFT_SIZES;\n\n if (!validSizes.has(size)) {\n return;\n }\n\n const newClass = `pecb-shadow-${type}--${size}`;\n\n if (this.currentClass && this.currentClass !== newClass) {\n this.renderer.removeClass(this.el.nativeElement, this.currentClass);\n }\n\n this.renderer.addClass(this.el.nativeElement, newClass);\n this.currentClass = newClass;\n }\n}\n\n// =============================================================================\n// BLUR DIRECTIVE\n// =============================================================================\n\n/**\n * Applies a CSS blur filter to the host element.\n *\n * @example\n * ```html\n * <!-- Element blur -->\n * <img pecbBlur=\"medium\" src=\"photo.jpg\" />\n *\n * <!-- Backdrop blur (glass-morphism) -->\n * <div pecbBlur=\"small\" [backdrop]=\"true\">Frosted glass</div>\n * ```\n */\n@Directive({\n selector: '[pecbBlur]',\n standalone: true\n})\nexport class BlurDirective implements OnInit, OnChanges {\n /** Blur size token */\n pecbBlur = input<BlurSize>('medium');\n\n /** Apply as backdrop-filter instead of filter */\n backdrop = input(false);\n\n private el = inject(ElementRef<HTMLElement>);\n private renderer = inject(Renderer2);\n private currentClass = '';\n\n ngOnInit(): void {\n this.applyClass();\n }\n\n ngOnChanges(): void {\n this.applyClass();\n }\n\n private applyClass(): void {\n const size = this.pecbBlur();\n\n if (!VALID_BLUR_SIZES.has(size)) {\n return;\n }\n\n const prefix = this.backdrop() ? 'pecb-backdrop-blur' : 'pecb-blur';\n const newClass = `${prefix}--${size}`;\n\n if (this.currentClass && this.currentClass !== newClass) {\n this.renderer.removeClass(this.el.nativeElement, this.currentClass);\n }\n\n this.renderer.addClass(this.el.nativeElement, newClass);\n this.currentClass = newClass;\n }\n}\n","import { Component, input, output, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Divider visual variants derived from the Figma design system.\n *\n * | Type | Description |\n * |---------------------|----------------------------------------------------|\n * | default | Simple horizontal line |\n * | with-icon | Line with a centered icon (ng-content) |\n * | with-label | Left-aligned label text, line fills remaining space|\n * | with-title | Centered title text over the line |\n * | with-button | Centered button over the line |\n * | with-title-button | Left title, line, right button |\n */\nexport type DividerType =\n | 'default'\n | 'with-icon'\n | 'with-label'\n | 'with-title'\n | 'with-button'\n | 'with-title-button';\n\n// =============================================================================\n// DIVIDER COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-divider',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './divider.component.html',\n styleUrls: ['./divider.component.scss']\n})\nexport class DividerComponent {\n /** Unique element ID */\n id = input<string>(generateUniqueId('divider'));\n\n /** Divider variant */\n type = input<DividerType>('default');\n\n /**\n * Title text displayed on the divider.\n * Used by 'with-label', 'with-title', and 'with-title-button' types.\n */\n title = input<string>('');\n\n /**\n * Button label text.\n * Used by 'with-button' and 'with-title-button' types.\n */\n buttonLabel = input<string>('Label');\n\n /**\n * Whether to show the icon inside the button.\n * Defaults to true.\n */\n showButtonIcon = input(true);\n\n /**\n * Whether to show the default + icon for the 'with-icon' type\n * when no content is projected via [dividerIcon].\n * Defaults to true.\n */\n showDefaultIcon = input(true);\n\n /** Accessible label for the divider */\n ariaLabel = input<string | undefined>(undefined);\n\n /** Emits when the button is clicked (for with-button and with-title-button types) */\n buttonClick = output<MouseEvent>();\n\n /** CSS class for the host wrapper */\n dividerClasses = computed(() => {\n return [\n 'pecb-divider',\n `pecb-divider--${this.type()}`\n ];\n });\n\n onButtonClick(event: MouseEvent): void {\n this.buttonClick.emit(event);\n }\n}\n","<div\n [id]=\"id()\"\n [class]=\"dividerClasses().join(' ')\"\n [attr.role]=\"'separator'\"\n [attr.aria-orientation]=\"'horizontal'\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <!-- DEFAULT: simple line -->\n @if (type() === 'default') {\n <div class=\"pecb-divider__line\"></div>\n }\n\n <!-- WITH ICON: line + centered icon (projected or default +) -->\n @if (type() === 'with-icon') {\n <div class=\"pecb-divider__line\"></div>\n <div class=\"pecb-divider__content pecb-divider__content--icon\">\n <ng-content select=\"[dividerIcon]\"></ng-content>\n @if (showDefaultIcon()) {\n <svg class=\"pecb-divider__default-icon\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </div>\n }\n\n <!-- WITH LABEL: left label + line fills rest -->\n @if (type() === 'with-label') {\n <div class=\"pecb-divider__content pecb-divider__content--label\">\n <span class=\"pecb-divider__label-text\">{{ title() }}</span>\n </div>\n <div class=\"pecb-divider__line pecb-divider__line--flex\"></div>\n }\n\n <!-- WITH TITLE: line + centered title -->\n @if (type() === 'with-title') {\n <div class=\"pecb-divider__line\"></div>\n <div class=\"pecb-divider__content pecb-divider__content--title\">\n <span class=\"pecb-divider__title-text\">{{ title() }}</span>\n </div>\n }\n\n <!-- WITH BUTTON: line + centered button -->\n @if (type() === 'with-button') {\n <div class=\"pecb-divider__line\"></div>\n <div class=\"pecb-divider__content pecb-divider__content--button\">\n <button\n type=\"button\"\n class=\"pecb-divider__button\"\n (click)=\"onButtonClick($event)\"\n >\n @if (showButtonIcon()) {\n <svg class=\"pecb-divider__button-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 4.167v11.666M4.167 10h11.666\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n <span class=\"pecb-divider__button-label\">{{ buttonLabel() }}</span>\n </button>\n </div>\n }\n\n <!-- WITH TITLE AND BUTTON: left title + line + right button -->\n @if (type() === 'with-title-button') {\n <div class=\"pecb-divider__content pecb-divider__content--title-left\">\n <span class=\"pecb-divider__title-text\">{{ title() }}</span>\n </div>\n <div class=\"pecb-divider__line pecb-divider__line--flex\"></div>\n <button\n type=\"button\"\n class=\"pecb-divider__button\"\n (click)=\"onButtonClick($event)\"\n >\n @if (showButtonIcon()) {\n <svg class=\"pecb-divider__button-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 4.167v11.666M4.167 10h11.666\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n <span class=\"pecb-divider__button-label\">{{ buttonLabel() }}</span>\n </button>\n }\n</div>\n","import {\n Component,\n input,\n output,\n computed,\n signal,\n inject,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type CodeSnippetTheme = 'light' | 'dark';\nexport type CodeSnippetVariant =\n | 'default'\n | 'filename'\n | 'filename-actions'\n | 'copy-banner'\n | 'gutter';\n\n// =============================================================================\n// CODE SNIPPET COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-code-snippet',\n imports: [CommonModule],\n templateUrl: './code-snippet.component.html',\n styleUrls: ['./code-snippet.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CodeSnippetComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n id = input(generateUniqueId('code-snippet'));\n code = input('');\n highlightedCode = input<string>('');\n language = input('Tailwind Js');\n theme = input<CodeSnippetTheme>('light');\n variant = input<CodeSnippetVariant>('default');\n filename = input('');\n showLineNumbers = input(true);\n showCopy = input(true);\n showFooter = input(true);\n ariaLabel = input('Code snippet');\n\n copied = output<string>();\n\n copyLabel = signal('Copy');\n\n codeLines = computed(() => {\n const codeValue = this.code();\n if (!codeValue) return [];\n return codeValue.split('\\n');\n });\n\n safeHighlightedCode = computed<SafeHtml>(() => {\n const html = this.highlightedCode();\n if (!html) return '';\n return this.sanitizer.bypassSecurityTrustHtml(html);\n });\n\n useHighlighted = computed(() => !!this.highlightedCode());\n\n charCount = computed(() => this.code().length);\n lineCount = computed(() => this.codeLines().length);\n\n get snippetClasses(): string[] {\n return [\n 'pecb-code-snippet',\n `pecb-code-snippet--${this.theme()}`,\n `pecb-code-snippet--${this.variant()}`\n ];\n }\n\n onCopy(): void {\n const codeValue = this.code();\n if (navigator.clipboard) {\n navigator.clipboard.writeText(codeValue).then(() => {\n this.copyLabel.set('Copied!');\n this.copied.emit(codeValue);\n setTimeout(() => this.copyLabel.set('Copy'), 2000);\n });\n }\n }\n}\n","<div\n [id]=\"id()\"\n [class]=\"snippetClasses.join(' ')\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <!-- Header: filename variant (with text copy button) -->\n @if (variant() === 'filename') {\n <div class=\"pecb-code-snippet__header\">\n <div class=\"pecb-code-snippet__filename\">\n <div class=\"pecb-code-snippet__icon-badge\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 13.3333 13.3333\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M6.66667 0C6.34901 0 6.03528 0.0701311 5.74786 0.205387L1.53121 2.18969C0.596563 2.62953 0 3.56958 0 4.60254V9.33333C0 9.99851 0.384153 10.6038 0.986014 10.8871L5.74786 13.1279C6.03528 13.2632 6.34901 13.3333 6.66667 13.3333C6.98432 13.3333 7.29805 13.2632 7.58547 13.1279L12.3473 10.8871C12.9492 10.6038 13.3333 9.99851 13.3333 9.33333V4.60254C13.3333 3.56958 12.7368 2.62953 11.8021 2.18969L7.58547 0.205387C7.29805 0.0701314 6.98432 0 6.66667 0ZM12 8.25464L7.33333 5.92131V1.56033L11.2344 3.39612C11.7017 3.61604 12 4.08606 12 4.60254V8.25464ZM6.66667 7.07869L11.8229 9.65678C11.8091 9.66559 11.7946 9.67357 11.7796 9.68065L7.01774 11.9215C6.90792 11.9732 6.78804 12 6.66667 12C6.54529 12 6.42541 11.9732 6.31559 11.9215L1.55374 9.68065C1.53869 9.67357 1.52425 9.66559 1.51047 9.65678L6.66667 7.07869ZM6 5.92131L1.33333 8.25464V4.60254C1.33333 4.08606 1.63161 3.61604 2.09894 3.39612L6 1.56033V5.92131Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n <span>{{ filename() }}</span>\n </div>\n <div class=\"pecb-code-snippet__header-actions\">\n @if (showCopy()) {\n <button\n type=\"button\"\n class=\"pecb-code-snippet__copy-btn\"\n (click)=\"onCopy()\"\n [attr.aria-label]=\"'Copy code'\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 4.167v11.666M4.167 10h11.666\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ copyLabel() }}\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Header: filename-actions variant (with icon-only square buttons) -->\n @if (variant() === 'filename-actions') {\n <div class=\"pecb-code-snippet__header\">\n <div class=\"pecb-code-snippet__filename\">\n <span>{{ filename() }}</span>\n </div>\n <div class=\"pecb-code-snippet__header-actions\">\n <ng-content select=\"[codeActions]\"></ng-content>\n @if (showCopy()) {\n <button\n type=\"button\"\n class=\"pecb-code-snippet__icon-btn\"\n (click)=\"onCopy()\"\n [attr.aria-label]=\"'Copy code'\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 4.167v11.666M4.167 10h11.666\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"pecb-code-snippet__icon-btn\"\n [attr.aria-label]=\"'More actions'\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 4.167v11.666M4.167 10h11.666\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Copy-banner variant: button in its own bordered box, then code in another -->\n @if (variant() === 'copy-banner') {\n <div class=\"pecb-code-snippet__banner-box\">\n <button\n type=\"button\"\n class=\"pecb-code-snippet__copy-banner\"\n (click)=\"onCopy()\"\n [attr.aria-label]=\"'Click to copy the code'\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 4.167v11.666M4.167 10h11.666\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Click to copy the code\n </button>\n </div>\n }\n\n <!-- Code area -->\n <div class=\"pecb-code-snippet__body\">\n <!-- Gutter: red background with white line numbers -->\n @if (variant() === 'gutter' && showLineNumbers()) {\n <div class=\"pecb-code-snippet__gutter\">\n @for (line of codeLines(); track $index) {\n <span class=\"pecb-code-snippet__line-num\">{{ $index + 1 }}</span>\n }\n </div>\n }\n\n <!-- Standard line numbers (non-gutter variants) -->\n @if (variant() !== 'gutter' && showLineNumbers()) {\n <div class=\"pecb-code-snippet__line-numbers\">\n @for (line of codeLines(); track $index) {\n <span class=\"pecb-code-snippet__line-num\">{{ $index + 1 }}</span>\n }\n </div>\n }\n\n <!-- Code content -->\n <div class=\"pecb-code-snippet__code-wrapper\">\n @if (useHighlighted()) {\n <pre class=\"pecb-code-snippet__code\"><code [innerHTML]=\"safeHighlightedCode()\"></code></pre>\n } @else {\n <pre class=\"pecb-code-snippet__code\"><code>{{ code() }}</code></pre>\n }\n\n <!-- Floating copy button (default/gutter variants) -->\n @if (showCopy() && (variant() === 'default' || variant() === 'gutter')) {\n <button\n type=\"button\"\n class=\"pecb-code-snippet__copy-btn pecb-code-snippet__copy-btn--floating\"\n (click)=\"onCopy()\"\n [attr.aria-label]=\"'Copy code'\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 4.167v11.666M4.167 10h11.666\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ copyLabel() }}\n </button>\n }\n </div>\n </div>\n\n <!-- Footer -->\n @if (showFooter()) {\n <div class=\"pecb-code-snippet__footer\">\n <div class=\"pecb-code-snippet__language\">\n <span>{{ language() }}</span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"pecb-code-snippet__meta\">\n <span>{{ charCount() }} chars</span>\n <span>{{ lineCount() }} lines</span>\n </div>\n </div>\n }\n</div>\n","import { Injectable } from '@angular/core';\nimport { IconName } from './icon-names';\n\n/**\n * Global registry for SVG icons.\n *\n * Icons are registered as inline SVG strings keyed by their `IconName`.\n * The `IconComponent` queries this registry when a `[name]` input is used.\n *\n * @example\n * ```ts\n * import { IconRegistry } from '@pecb-ui/components';\n * import { PECB_ICONS } from '@pecb-ui/components/icons';\n *\n * // Register all icons at once\n * constructor(private reg: IconRegistry) {\n * reg.registerAll(PECB_ICONS);\n * }\n *\n * // Or register individual icons\n * reg.register('check-01', '<svg ...>...</svg>');\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class IconRegistry {\n private readonly icons = new Map<string, string>();\n\n /** Register a single icon by name. */\n register(name: IconName | string, svg: string): void {\n this.icons.set(name, svg);\n }\n\n /** Register many icons at once. */\n registerAll(icons: Record<string, string>): void {\n for (const [name, svg] of Object.entries(icons)) {\n this.icons.set(name, svg);\n }\n }\n\n /** Retrieve an icon SVG string by name. Returns `undefined` if not found. */\n get(name: string): string | undefined {\n return this.icons.get(name);\n }\n\n /** Check whether an icon is registered. */\n has(name: string): boolean {\n return this.icons.has(name);\n }\n\n /** Return all registered icon names. */\n names(): string[] {\n return [...this.icons.keys()];\n }\n}\n","import { Component, input, output, computed, inject, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\nimport { BreadcrumbItem } from '../../shared/interfaces/component.interfaces';\nimport { IconRegistry } from '../icon/icon-registry';\n\n/**\n * Separator style between breadcrumb items.\n *\n * | Type | Description |\n * |---------|---------------------------|\n * | slash | Forward slash `/` |\n * | arrow | Right chevron arrow `>` |\n * | custom | Custom template separator |\n */\nexport type BreadcrumbSeparator = 'slash' | 'arrow' | 'custom';\n\n// =============================================================================\n// BREADCRUMBS COMPONENT\n// =============================================================================\n\n@Component({\n selector: 'pecb-breadcrumbs',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './breadcrumbs.component.html',\n styleUrls: ['./breadcrumbs.component.scss'],\n encapsulation: ViewEncapsulation.None\n})\nexport class BreadcrumbsComponent {\n private readonly registry = inject(IconRegistry);\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Unique element ID */\n id = input<string>(generateUniqueId('breadcrumbs'));\n\n /** Array of breadcrumb items to display */\n items = input.required<BreadcrumbItem[]>();\n\n /** Separator style between items */\n separator = input<BreadcrumbSeparator>('slash');\n\n /** Custom separator template (used when separator is 'custom') */\n separatorTemplate = input<TemplateRef<unknown> | null>(null);\n\n /**\n * Global icon color (CSS color value).\n * Applied to all icons unless overridden by the item's `iconColor`.\n * When not set, icons inherit the text color (red for links, gray for current).\n */\n iconColor = input<string>('');\n\n /** Accessible label for the breadcrumb navigation */\n ariaLabel = input<string>('Breadcrumb');\n\n /** Emits the clicked breadcrumb item */\n itemClick = output<BreadcrumbItem>();\n\n /** CSS classes for the host wrapper */\n breadcrumbClasses = computed(() => {\n return [\n 'pecb-breadcrumbs',\n `pecb-breadcrumbs--${this.separator()}`\n ];\n });\n\n /** Whether an item is the last in the list (current page) */\n isLastItem(index: number): boolean {\n return index === this.items().length - 1;\n }\n\n /** Resolve an icon name to a trusted SVG string */\n getIconSvg(iconName: string | undefined): SafeHtml | null {\n if (!iconName) return null;\n const svg = this.registry.get(iconName);\n return svg ? this.sanitizer.bypassSecurityTrustHtml(svg) : null;\n }\n\n /** Resolve icon color: per-item iconColor > global iconColor > inherit */\n getIconColor(item: BreadcrumbItem): string | null {\n return item.iconColor || this.iconColor() || null;\n }\n\n onItemClick(event: Event, item: BreadcrumbItem): void {\n event.preventDefault();\n this.itemClick.emit(item);\n }\n}\n","<nav\n [id]=\"id()\"\n [class]=\"breadcrumbClasses().join(' ')\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <ol class=\"pecb-breadcrumbs__list\">\n @for (item of items(); track $index; let i = $index) {\n <li\n class=\"pecb-breadcrumbs__item\"\n [class.pecb-breadcrumbs__item--active]=\"isLastItem(i)\"\n >\n @if (isLastItem(i)) {\n <!-- Current page — not a link -->\n <span\n class=\"pecb-breadcrumbs__text pecb-breadcrumbs__text--current\"\n [attr.aria-current]=\"'page'\"\n >\n @if (getIconSvg(item.icon); as iconSvg) {\n <span\n class=\"pecb-breadcrumbs__icon\"\n aria-hidden=\"true\"\n [innerHTML]=\"iconSvg\"\n [style.color]=\"getIconColor(item)\"\n ></span>\n }\n {{ item.label }}\n </span>\n } @else {\n <!-- Navigable breadcrumb link -->\n <a\n class=\"pecb-breadcrumbs__link\"\n [href]=\"item.url || '#'\"\n (click)=\"onItemClick($event, item)\"\n >\n @if (getIconSvg(item.icon); as iconSvg) {\n <span\n class=\"pecb-breadcrumbs__icon\"\n aria-hidden=\"true\"\n [innerHTML]=\"iconSvg\"\n [style.color]=\"getIconColor(item)\"\n ></span>\n }\n {{ item.label }}\n </a>\n\n <!-- Separator -->\n <span class=\"pecb-breadcrumbs__separator\" aria-hidden=\"true\">\n @if (separator() === 'slash') {\n /\n } @else if (separator() === 'arrow') {\n <svg class=\"pecb-breadcrumbs__separator-icon\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 12l4-4-4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n } @else if (separator() === 'custom' && separatorTemplate()) {\n <ng-container [ngTemplateOutlet]=\"separatorTemplate()!\"></ng-container>\n }\n </span>\n }\n </li>\n }\n </ol>\n</nav>\n","import { Component, input, output, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Search bar mode.\n *\n * | Mode | Description |\n * |----------|----------------------------------------------------|\n * | none | No search bar |\n * | simple | Compact search input only |\n * | advanced | Search input with a toggle button for filter fields |\n */\nexport type SearchMode = 'none' | 'simple' | 'advanced';\n\n// =============================================================================\n// PAGE TOOLBAR COMPONENT\n// =============================================================================\n\n/**\n * A positioning layout component that enforces the PECB design system rules\n * for buttons, tabs, search bars, and banners on any page.\n *\n * **Design rules (from Figma):**\n * - Buttons are always on the **left**\n * - Search bar is always on the **right**\n * - When a banner exists, buttons go **above** it, search goes **below** it\n * - When buttons + tabs coexist without a banner, a **divider** separates them\n * - Tabs + search share the same row (tabs left, search right)\n *\n * **Content projection slots:**\n * - `[toolbarButtons]` — action buttons (left side)\n * - `[toolbarTabs]` — tab navigation (left side, below banner or after divider)\n * - `[toolbarSearch]` — search bar (right side)\n * - `[toolbarBanner]` — profile banner / header area\n * - `[toolbarAdvancedSearch]` — expandable advanced filter fields\n * - `[toolbarBackButton]` — go-back navigation (top-left, above everything)\n *\n * @example\n * ```html\n * <!-- Simple: buttons left, search right -->\n * <pecb-general>\n * <ng-container toolbarButtons>\n * <button>Primary</button>\n * </ng-container>\n * <ng-container toolbarSearch>\n * <input placeholder=\"Search...\" />\n * </ng-container>\n * </pecb-general>\n *\n * <!-- With banner: buttons above, tabs+search below -->\n * <pecb-general [hasBanner]=\"true\" [hasTabs]=\"true\">\n * <ng-container toolbarButtons>...</ng-container>\n * <ng-container toolbarBanner>...</ng-container>\n * <ng-container toolbarTabs>...</ng-container>\n * <ng-container toolbarSearch>...</ng-container>\n * </pecb-general>\n * ```\n */\n@Component({\n selector: 'pecb-general',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './general.component.html',\n styleUrls: ['./general.component.scss']\n})\nexport class GeneralComponent {\n /** Unique element ID */\n id = input<string>(generateUniqueId('toolbar'));\n\n /** Whether the toolbar has action buttons */\n hasButtons = input(false);\n\n /** Whether the toolbar has tab navigation */\n hasTabs = input(false);\n\n /** Whether the toolbar has a banner/profile header */\n hasBanner = input(false);\n\n /** Whether the toolbar has a back button */\n hasBackButton = input(false);\n\n /** Search bar mode: 'none', 'simple', or 'advanced' */\n searchMode = input<SearchMode>('none');\n\n /** Whether the advanced search panel is currently expanded */\n advancedSearchOpen = input(false);\n\n /** Emits when the advanced search toggle is clicked */\n advancedSearchToggle = output<boolean>();\n\n /** Accessible label for the toolbar region */\n ariaLabel = input<string>('Page toolbar');\n\n /** Whether a search bar is present */\n hasSearch = computed(() => this.searchMode() !== 'none');\n\n /**\n * Whether to show a divider between buttons and tabs.\n * Only when both exist AND there is no banner.\n */\n showDivider = computed(() =>\n this.hasButtons() && this.hasTabs() && !this.hasBanner()\n );\n\n /**\n * Layout mode determines the overall structure.\n *\n * - 'flat': no banner — everything in stacked rows\n * - 'banner': banner present — buttons above, tabs+search below\n */\n layoutMode = computed<'flat' | 'banner'>(() =>\n this.hasBanner() ? 'banner' : 'flat'\n );\n\n onAdvancedSearchToggle(): void {\n this.advancedSearchToggle.emit(!this.advancedSearchOpen());\n }\n}\n","<div\n [id]=\"id()\"\n class=\"pecb-general\"\n [class.pecb-general--flat]=\"layoutMode() === 'flat'\"\n [class.pecb-general--banner-layout]=\"layoutMode() === 'banner'\"\n [class.pecb-general--has-buttons]=\"hasButtons()\"\n [class.pecb-general--has-tabs]=\"hasTabs()\"\n [class.pecb-general--has-search]=\"hasSearch()\"\n [class.pecb-general--has-back]=\"hasBackButton()\"\n [class.pecb-general--has-divider]=\"showDivider()\"\n role=\"toolbar\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <!-- BACK ROW -->\n <div class=\"pecb-general__back-row\">\n <ng-content select=\"[toolbarBackButton]\"></ng-content>\n </div>\n\n <!-- BUTTONS ROW -->\n <div class=\"pecb-general__buttons-row\">\n <ng-content select=\"[toolbarButtons]\"></ng-content>\n </div>\n\n <!-- BANNER -->\n <div class=\"pecb-general__banner\">\n <ng-content select=\"[toolbarBanner]\"></ng-content>\n </div>\n\n <!-- DIVIDER (between buttons and tabs when no banner) -->\n <div class=\"pecb-general__divider\"></div>\n\n <!-- TABS -->\n <div class=\"pecb-general__tabs\">\n <ng-content select=\"[toolbarTabs]\"></ng-content>\n </div>\n\n <!-- SEARCH -->\n <div class=\"pecb-general__search\">\n <ng-content select=\"[toolbarSearch]\"></ng-content>\n @if (searchMode() === 'advanced') {\n <button\n type=\"button\"\n class=\"pecb-general__advanced-toggle\"\n [class.pecb-general__advanced-toggle--active]=\"advancedSearchOpen()\"\n (click)=\"onAdvancedSearchToggle()\"\n aria-label=\"Toggle advanced search\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 8h4m0 0a2 2 0 1 0 4 0 2 2 0 0 0-4 0ZM13 8h8M3 16h8m0 0a2 2 0 1 0 4 0 2 2 0 0 0-4 0Zm6 0h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n }\n </div>\n\n <!-- ADVANCED SEARCH PANEL -->\n @if (searchMode() === 'advanced' && advancedSearchOpen()) {\n <div class=\"pecb-general__advanced-panel\">\n <ng-content select=\"[toolbarAdvancedSearch]\"></ng-content>\n </div>\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { ButtonComponent } from './components/button/button.component';\nimport {\n CardComponent,\n CardHeaderComponent,\n CardBodyComponent,\n CardFooterComponent\n} from './components/card/card.component';\nimport { StatusComponent } from './components/status/status.component';\nimport { PaginationComponent } from './components/pagination/pagination.component';\nimport { TableComponent } from './components/table/table.component';\nimport { TabComponent } from './components/tab/tab.component';\nimport { DatepickerComponent } from './components/datepicker/datepicker.component';\nimport { InputComponent } from './components/input/input.component';\nimport { RadioComponent } from './components/radio/radio.component';\nimport { CheckboxComponent } from './components/checkbox/checkbox.component';\nimport { ToggleComponent } from './components/toggle/toggle.component';\nimport { DropdownComponent } from './components/dropdown/dropdown.component';\nimport {\n RightModalComponent,\n RightModalHeaderDirective,\n RightModalContentDirective,\n RightModalFooterDirective\n} from './components/right-modal/right-modal.component';\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\nimport { ConfirmationComponent } from './components/confirmation/confirmation.component';\nimport { BottomSheetComponent } from './components/bottom-sheet/bottom-sheet.component';\nimport { AccordionItemComponent, AccordionSmallComponent } from './components/accordion/accordion.component';\nimport { ButtonGroupComponent, ButtonGroupItemComponent } from './components/button-group/button-group.component';\nimport { TooltipComponent } from './components/tooltip/tooltip.component';\nimport { TooltipDirective } from './components/tooltip/tooltip.directive';\nimport { MessageItemComponent, MessageBubbleComponent } from './components/messaging/messaging.component';\nimport {\n FullscreenModalComponent,\n FullscreenModalContentDirective,\n FullscreenModalFooterDirective\n} from './components/fullscreen-modal/fullscreen-modal.component';\nimport { StepperComponent } from './components/stepper/stepper.component';\nimport {\n GridComponent,\n GridItemComponent,\n SpacerComponent\n} from './components/grid/grid.component';\nimport { DashboardGridComponent } from './components/dashboard-grid/dashboard-grid.component';\nimport {\n SpinnerComponent,\n ProgressBarComponent,\n ProgressCircleComponent\n} from './components/progress/progress.component';\nimport { CodeInputComponent } from './components/code-input/code-input.component';\nimport {\n ShadowDirective,\n BlurDirective\n} from './components/shadow/shadow.directive';\nimport { DividerComponent } from './components/divider/divider.component';\nimport { CodeSnippetComponent } from './components/code-snippet/code-snippet.component';\nimport { BreadcrumbsComponent } from './components/breadcrumbs/breadcrumbs.component';\nimport { GeneralComponent } from './components/general/general.component';\n\nconst COMPONENTS = [\n ButtonComponent,\n CardComponent,\n CardHeaderComponent,\n CardBodyComponent,\n CardFooterComponent,\n StatusComponent,\n PaginationComponent,\n TableComponent,\n TabComponent,\n DatepickerComponent,\n InputComponent,\n RadioComponent,\n CheckboxComponent,\n ToggleComponent,\n DropdownComponent,\n RightModalComponent,\n RightModalHeaderDirective,\n RightModalContentDirective,\n RightModalFooterDirective,\n SidebarComponent,\n ConfirmationComponent,\n BottomSheetComponent,\n AccordionItemComponent,\n AccordionSmallComponent,\n ButtonGroupComponent,\n ButtonGroupItemComponent,\n TooltipComponent,\n TooltipDirective,\n MessageItemComponent,\n MessageBubbleComponent,\n FullscreenModalComponent,\n FullscreenModalContentDirective,\n FullscreenModalFooterDirective,\n StepperComponent,\n GridComponent,\n GridItemComponent,\n SpacerComponent,\n DashboardGridComponent,\n SpinnerComponent,\n ProgressBarComponent,\n ProgressCircleComponent,\n CodeInputComponent,\n ShadowDirective,\n BlurDirective,\n DividerComponent,\n CodeSnippetComponent,\n BreadcrumbsComponent,\n GeneralComponent\n];\n\n/**\n * PECB UI Components Module\n *\n * A professional Angular components library with TypeScript and SCSS.\n * Import this module to use all PECB UI components in your application.\n *\n * @example\n * ```typescript\n * import { PecbComponentsModule } from '@pecb-ui/components';\n *\n * @NgModule({\n * imports: [PecbComponentsModule]\n * })\n * export class AppModule { }\n * ```\n */\n@NgModule({\n imports: [CommonModule, ...COMPONENTS],\n exports: COMPONENTS\n})\nexport class PecbComponentsModule {}\n","import {\n Component,\n input,\n output,\n model,\n ChangeDetectionStrategy\n} from '@angular/core';\n\nexport type AlertType = 'info' | 'success' | 'warning' | 'error';\nexport type AlertVariant = 'banner' | 'filled';\n\n@Component({\n selector: 'pecb-alert',\n imports: [],\n templateUrl: './alert.component.html',\n styleUrls: ['./alert.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AlertComponent {\n type = input<AlertType>('info');\n variant = input<AlertVariant>('banner');\n title = input('');\n message = input('');\n dismissible = input(true);\n primaryAction = input<string | undefined>(undefined);\n secondaryAction = input<string | undefined>(undefined);\n /**\n * Whether the alert is visible. Manages its own state internally —\n * no consumer binding required. Supports [(visible)] for controlled mode.\n */\n visible = model(true);\n\n dismissed = output<void>();\n primaryActionClick = output<void>();\n secondaryActionClick = output<void>();\n\n dismiss(): void {\n this.visible.set(false);\n this.dismissed.emit();\n }\n\n get hasActions(): boolean {\n return !!(this.primaryAction() || this.secondaryAction());\n }\n\n get hostClasses(): string {\n return [\n 'pecb-alert',\n `pecb-alert--${this.type()}`,\n `pecb-alert--${this.variant()}`,\n this.hasActions ? 'pecb-alert--has-actions' : ''\n ].filter(Boolean).join(' ');\n }\n}\n","@if (visible()) {\n<div [class]=\"hostClasses\" role=\"alert\" aria-live=\"polite\">\n\n @if (variant() === 'banner') {\n <div class=\"pecb-alert__icon-wrap\" aria-hidden=\"true\">\n @switch (type()) {\n @case ('info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\n <path d=\"M0 6C0 2.68629 2.68629 0 6 0H26C29.3137 0 32 2.68629 32 6V26C32 29.3137 29.3137 32 26 32H6C2.68629 32 0 29.3137 0 26V6Z\" fill=\"#E6F0FA\"/>\n <circle cx=\"16.2644\" cy=\"16.2637\" r=\"9.49451\" fill=\"white\"/>\n <path d=\"M16.0005 4.9231C22.1181 4.9231 27.0774 9.8824 27.0774 16C27.0774 22.1176 22.1181 27.0769 16.0005 27.0769C9.88289 27.0769 4.92358 22.1176 4.92358 16C4.92358 9.8824 9.88289 4.9231 16.0005 4.9231ZM14.1544 13.0469C13.4181 13.047 12.9236 13.5413 12.9236 14.2777C12.9237 15.0139 13.4182 15.5083 14.1544 15.5084H15.8797L14.1544 21.2915C14.0309 21.9041 14.1546 22.6403 14.5251 23.1346C14.8959 23.7474 15.514 23.9946 16.1267 23.9946H18.0943C18.8357 23.9945 19.325 23.5053 19.325 22.7638C19.3249 22.0276 18.8305 21.5331 18.0943 21.5331H16.6159L18.3413 15.75C18.4648 15.1373 18.3411 14.4012 17.9705 13.9069C17.5997 13.2941 16.9817 13.0469 16.3689 13.0469H14.1544ZM16.7397 8.00002C15.7201 8.00005 14.8959 8.82415 14.8959 9.84377C14.896 10.8633 15.7201 11.6869 16.7397 11.6869C17.7593 11.6869 18.5833 10.8633 18.5834 9.84377C18.5834 8.82414 17.7593 8.00002 16.7397 8.00002Z\" fill=\"#5EACFF\"/>\n </svg>\n }\n @case ('success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\n <path d=\"M0 6C0 2.68629 2.68629 0 6 0H26C29.3137 0 32 2.68629 32 6V26C32 29.3137 29.3137 32 26 32H6C2.68629 32 0 29.3137 0 26V6Z\" fill=\"#E6F4EA\"/>\n <circle cx=\"15.9124\" cy=\"15.9121\" r=\"9.14286\" fill=\"white\"/>\n <path d=\"M16.0001 4.9231C9.88231 4.9231 4.92319 9.88222 4.92319 16C4.92319 22.1178 9.88231 27.0769 16.0001 27.0769C22.1179 27.0769 27.077 22.1178 27.077 16C27.0719 9.88222 22.1128 4.9231 16.0001 4.9231ZM21.9119 13.1729L15.9074 20.6862C15.6396 21.0158 15.2483 21.2218 14.826 21.2475C14.8002 21.2475 14.7693 21.2475 14.7436 21.2475C14.3471 21.2475 13.966 21.093 13.6879 20.8098L10.1964 17.3183C9.61453 16.7364 9.61453 15.7889 10.1964 15.207C10.7784 14.6251 11.7259 14.6251 12.3078 15.207L14.6149 17.514L19.5791 11.3087C20.0941 10.665 21.0313 10.5568 21.6802 11.0769C22.3239 11.5868 22.4269 12.5291 21.9119 13.1729Z\" fill=\"#57BC57\"/>\n </svg>\n }\n @case ('warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\n <path d=\"M0 6C0 2.68629 2.68629 0 6 0H26C29.3137 0 32 2.68629 32 6V26C32 29.3137 29.3137 32 26 32H6C2.68629 32 0 29.3137 0 26V6Z\" fill=\"#FFF4E5\"/>\n <circle cx=\"16.2644\" cy=\"16.2637\" r=\"9.49451\" fill=\"white\"/>\n <path d=\"M16.0007 4.9231C22.1183 4.9231 27.0778 9.88263 27.0778 16.0002C27.0777 22.1178 22.1182 27.0774 16.0007 27.0774C9.88316 27.0773 4.92363 22.1177 4.92351 16.0002C4.92351 9.88266 9.88309 4.92315 16.0007 4.9231ZM16.0407 20.1125C15.0013 20.1128 14.156 20.9588 14.1559 21.9983C14.2507 24.4963 17.832 24.4956 17.9264 21.9983C17.9264 20.9587 17.0803 20.1125 16.0407 20.1125ZM17.8854 9.48657C16.9498 8.3259 15.0529 8.32527 14.1169 9.48657C13.6482 10.0446 13.4512 10.7759 13.5768 11.4934C13.9515 13.6339 14.4802 16.6552 14.7175 18.012C14.9836 19.4395 17.0191 19.4391 17.2848 18.012L18.4255 11.4934C18.5511 10.7759 18.3541 10.0446 17.8854 9.48657Z\" fill=\"#FF9C4A\"/>\n </svg>\n }\n @case ('error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\n <path d=\"M0 6C0 2.68629 2.68629 0 6 0H26C29.3137 0 32 2.68629 32 6V26C32 29.3137 29.3137 32 26 32H6C2.68629 32 0 29.3137 0 26V6Z\" fill=\"#FDECEA\"/>\n <circle cx=\"15.9124\" cy=\"15.9121\" r=\"9.14286\" fill=\"white\"/>\n <path d=\"M23.8326 8.16745C28.1585 12.4933 28.1585 19.5068 23.8326 23.8326C19.5068 28.1584 12.4933 28.1584 8.16751 23.8326C3.8417 19.5068 3.8417 12.4933 8.16751 8.16745C12.4933 3.84164 19.5068 3.84164 23.8326 8.16745ZM20.1339 11.431C19.6834 10.9804 18.9527 10.9804 18.5022 11.431L15.7281 14.2051C15.638 14.2952 15.4919 14.2952 15.4018 14.2051L12.6277 11.431C12.1772 10.9804 11.4465 10.9804 10.9959 11.431C10.5454 11.8816 10.5454 12.6122 10.9959 13.0628L13.77 15.8368C13.8601 15.927 13.8601 16.0731 13.77 16.1632L10.9959 18.9372C10.5454 19.3878 10.5454 20.1184 10.9959 20.569C11.4465 21.0196 12.1772 21.0196 12.6277 20.569L15.4018 17.795C15.4919 17.7049 15.638 17.7049 15.7281 17.795L18.5022 20.569C18.9527 21.0196 19.6834 21.0196 20.1339 20.569C20.5845 20.1184 20.5845 19.3878 20.1339 18.9372L17.3599 16.1632C17.2698 16.0731 17.2698 15.927 17.3599 15.8368L20.1339 13.0628C20.5845 12.6122 20.5845 11.8816 20.1339 11.431Z\" fill=\"#FF606F\"/>\n </svg>\n }\n }\n </div>\n }\n\n <div class=\"pecb-alert__body\">\n @if (title()) {\n <p class=\"pecb-alert__title\">{{ title() }}</p>\n }\n @if (message()) {\n <p class=\"pecb-alert__message\">{{ message() }}</p>\n }\n\n @if (hasActions) {\n <div class=\"pecb-alert__actions\">\n @if (primaryAction()) {\n <button\n type=\"button\"\n class=\"pecb-alert__btn pecb-alert__btn--primary\"\n (click)=\"primaryActionClick.emit()\"\n >{{ primaryAction() }}</button>\n }\n @if (secondaryAction()) {\n <button\n type=\"button\"\n class=\"pecb-alert__btn pecb-alert__btn--secondary\"\n (click)=\"secondaryActionClick.emit()\"\n >{{ secondaryAction() }}</button>\n }\n </div>\n }\n </div>\n\n @if (variant() === 'banner' && dismissible()) {\n <div class=\"pecb-alert__divider\" aria-hidden=\"true\"></div>\n }\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"pecb-alert__close\"\n aria-label=\"Dismiss alert\"\n (click)=\"dismiss()\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M11 1L1 11M1 1L11 11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n }\n\n</div>\n}\n","import {\n Component,\n input,\n output,\n inject,\n computed,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nexport type MetricsCardVariation = '1' | '2' | '3' | '4' | '5' | '6';\nexport type MetricsCardType = 'data+cta' | 'data-only';\nexport type MetricsCardOrientation = 'left-aligned' | 'center';\nexport type MetricsCardBadgeStatus = 'success' | 'warning' | 'error' | 'info';\nexport type MetricsCardIconBg = 'white' | 'pending' | 'success' | 'error' | 'info' | 'purple';\n\n@Component({\n selector: 'pecb-metrics-card',\n standalone: true,\n imports: [],\n templateUrl: './metrics-card.component.html',\n styleUrls: ['./metrics-card.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MetricsCardComponent {\n private sanitizer = inject(DomSanitizer);\n\n /** Layout variation (1–6) matching the Figma design */\n variation = input<MetricsCardVariation>('1');\n\n /** Whether to render a CTA button/link */\n type = input<MetricsCardType>('data+cta');\n\n /**\n * Content alignment — only variation 6 supports 'center'.\n * All others default to 'left-aligned'.\n */\n orientation = input<MetricsCardOrientation>('left-aligned');\n\n /** Metric label/title text */\n label = input('Total Solar Sales');\n\n /** Main metric value displayed prominently */\n value = input('45,823');\n\n /** Show or hide the badge */\n hasBadge = input(true);\n\n /** Badge text (e.g. \"10%\", \"Label\", \"Paid\") */\n badgeText = input('10%');\n\n /** Badge color theme */\n badgeStatus = input<MetricsCardBadgeStatus>('success');\n\n /** Show or hide the description text next to the badge */\n hasDescription = input(true);\n\n /** Description text shown next to the percentage badge */\n description = input('Compared to last month');\n\n /** CTA button label (used for both inline links and footer buttons) */\n ctaText = input('View Snap Report');\n\n /** Show or hide the icon (variations 2, 3, 4, 6) */\n hasIcon = input(true);\n\n /** Custom SVG string for the icon — falls back to a refresh icon when empty */\n iconSvg = input('');\n\n /** Icon container background color (mainly variation 4) */\n iconBg = input<MetricsCardIconBg>('white');\n\n /** Date string shown on the right side of variation 1 */\n date = input('Jun 12th, 2023');\n\n /** Secondary metric text shown below the value in variation 5 */\n subtext = input('$1,873 last year');\n\n /** Emitted when any CTA button or link is clicked */\n ctaClicked = output<void>();\n\n safeIconSvg = computed(() =>\n this.iconSvg()\n ? this.sanitizer.bypassSecurityTrustHtml(this.iconSvg())\n : null\n );\n\n get hostClasses(): string {\n return [\n 'pecb-metrics-card',\n `pecb-metrics-card--variation-${this.variation()}`,\n `pecb-metrics-card--type-${this.type()}`,\n this.orientation() === 'center' ? 'pecb-metrics-card--center' : ''\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n /** Footer CTA renders for variations 2, 3, 4 (left-aligned) and 6 (center) */\n get showFooterCta(): boolean {\n if (this.type() !== 'data+cta') return false;\n const v = this.variation();\n return v === '2' || v === '3' || v === '4' || v === '6';\n }\n\n /** Inline CTA link renders for variations 1 and 5 */\n get showInlineCta(): boolean {\n if (this.type() !== 'data+cta') return false;\n return this.variation() === '1' || this.variation() === '5';\n }\n\n /** Footer CTA arrow renders only for left-aligned variations (2, 3, 4) */\n get showFooterArrow(): boolean {\n return this.orientation() !== 'center';\n }\n\n /** Icon wrapper size class driven by variation */\n get iconSizeClass(): string {\n const v = this.variation();\n if (v === '4') return 'pecb-metrics-card__icon-wrapper--lg';\n if (v === '6') return 'pecb-metrics-card__icon-wrapper--md';\n return 'pecb-metrics-card__icon-wrapper--sm';\n }\n\n /** Icon background class driven by iconBg input */\n get iconBgClass(): string {\n const bg = this.iconBg();\n return bg !== 'white' ? `pecb-metrics-card__icon-wrapper--bg-${bg}` : '';\n }\n\n onCtaClick(): void {\n this.ctaClicked.emit();\n }\n}\n","<div [class]=\"hostClasses\">\n\n <div class=\"pecb-metrics-card__body\">\n\n <!-- ═══════════════════════════════════════════════════════════════\n VARIATION 1 — Wide horizontal card\n Left: label + value + optional inline CTA\n Right: date + status badge\n ════════════════════════════════════════════════════════════════ -->\n @if (variation() === '1') {\n <div class=\"pecb-metrics-card__left\">\n <p class=\"pecb-metrics-card__label\">{{ label() }}</p>\n <p class=\"pecb-metrics-card__value\">{{ value() }}</p>\n @if (showInlineCta) {\n <button\n class=\"pecb-metrics-card__cta-link\"\n type=\"button\"\n (click)=\"onCtaClick()\"\n >\n {{ ctaText() }}\n </button>\n }\n </div>\n <div class=\"pecb-metrics-card__right\">\n <p class=\"pecb-metrics-card__date\">{{ date() }}</p>\n @if (hasBadge()) {\n <span class=\"pecb-metrics-card__badge pecb-metrics-card__badge--{{ badgeStatus() }}\">\n {{ badgeText() }}\n </span>\n }\n </div>\n }\n\n <!-- ═══════════════════════════════════════════════════════════════\n VARIATION 2 — Vertical: icon+label → value → badge+desc\n Footer CTA rendered outside body\n ════════════════════════════════════════════════════════════════ -->\n @if (variation() === '2') {\n <div class=\"pecb-metrics-card__header\">\n @if (hasIcon()) {\n <span\n class=\"pecb-metrics-card__icon-wrapper {{ iconSizeClass }} {{ iconBgClass }}\"\n aria-hidden=\"true\"\n >\n @if (safeIconSvg()) {\n <span [innerHTML]=\"safeIconSvg()\"></span>\n } @else {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 8C14 11.3137 11.3137 14 8 14C4.68629 14 2 11.3137 2 8C2 4.68629 4.68629 2 8 2C9.87384 2 11.5557 2.81444 12.7071 4.10051\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M14 2V5H11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </span>\n }\n <p class=\"pecb-metrics-card__label\">{{ label() }}</p>\n </div>\n <div class=\"pecb-metrics-card__metrics\">\n <p class=\"pecb-metrics-card__value\">{{ value() }}</p>\n @if (hasBadge() || hasDescription()) {\n <div class=\"pecb-metrics-card__badge-row\">\n @if (hasBadge()) {\n <span class=\"pecb-metrics-card__badge pecb-metrics-card__badge--{{ badgeStatus() }}\">\n {{ badgeText() }}\n </span>\n }\n @if (hasDescription()) {\n <p class=\"pecb-metrics-card__description\">{{ description() }}</p>\n }\n </div>\n }\n </div>\n }\n\n <!-- ═══════════════════════════════════════════════════════════════\n VARIATION 3 — Vertical: icon+label → badge+desc → value\n Badge and description appear ABOVE the value\n Footer CTA rendered outside body\n ════════════════════════════════════════════════════════════════ -->\n @if (variation() === '3') {\n <div class=\"pecb-metrics-card__header\">\n @if (hasIcon()) {\n <span\n class=\"pecb-metrics-card__icon-wrapper {{ iconSizeClass }} {{ iconBgClass }}\"\n aria-hidden=\"true\"\n >\n @if (safeIconSvg()) {\n <span [innerHTML]=\"safeIconSvg()\"></span>\n } @else {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 8C14 11.3137 11.3137 14 8 14C4.68629 14 2 11.3137 2 8C2 4.68629 4.68629 2 8 2C9.87384 2 11.5557 2.81444 12.7071 4.10051\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M14 2V5H11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </span>\n }\n <p class=\"pecb-metrics-card__label\">{{ label() }}</p>\n </div>\n <div class=\"pecb-metrics-card__metrics\">\n @if (hasBadge() || hasDescription()) {\n <div class=\"pecb-metrics-card__badge-row\">\n @if (hasBadge()) {\n <span class=\"pecb-metrics-card__badge pecb-metrics-card__badge--{{ badgeStatus() }}\">\n {{ badgeText() }}\n </span>\n }\n @if (hasDescription()) {\n <p class=\"pecb-metrics-card__description\">{{ description() }}</p>\n }\n </div>\n }\n <p class=\"pecb-metrics-card__value\">{{ value() }}</p>\n </div>\n }\n\n <!-- ═══════════════════════════════════════════════════════════════\n VARIATION 4 — Left: label + value + badge+desc, Right: icon\n Footer CTA rendered outside body\n ════════════════════════════════════════════════════════════════ -->\n @if (variation() === '4') {\n <div class=\"pecb-metrics-card__left\">\n <p class=\"pecb-metrics-card__label\">{{ label() }}</p>\n <div class=\"pecb-metrics-card__metrics\">\n <p class=\"pecb-metrics-card__value\">{{ value() }}</p>\n @if (hasBadge() || hasDescription()) {\n <div class=\"pecb-metrics-card__badge-row\">\n @if (hasBadge()) {\n <span class=\"pecb-metrics-card__badge pecb-metrics-card__badge--{{ badgeStatus() }}\">\n {{ badgeText() }}\n </span>\n }\n @if (hasDescription()) {\n <p class=\"pecb-metrics-card__description\">{{ description() }}</p>\n }\n </div>\n }\n </div>\n </div>\n @if (hasIcon()) {\n <div class=\"pecb-metrics-card__right pecb-metrics-card__right--icon-only\">\n <span\n class=\"pecb-metrics-card__icon-wrapper {{ iconSizeClass }} {{ iconBgClass }}\"\n aria-hidden=\"true\"\n >\n @if (safeIconSvg()) {\n <span [innerHTML]=\"safeIconSvg()\"></span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C14.8109 3 17.3337 4.22164 19.0607 6.15077\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M21 3V7H17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </span>\n </div>\n }\n }\n\n <!-- ═══════════════════════════════════════════════════════════════\n VARIATION 5 — Horizontal compact\n Left: label + value + subtext\n Right: badge + optional inline CTA\n ════════════════════════════════════════════════════════════════ -->\n @if (variation() === '5') {\n <div class=\"pecb-metrics-card__left\">\n <p class=\"pecb-metrics-card__label\">{{ label() }}</p>\n <div class=\"pecb-metrics-card__metrics pecb-metrics-card__metrics--compact\">\n <p class=\"pecb-metrics-card__value\">{{ value() }}</p>\n @if (hasDescription()) {\n <p class=\"pecb-metrics-card__subtext\">{{ subtext() }}</p>\n }\n </div>\n </div>\n <div class=\"pecb-metrics-card__right\">\n @if (hasBadge()) {\n <span class=\"pecb-metrics-card__badge pecb-metrics-card__badge--{{ badgeStatus() }}\">\n {{ badgeText() }}\n </span>\n }\n @if (showInlineCta) {\n <button\n class=\"pecb-metrics-card__cta-link\"\n type=\"button\"\n (click)=\"onCtaClick()\"\n >\n {{ ctaText() }}\n </button>\n }\n </div>\n }\n\n <!-- ═══════════════════════════════════════════════════════════════\n VARIATION 6 — Center-aligned\n Icon + label, value, badge + desc\n Footer CTA rendered outside body\n ════════════════════════════════════════════════════════════════ -->\n @if (variation() === '6') {\n <div class=\"pecb-metrics-card__center-header\">\n @if (hasIcon()) {\n <span\n class=\"pecb-metrics-card__icon-wrapper {{ iconSizeClass }} {{ iconBgClass }}\"\n aria-hidden=\"true\"\n >\n @if (safeIconSvg()) {\n <span [innerHTML]=\"safeIconSvg()\"></span>\n } @else {\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17.5 10C17.5 14.1421 14.1421 17.5 10 17.5C5.85786 17.5 2.5 14.1421 2.5 10C2.5 5.85786 5.85786 2.5 10 2.5C11.8449 2.5 13.5348 3.15138 14.8523 4.24848\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M17.5 2.5V6.25H13.75\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </span>\n }\n <p class=\"pecb-metrics-card__label pecb-metrics-card__label--center\">{{ label() }}</p>\n </div>\n <div class=\"pecb-metrics-card__metrics pecb-metrics-card__metrics--center\">\n <p class=\"pecb-metrics-card__value\">{{ value() }}</p>\n @if (hasBadge() || (hasDescription() && type() === 'data+cta')) {\n <div class=\"pecb-metrics-card__badge-row pecb-metrics-card__badge-row--center\">\n @if (hasBadge()) {\n <span class=\"pecb-metrics-card__badge pecb-metrics-card__badge--{{ badgeStatus() }}\">\n {{ badgeText() }}\n </span>\n }\n @if (hasDescription() && type() === 'data+cta') {\n <p class=\"pecb-metrics-card__description\">{{ description() }}</p>\n }\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- ═══════════════════════════════════════════════════════════════\n FOOTER CTA — rendered for data+cta type, variations 2, 3, 4, 6\n ════════════════════════════════════════════════════════════════ -->\n @if (showFooterCta) {\n <div class=\"pecb-metrics-card__footer\">\n <button\n class=\"pecb-metrics-card__cta-btn\"\n type=\"button\"\n (click)=\"onCtaClick()\"\n >\n <span>{{ ctaText() }}</span>\n @if (showFooterArrow) {\n <span class=\"pecb-metrics-card__cta-btn-icon\" aria-hidden=\"true\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 5L12.5 10L7.5 15\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n }\n </button>\n </div>\n }\n\n</div>\n","import {\n Component,\n computed,\n inject,\n input,\n model,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface FloatButtonAction {\n /** Unique identifier used for tracking and emitting click events */\n id: string;\n /** Label text displayed in the action button */\n label: string;\n /** Optional SVG string for the leading icon */\n iconSvg?: string;\n /**\n * Whether to render the icon even when `iconSvg` is provided.\n * Set to false to hide the icon for a specific item without removing the SVG string.\n * @default true\n */\n showIcon?: boolean;\n /**\n * Whether this item is rendered in the list.\n * Use this to dynamically show/hide individual actions without changing the array.\n * @default true\n */\n visible?: boolean;\n /** Whether this action is disabled */\n disabled?: boolean;\n /**\n * Per-item click handler. Called in addition to the global `actionClick` output.\n * Use this when each action needs its own dedicated function.\n * @example { id: 'audio', label: 'Audio', onClick: () => this.startRecording() }\n */\n onClick?: () => void;\n}\n\nexport type FloatButtonPosition =\n | 'bottom-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'top-right'\n | 'top-left'\n | 'top-center';\n\n// ─── FloatButtonItemComponent ─────────────────────────────────────────────────\n\n/**\n * Individual action pill item rendered inside the float button list.\n *\n * @example\n * <pecb-float-button-item label=\"Audio\" [iconSvg]=\"micSvg\" (itemClick)=\"onAudio()\">\n * </pecb-float-button-item>\n */\n@Component({\n selector: 'pecb-float-button-item',\n standalone: true,\n imports: [],\n template: `\n <button\n type=\"button\"\n [class]=\"hostClasses()\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled() || null\"\n (click)=\"onClick()\"\n >\n @if (iconSvg()) {\n <span\n class=\"pecb-float-button-item__icon\"\n aria-hidden=\"true\"\n [innerHTML]=\"safeIcon()\"\n ></span>\n }\n <span class=\"pecb-float-button-item__label\">{{ label() }}</span>\n </button>\n `,\n styleUrls: ['./float-button.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FloatButtonItemComponent {\n private sanitizer = inject(DomSanitizer);\n\n label = input.required<string>();\n iconSvg = input('');\n disabled = input(false);\n\n itemClick = output<void>();\n\n safeIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(this.iconSvg())\n );\n\n hostClasses = computed(() =>\n [\n 'pecb-float-button-item',\n this.disabled() ? 'pecb-float-button-item--disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n onClick(): void {\n if (!this.disabled()) {\n this.itemClick.emit();\n }\n }\n}\n\n// ─── FloatButtonComponent ─────────────────────────────────────────────────────\n\n/**\n * Floating action button with an expandable list of 1–5 action items.\n *\n * Manages open/closed state internally — no consumer binding required.\n * Supports `[(isOpen)]` for controlled mode.\n *\n * @example\n * <!-- Uncontrolled -->\n * <pecb-float-button [actions]=\"myActions\" (actionClick)=\"onAction($event)\">\n * </pecb-float-button>\n *\n * @example\n * <!-- Controlled -->\n * <pecb-float-button [actions]=\"myActions\" [(isOpen)]=\"menuOpen\" (actionClick)=\"onAction($event)\">\n * </pecb-float-button>\n */\n@Component({\n selector: 'pecb-float-button',\n standalone: true,\n imports: [FloatButtonItemComponent],\n templateUrl: './float-button.component.html',\n styleUrls: ['./float-button.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FloatButtonComponent {\n /**\n * List of action items to display (1–5 items as per design spec).\n * Items render in order, closest to the trigger first.\n */\n actions = input<FloatButtonAction[]>([]);\n\n /**\n * Whether the action list is open. Manages its own state internally —\n * no consumer binding required. Supports [(isOpen)] for controlled mode.\n */\n isOpen = model(false);\n\n /**\n * Corner position when `fixed` is true.\n * @default 'bottom-right'\n */\n position = input<FloatButtonPosition>('bottom-right');\n\n /**\n * When true, the component is positioned fixed to the viewport corner\n * defined by `position`. When false, it is relative/inline.\n * @default false\n */\n fixed = input(false);\n\n /** Accessible label for the trigger button */\n triggerAriaLabel = input('Toggle actions');\n\n // ── Outputs ────────────────────────────────────────────────────────────────\n\n /** Emits the action that was clicked */\n actionClick = output<FloatButtonAction>();\n /** Emits when the list opens */\n opened = output<void>();\n /** Emits when the list closes */\n closed = output<void>();\n\n // ── Computed ───────────────────────────────────────────────────────────────\n\n /** Filters hidden items then enforces the 1–5 item constraint */\n visibleActions = computed(() =>\n this.actions()\n .filter(a => a.visible !== false)\n .slice(0, 5)\n );\n\n hostClasses = computed(() =>\n [\n 'pecb-float-button',\n this.fixed() ? `pecb-float-button--fixed` : '',\n this.fixed() ? `pecb-float-button--${this.position()}` : '',\n this.isOpen() ? 'pecb-float-button--open' : '',\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n // ── Methods ────────────────────────────────────────────────────────────────\n\n toggle(): void {\n const next = !this.isOpen();\n this.isOpen.set(next);\n next ? this.opened.emit() : this.closed.emit();\n }\n\n onActionClick(action: FloatButtonAction): void {\n if (!action.disabled) {\n action.onClick?.();\n this.actionClick.emit(action);\n }\n }\n}\n","<div [class]=\"hostClasses()\">\n\n <!-- Action list -->\n @if (isOpen()) {\n <ul class=\"pecb-float-button__list\" role=\"menu\" aria-orientation=\"vertical\">\n @for (action of visibleActions(); track action.id; let i = $index; let total = $count) {\n <li role=\"none\" class=\"pecb-float-button__list-item\" [style.--item-rev-index]=\"total - 1 - i\">\n <pecb-float-button-item\n [label]=\"action.label\"\n [iconSvg]=\"action.showIcon !== false ? (action.iconSvg ?? '') : ''\"\n [disabled]=\"action.disabled ?? false\"\n (itemClick)=\"onActionClick(action)\"\n ></pecb-float-button-item>\n </li>\n }\n </ul>\n }\n\n <!-- Trigger -->\n <button\n type=\"button\"\n class=\"pecb-float-button__trigger\"\n [attr.aria-label]=\"triggerAriaLabel()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"true\"\n (click)=\"toggle()\"\n >\n <span class=\"pecb-float-button__trigger-icon\" aria-hidden=\"true\">\n <!-- + icon — CSS rotates 45° to × when open -->\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 5V19M5 12H19\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </button>\n\n</div>\n","import { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * The visual type of skeleton item to render.\n *\n * - `heading` — Single short line mimicking a section title\n * - `paragraph` — Multiple stacked lines mimicking body text\n * - `input` — Input field placeholder\n * - `button` — Button placeholder (combine with `shape` for circle/round)\n * - `image` — Square image/thumbnail placeholder with a photo icon\n * - `avatar` — User avatar placeholder (combine with `shape` for circle/square)\n */\nexport type SkeletonType = 'heading' | 'paragraph' | 'input' | 'button' | 'image' | 'avatar';\n\n/** Size scale shared across input, button, and avatar types */\nexport type SkeletonSize = 'sm' | 'md' | 'lg';\n\n/**\n * Shape variant.\n * - Button types: `default` | `circle` | `round`\n * - Avatar types: `circle` | `square`\n */\nexport type SkeletonShape = 'default' | 'circle' | 'round' | 'square';\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * `SkeletonComponent` renders a single animated placeholder that mirrors the\n * shape of real content while data is loading.\n *\n * Compose multiple instances to build full-page skeleton layouts.\n *\n * @example\n * <!-- Heading + paragraph block -->\n * <pecb-skeleton type=\"heading\" />\n * <pecb-skeleton type=\"paragraph\" [lines]=\"3\" />\n *\n * @example\n * <!-- Row with avatar and text -->\n * <pecb-skeleton type=\"avatar\" shape=\"circle\" size=\"md\" />\n * <pecb-skeleton type=\"paragraph\" [lines]=\"2\" />\n *\n * @example\n * <!-- Form fields -->\n * <pecb-skeleton type=\"input\" size=\"lg\" />\n * <pecb-skeleton type=\"button\" size=\"md\" />\n * <pecb-skeleton type=\"button\" shape=\"round\" size=\"sm\" />\n */\n@Component({\n selector: 'pecb-skeleton',\n standalone: true,\n templateUrl: './skeleton.component.html',\n styleUrls: ['./skeleton.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'role': 'status',\n '[attr.aria-label]': '\"Loading content\"',\n '[attr.aria-busy]': 'true',\n '[class]': 'hostClasses()',\n },\n})\nexport class SkeletonComponent {\n /** Type of skeleton item to render */\n type = input<SkeletonType>('paragraph');\n\n /**\n * Size variant — applies to `input`, `button`, and `avatar` types.\n * @default 'md'\n */\n size = input<SkeletonSize>('md');\n\n /**\n * Shape variant.\n * - For `button`: `default` (rect) | `circle` | `round` (pill)\n * - For `avatar`: `circle` | `square`\n * @default 'default'\n */\n shape = input<SkeletonShape>('default');\n\n /**\n * Number of lines rendered for `paragraph` type.\n * The last line is automatically shortened to ~60% width.\n * @default 3\n */\n lines = input<number>(3);\n\n /**\n * Override the width with any valid CSS value (e.g. `'70%'`, `'200px'`).\n * Applies to `heading`, `paragraph` lines, and `input` types.\n */\n width = input<string | undefined>(undefined);\n\n /**\n * Whether to show the shimmer sweep animation.\n * Set to `false` for a static placeholder.\n * @default true\n */\n animated = input<boolean>(true);\n\n /** @internal Line widths for paragraph type */\n readonly paragraphLines = computed<string[]>(() => {\n const count = Math.max(1, this.lines());\n return Array.from({ length: count }, (_, i) =>\n i === count - 1 && count > 1 ? '60%' : '100%'\n );\n });\n\n /** @internal Host CSS classes */\n readonly hostClasses = computed(() =>\n [\n 'pecb-skeleton',\n `pecb-skeleton--${this.type()}`,\n `pecb-skeleton--size-${this.size()}`,\n this.shape() !== 'default' ? `pecb-skeleton--shape-${this.shape()}` : '',\n this.animated() ? 'pecb-skeleton--animated' : '',\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@switch (type()) {\n\n @case ('heading') {\n <div class=\"pecb-skeleton__block pecb-skeleton__heading\" [style.width]=\"width()\" aria-hidden=\"true\">\n @if (animated()) { <span class=\"pecb-skeleton__shimmer\"></span> }\n </div>\n }\n\n @case ('paragraph') {\n @for (lineWidth of paragraphLines(); track $index) {\n <div class=\"pecb-skeleton__block pecb-skeleton__line\" [style.width]=\"width() ?? lineWidth\" aria-hidden=\"true\">\n @if (animated()) { <span class=\"pecb-skeleton__shimmer\"></span> }\n </div>\n }\n }\n\n @case ('input') {\n <div class=\"pecb-skeleton__block pecb-skeleton__input\" [style.width]=\"width()\" aria-hidden=\"true\">\n @if (animated()) { <span class=\"pecb-skeleton__shimmer\"></span> }\n </div>\n }\n\n @case ('button') {\n <div class=\"pecb-skeleton__block pecb-skeleton__button\" aria-hidden=\"true\">\n @if (animated()) { <span class=\"pecb-skeleton__shimmer\"></span> }\n </div>\n }\n\n @case ('image') {\n <div class=\"pecb-skeleton__block pecb-skeleton__image\" aria-hidden=\"true\">\n @if (animated()) { <span class=\"pecb-skeleton__shimmer\"></span> }\n <svg\n class=\"pecb-skeleton__image-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\" />\n </svg>\n </div>\n }\n\n @case ('avatar') {\n <div class=\"pecb-skeleton__block pecb-skeleton__avatar\" aria-hidden=\"true\">\n @if (animated()) { <span class=\"pecb-skeleton__shimmer\"></span> }\n </div>\n }\n\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n} from '@angular/core';\n\n// ─── Interfaces ───────────────────────────────────────────────────────────────\n\nexport interface ColorPaletteItem {\n /** Hex color value, e.g. \"#A11E29\" */\n hex: string;\n /** Optional accessible name for the swatch */\n name?: string;\n}\n\nexport interface ColorPaletteGroup {\n /** Section heading displayed above the swatches */\n title: string;\n /** List of colors in this group */\n colors: ColorPaletteItem[];\n}\n\n// ─── Default PECB design-system palette ───────────────────────────────────────\n\nexport const PECB_COLOR_PALETTE: ColorPaletteGroup[] = [\n {\n title: 'Primary',\n colors: [\n { hex: '#A11E29', name: 'Primary Red' },\n { hex: '#212427', name: 'Primary Dark' },\n { hex: '#FFFFFF', name: 'White' },\n ],\n },\n {\n title: 'Secondary',\n colors: [\n { hex: '#313131', name: 'Neutral 1' },\n { hex: '#616161', name: 'Neutral 2' },\n { hex: '#919191', name: 'Neutral 3' },\n { hex: '#C2C2C2', name: 'Neutral 4' },\n { hex: '#ECECEC', name: 'Neutral 5' },\n { hex: '#F7F5F5', name: 'Neutral 6' },\n { hex: '#F4F4F4', name: 'Neutral 7' },\n { hex: '#FAFAFA', name: 'Neutral 8' },\n ],\n },\n {\n title: 'Statuses',\n colors: [\n { hex: '#DC3545', name: 'Error' },\n { hex: '#FDECEA', name: 'Error Background' },\n { hex: '#FD4A5B', name: 'Error Light' },\n { hex: '#FD7E14', name: 'Warning' },\n { hex: '#FFF4E5', name: 'Warning Background' },\n { hex: '#FF9C4A', name: 'Warning Light' },\n { hex: '#008000', name: 'Success' },\n { hex: '#E6F4EA', name: 'Success Background' },\n { hex: '#57BC57', name: 'Success Light' },\n { hex: '#007BFF', name: 'Info' },\n { hex: '#E6F0FA', name: 'Info Background' },\n { hex: '#5EACFF', name: 'Info Light' },\n { hex: '#8E6DF0', name: 'Accent' },\n { hex: '#EEE8FF', name: 'Accent Background' },\n { hex: '#A98CFF', name: 'Accent Light' },\n ],\n },\n {\n title: 'Hover',\n colors: [\n { hex: '#671018', name: 'Primary Hover' },\n { hex: '#616161', name: 'Secondary Hover' },\n ],\n },\n];\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Displays a color palette as a grid of labelled swatches grouped by category.\n *\n * Uses the full PECB design-system palette by default. Pass custom `groups` to\n * render any set of colors.\n *\n * @example\n * <!-- Default PECB palette -->\n * <pecb-color-palette></pecb-color-palette>\n *\n * @example\n * <!-- Custom groups -->\n * <pecb-color-palette [groups]=\"myGroups\"></pecb-color-palette>\n */\n@Component({\n selector: 'pecb-color-palette',\n standalone: true,\n imports: [],\n templateUrl: './color-palette.component.html',\n styleUrls: ['./color-palette.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ColorPaletteComponent {\n /**\n * Color groups to display. Each group has a title and a list of hex colors.\n * Defaults to the full PECB design-system palette.\n */\n groups = input<ColorPaletteGroup[]>(PECB_COLOR_PALETTE);\n}\n","<div class=\"pecb-color-palette\">\n @for (group of groups(); track group.title) {\n <div class=\"pecb-color-palette__group\">\n <h3 class=\"pecb-color-palette__group-title\">{{ group.title }}</h3>\n\n <div class=\"pecb-color-palette__swatches\">\n @for (color of group.colors; track color.hex) {\n <div class=\"pecb-color-palette__swatch\">\n <div\n class=\"pecb-color-palette__swatch-color\"\n [style.background-color]=\"color.hex\"\n role=\"img\"\n [attr.aria-label]=\"color.name ?? color.hex\"\n ></div>\n <span class=\"pecb-color-palette__swatch-hex\">{{ color.hex.toUpperCase() }}</span>\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { NgOptimizedImage } from '@angular/common';\n\nexport type ProfileSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\nexport type ProfileIndicator = 'none' | 'online' | 'offline';\nexport type ProfileBadge = 'none' | 'verified' | 'camera';\n\nconst SIZE_PX: Record<ProfileSize, number> = {\n 'xs': 16, 'sm': 24, 'md': 32, 'lg': 40, 'xl': 48, '2xl': 64,\n};\n\n@Component({\n selector: 'pecb-profile',\n standalone: true,\n imports: [NgOptimizedImage],\n templateUrl: './profile.component.html',\n styleUrl: './profile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClass()',\n },\n})\nexport class ProfileComponent {\n src = input<string | undefined>(undefined);\n initials = input<string | undefined>(undefined);\n alt = input<string>('');\n size = input<ProfileSize>('md');\n indicator = input<ProfileIndicator>('none');\n badge = input<ProfileBadge>('none');\n\n cameraClick = output<MouseEvent>();\n\n hostClass = computed(() => `pecb-profile pecb-profile--${this.size()}`);\n showImage = computed(() => !!this.src());\n showInitials = computed(() => !this.src() && !!this.initials());\n showIcon = computed(() => !this.src() && !this.initials());\n imgSize = computed(() => SIZE_PX[this.size()]);\n\n onCameraClick(event: MouseEvent): void {\n event.stopPropagation();\n this.cameraClick.emit(event);\n }\n}\n","<div class=\"pecb-profile__image-wrap\">\n @if (showImage()) {\n <img\n class=\"pecb-profile__image\"\n [ngSrc]=\"src()!\"\n [width]=\"imgSize()\"\n [height]=\"imgSize()\"\n [alt]=\"alt()\"\n />\n } @else if (showInitials()) {\n <span class=\"pecb-profile__initials\">{{ initials() }}</span>\n } @else {\n <svg class=\"pecb-profile__icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8v2.4h19.2v-2.4c0-3.2-6.4-4.8-9.6-4.8z\"/>\n </svg>\n }\n</div>\n\n@if (indicator() !== 'none') {\n <span\n class=\"pecb-profile__badge pecb-profile__indicator\"\n [class.pecb-profile__indicator--online]=\"indicator() === 'online'\"\n [class.pecb-profile__indicator--offline]=\"indicator() === 'offline'\"\n [attr.aria-label]=\"indicator() === 'online' ? 'Online' : 'Offline'\"\n ></span>\n}\n\n@if (badge() === 'verified') {\n <span class=\"pecb-profile__badge pecb-profile__verified\" aria-label=\"Verified\">\n <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n}\n\n@if (badge() === 'camera') {\n <button\n class=\"pecb-profile__badge pecb-profile__camera\"\n type=\"button\"\n aria-label=\"Edit photo\"\n (click)=\"onCameraClick($event)\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M6.5 2L5.5 3.5H3a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-7a1 1 0 0 0-1-1h-2.5L9.5 2h-3zM8 11a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5z\"/>\n </svg>\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { NgOptimizedImage } from '@angular/common';\n\nexport type ProfileGroupSize = 'sm' | 'md' | 'lg';\n\nexport interface ProfileGroupItem {\n src?: string;\n initials?: string;\n alt?: string;\n}\n\nconst GROUP_SIZE_PX: Record<ProfileGroupSize, number> = {\n 'sm': 24, 'md': 32, 'lg': 40,\n};\n\n@Component({\n selector: 'pecb-profile-group',\n standalone: true,\n imports: [NgOptimizedImage],\n templateUrl: './profile-group.component.html',\n styleUrl: './profile-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClass()',\n },\n})\nexport class ProfileGroupComponent {\n avatars = input<ProfileGroupItem[]>([]);\n size = input<ProfileGroupSize>('md');\n max = input<number>(9);\n\n hostClass = computed(() => `pecb-profile-group pecb-profile-group--${this.size()}`);\n visible = computed(() => this.avatars().slice(0, this.max()));\n overflow = computed(() => Math.max(0, this.avatars().length - this.max()));\n overflowLabel = computed(() => `+${this.overflow()}`);\n imgSize = computed(() => GROUP_SIZE_PX[this.size()]);\n}\n","@for (avatar of visible(); track $index) {\n <div class=\"pecb-profile-group__item\">\n @if (avatar.src) {\n <img\n [ngSrc]=\"avatar.src\"\n [width]=\"imgSize()\"\n [height]=\"imgSize()\"\n [alt]=\"avatar.alt || ''\"\n />\n } @else if (avatar.initials) {\n <span class=\"pecb-profile-group__initials\">{{ avatar.initials }}</span>\n } @else {\n <svg class=\"pecb-profile-group__icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8v2.4h19.2v-2.4c0-3.2-6.4-4.8-9.6-4.8z\"/>\n </svg>\n }\n </div>\n}\n\n@if (overflow() > 0) {\n <div class=\"pecb-profile-group__overflow\" [attr.aria-label]=\"overflow() + ' more'\">\n {{ overflowLabel() }}\n </div>\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n} from '@angular/core';\n\n// ─── Interfaces ───────────────────────────────────────────────────────────────\n\n/**\n * One entry in the modular type scale table (Typefaces panel).\n */\nexport interface TypographyScaleEntry {\n /** Font size in pixels */\n px: number;\n /** Equivalent rem value displayed as a label, e.g. \"3.812\" */\n rem: string;\n /** Custom sample sentence. Defaults to the component's `scaleSampleText`. */\n sample?: string;\n}\n\n/**\n * One named text style in the font catalogue (Fonts panel).\n */\nexport interface TypographyStyleEntry {\n /** Display name, e.g. \"Hero 1 bold\", \"Body 14\", \"Caption\" */\n name: string;\n /** CSS font-size value, e.g. \"64px\" */\n fontSize: string;\n /** Numeric font-weight */\n fontWeight: 400 | 500 | 700;\n /** CSS line-height value, e.g. \"1.2\", \"normal\", \"18px\" */\n lineHeight: string;\n /** Optional CSS text-transform — use \"uppercase\" for caption styles */\n textTransform?: 'uppercase';\n}\n\n// ─── Default PECB design-system data ─────────────────────────────────────────\n\n/** Modular type scale used by the PECB design system (base 16 px, ratio 1.25). */\nexport const PECB_TYPE_SCALE: TypographyScaleEntry[] = [\n { px: 64, rem: '3.812' },\n { px: 48, rem: '3.062' },\n { px: 31, rem: '2.438' },\n { px: 25, rem: '1.938' },\n { px: 20, rem: '1.562' },\n { px: 16, rem: '1.000' },\n { px: 13, rem: '0.812' },\n { px: 10, rem: '0.625' },\n];\n\n/** All named text styles defined in the PECB design system. */\nexport const PECB_FONT_STYLES: TypographyStyleEntry[] = [\n // ── Hero ─────────────────────────────────────────────────────────────────\n { name: 'Hero 1', fontSize: '64px', fontWeight: 400, lineHeight: '1.2' },\n { name: 'Hero 1 medium', fontSize: '64px', fontWeight: 500, lineHeight: '1.2' },\n { name: 'Hero 1 bold', fontSize: '64px', fontWeight: 700, lineHeight: '1.2' },\n { name: 'Hero 2', fontSize: '56px', fontWeight: 400, lineHeight: '1.2' },\n { name: 'Hero 2 medium', fontSize: '56px', fontWeight: 500, lineHeight: '1.2' },\n { name: 'Hero 2 bold', fontSize: '56px', fontWeight: 700, lineHeight: '1.2' },\n { name: 'Hero 3', fontSize: '48px', fontWeight: 400, lineHeight: '1.2' },\n { name: 'Hero 3 medium', fontSize: '48px', fontWeight: 500, lineHeight: '1.2' },\n { name: 'Hero 3 bold', fontSize: '48px', fontWeight: 700, lineHeight: '1.2' },\n // ── Headings ──────────────────────────────────────────────────────────────\n { name: 'H1', fontSize: '40px', fontWeight: 400, lineHeight: '1.2' },\n { name: 'H1 medium', fontSize: '40px', fontWeight: 500, lineHeight: '1.2' },\n { name: 'H1 bold', fontSize: '40px', fontWeight: 700, lineHeight: '1.2' },\n { name: 'H2', fontSize: '32px', fontWeight: 400, lineHeight: '1.2' },\n { name: 'H2 medium', fontSize: '32px', fontWeight: 500, lineHeight: '1.2' },\n { name: 'H2 bold', fontSize: '32px', fontWeight: 700, lineHeight: '1.2' },\n { name: 'H3', fontSize: '24px', fontWeight: 400, lineHeight: '1.2' },\n { name: 'H3 medium', fontSize: '24px', fontWeight: 500, lineHeight: '1.2' },\n { name: 'H3 bold', fontSize: '24px', fontWeight: 700, lineHeight: '1.2' },\n // ── Body ─────────────────────────────────────────────────────────────────\n { name: 'Body 12', fontSize: '12px', fontWeight: 400, lineHeight: 'normal' },\n { name: 'Bold 12', fontSize: '12px', fontWeight: 700, lineHeight: 'normal' },\n { name: 'Medium 12', fontSize: '12px', fontWeight: 500, lineHeight: 'normal' },\n { name: 'Body 13', fontSize: '13px', fontWeight: 400, lineHeight: '20px' },\n { name: 'Bold 13', fontSize: '13px', fontWeight: 700, lineHeight: 'normal' },\n { name: 'Medium 13', fontSize: '13px', fontWeight: 500, lineHeight: 'normal' },\n { name: 'Body 14', fontSize: '14px', fontWeight: 400, lineHeight: '1.5' },\n { name: 'Bold 14', fontSize: '14px', fontWeight: 700, lineHeight: 'normal' },\n { name: 'Medium 14', fontSize: '14px', fontWeight: 500, lineHeight: 'normal' },\n { name: 'Body 16', fontSize: '18px', fontWeight: 400, lineHeight: '1.2' },\n { name: 'Bold 16', fontSize: '16px', fontWeight: 700, lineHeight: '1.2' },\n { name: 'Medium 16', fontSize: '16px', fontWeight: 500, lineHeight: '1.6' },\n // ── Caption ───────────────────────────────────────────────────────────────\n { name: 'Caption', fontSize: '12px', fontWeight: 400, lineHeight: '18px', textTransform: 'uppercase' },\n { name: 'Caption bold', fontSize: '12px', fontWeight: 700, lineHeight: '18px', textTransform: 'uppercase' },\n];\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Displays the typography system as two visual sections:\n *\n * 1. **Type Scale** — A table showing \"The quick brown fox…\" rendered at every\n * step of the modular scale, with px and rem labels.\n *\n * 2. **Font Styles** — A catalogue of every named text style, each rendered in\n * its own visual treatment.\n *\n * Uses the full PECB design system by default; pass custom data via inputs to\n * document any other type system.\n *\n * @example\n * <!-- Default PECB typography -->\n * <pecb-typography></pecb-typography>\n *\n * @example\n * <!-- Scale only -->\n * <pecb-typography [showStyles]=\"false\"></pecb-typography>\n *\n * @example\n * <!-- Custom data -->\n * <pecb-typography [scaleEntries]=\"myScale\" [styleEntries]=\"myStyles\"></pecb-typography>\n */\n@Component({\n selector: 'pecb-typography',\n standalone: true,\n imports: [],\n templateUrl: './typography.component.html',\n styleUrls: ['./typography.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TypographyComponent {\n /** Name of the typeface shown in the Fonts panel header. */\n fontName = input('Plus Jakarta Sans');\n\n /**\n * Type scale entries rendered in the Typefaces panel.\n * Defaults to the PECB modular scale.\n */\n scaleEntries = input<TypographyScaleEntry[]>(PECB_TYPE_SCALE);\n\n /**\n * Named text styles rendered in the Fonts panel.\n * Defaults to the full PECB font catalogue.\n */\n styleEntries = input<TypographyStyleEntry[]>(PECB_FONT_STYLES);\n\n /** Whether to render the Type Scale (Typefaces) panel. @default true */\n showScale = input(true);\n\n /** Whether to render the Font Styles (Fonts) panel. @default true */\n showStyles = input(true);\n\n /** Base value label shown in the type scale header. @default 16 */\n scaleBaseValue = input(16);\n\n /** Ratio label shown in the type scale header. @default 1.25 */\n scaleFactor = input(1.25);\n\n /** Sample sentence used in every scale row (overrideable per-entry via `sample`). */\n scaleSampleText = input('The quick brown fox jumps over the lazy dog');\n}\n","<div class=\"pecb-typography\">\n\n <!-- ── Type Scale (Typefaces) ──────────────────────────────────────────── -->\n @if (showScale()) {\n <div class=\"pecb-typography__scale\">\n\n <div class=\"pecb-typography__scale-meta\">\n <span>Base Value: {{ scaleBaseValue() }}</span>\n <span>Scale: {{ scaleFactor() }}</span>\n </div>\n\n @for (entry of scaleEntries(); track entry.px) {\n <div class=\"pecb-typography__scale-row\">\n <div class=\"pecb-typography__scale-label\" aria-hidden=\"true\">\n <span class=\"pecb-typography__scale-px\">{{ entry.px }}px</span>\n <span class=\"pecb-typography__scale-rem\">{{ entry.rem }}rem</span>\n </div>\n <p\n class=\"pecb-typography__scale-sample\"\n [style.font-size.px]=\"entry.px\"\n >{{ entry.sample ?? scaleSampleText() }}</p>\n </div>\n }\n\n </div>\n }\n\n <!-- ── Font Styles (Fonts) ─────────────────────────────────────────────── -->\n @if (showStyles()) {\n <div class=\"pecb-typography__styles\">\n\n <p class=\"pecb-typography__font-name\">\n Font Name:&nbsp;<strong>{{ fontName() }}</strong>\n </p>\n\n @for (style of styleEntries(); track style.name) {\n <p\n class=\"pecb-typography__style-item\"\n [style.font-size]=\"style.fontSize\"\n [style.font-weight]=\"style.fontWeight\"\n [style.line-height]=\"style.lineHeight\"\n [style.text-transform]=\"style.textTransform ?? 'none'\"\n >{{ style.name }}</p>\n }\n\n </div>\n }\n\n</div>\n","import { Injectable } from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\n\n/**\n * Notification types supported by the service\n */\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\n\n/**\n * Notification position on screen\n */\nexport type NotificationPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n\n/**\n * Notification configuration options\n */\nexport interface NotificationConfig {\n /** Notification message */\n message: string;\n /** Notification title (optional) */\n title?: string;\n /** Type of notification */\n type: NotificationType;\n /** Duration in milliseconds (0 for persistent) */\n duration?: number;\n /** Whether the notification can be dismissed */\n dismissible?: boolean;\n /** Position on screen */\n position?: NotificationPosition;\n /** Custom CSS class */\n customClass?: string;\n /** Unique identifier */\n id?: string;\n}\n\n/**\n * Notification object with all properties\n */\nexport interface Notification extends Required<Omit<NotificationConfig, 'title' | 'customClass'>> {\n title?: string;\n customClass?: string;\n timestamp: Date;\n}\n\n/**\n * A stateless, injectable notification service for displaying toast notifications.\n *\n * This service provides a reactive way to manage notifications across the application.\n * It uses RxJS Subjects to emit notification events that can be consumed by notification\n * display components.\n *\n * @example\n * ```typescript\n * import { NotificationService } from '@pecb-ui/components';\n *\n * @Component({...})\n * export class MyComponent {\n * constructor(private notificationService: NotificationService) {}\n *\n * showSuccess(): void {\n * this.notificationService.success('Operation completed successfully!');\n * }\n *\n * showError(): void {\n * this.notificationService.error('An error occurred', 'Error Title');\n * }\n * }\n * ```\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationService {\n private readonly notificationSubject = new Subject<Notification>();\n private readonly dismissSubject = new Subject<string>();\n private readonly clearSubject = new Subject<void>();\n\n /** Default duration for notifications in milliseconds */\n private readonly defaultDuration = 5000;\n /** Default position for notifications */\n private readonly defaultPosition: NotificationPosition = 'top-right';\n\n /**\n * Observable stream of notifications\n */\n get notifications$(): Observable<Notification> {\n return this.notificationSubject.asObservable();\n }\n\n /**\n * Observable stream of dismissed notification IDs\n */\n get dismiss$(): Observable<string> {\n return this.dismissSubject.asObservable();\n }\n\n /**\n * Observable stream for clear all events\n */\n get clear$(): Observable<void> {\n return this.clearSubject.asObservable();\n }\n\n /**\n * Show a success notification\n * @param message - The notification message\n * @param title - Optional title\n * @param config - Optional additional configuration\n */\n success(message: string, title?: string, config?: Partial<NotificationConfig>): string {\n return this.show({ ...config, message, title, type: 'success' });\n }\n\n /**\n * Show an error notification\n * @param message - The notification message\n * @param title - Optional title\n * @param config - Optional additional configuration\n */\n error(message: string, title?: string, config?: Partial<NotificationConfig>): string {\n return this.show({ ...config, message, title, type: 'error' });\n }\n\n /**\n * Show a warning notification\n * @param message - The notification message\n * @param title - Optional title\n * @param config - Optional additional configuration\n */\n warning(message: string, title?: string, config?: Partial<NotificationConfig>): string {\n return this.show({ ...config, message, title, type: 'warning' });\n }\n\n /**\n * Show an info notification\n * @param message - The notification message\n * @param title - Optional title\n * @param config - Optional additional configuration\n */\n info(message: string, title?: string, config?: Partial<NotificationConfig>): string {\n return this.show({ ...config, message, title, type: 'info' });\n }\n\n /**\n * Show a notification with custom configuration\n * @param config - Full notification configuration\n * @returns The notification ID\n */\n show(config: NotificationConfig): string {\n const id = config.id || this.generateId();\n\n const notification: Notification = {\n id,\n message: config.message,\n title: config.title,\n type: config.type,\n duration: config.duration ?? this.defaultDuration,\n dismissible: config.dismissible ?? true,\n position: config.position ?? this.defaultPosition,\n customClass: config.customClass,\n timestamp: new Date()\n };\n\n this.notificationSubject.next(notification);\n return id;\n }\n\n /**\n * Dismiss a specific notification by ID\n * @param id - The notification ID to dismiss\n */\n dismiss(id: string): void {\n this.dismissSubject.next(id);\n }\n\n /**\n * Clear all notifications\n */\n clearAll(): void {\n this.clearSubject.next();\n }\n\n /**\n * Generate a unique notification ID\n */\n private generateId(): string {\n return `notification-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n}\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Available theme modes\n */\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\n/**\n * Theme configuration interface\n */\nexport interface ThemeConfig {\n /** Current theme mode */\n mode: ThemeMode;\n /** Resolved theme (light or dark, never system) */\n resolvedTheme: 'light' | 'dark';\n /** CSS class to apply to the document */\n cssClass: string;\n}\n\n/**\n * Custom theme variables that can be overridden\n */\nexport interface ThemeVariables {\n /** Primary color */\n primaryColor?: string;\n /** Secondary color */\n secondaryColor?: string;\n /** Background color */\n backgroundColor?: string;\n /** Text color */\n textColor?: string;\n /** Border radius */\n borderRadius?: string;\n /** Font family */\n fontFamily?: string;\n /** Custom CSS variables */\n [key: string]: string | undefined;\n}\n\n/**\n * Storage key for persisting theme preference\n */\nconst THEME_STORAGE_KEY = 'pecb-ui-theme';\n\n/**\n * A stateless, injectable theme service for managing application themes.\n *\n * This service provides reactive theme management with support for light/dark modes,\n * system preference detection, and custom CSS variable overrides.\n *\n * @example\n * ```typescript\n * import { ThemeService } from '@pecb-ui/components';\n *\n * @Component({...})\n * export class MyComponent {\n * constructor(private themeService: ThemeService) {}\n *\n * toggleTheme(): void {\n * this.themeService.toggleTheme();\n * }\n *\n * setDarkMode(): void {\n * this.themeService.setTheme('dark');\n * }\n * }\n * ```\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n private readonly themeSubject: BehaviorSubject<ThemeConfig>;\n private readonly isBrowser: boolean;\n private mediaQuery: MediaQueryList | null = null;\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n\n const initialTheme = this.getInitialTheme();\n this.themeSubject = new BehaviorSubject<ThemeConfig>(this.createThemeConfig(initialTheme));\n\n if (this.isBrowser) {\n this.setupSystemThemeListener();\n this.applyTheme(this.themeSubject.value);\n }\n }\n\n /**\n * Observable stream of theme configuration changes\n */\n get theme$(): Observable<ThemeConfig> {\n return this.themeSubject.asObservable();\n }\n\n /**\n * Get the current theme configuration\n */\n get currentTheme(): ThemeConfig {\n return this.themeSubject.value;\n }\n\n /**\n * Get the current theme mode\n */\n get currentMode(): ThemeMode {\n return this.themeSubject.value.mode;\n }\n\n /**\n * Check if the current resolved theme is dark\n */\n get isDarkMode(): boolean {\n return this.themeSubject.value.resolvedTheme === 'dark';\n }\n\n /**\n * Set the theme mode\n * @param mode - The theme mode to set (light, dark, or system)\n */\n setTheme(mode: ThemeMode): void {\n const config = this.createThemeConfig(mode);\n this.themeSubject.next(config);\n this.persistTheme(mode);\n\n if (this.isBrowser) {\n this.applyTheme(config);\n }\n }\n\n /**\n * Toggle between light and dark themes\n * If currently using system preference, switches to the opposite of the resolved theme\n */\n toggleTheme(): void {\n const current = this.themeSubject.value;\n const newMode: ThemeMode = current.resolvedTheme === 'light' ? 'dark' : 'light';\n this.setTheme(newMode);\n }\n\n /**\n * Reset to system preference\n */\n useSystemTheme(): void {\n this.setTheme('system');\n }\n\n /**\n * Apply custom CSS variables to the document\n * @param variables - Object containing CSS variable overrides\n */\n setCustomVariables(variables: ThemeVariables): void {\n if (!this.isBrowser) {\n return;\n }\n\n const root = document.documentElement;\n Object.entries(variables).forEach(([key, value]) => {\n if (value !== undefined) {\n const cssVarName = this.toCssVariableName(key);\n root.style.setProperty(cssVarName, value);\n }\n });\n }\n\n /**\n * Remove custom CSS variables from the document\n * @param variableNames - Array of variable names to remove\n */\n removeCustomVariables(variableNames: string[]): void {\n if (!this.isBrowser) {\n return;\n }\n\n const root = document.documentElement;\n variableNames.forEach(name => {\n const cssVarName = this.toCssVariableName(name);\n root.style.removeProperty(cssVarName);\n });\n }\n\n /**\n * Get the initial theme from storage or system preference\n */\n private getInitialTheme(): ThemeMode {\n if (!this.isBrowser) {\n return 'light';\n }\n\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\n if (stored && ['light', 'dark', 'system'].includes(stored)) {\n return stored as ThemeMode;\n }\n\n return 'system';\n }\n\n /**\n * Create a theme configuration object\n */\n private createThemeConfig(mode: ThemeMode): ThemeConfig {\n const resolvedTheme = this.resolveTheme(mode);\n return {\n mode,\n resolvedTheme,\n cssClass: `pecb-theme-${resolvedTheme}`\n };\n }\n\n /**\n * Resolve the actual theme from mode (handles 'system' mode)\n */\n private resolveTheme(mode: ThemeMode): 'light' | 'dark' {\n if (mode === 'system') {\n return this.getSystemPreference();\n }\n return mode;\n }\n\n /**\n * Get the system color scheme preference\n */\n private getSystemPreference(): 'light' | 'dark' {\n if (!this.isBrowser) {\n return 'light';\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n /**\n * Setup listener for system theme changes\n */\n private setupSystemThemeListener(): void {\n if (!this.isBrowser) {\n return;\n }\n\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const listener = (): void => {\n if (this.themeSubject.value.mode === 'system') {\n const config = this.createThemeConfig('system');\n this.themeSubject.next(config);\n this.applyTheme(config);\n }\n };\n\n // Use addEventListener for modern browsers\n if (this.mediaQuery.addEventListener) {\n this.mediaQuery.addEventListener('change', listener);\n }\n }\n\n /**\n * Apply the theme to the document\n */\n private applyTheme(config: ThemeConfig): void {\n if (!this.isBrowser) {\n return;\n }\n\n const root = document.documentElement;\n\n // Remove existing theme classes\n root.classList.remove('pecb-theme-light', 'pecb-theme-dark');\n\n // Add new theme class\n root.classList.add(config.cssClass);\n\n // Set data attribute for CSS selectors\n root.setAttribute('data-pecb-theme', config.resolvedTheme);\n }\n\n /**\n * Persist theme preference to storage\n */\n private persistTheme(mode: ThemeMode): void {\n if (!this.isBrowser) {\n return;\n }\n localStorage.setItem(THEME_STORAGE_KEY, mode);\n }\n\n /**\n * Convert camelCase property name to CSS variable name\n */\n private toCssVariableName(name: string): string {\n const kebabCase = name.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `--pecb-${kebabCase}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n/**\n * Loading state for a specific operation\n */\nexport interface LoadingState {\n /** Unique identifier for the loading operation */\n id: string;\n /** Whether this operation is currently loading */\n isLoading: boolean;\n /** Optional message to display */\n message?: string;\n /** Optional progress percentage (0-100) */\n progress?: number;\n}\n\n/**\n * A stateless, injectable loading service for managing loading states.\n *\n * This service provides a centralized way to track loading states across\n * the application, supporting multiple concurrent loading operations with\n * individual tracking capabilities.\n *\n * @example\n * ```typescript\n * import { LoadingService } from '@pecb-ui/components';\n *\n * @Component({...})\n * export class MyComponent {\n * isLoading$ = this.loadingService.isLoading$('my-operation');\n *\n * constructor(private loadingService: LoadingService) {}\n *\n * async loadData(): Promise<void> {\n * this.loadingService.start('my-operation', 'Loading data...');\n * try {\n * await this.fetchData();\n * } finally {\n * this.loadingService.stop('my-operation');\n * }\n * }\n * }\n * ```\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class LoadingService {\n private readonly loadingStates = new Map<string, LoadingState>();\n private readonly statesSubject = new BehaviorSubject<Map<string, LoadingState>>(new Map());\n\n /** Default loading operation ID */\n private readonly defaultId = 'global';\n\n /**\n * Observable of all loading states\n */\n get states$(): Observable<Map<string, LoadingState>> {\n return this.statesSubject.asObservable();\n }\n\n /**\n * Observable that emits true when any loading operation is active\n */\n get isAnyLoading$(): Observable<boolean> {\n return this.statesSubject.pipe(\n map(states => Array.from(states.values()).some(state => state.isLoading))\n );\n }\n\n /**\n * Get observable for a specific loading operation\n * @param id - The loading operation identifier\n */\n isLoading$(id: string = this.defaultId): Observable<boolean> {\n return this.statesSubject.pipe(\n map(states => states.get(id)?.isLoading ?? false)\n );\n }\n\n /**\n * Get observable for loading state with message\n * @param id - The loading operation identifier\n */\n getState$(id: string = this.defaultId): Observable<LoadingState | undefined> {\n return this.statesSubject.pipe(\n map(states => states.get(id))\n );\n }\n\n /**\n * Check if a specific operation is currently loading (synchronous)\n * @param id - The loading operation identifier\n */\n isLoading(id: string = this.defaultId): boolean {\n return this.loadingStates.get(id)?.isLoading ?? false;\n }\n\n /**\n * Check if any operation is currently loading (synchronous)\n */\n isAnyLoading(): boolean {\n return Array.from(this.loadingStates.values()).some(state => state.isLoading);\n }\n\n /**\n * Start a loading operation\n * @param id - The loading operation identifier\n * @param message - Optional message to display\n */\n start(id: string = this.defaultId, message?: string): void {\n this.updateState(id, { isLoading: true, message, progress: undefined });\n }\n\n /**\n * Stop a loading operation\n * @param id - The loading operation identifier\n */\n stop(id: string = this.defaultId): void {\n this.updateState(id, { isLoading: false, message: undefined, progress: undefined });\n }\n\n /**\n * Update progress for a loading operation\n * @param id - The loading operation identifier\n * @param progress - Progress percentage (0-100)\n * @param message - Optional updated message\n */\n setProgress(id: string, progress: number, message?: string): void {\n const currentState = this.loadingStates.get(id);\n if (currentState) {\n this.updateState(id, {\n isLoading: true,\n progress: Math.min(100, Math.max(0, progress)),\n message: message ?? currentState.message\n });\n }\n }\n\n /**\n * Update the message for a loading operation\n * @param id - The loading operation identifier\n * @param message - New message to display\n */\n setMessage(id: string, message: string): void {\n const currentState = this.loadingStates.get(id);\n if (currentState) {\n this.updateState(id, { ...currentState, id, message });\n }\n }\n\n /**\n * Stop all loading operations\n */\n stopAll(): void {\n this.loadingStates.clear();\n this.statesSubject.next(new Map());\n }\n\n /**\n * Remove a loading state completely\n * @param id - The loading operation identifier\n */\n remove(id: string): void {\n this.loadingStates.delete(id);\n this.emitStates();\n }\n\n /**\n * Execute an async operation with automatic loading state management\n * @param id - The loading operation identifier\n * @param operation - The async operation to execute\n * @param message - Optional loading message\n * @returns The result of the operation\n */\n async withLoading<T>(\n id: string,\n operation: () => Promise<T>,\n message?: string\n ): Promise<T> {\n this.start(id, message);\n try {\n return await operation();\n } finally {\n this.stop(id);\n }\n }\n\n /**\n * Update a loading state\n */\n private updateState(id: string, partialState: Partial<LoadingState> & { isLoading: boolean }): void {\n const state: LoadingState = {\n id,\n isLoading: partialState.isLoading,\n message: partialState.message,\n progress: partialState.progress\n };\n\n this.loadingStates.set(id, state);\n this.emitStates();\n }\n\n /**\n * Emit current states to subscribers\n */\n private emitStates(): void {\n this.statesSubject.next(new Map(this.loadingStates));\n }\n}\n","/**\n * Common type definitions for PECB UI Components\n * @module types\n */\n\n/**\n * Standard size variants used across components\n */\nexport type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Standard component size mapping\n */\nexport type ComponentSize = 'small' | 'medium' | 'large';\n\n/**\n * Semantic color variants\n */\nexport type ColorVariant = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info';\n\n/**\n * Extended color variants including neutral options\n */\nexport type ExtendedColorVariant = ColorVariant | 'neutral' | 'muted';\n\n/**\n * Component state variants\n */\nexport type StateVariant = 'default' | 'hover' | 'active' | 'focus' | 'disabled';\n\n/**\n * Position options for overlays and popups\n */\nexport type Position =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end';\n\n/**\n * Alignment options\n */\nexport type Alignment = 'start' | 'center' | 'end' | 'stretch';\n\n/**\n * Direction options for layouts\n */\nexport type Direction = 'horizontal' | 'vertical';\n\n/**\n * Orientation alias for direction\n */\nexport type Orientation = 'horizontal' | 'vertical';\n\n/**\n * Spacing scale values\n */\nexport type SpacingScale = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\n\n/**\n * Border radius scale values\n */\nexport type RadiusScale = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/**\n * Shadow elevation levels\n */\nexport type ElevationLevel = 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Animation timing presets\n */\nexport type AnimationTiming = 'instant' | 'fast' | 'normal' | 'slow';\n\n/**\n * Breakpoint names\n */\nexport type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\n\n/**\n * Form validation state\n */\nexport type ValidationState = 'valid' | 'invalid' | 'pending' | 'pristine';\n\n/**\n * Generic callback function type\n */\nexport type Callback<T = void> = () => T;\n\n/**\n * Generic event handler type\n */\nexport type EventHandler<T = Event> = (event: T) => void;\n\n/**\n * Make specific properties required\n */\nexport type RequireProps<T, K extends keyof T> = T & Required<Pick<T, K>>;\n\n/**\n * Make specific properties optional\n */\nexport type OptionalProps<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Extract non-nullable type\n */\nexport type NonNullableProps<T> = {\n [K in keyof T]: NonNullable<T[K]>;\n};\n","/**\n * String utility functions for PECB UI Components\n * @module utils/string\n */\n\n/**\n * Convert a string to kebab-case\n * @param str - The string to convert\n * @returns The kebab-case string\n *\n * @example\n * toKebabCase('myComponentName') // 'my-component-name'\n * toKebabCase('MyComponentName') // 'my-component-name'\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Convert a string to camelCase\n * @param str - The string to convert\n * @returns The camelCase string\n *\n * @example\n * toCamelCase('my-component-name') // 'myComponentName'\n * toCamelCase('my_component_name') // 'myComponentName'\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\n .replace(/^[A-Z]/, char => char.toLowerCase());\n}\n\n/**\n * Convert a string to PascalCase\n * @param str - The string to convert\n * @returns The PascalCase string\n *\n * @example\n * toPascalCase('my-component-name') // 'MyComponentName'\n */\nexport function toPascalCase(str: string): string {\n const camel = toCamelCase(str);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n}\n\n/**\n * Convert a string to snake_case\n * @param str - The string to convert\n * @returns The snake_case string\n *\n * @example\n * toSnakeCase('myComponentName') // 'my_component_name'\n */\nexport function toSnakeCase(str: string): string {\n return toKebabCase(str).replace(/-/g, '_');\n}\n\n/**\n * Capitalize the first letter of a string\n * @param str - The string to capitalize\n * @returns The capitalized string\n *\n * @example\n * capitalize('hello world') // 'Hello world'\n */\nexport function capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Truncate a string to a specified length\n * @param str - The string to truncate\n * @param maxLength - Maximum length\n * @param suffix - Suffix to append when truncated (default: '...')\n * @returns The truncated string\n *\n * @example\n * truncate('Hello World', 8) // 'Hello...'\n * truncate('Hello World', 8, '…') // 'Hello W…'\n */\nexport function truncate(str: string, maxLength: number, suffix = '...'): string {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * Check if a string is empty or contains only whitespace\n * @param str - The string to check\n * @returns True if the string is empty or whitespace\n *\n * @example\n * isBlank('') // true\n * isBlank(' ') // true\n * isBlank('hello') // false\n */\nexport function isBlank(str: string | null | undefined): boolean {\n return !str || str.trim().length === 0;\n}\n\n/**\n * Check if a string is not empty and contains non-whitespace characters\n * @param str - The string to check\n * @returns True if the string is not empty\n */\nexport function isNotBlank(str: string | null | undefined): str is string {\n return !isBlank(str);\n}\n\n/**\n * Generate a slug from a string (URL-friendly)\n * @param str - The string to convert\n * @returns URL-friendly slug\n *\n * @example\n * slugify('Hello World!') // 'hello-world'\n * slugify('Café Latte') // 'cafe-latte'\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s-]/g, '') // Remove non-alphanumeric\n .replace(/[\\s_]+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Remove consecutive hyphens\n .replace(/^-|-$/g, ''); // Trim hyphens from ends\n}\n\n/**\n * Escape HTML special characters\n * @param str - The string to escape\n * @returns The escaped string\n *\n * @example\n * escapeHtml('<script>alert(\"XSS\")</script>') // '&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;'\n */\nexport function escapeHtml(str: string): string {\n const htmlEscapes: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n };\n return str.replace(/[&<>\"']/g, char => htmlEscapes[char]);\n}\n\n/**\n * Strip HTML tags from a string\n * @param str - The string containing HTML\n * @returns The string without HTML tags\n *\n * @example\n * stripHtml('<p>Hello <strong>World</strong></p>') // 'Hello World'\n */\nexport function stripHtml(str: string): string {\n return str.replace(/<[^>]*>/g, '');\n}\n\n/**\n * Generate initials from a name\n * @param name - The name to extract initials from\n * @param maxLength - Maximum number of initials (default: 2)\n * @returns The initials in uppercase\n *\n * @example\n * getInitials('John Doe') // 'JD'\n * getInitials('John Michael Doe', 3) // 'JMD'\n */\nexport function getInitials(name: string, maxLength = 2): string {\n if (!name) return '';\n\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, maxLength)\n .map(word => word.charAt(0).toUpperCase())\n .join('');\n}\n\n/**\n * Pluralize a word based on count\n * @param count - The count to check\n * @param singular - Singular form\n * @param plural - Plural form (optional, defaults to singular + 's')\n * @returns The appropriate form of the word\n *\n * @example\n * pluralize(1, 'item') // 'item'\n * pluralize(5, 'item') // 'items'\n * pluralize(2, 'child', 'children') // 'children'\n */\nexport function pluralize(count: number, singular: string, plural?: string): string {\n return count === 1 ? singular : (plural ?? `${singular}s`);\n}\n\n/**\n * Format a number as a string with count and pluralized label\n * @param count - The count\n * @param singular - Singular form of the label\n * @param plural - Plural form (optional)\n * @returns Formatted string like \"5 items\"\n *\n * @example\n * formatCount(1, 'item') // '1 item'\n * formatCount(5, 'item') // '5 items'\n */\nexport function formatCount(count: number, singular: string, plural?: string): string {\n return `${count} ${pluralize(count, singular, plural)}`;\n}\n","/**\n * Accessibility utility functions for PECB UI Components\n * Helps ensure WCAG 2.1 compliance\n * @module utils/accessibility\n */\n\nimport { generateUniqueId } from './dom.utils';\n\n/**\n * ARIA live region politeness levels\n */\nexport type AriaLive = 'off' | 'polite' | 'assertive';\n\n/**\n * ARIA roles commonly used in components\n */\nexport type AriaRole =\n | 'alert'\n | 'alertdialog'\n | 'button'\n | 'checkbox'\n | 'combobox'\n | 'dialog'\n | 'grid'\n | 'gridcell'\n | 'link'\n | 'listbox'\n | 'menu'\n | 'menubar'\n | 'menuitem'\n | 'menuitemcheckbox'\n | 'menuitemradio'\n | 'option'\n | 'progressbar'\n | 'radio'\n | 'radiogroup'\n | 'scrollbar'\n | 'searchbox'\n | 'slider'\n | 'spinbutton'\n | 'status'\n | 'switch'\n | 'tab'\n | 'tablist'\n | 'tabpanel'\n | 'textbox'\n | 'tooltip'\n | 'tree'\n | 'treegrid'\n | 'treeitem';\n\n/**\n * Standard ARIA attributes interface for components\n */\nexport interface AriaAttributes {\n role?: AriaRole;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-expanded'?: boolean;\n 'aria-selected'?: boolean;\n 'aria-checked'?: boolean | 'mixed';\n 'aria-disabled'?: boolean;\n 'aria-hidden'?: boolean;\n 'aria-invalid'?: boolean;\n 'aria-required'?: boolean;\n 'aria-readonly'?: boolean;\n 'aria-pressed'?: boolean | 'mixed';\n 'aria-current'?: boolean | 'page' | 'step' | 'location' | 'date' | 'time';\n 'aria-haspopup'?: boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\n 'aria-controls'?: string;\n 'aria-owns'?: string;\n 'aria-live'?: AriaLive;\n 'aria-atomic'?: boolean;\n 'aria-busy'?: boolean;\n 'aria-valuemin'?: number;\n 'aria-valuemax'?: number;\n 'aria-valuenow'?: number;\n 'aria-valuetext'?: string;\n 'aria-orientation'?: 'horizontal' | 'vertical';\n 'aria-activedescendant'?: string;\n 'aria-autocomplete'?: 'none' | 'inline' | 'list' | 'both';\n 'aria-multiselectable'?: boolean;\n 'aria-sort'?: 'none' | 'ascending' | 'descending' | 'other';\n 'aria-level'?: number;\n 'aria-setsize'?: number;\n 'aria-posinset'?: number;\n tabindex?: number;\n}\n\n/**\n * Generate ARIA attributes for a button component\n * @param options - Button accessibility options\n * @returns ARIA attributes object\n */\nexport function getButtonAriaAttributes(options: {\n label?: string;\n pressed?: boolean;\n expanded?: boolean;\n disabled?: boolean;\n controls?: string;\n haspopup?: AriaAttributes['aria-haspopup'];\n describedby?: string;\n}): AriaAttributes {\n const attrs: AriaAttributes = {};\n\n if (options.label) {\n attrs['aria-label'] = options.label;\n }\n if (options.pressed !== undefined) {\n attrs['aria-pressed'] = options.pressed;\n }\n if (options.expanded !== undefined) {\n attrs['aria-expanded'] = options.expanded;\n }\n if (options.disabled) {\n attrs['aria-disabled'] = true;\n }\n if (options.controls) {\n attrs['aria-controls'] = options.controls;\n }\n if (options.haspopup) {\n attrs['aria-haspopup'] = options.haspopup;\n }\n if (options.describedby) {\n attrs['aria-describedby'] = options.describedby;\n }\n\n return attrs;\n}\n\n/**\n * Generate ARIA attributes for a dialog/modal component\n * @param options - Dialog accessibility options\n * @returns ARIA attributes object\n */\nexport function getDialogAriaAttributes(options: {\n labelledby?: string;\n describedby?: string;\n modal?: boolean;\n}): AriaAttributes {\n return {\n role: 'dialog',\n 'aria-labelledby': options.labelledby,\n 'aria-describedby': options.describedby,\n 'aria-modal': options.modal\n } as AriaAttributes;\n}\n\n/**\n * Generate ARIA attributes for a form input\n * @param options - Input accessibility options\n * @returns ARIA attributes object\n */\nexport function getInputAriaAttributes(options: {\n label?: string;\n labelledby?: string;\n describedby?: string;\n invalid?: boolean;\n required?: boolean;\n readonly?: boolean;\n disabled?: boolean;\n errorId?: string;\n helperId?: string;\n}): AriaAttributes {\n const attrs: AriaAttributes = {};\n\n if (options.label) {\n attrs['aria-label'] = options.label;\n }\n if (options.labelledby) {\n attrs['aria-labelledby'] = options.labelledby;\n }\n\n // Build aria-describedby from multiple sources\n const describedbyParts: string[] = [];\n if (options.describedby) {\n describedbyParts.push(options.describedby);\n }\n if (options.invalid && options.errorId) {\n describedbyParts.push(options.errorId);\n }\n if (options.helperId) {\n describedbyParts.push(options.helperId);\n }\n if (describedbyParts.length > 0) {\n attrs['aria-describedby'] = describedbyParts.join(' ');\n }\n\n if (options.invalid !== undefined) {\n attrs['aria-invalid'] = options.invalid;\n }\n if (options.required) {\n attrs['aria-required'] = true;\n }\n if (options.readonly) {\n attrs['aria-readonly'] = true;\n }\n if (options.disabled) {\n attrs['aria-disabled'] = true;\n }\n\n return attrs;\n}\n\n/**\n * Generate ARIA attributes for a progress bar\n * @param options - Progress accessibility options\n * @returns ARIA attributes object\n */\nexport function getProgressAriaAttributes(options: {\n value: number;\n min?: number;\n max?: number;\n label?: string;\n valueText?: string;\n}): AriaAttributes {\n return {\n role: 'progressbar',\n 'aria-valuenow': options.value,\n 'aria-valuemin': options.min ?? 0,\n 'aria-valuemax': options.max ?? 100,\n 'aria-label': options.label,\n 'aria-valuetext': options.valueText ?? `${options.value}%`\n };\n}\n\n/**\n * Generate ARIA attributes for a tab component\n * @param options - Tab accessibility options\n * @returns ARIA attributes for tab and tabpanel\n */\nexport function getTabAriaAttributes(options: {\n tabId: string;\n panelId: string;\n selected: boolean;\n disabled?: boolean;\n}): { tab: AriaAttributes; panel: AriaAttributes } {\n return {\n tab: {\n role: 'tab',\n 'aria-selected': options.selected,\n 'aria-controls': options.panelId,\n 'aria-disabled': options.disabled,\n tabindex: options.selected ? 0 : -1\n },\n panel: {\n role: 'tabpanel',\n 'aria-labelledby': options.tabId,\n 'aria-hidden': !options.selected,\n tabindex: 0\n }\n };\n}\n\n/**\n * Generate ARIA attributes for a listbox option\n * @param options - Option accessibility options\n * @returns ARIA attributes object\n */\nexport function getOptionAriaAttributes(options: {\n selected: boolean;\n disabled?: boolean;\n setsize?: number;\n posinset?: number;\n}): AriaAttributes {\n return {\n role: 'option',\n 'aria-selected': options.selected,\n 'aria-disabled': options.disabled,\n 'aria-setsize': options.setsize,\n 'aria-posinset': options.posinset\n };\n}\n\n/**\n * Generate linked IDs for label and input association\n * @param baseName - Base name for generating IDs\n * @returns Object with inputId, labelId, errorId, and helperId\n */\nexport function generateLinkedIds(baseName?: string): {\n inputId: string;\n labelId: string;\n errorId: string;\n helperId: string;\n} {\n const base = baseName || generateUniqueId('input');\n return {\n inputId: base,\n labelId: `${base}-label`,\n errorId: `${base}-error`,\n helperId: `${base}-helper`\n };\n}\n\n/**\n * Create a visually hidden element for screen readers\n * @returns CSS styles for visually hidden content\n */\nexport function getVisuallyHiddenStyles(): Record<string, string> {\n return {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: '0'\n };\n}\n\n/**\n * Check if the user has enabled reduced motion preference\n * @returns True if user prefers reduced motion\n */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Check if the user has enabled high contrast mode\n * @returns True if high contrast mode is enabled\n */\nexport function prefersHighContrast(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-contrast: more)').matches;\n}\n\n/**\n * Announce a message to screen readers using aria-live regions\n * @param message - The message to announce\n * @param politeness - The urgency level (polite or assertive)\n */\nexport function announceToScreenReader(\n message: string,\n politeness: 'polite' | 'assertive' = 'polite'\n): void {\n if (typeof document === 'undefined') return;\n\n const announcement = document.createElement('div');\n announcement.setAttribute('role', 'status');\n announcement.setAttribute('aria-live', politeness);\n announcement.setAttribute('aria-atomic', 'true');\n Object.assign(announcement.style, getVisuallyHiddenStyles());\n\n document.body.appendChild(announcement);\n\n // Delay slightly to ensure screen readers pick up the change\n setTimeout(() => {\n announcement.textContent = message;\n }, 100);\n\n // Clean up after announcement is read\n setTimeout(() => {\n document.body.removeChild(announcement);\n }, 1000);\n}\n\n/**\n * Get the appropriate aria-current value for navigation items\n * @param isActive - Whether the item is active/current\n * @param type - The type of current indicator\n * @returns The aria-current value or undefined\n */\nexport function getAriaCurrent(\n isActive: boolean,\n type: 'page' | 'step' | 'location' | 'date' | 'time' = 'page'\n): AriaAttributes['aria-current'] {\n return isActive ? type : undefined;\n}\n","/**\n * Error handling utility functions for PECB UI Components\n * Provides standardized error handling patterns\n * @module utils/error\n */\n\n/**\n * Error severity levels\n */\nexport type ErrorSeverity = 'info' | 'warning' | 'error' | 'critical';\n\n/**\n * Error categories for classification\n */\nexport type ErrorCategory =\n | 'validation'\n | 'network'\n | 'authentication'\n | 'authorization'\n | 'configuration'\n | 'runtime'\n | 'unknown';\n\n/**\n * Standard error interface for PECB components\n */\nexport interface PecbError {\n /** Unique error code */\n code: string;\n /** Human-readable error message */\n message: string;\n /** Error severity level */\n severity: ErrorSeverity;\n /** Error category */\n category: ErrorCategory;\n /** Original error if wrapping another error */\n originalError?: Error;\n /** Additional context data */\n context?: Record<string, unknown>;\n /** Timestamp when error occurred */\n timestamp: Date;\n /** Suggested recovery action */\n recoveryAction?: string;\n /** Whether the error is recoverable */\n recoverable: boolean;\n}\n\n/**\n * Validation error details\n */\nexport interface ValidationError {\n /** Field name that failed validation */\n field: string;\n /** Validation rule that failed */\n rule: string;\n /** Error message */\n message: string;\n /** Expected value or format */\n expected?: string;\n /** Actual value received */\n actual?: unknown;\n}\n\n/**\n * Error factory options\n */\nexport interface ErrorOptions {\n code?: string;\n severity?: ErrorSeverity;\n category?: ErrorCategory;\n context?: Record<string, unknown>;\n recoveryAction?: string;\n recoverable?: boolean;\n originalError?: Error;\n}\n\n/**\n * Create a standardized PECB error\n * @param message - Error message\n * @param options - Additional error options\n * @returns A standardized PecbError object\n *\n * @example\n * const error = createError('Invalid input', {\n * code: 'VALIDATION_001',\n * category: 'validation',\n * severity: 'warning',\n * recoverable: true\n * });\n */\nexport function createError(message: string, options: ErrorOptions = {}): PecbError {\n return {\n code: options.code ?? 'PECB_ERROR',\n message,\n severity: options.severity ?? 'error',\n category: options.category ?? 'unknown',\n originalError: options.originalError,\n context: options.context,\n timestamp: new Date(),\n recoveryAction: options.recoveryAction,\n recoverable: options.recoverable ?? false\n };\n}\n\n/**\n * Create a validation error\n * @param field - Field name that failed validation\n * @param rule - Validation rule that failed\n * @param message - Error message\n * @returns A ValidationError object\n *\n * @example\n * const error = createValidationError('email', 'format', 'Invalid email format');\n */\nexport function createValidationError(\n field: string,\n rule: string,\n message: string,\n details?: { expected?: string; actual?: unknown }\n): ValidationError {\n return {\n field,\n rule,\n message,\n expected: details?.expected,\n actual: details?.actual\n };\n}\n\n/**\n * Wrap an unknown error in a PecbError\n * @param error - The error to wrap\n * @param options - Additional options\n * @returns A standardized PecbError\n *\n * @example\n * try {\n * await riskyOperation();\n * } catch (e) {\n * const error = wrapError(e, { category: 'network' });\n * handleError(error);\n * }\n */\nexport function wrapError(error: unknown, options: ErrorOptions = {}): PecbError {\n if (isPecbError(error)) {\n return error;\n }\n\n let message = 'An unknown error occurred';\n let originalError: Error | undefined;\n\n if (error instanceof Error) {\n message = error.message;\n originalError = error;\n } else if (typeof error === 'string') {\n message = error;\n } else if (error && typeof error === 'object' && 'message' in error) {\n message = String((error as { message: unknown }).message);\n }\n\n return createError(message, {\n ...options,\n originalError\n });\n}\n\n/**\n * Type guard to check if an object is a PecbError\n * @param error - The object to check\n * @returns True if the object is a PecbError\n */\nexport function isPecbError(error: unknown): error is PecbError {\n return (\n error !== null &&\n typeof error === 'object' &&\n 'code' in error &&\n 'message' in error &&\n 'severity' in error &&\n 'category' in error &&\n 'timestamp' in error\n );\n}\n\n/**\n * Type guard to check if an error is recoverable\n * @param error - The error to check\n * @returns True if the error is recoverable\n */\nexport function isRecoverableError(error: PecbError): boolean {\n return error.recoverable;\n}\n\n/**\n * Format an error for display to users\n * @param error - The error to format\n * @param includeCode - Whether to include the error code\n * @returns Formatted error message\n */\nexport function formatErrorMessage(error: PecbError, includeCode = false): string {\n if (includeCode) {\n return `[${error.code}] ${error.message}`;\n }\n return error.message;\n}\n\n/**\n * Format an error for logging\n * @param error - The error to format\n * @returns Formatted error string for logging\n */\nexport function formatErrorForLog(error: PecbError): string {\n const parts = [\n `[${error.timestamp.toISOString()}]`,\n `[${error.severity.toUpperCase()}]`,\n `[${error.code}]`,\n error.message\n ];\n\n if (error.context) {\n parts.push(`Context: ${JSON.stringify(error.context)}`);\n }\n\n if (error.originalError?.stack) {\n parts.push(`Stack: ${error.originalError.stack}`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Create a network error\n * @param message - Error message\n * @param statusCode - HTTP status code if applicable\n * @param originalError - Original error\n * @returns A network category PecbError\n */\nexport function createNetworkError(\n message: string,\n statusCode?: number,\n originalError?: Error\n): PecbError {\n return createError(message, {\n code: statusCode ? `NETWORK_${statusCode}` : 'NETWORK_ERROR',\n category: 'network',\n severity: 'error',\n context: statusCode ? { statusCode } : undefined,\n recoverable: true,\n recoveryAction: 'Please check your connection and try again',\n originalError\n });\n}\n\n/**\n * Create an authentication error\n * @param message - Error message\n * @param originalError - Original error\n * @returns An authentication category PecbError\n */\nexport function createAuthError(message: string, originalError?: Error): PecbError {\n return createError(message, {\n code: 'AUTH_ERROR',\n category: 'authentication',\n severity: 'error',\n recoverable: true,\n recoveryAction: 'Please sign in again',\n originalError\n });\n}\n\n/**\n * Create an authorization error\n * @param message - Error message\n * @param resource - The resource that access was denied to\n * @returns An authorization category PecbError\n */\nexport function createAuthorizationError(message: string, resource?: string): PecbError {\n return createError(message, {\n code: 'AUTHZ_ERROR',\n category: 'authorization',\n severity: 'warning',\n context: resource ? { resource } : undefined,\n recoverable: false,\n recoveryAction: 'Contact an administrator for access'\n });\n}\n\n/**\n * Create a configuration error\n * @param message - Error message\n * @param configKey - The configuration key that is invalid\n * @returns A configuration category PecbError\n */\nexport function createConfigError(message: string, configKey?: string): PecbError {\n return createError(message, {\n code: 'CONFIG_ERROR',\n category: 'configuration',\n severity: 'critical',\n context: configKey ? { configKey } : undefined,\n recoverable: false,\n recoveryAction: 'Check your configuration settings'\n });\n}\n\n/**\n * Error handler type\n */\nexport type ErrorHandler = (error: PecbError) => void;\n\n/**\n * Global error handler registry\n */\nconst errorHandlers: Map<ErrorCategory, ErrorHandler[]> = new Map();\n\n/**\n * Register an error handler for a category\n * @param category - The error category to handle\n * @param handler - The handler function\n * @returns Cleanup function to unregister\n */\nexport function registerErrorHandler(category: ErrorCategory, handler: ErrorHandler): () => void {\n const handlers = errorHandlers.get(category) ?? [];\n handlers.push(handler);\n errorHandlers.set(category, handlers);\n\n return () => {\n const currentHandlers = errorHandlers.get(category);\n if (currentHandlers) {\n const index = currentHandlers.indexOf(handler);\n if (index > -1) {\n currentHandlers.splice(index, 1);\n }\n }\n };\n}\n\n/**\n * Handle an error by invoking registered handlers\n * @param error - The error to handle\n */\nexport function handleError(error: PecbError): void {\n const handlers = errorHandlers.get(error.category) ?? [];\n const globalHandlers = errorHandlers.get('unknown') ?? [];\n\n [...handlers, ...globalHandlers].forEach(handler => {\n try {\n handler(error);\n } catch (e) {\n console.error('Error in error handler:', e);\n }\n });\n}\n\n/**\n * Try to execute an operation and return a result or error\n * @param operation - The operation to execute\n * @param errorOptions - Options for error wrapping\n * @returns A tuple of [result, null] or [null, error]\n */\nexport async function tryAsync<T>(\n operation: () => Promise<T>,\n errorOptions?: ErrorOptions\n): Promise<[T, null] | [null, PecbError]> {\n try {\n const result = await operation();\n return [result, null];\n } catch (e) {\n return [null, wrapError(e, errorOptions)];\n }\n}\n\n/**\n * Synchronous version of tryAsync\n * @param operation - The operation to execute\n * @param errorOptions - Options for error wrapping\n * @returns A tuple of [result, null] or [null, error]\n */\nexport function trySync<T>(\n operation: () => T,\n errorOptions?: ErrorOptions\n): [T, null] | [null, PecbError] {\n try {\n const result = operation();\n return [result, null];\n } catch (e) {\n return [null, wrapError(e, errorOptions)];\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n inject,\n computed,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { IconName } from './icon-names';\nimport { CustomIconName } from './custom-icon-names';\nimport { IconRegistry } from './icon-registry';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/** Container size. The inner icon is always 50 % of the container. */\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/**\n * Background colour of the icon container.\n * Each variant also sets a matching `color` so SVGs using `currentColor` inherit\n * the correct stroke/fill automatically.\n */\nexport type IconColor =\n | 'none'\n | 'primary'\n | 'gray'\n | 'white'\n | 'error'\n | 'warning'\n | 'success';\n\n/** Border-radius shape of the container. */\nexport type IconShape = 'round' | 'square';\n\n// ─── Size map ─────────────────────────────────────────────────────────────────\n\n/** Maps each size token to the **inner icon** dimension in px (= container ÷ 2). */\nconst INNER_SIZE_PX: Record<IconSize, number> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 28,\n '2xl': 32,\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * A coloured icon container that wraps any SVG icon.\n *\n * Supports three ways to provide an icon:\n *\n * 1. **By name** — pass a registered `IconName` via `[name]`.\n * The component looks up the SVG from the `IconRegistry`.\n * 2. **By SVG string** — pass an inline SVG string via `[svgIcon]`.\n * 3. **By content projection** — project an `<svg>` element as child content.\n *\n * Priority: `name` > `svgIcon` > content projection.\n *\n * @example\n * <!-- By name (requires icon to be registered in IconRegistry) -->\n * <pecb-icon name=\"check-01\" color=\"success\" size=\"md\"></pecb-icon>\n *\n * @example\n * <!-- SVG string input -->\n * <pecb-icon [svgIcon]=\"alertSvg\" color=\"error\" size=\"md\" shape=\"round\">\n * </pecb-icon>\n *\n * @example\n * <!-- Content projection -->\n * <pecb-icon color=\"success\" size=\"lg\" shape=\"square\">\n * <svg width=\"24\" height=\"24\" ...>...</svg>\n * </pecb-icon>\n */\n@Component({\n selector: 'pecb-icon',\n standalone: true,\n imports: [],\n templateUrl: './icon.component.html',\n styleUrls: ['./icon.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n // None is required so the injected SVG (innerHTML) can be targeted by CSS.\n // All rules are scoped under the .pecb-icon BEM block.\n encapsulation: ViewEncapsulation.None,\n})\nexport class IconComponent {\n private readonly sanitizer = inject(DomSanitizer);\n private readonly registry = inject(IconRegistry);\n\n // ── Inputs ──────────────────────────────────────────────────────────────────\n\n /**\n * Registered icon name. When provided, the SVG is resolved from the\n * `IconRegistry`. Takes highest priority.\n */\n name = input<IconName | CustomIconName | undefined>(undefined);\n\n /**\n * Inline SVG string to render inside the container.\n * When provided, this takes precedence over projected content.\n */\n svgIcon = input('');\n\n /**\n * Container (and colour) size.\n * @default 'md' → 40 × 40 px container, 20 × 20 px icon\n */\n size = input<IconSize>('md');\n\n /**\n * Background colour variant.\n * Also applies the matching foreground colour so `currentColor` SVGs are\n * correctly tinted without any extra configuration.\n * @default 'primary'\n */\n color = input<IconColor>('primary');\n\n /**\n * Container shape.\n * - `round` — fully circular (border-radius 50 %)\n * - `square` — softly rounded rectangle (border-radius 8 px)\n * @default 'round'\n */\n shape = input<IconShape>('round');\n\n /**\n * Accessible label for the icon. When provided the container receives\n * `role=\"img\"` and `aria-label`. When omitted the icon is treated as\n * decorative (`aria-hidden=\"true\"`).\n */\n ariaLabel = input<string | undefined>(undefined);\n\n // ── Computed ─────────────────────────────────────────────────────────────────\n\n hostClasses = computed(() =>\n [\n 'pecb-icon',\n `pecb-icon--${this.size()}`,\n `pecb-icon--${this.color()}`,\n `pecb-icon--${this.shape()}`,\n ].join(' ')\n );\n\n /** Inner icon dimension in px (= container ÷ 2). */\n innerSize = computed(() => INNER_SIZE_PX[this.size()]);\n\n /** Resolved SVG string: name lookup → svgIcon input → empty. */\n resolvedSvg = computed(() => {\n const iconName = this.name();\n if (iconName) {\n return this.registry.get(iconName) ?? '';\n }\n return this.svgIcon();\n });\n\n safeIcon = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(this.resolvedSvg())\n );\n}\n","<div\n [class]=\"hostClasses()\"\n [attr.role]=\"ariaLabel() ? 'img' : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-hidden]=\"ariaLabel() ? null : true\"\n>\n @if (resolvedSvg()) {\n <span\n class=\"pecb-icon__svg\"\n [style.width.px]=\"innerSize()\"\n [style.height.px]=\"innerSize()\"\n [innerHTML]=\"safeIcon()\"\n ></span>\n } @else {\n <span\n class=\"pecb-icon__content\"\n [style.width.px]=\"innerSize()\"\n [style.height.px]=\"innerSize()\"\n >\n <ng-content></ng-content>\n </span>\n }\n</div>\n","/*\n * Public API Surface of @pecb-ui/components\n *\n * This file defines the public API of the library.\n * Only exports from this file will be accessible to consumers.\n */\n\n// =============================================================================\n// MODULE\n// =============================================================================\nexport * from './lib/pecb-components.module';\n\n// =============================================================================\n// COMPONENTS\n// =============================================================================\nexport * from './lib/components/button/button.component';\nexport * from './lib/components/card/card.component';\nexport * from './lib/components/status/status.component';\nexport * from './lib/components/pagination/pagination.component';\nexport * from './lib/components/table/table.component';\nexport * from './lib/components/tab/tab.component';\nexport * from './lib/components/datepicker/datepicker.component';\nexport * from './lib/components/input/input.component';\nexport * from './lib/components/radio/radio.component';\nexport * from './lib/components/checkbox/checkbox.component';\nexport * from './lib/components/toggle/toggle.component';\nexport * from './lib/components/dropdown/dropdown.component';\nexport * from './lib/components/right-modal/right-modal.component';\nexport * from './lib/components/sidebar/sidebar.component';\nexport * from './lib/components/confirmation/confirmation.component';\nexport * from './lib/components/alert/alert.component';\nexport * from './lib/components/bottom-sheet/bottom-sheet.component';\nexport * from './lib/components/accordion/accordion.component';\nexport * from './lib/components/button-group/button-group.component';\nexport * from './lib/components/tooltip/tooltip.component';\nexport * from './lib/components/tooltip/tooltip.directive';\nexport * from './lib/components/metrics-card/metrics-card.component';\nexport * from './lib/components/float-button/float-button.component';\nexport * from './lib/components/skeleton/skeleton.component';\nexport * from './lib/components/messaging/messaging.component';\nexport * from './lib/components/fullscreen-modal/fullscreen-modal.component';\nexport * from './lib/components/color-palette/color-palette.component';\nexport * from './lib/components/profile/profile.component';\nexport * from './lib/components/profile/profile-group.component';\nexport * from './lib/components/typography/typography.component';\nexport * from './lib/components/stepper/stepper.component';\n\n// =============================================================================\n// SERVICES\n// =============================================================================\nexport * from './lib/services/notification.service';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/loading.service';\n\n// =============================================================================\n// SHARED TYPES\n// =============================================================================\nexport * from './lib/shared/types/common.types';\n\n// =============================================================================\n// SHARED INTERFACES\n// =============================================================================\nexport * from './lib/shared/interfaces/component.interfaces';\n\n// =============================================================================\n// SHARED UTILITIES\n// =============================================================================\n\n// String utilities\nexport {\n toKebabCase,\n toCamelCase,\n toPascalCase,\n toSnakeCase,\n capitalize,\n truncate,\n isBlank,\n isNotBlank,\n slugify,\n escapeHtml,\n stripHtml,\n getInitials,\n pluralize,\n formatCount\n} from './lib/shared/utils/string.utils';\n\n// DOM utilities\nexport {\n isBrowser,\n generateUniqueId,\n matchesSelector,\n closestElement,\n isElementVisible,\n getFocusableElements,\n trapFocus,\n scrollIntoView,\n getScrollParent,\n disableBodyScroll,\n copyToClipboard,\n hasClass,\n addClass,\n removeClass,\n toggleClass,\n getComputedStyleValue\n} from './lib/shared/utils/dom.utils';\n\n// Accessibility utilities\nexport {\n AriaLive,\n AriaRole,\n AriaAttributes,\n getButtonAriaAttributes,\n getDialogAriaAttributes,\n getInputAriaAttributes,\n getProgressAriaAttributes,\n getTabAriaAttributes,\n getOptionAriaAttributes,\n generateLinkedIds,\n getVisuallyHiddenStyles,\n prefersReducedMotion,\n prefersHighContrast,\n announceToScreenReader,\n getAriaCurrent\n} from './lib/shared/utils/accessibility.utils';\n\n// Error handling utilities\nexport {\n ErrorSeverity,\n ErrorCategory,\n PecbError,\n ValidationError,\n ErrorOptions,\n ErrorHandler,\n createError,\n createValidationError,\n wrapError,\n isPecbError,\n isRecoverableError,\n formatErrorMessage,\n formatErrorForLog,\n createNetworkError,\n createAuthError,\n createAuthorizationError,\n createConfigError,\n registerErrorHandler,\n handleError,\n tryAsync,\n trySync\n} from './lib/shared/utils/error.utils';\nexport * from './lib/components/icon/icon.component';\nexport * from './lib/components/grid/grid.component';\nexport * from './lib/components/dashboard-grid/dashboard-grid.component';\nexport * from './lib/components/progress/progress.component';\nexport * from './lib/components/code-input/code-input.component';\nexport * from './lib/components/shadow/shadow.directive';\nexport * from './lib/components/divider/divider.component';\nexport * from './lib/components/code-snippet/code-snippet.component';\nexport * from './lib/components/breadcrumbs/breadcrumbs.component';\nexport * from './lib/components/general/general.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":";;;;;;;;;;;AAAA;;;AAGG;AAEH;;;AAGG;SACa,SAAS,GAAA;IACvB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW;AACzE;AAEA;;;;;;;AAOG;AACG,SAAU,gBAAgB,CAAC,MAAM,GAAG,MAAM,EAAA;AAC9C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACzD,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,EAAE;AAC9B;AAEA;;;;;AAKG;AACG,SAAU,eAAe,CAAC,OAAgB,EAAE,QAAgB,EAAA;AAChE,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAClC;AAEA;;;;;AAKG;AACG,SAAU,cAAc,CAAoB,OAAgB,EAAE,QAAgB,EAAA;AAClF,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAa;AAC9C;AAEA;;;;;AAKG;SACa,gBAAgB,CAAC,OAAgB,EAAE,OAAO,GAAG,IAAI,EAAA;IAC/D,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,KAAK;AAE9B,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;IAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY;IAChF,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC,eAAe,CAAC,WAAW;IAE7E,IAAI,OAAO,EAAE;AACX,QAAA,QACE,IAAI,CAAC,GAAG,GAAG,YAAY;YACvB,IAAI,CAAC,MAAM,GAAG,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,WAAW;AACvB,YAAA,IAAI,CAAC,KAAK,GAAG,CAAC;IAElB;AAEA,IAAA,QACE,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,IAAI,IAAI,CAAC;QACd,IAAI,CAAC,MAAM,IAAI,YAAY;AAC3B,QAAA,IAAI,CAAC,KAAK,IAAI,WAAW;AAE7B;AAEA;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,SAAkB,EAAA;AACrD,IAAA,MAAM,kBAAkB,GAAG;QACzB,SAAS;QACT,YAAY;QACZ,wBAAwB;QACxB,4CAA4C;QAC5C,wBAAwB;QACxB,0BAA0B;QAC1B,iCAAiC;QACjC;AACD,KAAA,CAAC,IAAI,CAAC,GAAG,CAAC;IAEX,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,kBAAkB,CAAC,CAAC;AAChF;AAEA;;;;AAIG;AACG,SAAU,SAAS,CAAC,SAAsB,EAAA;AAC9C,IAAA,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,SAAS,CAAC;AACzD,IAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;AAEnE,IAAA,MAAM,aAAa,GAAG,CAAC,KAAoB,KAAU;AACnD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;YAAE;AAEzB,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,YAAY,EAAE;gBAC3C,KAAK,CAAC,cAAc,EAAE;gBACtB,WAAW,EAAE,KAAK,EAAE;YACtB;QACF;aAAO;AACL,YAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE;gBAC1C,KAAK,CAAC,cAAc,EAAE;gBACtB,YAAY,EAAE,KAAK,EAAE;YACvB;QACF;AACF,IAAA,CAAC;AAED,IAAA,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC;IACpD,YAAY,EAAE,KAAK,EAAE;AAErB,IAAA,OAAO,MAAK;AACV,QAAA,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC;AACzD,IAAA,CAAC;AACH;AAEA;;;;AAIG;AACG,SAAU,cAAc,CAC5B,OAAgB,EAChB,OAAA,GAAiC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAA;AAEzE,IAAA,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC;AACjC;AAEA;;;;AAIG;AACG,SAAU,eAAe,CAAC,OAAgB,EAAA;IAC9C,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,IAAI;AAE7B,IAAA,IAAI,MAAM,GAAmB,OAAO,CAAC,aAAa;IAElD,OAAO,MAAM,EAAE;AACb,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC;AACtC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAEnE,QAAA,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACxC,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,MAAM,CAAC,aAAa;IAC/B;AAEA,IAAA,OAAO,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,eAAe;AAC9D;AAEA;;;AAGG;SACa,iBAAiB,GAAA;IAC/B,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,MAAK,EAAE,CAAC;AAEjC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAC9B,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,IAAA,MAAM,cAAc,GAAG;AACrB,QAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;AAC7B,QAAA,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG;AACnB,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AACvB,QAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;KACtB;AAED,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;IAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,CAAA,EAAI,OAAO,IAAI;AAChC,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACzB,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AAE9B,IAAA,OAAO,MAAK;QACV,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ;QAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG;QACnC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK;QACvC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ;AAC7C,QAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;AAC7B,IAAA,CAAC;AACH;AAEA;;;;AAIG;AACI,eAAe,eAAe,CAAC,IAAY,EAAA;AAChD,IAAA,IAAI,CAAC,SAAS,EAAE,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;IACpE;IAEA,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE;QACxD,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;IAC3C;SAAO;;QAEL,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AACnD,QAAA,QAAQ,CAAC,KAAK,GAAG,IAAI;AACrB,QAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AACjC,QAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS;AAC/B,QAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS;AAC9B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QACnC,QAAQ,CAAC,KAAK,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;AAC5B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACrC;AACF;AAEA;;;;;AAKG;AACG,SAAU,QAAQ,CAAC,OAAgB,EAAE,SAAiB,EAAA;IAC1D,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC9C;AAEA;;;;AAIG;SACa,QAAQ,CAAC,OAAgB,EAAE,GAAG,UAAoB,EAAA;IAChE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;AACtC;AAEA;;;;AAIG;SACa,WAAW,CAAC,OAAgB,EAAE,GAAG,UAAoB,EAAA;IACnE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;AACzC;AAEA;;;;;;AAMG;SACa,WAAW,CAAC,OAAgB,EAAE,SAAiB,EAAE,KAAe,EAAA;IAC9E,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;AACnD;AAEA;;;;;AAKG;AACG,SAAU,qBAAqB,CAAC,OAAgB,EAAE,QAAgB,EAAA;IACtE,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,EAAE;IAC3B,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAC7D;;MCnPa,eAAe,CAAA;AAP5B,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;QAEjD,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,KAAK,CAAC,8CAAC;AAE3C;;AAEG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAgB,SAAS,mDAAC;AAEzC;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,IAAI,gDAAC;AAE9B;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAkB,MAAM,qDAAC;AAE1C;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,SAAS,gDAAC;AAE3C;;AAEG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEvB;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;AAExB;;AAEG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,mDAAC;AAEtB;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAgC,QAAQ,gDAAC;;AAIrD;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;AAEhD;;AAEG;AACH,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAqB,SAAS,0DAAC;AAErD;;AAEG;AACH,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,2DAAC;AAEtD;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAsB,SAAS,wDAAC;AAEpD;;AAEG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAsB,SAAS,uDAAC;AAEnD;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAwE,SAAS,wDAAC;AAEtG;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAqB,SAAS,wDAAC;AAEnD;;AAEG;QACH,IAAA,CAAA,OAAO,GAAG,MAAM,EAAc;AA2D/B,IAAA;AAzDC;;AAEG;AACH,IAAA,IAA4B,MAAM,GAAA;QAChC,OAAO,IAAI,CAAC;IACd;AAEA;;AAEG;AACH,IAAA,IAAI,aAAa,GAAA;QACf,OAAO;YACL,aAAa;AACb,YAAA,CAAA,aAAA,EAAgB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE;AAChC,YAAA,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AAC7B,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,MAAM,GAAG,CAAA,kBAAA,EAAqB,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE;YAC1E,IAAI,CAAC,SAAS,EAAE,GAAG,yBAAyB,GAAG,EAAE;YACjD,IAAI,CAAC,OAAO,EAAE,GAAG,sBAAsB,GAAG;AAC3C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;IAC3E;AAEA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;IAC5E;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,WAAW;IACzC;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,sBAAsB;IAC/B;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAG,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;IAClE;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE;AAEA,IAAA,OAAO,CAAC,KAAiB,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;AACvC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACvF,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAA8B,CAAC;QACnD;IACF;+GA/IW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5B5B,42DA4DA,EAAA,MAAA,EAAA,CAAA,++JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrCc,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKb,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACI,aAAa,EAAA,OAAA,EACd,CAAC,YAAY,CAAC,QAGjB,EAAE,WAAW,EAAE,MAAM,EAAE,EAAA,QAAA,EAAA,42DAAA,EAAA,MAAA,EAAA,CAAA,++JAAA,CAAA,EAAA;;sBA4F9B,WAAW;uBAAC,SAAS;;;AEhHxB,MAAM,UAAU,GAA+B;AAC7C,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,EAAE,EAAE,KAAK;AACT,IAAA,EAAE,EAAE,KAAK;AACT,IAAA,EAAE,EAAE,MAAM;AACV,IAAA,EAAE,EAAE,MAAM;AACV,IAAA,IAAI,EAAE,QAAQ;CACf;MAaY,aAAa,CAAA;AAN1B,IAAA,WAAA,GAAA;AAOE;;AAEG;QACH,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,MAAM,CAAC,8CAAC;AAE5C;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,qDAAC;AAEtC;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;AAExB;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;AAExB;;;AAGG;AACH,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAsB,IAAI,kDAAC;;AAIzC;;;AAGG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAW,MAAM,gDAAC;AAE9B;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;AAEhD;;AAEG;AACH,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAqB,SAAS,0DAAC;AAErD;;AAEG;AACH,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,2DAAC;AAqBvD,IAAA;AAnBC;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,WAAW;AACX,YAAA,CAAA,qBAAA,EAAwB,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE;YAC1C,IAAI,CAAC,SAAS,EAAE,GAAG,sBAAsB,GAAG,EAAE;YAC9C,IAAI,CAAC,SAAS,EAAE,GAAG,uBAAuB,GAAG;AAC9C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAgB,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IACjE;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI;IACpD;+GApEW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,yuCC1B1B,2TAWA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FDea,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,cACT,IAAI,EAAA,QAAA,EAAA,2TAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;;MAqFL,mBAAmB,CAAA;AAVhC,IAAA,WAAA,GAAA;AAWE,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,wDAAC;AAC1C,IAAA;+GAFY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAPpB;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FAGU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAV/B,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EACN;;;;AAIT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;;MAaU,iBAAiB,CAAA;+GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,0EAHlB,8DAA8D,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FAG7D,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,QAAA,EACN,8DAA8D,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;;MAW7D,mBAAmB,CAAA;+GAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,4EAHpB,gEAAgE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FAG/D,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EACN,gEAAgE,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;;;ME5G/D,eAAe,CAAA;AAP5B,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,GAAG,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;AAE7E,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,SAAS,gDAAC;AACnC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAgB,QAAQ,mDAAC;AACxC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,IAAI,gDAAC;QAC9B,IAAA,CAAA,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAC3B,IAAA,CAAA,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACtB,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAwB9B,IAAA;AAtBC,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,GAAG;IACjB;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,OAAO,GAAG;YACd,aAAa;AACb,YAAA,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,EAAE,CAAA;SAC5B;AAED,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,EAAE;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE,CAAC;QAChD;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QACtC,IAAI,WAAW,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D;AAEA,QAAA,OAAO,OAAO;IAChB;+GA/BW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECd5B,oKAQA,EAAA,MAAA,EAAA,CAAA,ixEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,WACd,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,oKAAA,EAAA,MAAA,EAAA,CAAA,ixEAAA,CAAA,EAAA;;;MEmBtC,mBAAmB,CAAA;IAoB9B,WAAA,CAAoB,UAAsB,EAAU,GAAsB,EAAA;QAAtD,IAAA,CAAA,UAAU,GAAV,UAAU;QAAsB,IAAA,CAAA,GAAG,GAAH,GAAG;AAnBvD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,CAAC,sDAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;AACpB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,CAAC,uDAAC;AACtB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,2DAAC;AACnD,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAiB,IAAI,gDAAC;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAoB,MAAM,mDAAC;AAC1C,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,IAAI,gEAAC;AAClC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,yDAAC;AAC3B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,CAAC,2DAAC;AAC1B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,YAAY,6CAAI,KAAK,EAAE,YAAY,EAAA,CAAA,GAAA,CAArB,EAAE,KAAK,EAAE,YAAY,EAAE,GAAC;QAExD,IAAA,CAAA,UAAU,GAAG,MAAM,EAAmB;QACtC,IAAA,CAAA,cAAc,GAAG,MAAM,EAAU;QAExB,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;QAChF,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAClE,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,KAAK,0DAAC;IAE+C;AAG7E,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AAClF,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO;YACL,iBAAiB;AACjB,YAAA,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AACjC,YAAA,CAAA,iBAAA,EAAoB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE;YACpC,IAAI,CAAC,QAAQ,EAAE,GAAG,2BAA2B,GAAG;AACjD,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS;IAClE;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,oBAAoB,EAAE;IACjE;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,EAAE;AACjE,YAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAA,IAAA,EAAO,IAAI,CAAC,UAAU,EAAE,EAAE;QAC9E;AACA,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAA,IAAA,EAAO,IAAI,CAAC,UAAU,EAAE,QAAQ;IAC5E;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AACrC,QAAA,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;IACvD;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1E;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IACnD;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IACnE;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;YAC1F;QACF;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvC;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvC;IACF;AAEA,IAAA,gBAAgB,CAAC,OAAe,EAAA;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AAC/C,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC;AAEA,IAAA,QAAQ,CAAC,KAAsB,EAAA;AAC7B,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ;IAClC;IAEA,WAAW,CAAC,KAAa,EAAE,IAAqB,EAAA;AAC9C,QAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,CAAA,SAAA,EAAY,KAAK,EAAE;IAC9D;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;AACxB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC;AAChB,SAAA,CAAC;IACJ;IAEQ,mBAAmB,GAAA;QACzB,MAAM,KAAK,GAAwB,EAAE;AACrC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE;AAEzC,QAAA,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,EAAE;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE;AAAE,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD;aAAO;AACL,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACb,YAAA,IAAI,WAAW,IAAI,UAAU,EAAE;AAC7B,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACjB,gBAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACxB;iBAAO,IAAI,WAAW,IAAI,UAAU,GAAG,UAAU,GAAG,CAAC,EAAE;AACrD,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACjB,gBAAA,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3E;iBAAO;AACL,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACjB,gBAAA,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACtE,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACjB,gBAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACxB;QACF;AAEA,QAAA,OAAO,KAAK;IACd;+GA5JW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BhC,+lMAsMA,EAAA,MAAA,EAAA,CAAA,6uLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5Kc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,WAClB,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+lMAAA,EAAA,MAAA,EAAA,CAAA,6uLAAA,CAAA,EAAA;;sBAwBhD,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;ME2C/B,cAAc,CAAA;IACzB,WAAA,CAAoB,SAAuB,EAAU,GAAsB,EAAA;QAAvD,IAAA,CAAA,SAAS,GAAT,SAAS;QAAwB,IAAA,CAAA,GAAG,GAAH,GAAG;AAExD;;AAEG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAoB,EAAE,mDAAC;AAEtC;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAQ,EAAE,gDAAC;AAEvB;;;AAGG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAY,IAAI,gDAAC;AAE7B;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAe,SAAS,mDAAC;AAExC;;;AAGG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;AAExB;;;AAGG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AAEvB;;;AAGG;AACH,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,IAAI,0DAAC;AAE5B;;AAEG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,CAAC,sDAAC;AAErB;;;AAGG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,CAAC,uDAAC;AAEtB;;;AAGG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;AAEpB;;AAEG;AACH,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,2DAAC;AAEnD;;;AAGG;AACH,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,IAAI,gEAAC;AAElC;;;AAGG;AACH,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAA8C,MAAM,6DAAC;AAE9E;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,2BAA2B,wDAAC;AAEjD;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,mDAAC;AAEtB;;;AAGG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AAEzB;;AAEG;AACH,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAW,EAAE,2DAAC;AAErC;;;AAGG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;AAE3B;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;AAEhD;;AAEG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAqB,SAAS,sDAAC;AAEjD;;AAEG;AACH,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAwB,IAAI,yDAAC;AAElD;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,YAAY,6CAAI,KAAK,EAAE,YAAY,EAAA,CAAA,GAAA,CAArB,EAAE,KAAK,EAAE,YAAY,EAAE,GAAC;AAExD;;AAEG;QACH,IAAA,CAAA,UAAU,GAAG,MAAM,EAAmB;AAEtC;;AAEG;QACH,IAAA,CAAA,cAAc,GAAG,MAAM,EAAU;AAEjC;;AAEG;QACH,IAAA,CAAA,QAAQ,GAAG,MAAM,EAA+B;AAEhD;;AAEG;QACH,IAAA,CAAA,SAAS,GAAG,MAAM,EAAuB;AAEzC;;AAEG;QACH,IAAA,CAAA,UAAU,GAAG,MAAM,EAAkB;AAErC;;AAEG;QACH,IAAA,CAAA,eAAe,GAAG,MAAM,EAAuB;IAxJ+B;AA6J9E,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,MAAM,OAAO,GAAG,CAAC,sBAAsB,CAAC;QACxC,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;AACrE,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG,CAAC,wBAAwB,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,SAAS,EAAE;AACjF,YAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC;QAClD;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,EAAE,eAAe,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE,CAAC;QAC7F,IAAI,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;QAC3D,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC7D,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;IAEA,YAAY,CAAC,GAAQ,EAAE,GAAW,EAAA;AAChC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3B,IAAI,KAAK,GAAG,GAAG;AACf,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAE,gBAAA,OAAO,EAAE;AACpD,YAAA,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB;QACA,OAAO,KAAK,IAAI,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,MAAuB,EAAA;QACvC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM;AAAE,YAAA,OAAO,EAAE;AACvD,QAAA,OAAO,CAAA,kBAAA,EAAqB,MAAM,CAAC,KAAK,EAAE;IAC5C;IAEA,UAAU,CAAC,GAAQ,EAAE,KAAa,EAAA;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACpC;AAEA,IAAA,WAAW,CAAC,MAAc,EAAE,GAAQ,EAAE,KAAa,EAAE,KAAY,EAAA;QAC/D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC7C;AAEA,IAAA,aAAa,CAAC,MAAuB,EAAA;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE;QACtB,IAAI,YAAY,GAA0B,KAAK;QAE/C,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC,GAAG,EAAE;AACpC,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,EAAE;gBAClC,YAAY,GAAG,MAAM;YACvB;AAAO,iBAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE;gBAC1C,YAAY,GAAG,IAAI;YACrB;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;AAC1D,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;AAEpC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC,GAAG;AAClB,YAAA,SAAS,EAAE,YAAY;AACxB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC;QACjD,IAAI,aAAa,GAAG,CAAC,CAAC;AAAE,YAAA,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;;AACxD,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,kBAAkB,GAAA;QAChB,IAAI,IAAI,CAAC,aAAa,EAAE;AAAE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;;YACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC/C;IAEA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM;IACvF;IAEA,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM;IAChG;AAEA,IAAA,YAAY,CAAC,KAAsB,EAAA;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEA,IAAA,gBAAgB,CAAC,OAAe,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;IACnC;AAEA,IAAA,YAAY,CAAC,MAAuB,EAAA;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ;AAAE,YAAA,OAAO,MAAM;AACnC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,MAAM;AACnD,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,MAAM;IACvC;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA,EAAY,OAAO,KAAK,CAAC,CAAC;IACpD,UAAU,CAAC,CAAS,EAAE,MAAuB,EAAA,EAAY,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AAE5E,IAAA,aAAa,CAAC,MAAuB,EAAA;QACnC,OAAO,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM;IAClD;IAEA,aAAa,CAAC,KAAU,EAAE,MAAuB,EAAA;AAC/C,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY;QAClC,IAAI,MAAM,EAAE,OAAO,IAAI,KAAK,IAAI,MAAM,CAAC,OAAO;AAAE,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5E,QAAA,MAAM,UAAU,GAA2B;AACzC,YAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAC1C,YAAA,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO;AACxC,YAAA,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS;AAC5C,YAAA,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS;AACxC,YAAA,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;SAC/C;AACD,QAAA,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,SAAS;IACvC;AAEA,IAAA,gBAAgB,CAAC,MAAuB,EAAA,EAAS,OAAO,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,QAAQ,CAAC,CAAC;AAClG,IAAA,aAAa,CAAC,MAAuB,EAAA,EAAS,OAAO,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAExF,WAAW,CAAC,GAAQ,EAAE,MAAuB,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE;QACtC,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE;AAC/C,YAAA,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;YAC7C,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE;SACrD;IACH;AAEA,IAAA,UAAU,CAAC,MAAuB,EAAA;QAChC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,OAAO;QACtE,OAAO;YACL,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;YAC7C,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;AAC7C,YAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;SACvE;IACH;AAEA,IAAA,aAAa,CAAC,MAAmB,EAAE,GAAQ,EAAE,KAAa,EAAE,KAAY,EAAA;QACtE,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,MAAM,CAAC,MAAM;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxD;AAEA,IAAA,yBAAyB,CAAC,GAAQ,EAAE,MAAuB,EAAE,KAAa,EAAA;AACxE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAChD,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE;AACjD,QAAA,IAAI,MAAM,CAAC,iBAAiB,EAAE;AAC5B,YAAA,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE;QAC5E;AACA,QAAA,OAAO,YAAY;IACrB;IAEA,mBAAmB,CAAC,MAAuB,EAAA,EAAa,OAAO,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE1F,IAAA,WAAW,CAAC,OAA2B,EAAA;AACrC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC;IACxD;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;AACtB,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,KAAK;QAC7E,OAAO,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE;IAC3B;IAEQ,mBAAmB,GAAA;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;AAC5E,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;IACtF;+GA1VW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,wkHChG3B,6haAsQA,EAAA,MAAA,EAAA,CAAA,upNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3Kc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,kCAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,2SAAE,eAAe,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKnD,cAAc,EAAA,UAAA,EAAA,CAAA;kBAP1B,SAAS;+BACI,YAAY,EAAA,OAAA,EACb,CAAC,YAAY,EAAE,mBAAmB,EAAE,eAAe,CAAC,EAAA,eAAA,EAG5C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6haAAA,EAAA,MAAA,EAAA,CAAA,upNAAA,CAAA,EAAA;;sBA6JhD,YAAY;uBAAC,eAAe;;sBAC5B,YAAY;uBAAC,iBAAiB;;;ME9OpB,YAAY,CAAA;AAPzB,IAAA,WAAA,GAAA;QAQE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,8CAAC;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAW,SAAS,oDAAC;AACrC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAU,IAAI,gDAAC;AAC3B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,UAAU,iDAAC;QACzB,IAAA,CAAA,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACtB,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;QACtB,IAAA,CAAA,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAC3B,IAAA,CAAA,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAC9B,IAAA,CAAA,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;QAE/B,IAAA,CAAA,OAAO,GAAG,MAAM,EAAU;QAC1B,IAAA,CAAA,MAAM,GAAG,MAAM,EAAU;AAuC1B,IAAA;AArCC,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO;YACL,UAAU;AACV,YAAA,CAAA,UAAA,EAAa,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE;AAC9B,YAAA,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;YAC1B,IAAI,CAAC,MAAM,EAAE,GAAG,kBAAkB,GAAG,EAAE;YACvC,IAAI,CAAC,QAAQ,EAAE,GAAG,oBAAoB,GAAG;AAC1C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,OAAO,CAAC,KAAiB,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9B;IACF;AAEA,IAAA,OAAO,CAAC,KAAiB,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7B;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AAErB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9B;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7B;IACF;+GApDW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdzB,wmDAoCA,EAAA,MAAA,EAAA,CAAA,+sHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3Bc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,YAAY,EAAA,UAAA,EAAA,CAAA;kBAPxB,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,WACX,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wmDAAA,EAAA,MAAA,EAAA,CAAA,+sHAAA,CAAA,EAAA;;;ME6BtC,mBAAmB,CAAA;AAqF9B,IAAA,WAAA,GAAA;AApFiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAIhD;;AAEG;QACH,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,YAAY,CAAC,8CAAC;AAElD;;AAEG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,iDAAC;AAE5C;;AAEG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,aAAa,uDAAC;AAElC;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAiB,IAAI,gDAAC;AAElC;;;AAGG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,iDAAC;AAE5C;;AAEG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEvB;;AAEG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEvB;;AAEG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,YAAY,sDAAC;AAEhC;;AAEG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAmB,SAAS,mDAAC;AAE5C;;AAEG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAmB,SAAS,mDAAC;AAE5C;;AAEG;QACH,IAAA,CAAA,UAAU,GAAG,MAAM,EAAe;AAElC;;AAEG;QACH,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;AAEvB;;AAEG;QACH,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;;AAGvB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAc,IAAI,wDAAC;AACxC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,KAAK,0DAAC;AAC9B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAO,IAAI,IAAI,EAAE,wDAAC;AACvC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgB,EAAE,wDAAC;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AACrD,QAAA,IAAA,CAAA,UAAU,GAAG;YACX,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;YACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;SACvD;AAEO,QAAA,IAAA,CAAA,QAAQ,GAAiC,MAAK,EAAE,CAAC;AACjD,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;QAGtC,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,iBAAiB;AACjB,YAAA,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;YACjC,IAAI,CAAC,QAAQ,EAAE,GAAG,2BAA2B,GAAG,EAAE;YAClD,IAAI,CAAC,cAAc,EAAE,GAAG,uBAAuB,GAAG,EAAE;YACpD,IAAI,CAAC,YAAY,EAAE,GAAG,4BAA4B,GAAG;AACtD,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,EAAE;QACnC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAG,CAAC;IAC9C;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,CAAA,CAAE;IAClG;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AAC/C,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAClB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;AAC9B,YAAA,IAAI,EAAE;gBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,gBAAgB,EAAE;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACpB;IACF;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACpB;IACF;IAEA,aAAa,GAAA;AACX,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA,IAAA,UAAU,CAAC,GAAgB,EAAA;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc;YAAE;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,OAAO,IAAI,GAAG,CAAC,IAAI,GAAG,OAAO;YAAE;AACnC,QAAA,IAAI,OAAO,IAAI,GAAG,CAAC,IAAI,GAAG,OAAO;YAAE;QACnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA,IAAA,SAAS,CAAC,KAAiB,EAAA;QACzB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAGA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACzD,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;QACvB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACjC,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEQ,gBAAgB,GAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE;QAC5C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzC,QAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,EAAE;AAC3C,QAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;AAC1D,QAAA,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;QAC1D,MAAM,IAAI,GAAkB,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAE1B,QAAA,KAAK,IAAI,CAAC,GAAG,iBAAiB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC/C,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,GAAG,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACzJ;AAEA,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;AAC9B,QAAA,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACzB,YAAA,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;YACpF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACzG;AAEA,QAAA,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM;AACtC,QAAA,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,aAAa,EAAE,GAAG,EAAE,EAAE;AAC7C,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpH;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEQ,IAAA,UAAU,CAAC,IAAU,EAAA;AAC3B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC1D,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACnD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChG;AAEA,IAAA,UAAU,CAAC,KAAkB,EAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,KAAK;YAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,gBAAgB,CAAC,EAAgC,EAAA,EAAU,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC/E,iBAAiB,CAAC,EAAc,EAAA,EAAU,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;AAC/D,IAAA,gBAAgB,CAAC,UAAmB,EAAA,EAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;+GAlOlE,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,SAAA,EARjB;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,mBAAmB,CAAC;AAClD,gBAAA,KAAK,EAAE;AACV;SACJ,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvCL,y0HAoHA,o2PDvFc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYb,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAd/B,SAAS;+BACI,iBAAiB,EAAA,OAAA,EAClB,CAAC,YAAY,CAAC,mBAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,yBAAyB,CAAC;AAClD,4BAAA,KAAK,EAAE;AACV;AACJ,qBAAA,EAAA,QAAA,EAAA,y0HAAA,EAAA,MAAA,EAAA,CAAA,6yPAAA,CAAA,EAAA;;sBAKF,SAAS;uBAAC,cAAc;;sBAiKxB,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;AEzL5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;MAeU,cAAc,CAAA;AAd3B,IAAA,WAAA,GAAA;AAemB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAIjD;;AAEG;QACH,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,OAAO,CAAC,8CAAC;AAE7C;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAY,MAAM,gDAAC;AAE/B;;AAEG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,iDAAC;AAE5C;;AAEG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,EAAE,uDAAC;AAEvB;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAY,IAAI,gDAAC;AAE7B;;;AAGG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,iDAAC;AAE5C;;AAEG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEvB;;AAEG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEvB;;AAEG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEvB;;AAEG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,iDAAC;AAEpB;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAqB,SAAS,wDAAC;AAEnD;;AAEG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAqB,SAAS,sDAAC;AAEjD;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,SAAS,gDAAC;AAE3C;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAmB,MAAM,wDAAC;AAE9C;;AAEG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,oDAAC;AAE/C;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;AAEhD;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;AAExB;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;AAEhD;;AAEG;AACH,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,+CAAC;AAE1C;;AAEG;AACH,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,+CAAC;AAE1C;;AAEG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,SAAS,gDAAC;AAE3C;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAqB,SAAS,wDAAC;AAEnD;;AAEG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;AAE3B;;AAEG;QACH,IAAA,CAAA,WAAW,GAAG,MAAM,EAAU;AAE9B;;AAEG;QACH,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;AAExB;;AAEG;QACH,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;AAExB;;AAEG;QACH,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;;AAGxB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE,iDAAC;AAClB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACzB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAEpB,QAAA,IAAA,CAAA,QAAQ,GAA4B,MAAK,EAAE,CAAC;AAC5C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AA8FzC,IAAA;AA5FC,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,YAAY;AACZ,YAAA,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;YAC5B,IAAI,CAAC,KAAK,EAAE,GAAG,uBAAuB,GAAG,EAAE;YAC3C,IAAI,CAAC,QAAQ,EAAE,GAAG,sBAAsB,GAAG,EAAE;YAC7C,IAAI,CAAC,KAAK,EAAE,GAAG,mBAAmB,GAAG,EAAE;YACvC,IAAI,CAAC,QAAQ,EAAE,GAAG,sBAAsB,GAAG,EAAE;YAC7C,IAAI,CAAC,SAAS,EAAE,GAAG,qBAAqB,GAAG,EAAE;YAC7C,IAAI,CAAC,KAAK,EAAE,GAAG,uBAAuB,GAAG;AAC1C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,MAAM;AACpE,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IACnF;AAEA,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IAC7F;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACrE,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACnB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACtE,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;IACzB;AAEA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;QAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACrC;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;AAEA,IAAA,UAAU,CAAC,KAAiB,EAAA;QAC1B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE;IAC1C;AAEA,IAAA,wBAAwB,CAAC,KAAiB,EAAA;QACxC,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7C;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE;IAC1C;AAEA,IAAA,YAAY,CAAC,IAAwB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;IACrD;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B;+GAhPW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EARZ;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,cAAc,CAAC;AAC7C,gBAAA,KAAK,EAAE;AACV;SACJ,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxEL,moNAmJA,kvLDrFc,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYb,cAAc,EAAA,UAAA,EAAA,CAAA;kBAd1B,SAAS;+BACI,YAAY,EAAA,OAAA,EACb,CAAC,YAAY,CAAC,mBAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,oBAAoB,CAAC;AAC7C,4BAAA,KAAK,EAAE;AACV;AACJ,qBAAA,EAAA,QAAA,EAAA,moNAAA,EAAA,MAAA,EAAA,CAAA,2rLAAA,CAAA,EAAA;;sBAKF,SAAS;uBAAC,cAAc;;;MEvDd,cAAc,CAAA;AAd3B,IAAA,WAAA,GAAA;QAeE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,8CAAC;QACrC,IAAA,CAAA,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACtB,IAAA,CAAA,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;AACxB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAe,KAAK,mDAAC;QACpC,IAAA,CAAA,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACvB,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC7B,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAqB,OAAO,yDAAC;AAClD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;QAEvB,IAAA,CAAA,eAAe,GAAG,MAAM,EAAW;AAEnC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AAEf,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAyCzC,IAAA;AAvCC,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,YAAY;AACZ,YAAA,CAAA,YAAA,EAAe,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE;YAC/B,IAAI,CAAC,QAAQ,EAAE,GAAG,sBAAsB,GAAG,EAAE;YAC7C,IAAI,CAAC,OAAO,EAAE,GAAG,qBAAqB,GAAG,EAAE;AAC3C,YAAA,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM,GAAG,wBAAwB,GAAG;AAC9D,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,aAAa,CAAC,KAAY,EAAA;QACxB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAC1D,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACzC;IACF;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1C;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B;+GAvDW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EARZ;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,cAAc,CAAC;AAC7C,gBAAA,KAAK,EAAE;AACV;SACJ,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBL,mtCA0BA,64FDhBc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYb,cAAc,EAAA,UAAA,EAAA,CAAA;kBAd1B,SAAS;+BACI,YAAY,EAAA,OAAA,EACb,CAAC,YAAY,CAAC,mBAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,oBAAoB,CAAC;AAC7C,4BAAA,KAAK,EAAE;AACV;AACJ,qBAAA,EAAA,QAAA,EAAA,mtCAAA,EAAA,MAAA,EAAA,CAAA,s1FAAA,CAAA,EAAA;;;MECQ,iBAAiB,CAAA;AAd9B,IAAA,WAAA,GAAA;QAeE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,8CAAC;QACxC,IAAA,CAAA,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACtB,IAAA,CAAA,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACvB,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC7B,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAwB,OAAO,yDAAC;AACrD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;QAEvB,IAAA,CAAA,aAAa,GAAG,MAAM,EAAW;AAEjC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AAEf,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAsCzC,IAAA;AApCC,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,eAAe;YACf,IAAI,CAAC,QAAQ,EAAE,GAAG,yBAAyB,GAAG,EAAE;YAChD,IAAI,CAAC,OAAO,EAAE,GAAG,wBAAwB,GAAG,EAAE;AAC9C,YAAA,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM,GAAG,2BAA2B,GAAG;AACjE,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;QAC3B,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACzC;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAc,EAAA;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3B;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B;+GAlDW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,SAAA,EARf;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC;AAChD,gBAAA,KAAK,EAAE;AACV;SACJ,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBL,89CA6BA,0mEDpBc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYb,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAd7B,SAAS;+BACI,eAAe,EAAA,OAAA,EAChB,CAAC,YAAY,CAAC,mBAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,uBAAuB,CAAC;AAChD,4BAAA,KAAK,EAAE;AACV;AACJ,qBAAA,EAAA,QAAA,EAAA,89CAAA,EAAA,MAAA,EAAA,CAAA,mjEAAA,CAAA,EAAA;;;MEEQ,eAAe,CAAA;AAd5B,IAAA,WAAA,GAAA;QAeE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,8CAAC;QACtC,IAAA,CAAA,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACtB,IAAA,CAAA,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACvB,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC7B,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAsB,OAAO,yDAAC;AACnD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;QAEvB,IAAA,CAAA,YAAY,GAAG,MAAM,EAAW;AAEhC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AAEf,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAsCzC,IAAA;AApCC,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,aAAa;YACb,IAAI,CAAC,QAAQ,EAAE,GAAG,uBAAuB,GAAG,EAAE;YAC9C,IAAI,CAAC,OAAO,EAAE,GAAG,sBAAsB,GAAG,EAAE;AAC5C,YAAA,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM,GAAG,yBAAyB,GAAG;AAC/D,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACxC;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAc,EAAA;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3B;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B;+GAlDW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EARb;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,eAAe,CAAC;AAC9C,gBAAA,KAAK,EAAE;AACV;SACJ,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBL,6zCA6BA,4sEDpBc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYb,eAAe,EAAA,UAAA,EAAA,CAAA;kBAd3B,SAAS;+BACI,aAAa,EAAA,OAAA,EACd,CAAC,YAAY,CAAC,mBAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,qBAAqB,CAAC;AAC9C,4BAAA,KAAK,EAAE;AACV;AACJ,qBAAA,EAAA,QAAA,EAAA,6zCAAA,EAAA,MAAA,EAAA,CAAA,qpEAAA,CAAA,EAAA;;;MEoBQ,iBAAiB,CAAA;AAd9B,IAAA,WAAA,GAAA;AAiBmB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAEhD,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,8CAAC;QACxC,IAAA,CAAA,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACvB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAe,IAAI,gDAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAmB,EAAE,mDAAC;AACrC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,GAAG,qDAAC;AACtB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,iDAAC;QACpB,IAAA,CAAA,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAC9B,IAAA,CAAA,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAE5B,IAAA,CAAA,eAAe,GAAG,MAAM,EAAuB;AAE/C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,EAAE,uDAAC;AACxB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAY,EAAE,0DAAC;AACtC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,wDAAC;AAEjB,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAgJzC,IAAA;AA9IC,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,eAAe;AACf,YAAA,CAAA,eAAA,EAAkB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;YAC/B,IAAI,CAAC,QAAQ,EAAE,GAAG,yBAAyB,GAAG,EAAE;YAChD,IAAI,CAAC,KAAK,EAAE,GAAG,sBAAsB,GAAG,EAAE;YAC1C,IAAI,CAAC,MAAM,EAAE,GAAG,qBAAqB,GAAG,EAAE;YAC1C,IAAI,CAAC,QAAQ,GAAG,0BAA0B,GAAG,EAAE;YAC/C,IAAI,CAAC,QAAQ,EAAE,GAAG,yBAAyB,GAAG;AAC/C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;IACzC;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,OAAO,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE;QAC9C,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpF;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AAC7B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/F,YAAA,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACzD;QACA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;AACzF,QAAA,OAAO,cAAc,EAAE,KAAK,IAAI,EAAE;IACpC;AAEA,IAAA,QAAQ,CAAC,KAAiB,EAAA;QACxB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACjB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/B;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9D;QACF;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B;IACF;AAEA,IAAA,YAAY,CAAC,MAAsB,EAAA;QACjC,IAAI,MAAM,CAAC,QAAQ;YAAE;AACrB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;AAAE,gBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;AACnC,gBAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACvD;aAAO;YACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACvC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B;IACF;AAEA,IAAA,UAAU,CAAC,MAAsB,EAAA;QAC/B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IACrD;AAEA,IAAA,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;QAC/C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe;AAC5C,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;oBAClB,KAAK,CAAC,cAAc,EAAE;oBACtB,IAAI,CAAC,cAAc,EAAE;gBACvB;AAAO,qBAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE;oBACnF,KAAK,CAAC,cAAc,EAAE;oBACtB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBACzD;gBACA;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAAE,IAAI,CAAC,cAAc,EAAE;;oBACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACzF;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,IAAI,CAAC,MAAM,EAAE;AAAE,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9E;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;oBACjB,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B;gBACA;AACF,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B;gBACA;;IAEN;AAGA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACzD,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B;QACF;IACF;AAEA,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QAC5D;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACvD;IACF;IAEA,gBAAgB,CAAC,EAA4B,EAAA,EAAU,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC3E,iBAAiB,CAAC,EAAc,EAAA,EAAU,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;AAC/D,IAAA,gBAAgB,CAAC,UAAmB,EAAA,EAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;+GAzKlE,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,SAAA,EARf;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC;AAChD,gBAAA,KAAK,EAAE;AACV;SACJ,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrCL,ulIAqGA,4xND1Ec,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYb,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAd7B,SAAS;+BACI,eAAe,EAAA,OAAA,EAChB,CAAC,YAAY,CAAC,mBAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,uBAAuB,CAAC;AAChD,4BAAA,KAAK,EAAE;AACV;AACJ,qBAAA,EAAA,QAAA,EAAA,ulIAAA,EAAA,MAAA,EAAA,CAAA,quNAAA,CAAA,EAAA;;sBAGF,SAAS;uBAAC,aAAa;;sBAoJvB,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;MEpK/B,mBAAmB,CAAA;AAPhC,IAAA,WAAA,GAAA;QAQE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,8CAAC;AAC3C,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;AACrB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAiB,IAAI,gDAAC;AAClC,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,IAAI,gEAAC;AAClC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,yDAAC;AAC3B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;QAC7B,IAAA,CAAA,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAC3B,IAAA,CAAA,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAChC,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAEjC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QACvB,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QAIf,IAAA,CAAA,gBAAgB,GAAwB,IAAI;QAC5C,IAAA,CAAA,iBAAiB,GAAwB,IAAI;QAC7C,IAAA,CAAA,qBAAqB,GAAmB,IAAI;AA2ErD,IAAA;IAzEC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,MAAM,EAAE;QACf;IACF;IAEA,eAAe,GAAA;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YACpC,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO;YACL,kBAAkB;YAClB,IAAI,CAAC,MAAM,EAAE,GAAG,wBAAwB,GAAG;AAC5C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO;YACL,yBAAyB;AACzB,YAAA,CAAA,yBAAA,EAA4B,IAAI,CAAC,IAAI,EAAE,CAAA;SACxC;IACH;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YACvE,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,aAAa;AACnD,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,EAAE;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YAClC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAClE;IACF;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;AACA,QAAA,IAAI,IAAI,CAAC,qBAAqB,YAAY,WAAW,EAAE;AACrD,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;QACpC;IACF;+GA5FW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBhC,uwCAgDA,EAAA,MAAA,EAAA,CAAA,ywEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7Bc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,WACnB,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uwCAAA,EAAA,MAAA,EAAA,CAAA,ywEAAA,CAAA,EAAA;;sBAgBhD,SAAS;uBAAC,YAAY;;MAsFZ,yBAAyB,CAAA;+GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,0BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B;AAC1C,iBAAA;;MAQY,0BAA0B,CAAA;+GAA1B,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,2BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,2BAA2B;AAC3C,iBAAA;;MAQY,yBAAyB,CAAA;+GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,0BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B;AAC1C,iBAAA;;;ME/GY,gBAAgB,CAAA;AAP7B,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAEjD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAmB,EAAE,oDAAC;AACtC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;QACxB,IAAA,CAAA,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QACzB,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;QAC7B,IAAA,CAAA,aAAa,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC/B,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;QAExB,IAAA,CAAA,SAAS,GAAG,MAAM,EAAmB;QACrC,IAAA,CAAA,cAAc,GAAG,MAAM,EAAW;AAElC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAyB,IAAI,2DAAC;AACtD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,CAAC,4DAAC;AAiG7B,IAAA;IA/FC,WAAW,CAAC,IAAqB,EAAE,KAAY,EAAA;QAC7C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACjE,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;AACjD,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;YAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YACnC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;YACvE;QACF;QAEA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,IAC7C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC7B;QAED,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,IAAG;AAChC,gBAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,IAAG;oBAClC,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE;AAChD,wBAAA,WAAW,CAAC,QAAQ,GAAG,KAAK;oBAC9B;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ;QAChC;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;IAEA,gBAAgB,CAAC,KAAsB,EAAE,KAAY,EAAA;QACnD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/C,YAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ;QAClC;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;YAC9B,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,cAAc,GAAA;QACZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5C;AAEA,IAAA,WAAW,CAAC,IAAY,EAAA;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;IACrD;IAEA,cAAc,CAAC,MAAc,EAAE,OAAuB,EAAA;QACpD,OAAO,OAAO,CAAC,EAAE;IACnB;IAEA,WAAW,CAAC,MAAc,EAAE,IAAqB,EAAA;QAC/C,OAAO,IAAI,CAAC,EAAE;IAChB;AAEA,IAAA,mBAAmB,CAAC,IAAqB,EAAA;QACvC,IAAI,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AAC5B,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACrE;AACA,QAAA,OAAO,KAAK;IACd;IAEA,cAAc,CAAC,IAAqB,EAAE,OAAO,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAA;AACrE,QAAA,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,uBAAuB,GAAG,oBAAoB,CAAC;AAE1E,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC;QAE3D,MAAM,wBAAwB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAC/D,IAAI,wBAAwB,EAAE;AAC5B,YAAA,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,+BAA+B,GAAG,4BAA4B,CAAC;QACxF;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7C,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC;gBAChD,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;YACjE;AAAO,iBAAA,IAAI,OAAO,IAAI,CAAC,QAAQ,EAAE;gBAC/B,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;YACjE;QACF;AAEA,QAAA,OAAO,OAAO;IAChB;+GA/GW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,omCC1B7B,4iRA4MA,EAAA,MAAA,EAAA,CAAA,8gRAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDlLa,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4iRAAA,EAAA,MAAA,EAAA,CAAA,8gRAAA,CAAA,EAAA;;;MEDtC,qBAAqB,CAAA;AA4BhC,IAAA,WAAA,GAAA;QA3BA,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,8CAAC;AAC5C;;;AAGG;AACH,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;AACrB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,cAAc,iDAAC;AAC7B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,EAAE,mDAAC;AACnB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;AAC1B,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;AACxB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAuB,SAAS,oDAAC;AACjD,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;AAC7B,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,IAAI,gEAAC;AAClC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,yDAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;AAChD,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,2DAAC;QAEtD,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;QAC1B,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;QAC1B,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QAIf,IAAA,CAAA,gBAAgB,GAAwB,IAAI;QAC5C,IAAA,CAAA,iBAAiB,GAAwB,IAAI;QAC7C,IAAA,CAAA,qBAAqB,GAAmB,IAAI;QAGlD,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,CAAC,MAAM,EAAE;YACf;iBAAO;gBACL,IAAI,CAAC,OAAO,EAAE;YAChB;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO;YACL,mBAAmB;YACnB,IAAI,CAAC,MAAM,EAAE,GAAG,yBAAyB,GAAG;AAC7C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,oDAAoD,IAAI,CAAC,QAAQ,EAAE,EAAE;IAC9E;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ;IAC7B;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU;IAC/B;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YACvE,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACrB,IAAI,CAAC,KAAK,EAAE;IACd;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACrB,IAAI,CAAC,KAAK,EAAE;IACd;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,aAAa;AACnD,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,EAAE;QAC5C,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;QACpB,IAAI,IAAI,CAAC,WAAW,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC7D,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;QACnE;IACF;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;AACA,QAAA,IAAI,IAAI,CAAC,qBAAqB,YAAY,WAAW,EAAE;AACrD,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;QACpC;IACF;+GAvHW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,m4DCvBlC,4jOA6GA,EAAA,MAAA,EAAA,CAAA,s6GAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDtFa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,OAAA,EACpB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4jOAAA,EAAA,MAAA,EAAA,CAAA,s6GAAA,CAAA,EAAA;;sBAwB9C,SAAS;uBAAC,aAAa;;;MExBb,oBAAoB,CAAA;AAwB/B,IAAA,WAAA,GAAA;QAvBA,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,8CAAC;AAC5C;;;AAGG;AACH,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;AACrB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;AACjB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,gBAAgB,uDAAC;AACrC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,kBAAkB,yDAAC;AACzC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;AAC7B,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,IAAI,gEAAC;AAClC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,yDAAC;QAE3B,IAAA,CAAA,cAAc,GAAG,MAAM,EAAQ;QAC/B,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAQ;QACjC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QAIf,IAAA,CAAA,gBAAgB,GAAwB,IAAI;QAC5C,IAAA,CAAA,iBAAiB,GAAwB,IAAI;QAC7C,IAAA,CAAA,qBAAqB,GAAmB,IAAI;QAGlD,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,CAAC,MAAM,EAAE;YACf;iBAAO;gBACL,IAAI,CAAC,OAAO,EAAE;YAChB;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ;IAC7B;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YACvE,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,aAAa;AACnD,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,EAAE;QAC5C,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;QACpB,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5D,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAClE;IACF;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;AACA,QAAA,IAAI,IAAI,CAAC,qBAAqB,YAAY,WAAW,EAAE;AACrD,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;QACpC;IACF;+GA1FW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,y4CCrBjC,2pDAgDA,EAAA,MAAA,EAAA,CAAA,8nGAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FD3Ba,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,OAAA,EACpB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2pDAAA,EAAA,MAAA,EAAA,CAAA,8nGAAA,CAAA,EAAA;;sBAoB9C,SAAS;uBAAC,YAAY;;;AElBzB;AAEA;;;;;;;;;;;;;;AAcG;MAQU,sBAAsB,CAAA;AAPnC,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAmB,OAAO,mDAAC;;AAE1C,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,CAAC,kDAAC;;AAEjB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;;AAExB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;;AAEjB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;;AAEjB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAW,EAAE,oDAAC;AAC9B;;;AAGG;AACH,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;;AAErB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;;AAEtB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;;AAEtB,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,yDAAC;;AAE3B,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;QAExB,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;QAC5B,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;QAC5B,IAAA,CAAA,aAAa,GAAG,MAAM,EAAQ;AAK/B,IAAA;IAHC,MAAM,GAAA;QACJ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC;+GAjCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,6lDC7CnC,u/PA0IA,EAAA,MAAA,EAAA,CAAA,qwNAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FD7Fa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,OAAA,EACtB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,u/PAAA,EAAA,MAAA,EAAA,CAAA,qwNAAA,CAAA,EAAA;;AAsCjD;AAEA;;;;;;;;;;;;;;;AAeG;MAQU,uBAAuB,CAAA;AAPpC,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;;AAEjB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;;AAEpB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,WAAW,qDAAC;AAC9B;;;AAGG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;;AAEvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;;AAExB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;;AAE1B,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,IAAI,wDAAC;;AAE1B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;;AAEtB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;;AAEtB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;;AAExB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;QAEtB,IAAA,CAAA,eAAe,GAAG,MAAM,EAAQ;QAChC,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;QAC5B,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;QAC5B,IAAA,CAAA,aAAa,GAAG,MAAM,EAAQ;QAC9B,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;AAa7B,IAAA;IAXC,aAAa,GAAA;QACX,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrC;;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;IACA,IAAI,aAAa,CAAC,KAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;+GA3CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EE1GpC,4/IAoGA,EAAA,MAAA,EAAA,CAAA,qwNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EFCY,eAAe,iLAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAK3B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;+BACE,sBAAsB,EAAA,OAAA,EACvB,CAAC,eAAe,EAAE,WAAW,CAAC,EAAA,eAAA,EAGtB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4/IAAA,EAAA,MAAA,EAAA,CAAA,qwNAAA,CAAA,EAAA;;;MGnFpC,wBAAwB,CAAA;AAPrC,IAAA,WAAA,GAAA;AAQU,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAExC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,iDAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAA0B,QAAQ,oDAAC;;AAEnD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,EAAE,0DAAC;;AAE1B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,EAAE,2DAAC;AAE3B,QAAA,IAAA,CAAA,kBAAkB,GAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,8DAAC;AACnG,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,+DAAC;AACpG;;;AAGG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAsB,MAAM,oDAAC;QAE7C,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;AAiBzB,IAAA;IAfC,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACnC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACrB;IACF;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,wBAAwB;AACxB,YAAA,CAAA,wBAAA,EAA2B,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE;YAC5C,IAAI,CAAC,QAAQ,EAAE,GAAG,kCAAkC,GAAG,EAAE;YACzD,IAAI,CAAC,QAAQ,EAAE,GAAG,kCAAkC,GAAG,EAAE;SAC1D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B;+GApCW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,gkCCrBrC,i7CAuCA,EAAA,MAAA,EAAA,CAAA,i2DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDlBa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,OAAA,EACzB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,i7CAAA,EAAA,MAAA,EAAA,CAAA,i2DAAA,CAAA,EAAA;;MAoDpC,oBAAoB,CAAA;AAXjC,IAAA,WAAA,GAAA;AAYE,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;AACjD,IAAA;+GAFY,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EARrB;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,i2DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAIU,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAXhC,SAAS;+BACE,mBAAmB,EAAA,OAAA,EACpB,EAAE,EAAA,QAAA,EACD;;;;GAIT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,i2DAAA,CAAA,EAAA;;;ME9CpC,gBAAgB,CAAA;AAP7B,IAAA,WAAA,GAAA;AAQE,QAAA,IAAA,CAAA,KAAK,GAAa,KAAK,CAAC,EAAE,iDAAC;AAC3B,QAAA,IAAA,CAAA,OAAO,GAAW,KAAK,CAAC,EAAE,mDAAC;AAC3B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAyB,UAAU,2DAAC;AAC3D,QAAA,IAAA,CAAA,KAAK,GAAa,KAAK,CAAe,MAAM,iDAAC;AAC7C,QAAA,IAAA,CAAA,UAAU,GAAQ,KAAK,CAAqB,SAAS,sDAAC;AACtD,QAAA,IAAA,CAAA,YAAY,GAAM,KAAK,CAAqB,SAAS,wDAAC;AACtD,QAAA,IAAA,CAAA,SAAS,GAAS,KAAK,CAAC,IAAI,qDAAC;AAC7B;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,IAAI,mDAAC;QAErB,IAAA,CAAA,MAAM,GAAc,MAAM,EAAQ;QAClC,IAAA,CAAA,eAAe,GAAK,MAAM,EAAQ;QAClC,IAAA,CAAA,iBAAiB,GAAG,MAAM,EAAQ;AAgCnC,IAAA;IA9BC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;IACrD;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAwC;IACpF;;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,OAAO,GAAG,SAAS,GAAG,MAAM;IACtD;;AAGA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,OAAO,GAAG,SAAS,GAAG,SAAS;IACzD;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,cAAc;AACd,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AAC/B,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,eAAe,EAAE,CAAA;AACxC,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC;IACb;+GA/CW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,mvCCvB7B,ygJAoFA,EAAA,MAAA,EAAA,CAAA,i1IAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FD7Da,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ygJAAA,EAAA,MAAA,EAAA,CAAA,i1IAAA,CAAA,EAAA;;;AENjD,MAAM,GAAG,GAAG,CAAC,CAAC;MAMD,gBAAgB,CAAA;AAJ7B,IAAA,WAAA,GAAA;;AAME,QAAA,IAAA,CAAA,WAAW,GAAO,KAAK,CAAC,EAAE,uDAAC;;AAE3B,QAAA,IAAA,CAAA,YAAY,GAAM,KAAK,CAAC,EAAE,wDAAC;;AAE3B,QAAA,IAAA,CAAA,YAAY,GAAM,KAAK,CAAe,MAAM,wDAAC;;AAE7C,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAyB,UAAU,2DAAC;;AAE3D,QAAA,IAAA,CAAA,cAAc,GAAQ,KAAK,CAAoB,OAAO,0DAAC;;AAEvD,QAAA,IAAA,CAAA,iBAAiB,GAAK,KAAK,CAAC,EAAE,6DAAC;;AAE/B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,EAAE,+DAAC;;QAG/B,IAAA,CAAA,sBAAsB,GAAK,MAAM,EAAQ;;QAEzC,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAAQ;AAEjC,QAAA,IAAA,CAAA,EAAE,GAAS,MAAM,EAAC,UAAuB,EAAC;AAC1C,QAAA,IAAA,CAAA,MAAM,GAAK,MAAM,CAAC,cAAc,CAAC;AACjC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAiH/C,IAAA;IA7GC,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,IAAI,EAAE;IACpD;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,OAAO;YAAE,IAAI,CAAC,IAAI,EAAE;IACpD;IAGA,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,OAAO,EAAE;AACrC,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;QACtC;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,IAAI,EAAE;IACb;;IAGQ,uBAAuB,GAAA;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE;AAClC,QAAA,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AACpC,QAAA,MAAM,OAAO,GAA2B,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;QACtG,OAAO,CAAA,EAAG,OAAO,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,KAAK,EAA4B;IAC9D;IAEQ,IAAI,GAAA;QACV,IAAI,IAAI,CAAC,GAAG;YAAE;AAEd,QAAA,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC,gBAAgB,EAAE,EAAE,mBAAmB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpF,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAU,IAAI,CAAC,WAAW,EAAE,CAAC;AACxD,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAY,IAAI,CAAC,YAAY,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAY,IAAI,CAAC,YAAY,EAAE,CAAC;;;AAGzD,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACpE,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC9D,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAQ,IAAI,CAAC,cAAc,EAAE,KAAK,OAAO,CAAC;;AAGvE,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AACrF,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC;QAEzF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC1D,QAAA,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,aAAa,EAAE;QAC1C,IAAI,CAAC,QAAQ,EAAE;IACjB;IAEQ,IAAI,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QACf,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAClB,QAAA,IAAI,CAAC,GAAG,GAAG,SAAS;IACtB;IAEQ,QAAQ,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QAEf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,aAA4B;QAChE,MAAM,IAAI,GAAQ,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAC/D,QAAA,MAAM,GAAG,GAAS,IAAI,CAAC,eAAe,EAAE;AACxC,QAAA,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAqB;AAExD,QAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAClC,QAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAK,MAAM;;;;AAKjC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AAClB,YAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI;QACrE;AAAO,aAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA,EAAA,CAAI;QAChD;aAAO;;AAEL,YAAA,IAAI,KAAK,KAAK,KAAK,EAAE;gBACnB,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA,EAAA,CAAI;YACvC;AAAO,iBAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI;AAC7D,gBAAA,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB;YAChD;iBAAO;AACL,gBAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI;YAClE;QACF;;QAGA,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE;AACvC,YAAA,IAAI,KAAK,KAAK,MAAM,EAAE;gBACpB,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;YACzC;AAAO,iBAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,SAAS,CAAC,KAAK,CAAC,IAAI,GAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI;AAC7D,gBAAA,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB;YAChD;iBAAO;;AAEL,gBAAA,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI;YAC/D;QACF;AAAO,aAAA,IAAI,IAAI,KAAK,MAAM,EAAE;;AAE1B,YAAA,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI;QACpE;aAAO;;AAEL,YAAA,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAA,EAAA,CAAI;QAChD;IACF;+GAvIW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE;AACb,iBAAA;;sBA2BE,YAAY;uBAAC,YAAY;;sBAKzB,YAAY;uBAAC,YAAY;;sBAKzB,YAAY;uBAAC,OAAO;;;AC7CvB;MAUa,oBAAoB,CAAA;AARjC,IAAA,WAAA,GAAA;;AAUE,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;;AAE7B,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,EAAE,0DAAC;;AAElC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,eAAe,gDAAC;;AAErC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,OAAO,gDAAC;;AAE7B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAS,2CAA2C,mDAAC;;AAEpE,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoB,SAAS,kDAAC;;AAE5C,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,CAAC,uDAAC;;AAE9B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;;QAGhC,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;AAE5B,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAS,MAAK;AAC/B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,YAAA,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;AAC3D,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;iBACtB,KAAK,CAAC,GAAG;iBACT,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACnB,IAAI,CAAC,EAAE;AACP,iBAAA,SAAS,CAAC,CAAC,EAAE,CAAC;AACd,iBAAA,WAAW,EAAE;AAClB,QAAA,CAAC,oDAAC;AASH,IAAA;AAPC,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,mBAAmB;AACnB,YAAA,IAAI,CAAC,MAAM,EAAE,KAAK,SAAS,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE;YACxE,IAAI,CAAC,QAAQ,EAAE,GAAG,6BAA6B,GAAG;SACnD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B;+GAtCW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,uoCCtBjC,6mFAiEA,EAAA,MAAA,EAAA,CAAA,88RAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FD3Ca,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6mFAAA,EAAA,MAAA,EAAA,CAAA,88RAAA,CAAA,EAAA;;AA2CjD;MAUa,sBAAsB,CAAA;AARnC,IAAA,WAAA,GAAA;;AAUE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAoB,MAAM,gDAAC;;AAEvC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAmB,UAAU,qDAAC;;;AAI/C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,EAAE,gDAAC;AACxB;;;AAGG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAW,EAAE,oDAAC;;;AAI9B,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,cAAc,sDAAC;;AAE1C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,SAAS,gDAAC;;AAE/B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAU,KAAK,2DAAC;;;AAIvC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;;AAE7B,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,EAAE,0DAAC;;;AAIlC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,cAAc,oDAAC;;AAExC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,oBAAoB,oDAAC;;AAE9C,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,EAAE,wDAAC;;;AAIhC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAS,MAAM,yDAAC;AACrC;;;AAGG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAW,EAAE,wDAAC;;;AAIlC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,oDAAC;;AAE5B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,kBAAkB,oDAAC;;;QAI5C,IAAA,CAAA,eAAe,GAAG,MAAM,EAAQ;;QAEhC,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;;AAI5B,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAS,MAAK;AAC/B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,YAAA,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;AAC3D,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;iBAC5B,KAAK,CAAC,GAAG;iBACT,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACnB,IAAI,CAAC,EAAE;AACP,iBAAA,SAAS,CAAC,CAAC,EAAE,CAAC;AACd,iBAAA,WAAW,EAAE;AAClB,QAAA,CAAC,oDAAC;AAEF,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAW,MAAK;AACxC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI;AAChC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;AACrB,QAAA,CAAC,2DAAC;AAEF,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAW,MAAK;AACrC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,YAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,gBAAA,OAAO,MAAM;;AAEpC,YAAA,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1H,QAAA,CAAC,wDAAC;AAaH,IAAA;AAXC,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,qBAAqB;AACrB,YAAA,CAAA,qBAAA,EAAwB,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE;AAC1C,YAAA,CAAA,qBAAA,EAAwB,IAAI,CAAC,IAAI,EAAE,CAAA;AACpC,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC;IACb;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;IACpE;+GA/FW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,8uEEzEnC,8uOA8IA,EAAA,MAAA,EAAA,CAAA,88RAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FFrEa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8uOAAA,EAAA,MAAA,EAAA,CAAA,88RAAA,CAAA,EAAA;;;AGxDjD;MAOa,+BAA+B,CAAA;+GAA/B,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gCAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAL3C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,gCAAgC;AAChD,iBAAA;;MAOY,8BAA8B,CAAA;+GAA9B,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAJ1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,UAAU,EAAE;AACb,iBAAA;;AAGD;MAUa,wBAAwB,CAAA;AARrC,IAAA,WAAA,GAAA;;QAUE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,8CAAC;;AAGhD,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;;AAGrB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;AAGzB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;;AAG7B,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,IAAI,gEAAC;;AAGlC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,yDAAC;;AAG3B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;;AAGhD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAqB,SAAS,0DAAC;;AAGrD,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,2DAAC;;QAGtD,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;;QAGvB,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QAIf,IAAA,CAAA,gBAAgB,GAAwB,IAAI;QAC5C,IAAA,CAAA,iBAAiB,GAAwB,IAAI;QAC7C,IAAA,CAAA,qBAAqB,GAAmB,IAAI;AAuErD,IAAA;IArEC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,MAAM,EAAE;QACf;IACF;IAEA,eAAe,GAAA;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YACpC,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YACvE,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;;AAGA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ;IAC7B;AAEA,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3E;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,aAAa;AACnD,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,EAAE;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YAClC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAClE;IACF;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;AACA,QAAA,IAAI,IAAI,CAAC,qBAAqB,YAAY,WAAW,EAAE;AACrD,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;QACpC;IACF;+GA5GW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,0+CCxCrC,w4FAwDA,EAAA,MAAA,EAAA,CAAA,w1EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDhBa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBARpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cACrB,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w4FAAA,EAAA,MAAA,EAAA,CAAA,w1EAAA,CAAA,EAAA;;sBAoC9C,SAAS;uBAAC,YAAY;;;AEnDzB;AACA;AACA;MASa,gBAAgB,CAAA;AAP7B,IAAA,WAAA,GAAA;QAQE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,8CAAC;AACvC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAc,OAAO,gDAAC;AAClC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAc,IAAI,gDAAC;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAmB,YAAY,qDAAC;AACjD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAmB,SAAS,qDAAC;AAC9C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAa,EAAE,iDAAC;AAC7B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,CAAC,uDAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,UAAU,qDAAC;QAErC,IAAA,CAAA,WAAW,GAAG,MAAM,EAAU;AAE9B,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,YAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM;YAC/B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACtC,gBAAA,GAAG,IAAI;gBACP,KAAK;AACL,gBAAA,aAAa,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;gBAC9D,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK;AACtC,aAAA,CAAC,CAAC;AACL,QAAA,CAAC,yDAAC;AAoEH,IAAA;AAlEC,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,cAAc;AACd,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AAC9B,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AAC9B,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE;AACnC,YAAA,CAAA,mBAAA,EAAsB,IAAI,CAAC,SAAS,EAAE,CAAA;SACvC;IACH;AAEA,IAAA,cAAc,CAAC,IAAmE,EAAA;QAChF,OAAO;YACL,oBAAoB;YACpB,CAAA,oBAAA,EAAuB,IAAI,CAAC,aAAa,CAAA,CAAE;YAC3C,CAAA,oBAAA,EAAuB,IAAI,CAAC,KAAK,CAAA,CAAE;AACnC,YAAA,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,GAAG,6BAA6B,GAAG;AACrE,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,mBAAmB,CAAC,IAAkC,EAAA;QACpD,OAAO;YACL,yBAAyB;YACzB,IAAI,CAAC,aAAa,KAAK,QAAQ,GAAG,oCAAoC,GAAG;AAC1E,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,uBAAuB,CAAC,IAAiD,EAAA;AACvE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACrD,OAAO;YACL,oBAAoB;YACpB,0BAA0B;AAC1B,YAAA,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,GAAG,4BAA4B,GAAG;SAClF;IACH;AAEA,IAAA,wBAAwB,CAAC,IAAkC,EAAA;QACzD,OAAO;YACL,oBAAoB;YACpB,2BAA2B;YAC3B,IAAI,CAAC,aAAa,KAAK,QAAQ,GAAG,4BAA4B,GAAG;SAClE;IACH;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;IAEA,aAAa,CAAC,KAAoB,EAAE,KAAa,EAAA;AAC/C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B;IACF;IAEQ,YAAY,CAAC,KAAa,EAAE,OAAe,EAAA;QACjD,IAAI,KAAK,GAAG,OAAO;AAAE,YAAA,OAAO,QAAQ;QACpC,IAAI,KAAK,KAAK,OAAO;AAAE,YAAA,OAAO,SAAS;AACvC,QAAA,OAAO,MAAM;IACf;IAEQ,YAAY,CAAC,KAAa,EAAE,KAAa,EAAA;QAC/C,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;QAC9B,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,OAAO;AAC/B,QAAA,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,OAAO,QAAQ;IACjB;+GAzFW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClC7B,08VAmNA,EAAA,MAAA,EAAA,CAAA,i0hBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtLc,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,WACf,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,08VAAA,EAAA,MAAA,EAAA,CAAA,i0hBAAA,CAAA,EAAA;;;AE2CnD;AACA;AACA;MASa,aAAa,CAAA;AAP1B,IAAA,WAAA,GAAA;;QASE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,MAAM,CAAC,8CAAC;;AAG5C,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAc,CAAC,mDAAC;AAE/B;;;AAGG;AACH,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAS,OAAO,yDAAC;;AAGtC,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAU,IAAI,+CAAC;;AAG1B,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAsB,SAAS,kDAAC;;AAG9C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAsB,SAAS,qDAAC;;AAGjD,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAc,MAAM,mDAAC;;AAGpC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAY,SAAS,iDAAC;;AAGnC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAoB,SAAS,yDAAC;;AAGnD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;;AAGhD,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AACzB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;AAC3B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;YAEnC,OAAO;gBACL,WAAW;gBACX,IAAI,KAAK,MAAM,GAAG,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,GAAG,sBAAsB;;AAEpE,gBAAA,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,GAAG,kBAAkB,MAAM,CAAA,CAAE,GAAG,EAAE;gBAC1E,IAAI,KAAK,SAAS,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,GAAG,EAAE;gBACtD,IAAI,KAAK,SAAS,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,GAAG,EAAE;gBACtD,GAAG,KAAK,MAAM,GAAG,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,GAAG,EAAE;gBACjD,MAAM,KAAK,SAAS,GAAG,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAE,GAAG,EAAE;gBACxD,MAAM,KAAK,SAAS,GAAG,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,GAAG;AACxD,aAAA,CAAC,MAAM,CAAC,OAAO,CAAC;AACnB,QAAA,CAAC,uDAAC;;AAGF,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACxB,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE;gBAC7B,OAAO,EAAE,6BAA6B,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE;YAChE;AACA,YAAA,OAAO,EAAE;AACX,QAAA,CAAC,qDAAC;AACH,IAAA;+GAhEY,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtF1B,2NASA,EAAA,MAAA,EAAA,CAAA,0lJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDyEY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,2NAAA,EAAA,MAAA,EAAA,CAAA,0lJAAA,CAAA,EAAA;;AAsEzB;AACA;AACA;MAYa,iBAAiB,CAAA;AAV9B,IAAA,WAAA,GAAA;;AAYE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAe,CAAC,gDAAC;;AAG7B,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAA2B,SAAS,kDAAC;;AAGnD,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAA2B,SAAS,kDAAC;;AAGnD,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAA2B,SAAS,kDAAC;;AAGnD,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAgB,IAAI,gDAAC;;AAGjC,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;YAExB,OAAO;gBACL,iBAAiB;gBACjB,IAAI,KAAK,MAAM,GAAG,4BAA4B,GAAG,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE;gBAChF,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,MAAM,GAAG,+BAA+B,GAAG,CAAA,yBAAA,EAA4B,EAAE,EAAE,IAAI,EAAE;gBAC5G,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,MAAM,GAAG,+BAA+B,GAAG,CAAA,yBAAA,EAA4B,EAAE,EAAE,IAAI,EAAE;gBAC5G,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,MAAM,GAAG,+BAA+B,GAAG,CAAA,yBAAA,EAA4B,EAAE,EAAE,IAAI;aAC3G,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7B,QAAA,CAAC,uDAAC;AACH,IAAA;+GA/BY,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAPlB;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0lJAAA,CAAA,EAAA,CAAA,CAAA;;4FAGU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAV7B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,QAAA,EACN;;;;AAIT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,0lJAAA,CAAA,EAAA;;AAoCH;AACA;AACA;MAQa,eAAe,CAAA;AAN5B,IAAA,WAAA,GAAA;;AAQE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,IAAI,gDAAC;;AAG9B,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;;AAGrB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;YAC5B,OAAO;gBACL,aAAa;AACb,gBAAA,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;gBAC7B,IAAI,CAAC,MAAM,EAAE,GAAG,qBAAqB,GAAG;aACzC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7B,QAAA,CAAC,yDAAC;AACH,IAAA;+GAfY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,mUAHhB,CAAA,+DAAA,CAAiE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0lJAAA,CAAA,EAAA,CAAA,CAAA;;4FAGhE,eAAe,EAAA,UAAA,EAAA,CAAA;kBAN3B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,QAAA,EACN,CAAA,+DAAA,CAAiE,EAAA,MAAA,EAAA,CAAA,0lJAAA,CAAA,EAAA;;;AEzL7E;AACA;AACA;MASa,sBAAsB,CAAA;AAPnC,IAAA,WAAA,GAAA;QAQE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,8CAAC;AACpC,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAsB,GAAG,kDAAC;AACxC,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAmB,IAAI,+CAAC;AACnC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAS,EAAE,mDAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;AAC7B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,gBAAgB,qDAAC;AAE3C,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;YACxB,MAAM,MAAM,GAA2B,EAAE;AACzC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE;YAEpC,IAAI,aAAa,EAAE;AACjB,gBAAA,MAAM,CAAC,uBAAuB,CAAC,GAAG,aAAa;YACjD;AAEA,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;YAC/B,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM;YAC/B;AAEA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,qDAAC;AASH,IAAA;AAPC,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,qBAAqB;AACrB,YAAA,CAAA,qBAAA,EAAwB,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE;AACvC,YAAA,CAAA,yBAAA,EAA4B,IAAI,CAAC,GAAG,EAAE,CAAA;SACvC;IACH;+GA9BW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChCnC,2LASA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDkBc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,WACtB,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2LAAA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA;;;AElBnD;AACA;AACA;MAyCa,gBAAgB,CAAA;AAvC7B,IAAA,WAAA,GAAA;QAwCE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,8CAAC;AACvC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,EAAE,gDAAC;AAChB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,SAAS,qDAAC;QAE5B,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;QACvC,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,uDAAC;QAClE,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,kDAAC;AACpE,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,yDAAC;AAC5D,IAAA;+GATY,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApCf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,s7DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjCS,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAqCb,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAvC5B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAgCT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,s7DAAA,CAAA,EAAA;;AAanD;AACA;AACA;MAwCa,oBAAoB,CAAA;AAtCjC,IAAA,WAAA,GAAA;QAuCE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,8CAAC;AAC5C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,CAAC,iDAAC;AAChB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAkB,IAAI,gDAAC;AACnC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;AACjB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;AACpB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,IAAI,0DAAC;AAC5B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;QAE7B,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEvE,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACxB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;AAC3B,YAAA,IAAI,MAAM;AAAE,gBAAA,OAAO,MAAM;YACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACtD,QAAA,CAAC,qDAAC;AAgBH,IAAA;AAdC,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO;YACL,mBAAmB;AACnB,YAAA,CAAA,mBAAA,EAAsB,IAAI,CAAC,IAAI,EAAE,CAAA;SAClC;IACH;AAEQ,IAAA,mBAAmB,CAAC,KAAa,EAAA;QACvC,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;QACjC,IAAI,KAAK,IAAI,EAAE;AAAE,YAAA,OAAO,SAAS;QACjC,IAAI,KAAK,IAAI,EAAE;AAAE,YAAA,OAAO,SAAS;QACjC,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,SAAS;AACjC,QAAA,OAAO,SAAS;IAClB;+GA/BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnCnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,s7DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhCS,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAoCb,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAtChC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,OAAA,EACpB,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+BT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,s7DAAA,CAAA,EAAA;;AAoCnD;AACA;AACA;MAkDa,uBAAuB,CAAA;AAhDpC,IAAA,WAAA,GAAA;QAiDE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,8CAAC;AAC/C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,CAAC,iDAAC;AAChB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,IAAI,gDAAC;AACtC,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,IAAI,0DAAC;AAC5B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;AAEZ,QAAA,IAAA,CAAA,OAAO,GAAuC;AAC7D,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE;SACL;AAEgB,QAAA,IAAA,CAAA,WAAW,GAAuC;AACjE,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,EAAE,EAAE;SACL;AAED,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,qDAAC;AACrD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,oDAAC;AACxD,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;YACrB,IAAI,CAAC,KAAK,IAAI;AAAE,gBAAA,OAAO,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI;AAAE,gBAAA,OAAO,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI;AAAE,gBAAA,OAAO,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI;AAAE,gBAAA,OAAO,CAAC;AACxB,YAAA,OAAO,CAAC;AACV,QAAA,CAAC,uDAAC;QACF,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,kDAAC;AACpE,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,yDAAC;QAC3D,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACvE,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG;YAC1C,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC;AAC9C,QAAA,CAAC,sDAAC;AAEF,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACxB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;AAC3B,YAAA,IAAI,MAAM;AAAE,gBAAA,OAAO,MAAM;YACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACtD,QAAA,CAAC,qDAAC;AAgBH,IAAA;AAdC,IAAA,IAAI,aAAa,GAAA;QACf,OAAO;YACL,sBAAsB;AACtB,YAAA,CAAA,sBAAA,EAAyB,IAAI,CAAC,IAAI,EAAE,CAAA;SACrC;IACH;AAEQ,IAAA,mBAAmB,CAAC,KAAa,EAAA;QACvC,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;QACjC,IAAI,KAAK,IAAI,EAAE;AAAE,YAAA,OAAO,SAAS;QACjC,IAAI,KAAK,IAAI,EAAE;AAAE,YAAA,OAAO,SAAS;QACjC,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,SAAS;AACjC,QAAA,OAAO,SAAS;IAClB;+GA7DW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7CtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,s7DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1CS,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA8Cb,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhDnC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EACvB,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyCT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,s7DAAA,CAAA,EAAA;;;ACzKnD;AACA;AACA;MAgBa,kBAAkB,CAAA;AAuB7B,IAAA,WAAA,GAAA;QApBA,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,YAAY,CAAC,8CAAC;AAC1C,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,CAAC,kDAAC;AACjB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,YAAY,qDAAC;AACnD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAiB,SAAS,iDAAC;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,EAAE,wDAAC;AACxB,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;AAC3B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,mBAAmB,qDAAC;QAEtC,IAAA,CAAA,SAAS,GAAG,MAAM,EAAU;QAC5B,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;AAExB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAW,EAAE,iDAAC;AAC5B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAS,CAAC,CAAC,wDAAC;AAEjC,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,uDAAC;AAExE,QAAA,IAAA,CAAA,QAAQ,GAA4B,MAAK,EAAE,CAAC;AAC5C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;QAGtC,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAoB,EAAA;AAC7B,QAAA,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;AACvB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACnD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAChF,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1B;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,KAAK;AAC/C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;QAEjC,OAAO;YACL,uBAAuB;AACvB,YAAA,SAAS,GAAG,+BAA+B,GAAG,EAAE;YAChD,YAAY,KAAK,OAAO,IAAI,SAAS,GAAG,8BAA8B,GAAG,EAAE;YAC3E,SAAS,IAAI,YAAY,KAAK,OAAO,GAAG,+BAA+B,GAAG,EAAE;YAC5E,CAAC,SAAS,IAAI,CAAC,SAAS,GAAG,8BAA8B,GAAG;AAC7D,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;IAEA,WAAW,CAAC,KAAY,EAAE,KAAa,EAAA;AACrC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AACtC,QAAA,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;AAC5B,QAAA,MAAM,CAAC,KAAK,GAAG,IAAI;QAEnB,IAAI,CAAC,SAAS,EAAE;QAEhB,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QAC3B;AAEA,QAAA,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C;IACF;IAEA,aAAa,CAAC,KAAoB,EAAE,KAAa,EAAA;QAC/C,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAEtC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YAC7B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AACvB,gBAAA,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE;AACxB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC5B,IAAI,CAAC,SAAS,EAAE;AAChB,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,gBAAA,MAAM,CAAC,KAAK,GAAG,EAAE;YACnB;AAAO,iBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACpB,gBAAA,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE;AAC5B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC5B,IAAI,CAAC,SAAS,EAAE;AAChB,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YAC3B;YACA;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,KAAK,KAAK,GAAG,CAAC,EAAE;YACvE,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB;QACF;QAEA,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,KAAK,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;YAC1F,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;YAC5B,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,YAAA,MAAM,CAAC,KAAK,GAAG,EAAE;YACjB;QACF;IACF;IAEA,WAAW,CAAC,KAAqB,EAAE,KAAa,EAAA;QAC9C,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;AAC7E,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAI,SAAS,GAAG,KAAK;AAErB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE;gBAAE;AAChC,YAAA,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI;AAC9B,YAAA,SAAS,EAAE;QACb;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,SAAS,EAAE;AAEhB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1D,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;AAE3B,QAAA,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C;IACF;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B;IAEA,UAAU,GAAA;QACR,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAClE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;QAC1B,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEQ,SAAS,GAAA;QACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE;AAEQ,IAAA,SAAS,CAAC,KAAa,EAAA;QAC7B,UAAU,CAAC,MAAK;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;AACzC,YAAA,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE;gBACnC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE;YACtC;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,eAAe,GAAA;QACrB,UAAU,CAAC,MAAK;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;AACzC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;YACjC,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAI;oBAC7B,QAAQ,CAAC,aAAa,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE;AACtD,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,SAAS,GAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtB;+GAlMW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EARhB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvCL,wzCA6CA,omEDhBc,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYb,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;+BACI,iBAAiB,EAAA,OAAA,EAClB,CAAC,YAAY,CAAC,mBAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,wzCAAA,EAAA,MAAA,EAAA,CAAA,6iEAAA,CAAA,EAAA;;sBAGF,YAAY;uBAAC,WAAW;;;AEgC3B;AACA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS;AACvC,IAAA,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;AACvE,CAAA,CAAC;AACF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS;AACvC,IAAA,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC/B,CAAA,CAAC;AACF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS;IACvC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC/C,CAAA,CAAC;AAEF;AACA;AACA;AAEA;;;;;;;;;;;;;;AAcG;MAKU,eAAe,CAAA;AAJ5B,IAAA,WAAA,GAAA;;AAME,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAa,QAAQ,sDAAC;;AAGxC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAa,MAAM,sDAAC;AAE9B,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,IAAA,CAAA,YAAY,GAAG,EAAE;AA4B1B,IAAA;IA1BC,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,EAAE;IACnB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,EAAE;IACnB;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,GAAG,gBAAgB,GAAG,gBAAgB;QAExE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACzB;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,CAAA,YAAA,EAAe,IAAI,CAAA,EAAA,EAAK,IAAI,EAAE;QAE/C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE;AACvD,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QACrE;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC;AACvD,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ;IAC9B;+GApCW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE;AACb,iBAAA;;AAwCD;AACA;AACA;AAEA;;;;;;;;;;;AAWG;MAKU,aAAa,CAAA;AAJ1B,IAAA,WAAA,GAAA;;AAME,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAW,QAAQ,oDAAC;;AAGpC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEf,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,IAAA,CAAA,YAAY,GAAG,EAAE;AA2B1B,IAAA;IAzBC,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,EAAE;IACnB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,EAAE;IACnB;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;QAE5B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/B;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,oBAAoB,GAAG,WAAW;AACnE,QAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAI,EAAE;QAErC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE;AACvD,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QACrE;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC;AACvD,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ;IAC9B;+GAnCW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE;AACb,iBAAA;;;AC1ID;AACA;AACA;MASa,gBAAgB,CAAA;AAP7B,IAAA,WAAA,GAAA;;QASE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,SAAS,CAAC,8CAAC;;AAG/C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAc,SAAS,gDAAC;AAEpC;;;AAGG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEzB;;;AAGG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,OAAO,uDAAC;AAEpC;;;AAGG;AACH,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,IAAI,0DAAC;AAE5B;;;;AAIG;AACH,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;;AAG7B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;;QAGhD,IAAA,CAAA,WAAW,GAAG,MAAM,EAAc;;AAGlC,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;YAC7B,OAAO;gBACL,cAAc;AACd,gBAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,EAAE,CAAA;aAC7B;AACH,QAAA,CAAC,0DAAC;AAKH,IAAA;AAHC,IAAA,aAAa,CAAC,KAAiB,EAAA;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;+GAhDW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvC7B,opGAgFA,EAAA,MAAA,EAAA,CAAA,qtFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7CY,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,opGAAA,EAAA,MAAA,EAAA,CAAA,qtFAAA,CAAA,EAAA;;;AEVzB;AACA;AACA;MASa,oBAAoB,CAAA;AAPjC,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;QAEjD,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,8CAAC;AAC5C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,EAAE,gDAAC;AAChB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAS,EAAE,2DAAC;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,aAAa,oDAAC;AAC/B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAmB,OAAO,iDAAC;AACxC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAqB,SAAS,mDAAC;AAC9C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;AACpB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;AAC7B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;AACtB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;AACxB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,cAAc,qDAAC;QAEjC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAU;AAEzB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,MAAM,qDAAC;AAE1B,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACxB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,OAAO,EAAE;AACzB,YAAA,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9B,QAAA,CAAC,qDAAC;AAEF,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAW,MAAK;AAC5C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;AACnC,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;YACpB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;AACrD,QAAA,CAAC,+DAAC;AAEF,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,0DAAC;AAEzD,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,qDAAC;AAC9C,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,qDAAC;AAoBpD,IAAA;AAlBC,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,mBAAmB;AACnB,YAAA,CAAA,mBAAA,EAAsB,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AACpC,YAAA,CAAA,mBAAA,EAAsB,IAAI,CAAC,OAAO,EAAE,CAAA;SACrC;IACH;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7B,QAAA,IAAI,SAAS,CAAC,SAAS,EAAE;YACvB,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAK;AACjD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAC3B,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;AACpD,YAAA,CAAC,CAAC;QACJ;IACF;+GArDW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpCjC,qrNAiJA,EAAA,MAAA,EAAA,CAAA,skPAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlHc,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,WACpB,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qrNAAA,EAAA,MAAA,EAAA,CAAA,skPAAA,CAAA,EAAA;;;AE/BnD;;;;;;;;;;;;;;;;;;;AAmBG;MAEU,YAAY,CAAA;AADzB,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAAkB;AA4BnD,IAAA;;IAzBC,QAAQ,CAAC,IAAuB,EAAE,GAAW,EAAA;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;IAC3B;;AAGA,IAAA,WAAW,CAAC,KAA6B,EAAA;AACvC,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;QAC3B;IACF;;AAGA,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;;AAGA,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;;IAGA,KAAK,GAAA;QACH,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B;+GA5BW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA,CAAA;;4FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACLlC;AACA;AACA;MAUa,oBAAoB,CAAA;AARjC,IAAA,WAAA,GAAA;AASmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;;QAGjD,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,aAAa,CAAC,8CAAC;;AAGnD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAoB;;AAG1C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAsB,OAAO,qDAAC;;AAG/C,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAA8B,IAAI,6DAAC;AAE5D;;;;AAIG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;;AAG7B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,YAAY,qDAAC;;QAGvC,IAAA,CAAA,SAAS,GAAG,MAAM,EAAkB;;AAGpC,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;YAChC,OAAO;gBACL,kBAAkB;AAClB,gBAAA,CAAA,kBAAA,EAAqB,IAAI,CAAC,SAAS,EAAE,CAAA;aACtC;AACH,QAAA,CAAC,6DAAC;AAuBH,IAAA;;AApBC,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,OAAO,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC;IAC1C;;AAGA,IAAA,UAAU,CAAC,QAA4B,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AACvC,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,IAAI;IACjE;;AAGA,IAAA,YAAY,CAAC,IAAoB,EAAA;QAC/B,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;IACnD;IAEA,WAAW,CAAC,KAAY,EAAE,IAAoB,EAAA;QAC5C,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;+GAzDW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BjC,utEA8DA,EAAA,MAAA,EAAA,CAAA,mrDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAKX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,aAAA,EAGR,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,utEAAA,EAAA,MAAA,EAAA,CAAA,mrDAAA,CAAA,EAAA;;;AETvC;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;MAQU,gBAAgB,CAAA;AAP7B,IAAA,WAAA,GAAA;;QASE,IAAA,CAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,CAAC,SAAS,CAAC,8CAAC;;AAG/C,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;;AAGzB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,mDAAC;;AAGtB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;;AAGxB,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,KAAK,yDAAC;;AAG5B,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAa,MAAM,sDAAC;;AAGtC,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAC,KAAK,8DAAC;;QAGjC,IAAA,CAAA,oBAAoB,GAAG,MAAM,EAAW;;AAGxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,cAAc,qDAAC;;AAGzC,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,qDAAC;AAExD;;;AAGG;QACH,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MACrB,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACzD;AAED;;;;;AAKG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAoB,MACvC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,GAAG,MAAM,sDACrC;AAKF,IAAA;IAHC,sBAAsB,GAAA;QACpB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5D;+GAnDW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtE7B,qjEA6DA,EAAA,MAAA,EAAA,CAAA,87GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDKY,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,qjEAAA,EAAA,MAAA,EAAA,CAAA,87GAAA,CAAA,EAAA;;;AELzB,MAAM,UAAU,GAAG;IACjB,eAAe;IACf,aAAa;IACb,mBAAmB;IACnB,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,mBAAmB;IACnB,cAAc;IACd,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,mBAAmB;IACnB,yBAAyB;IACzB,0BAA0B;IAC1B,yBAAyB;IACzB,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;IACpB,sBAAsB;IACtB,uBAAuB;IACvB,oBAAoB;IACpB,wBAAwB;IACxB,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,wBAAwB;IACxB,+BAA+B;IAC/B,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;IACb,iBAAiB;IACjB,eAAe;IACf,sBAAsB;IACtB,gBAAgB;IAChB,oBAAoB;IACpB,uBAAuB;IACvB,kBAAkB;IAClB,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,oBAAoB;IACpB,oBAAoB;IACpB;CACD;AAED;;;;;;;;;;;;;;;AAeG;MAKU,oBAAoB,CAAA;+GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAApB,oBAAoB,EAAA,OAAA,EAAA,CAHrB,YAAY,EAnEtB,eAAe;YACf,aAAa;YACb,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB;YACnB,eAAe;YACf,mBAAmB;YACnB,cAAc;YACd,YAAY;YACZ,mBAAmB;YACnB,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YACnB,yBAAyB;YACzB,0BAA0B;YAC1B,yBAAyB;YACzB,gBAAgB;YAChB,qBAAqB;YACrB,oBAAoB;YACpB,sBAAsB;YACtB,uBAAuB;YACvB,oBAAoB;YACpB,wBAAwB;YACxB,gBAAgB;YAChB,gBAAgB;YAChB,oBAAoB;YACpB,sBAAsB;YACtB,wBAAwB;YACxB,+BAA+B;YAC/B,8BAA8B;YAC9B,gBAAgB;YAChB,aAAa;YACb,iBAAiB;YACjB,eAAe;YACf,sBAAsB;YACtB,gBAAgB;YAChB,oBAAoB;YACpB,uBAAuB;YACvB,kBAAkB;YAClB,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,oBAAoB;YACpB,oBAAoB;AACpB,YAAA,gBAAgB,aA/ChB,eAAe;YACf,aAAa;YACb,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB;YACnB,eAAe;YACf,mBAAmB;YACnB,cAAc;YACd,YAAY;YACZ,mBAAmB;YACnB,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YACnB,yBAAyB;YACzB,0BAA0B;YAC1B,yBAAyB;YACzB,gBAAgB;YAChB,qBAAqB;YACrB,oBAAoB;YACpB,sBAAsB;YACtB,uBAAuB;YACvB,oBAAoB;YACpB,wBAAwB;YACxB,gBAAgB;YAChB,gBAAgB;YAChB,oBAAoB;YACpB,sBAAsB;YACtB,wBAAwB;YACxB,+BAA+B;YAC/B,8BAA8B;YAC9B,gBAAgB;YAChB,aAAa;YACb,iBAAiB;YACjB,eAAe;YACf,sBAAsB;YACtB,gBAAgB;YAChB,oBAAoB;YACpB,uBAAuB;YACvB,kBAAkB;YAClB,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,oBAAoB;YACpB,oBAAoB;YACpB,gBAAgB,CAAA,EAAA,CAAA,CAAA;gHAuBL,oBAAoB,EAAA,OAAA,EAAA,CAHrB,YAAY,EAnEtB,eAAe;YAKf,eAAe;YACf,mBAAmB;YACnB,cAAc;YACd,YAAY;YACZ,mBAAmB;YACnB,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YAQnB,uBAAuB;YAUvB,gBAAgB;YAChB,aAAa;YAGb,sBAAsB;YACtB,gBAAgB;YAChB,oBAAoB;YACpB,uBAAuB;YACvB,kBAAkB;YAGlB,gBAAgB;YAChB,oBAAoB;YACpB,oBAAoB;YACpB,gBAAgB,CAAA,EAAA,CAAA,CAAA;;4FAuBL,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC;AACtC,oBAAA,OAAO,EAAE;AACV,iBAAA;;;MCjHY,cAAc,CAAA;AAP3B,IAAA,WAAA,GAAA;AAQE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAY,MAAM,gDAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAe,QAAQ,mDAAC;AACvC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;AACjB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,EAAE,mDAAC;AACnB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,IAAI,uDAAC;AACzB,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAqB,SAAS,yDAAC;AACpD,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,2DAAC;AACtD;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,IAAI,mDAAC;QAErB,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;QAC1B,IAAA,CAAA,kBAAkB,GAAG,MAAM,EAAQ;QACnC,IAAA,CAAA,oBAAoB,GAAG,MAAM,EAAQ;AAmBtC,IAAA;IAjBC,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3D;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,YAAY;AACZ,YAAA,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AAC5B,YAAA,CAAA,YAAA,EAAe,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE;YAC/B,IAAI,CAAC,UAAU,GAAG,yBAAyB,GAAG;SAC/C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B;+GAlCW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,gwCClB3B,+4MAqFA,EAAA,MAAA,EAAA,CAAA,0vOAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDnEa,cAAc,EAAA,UAAA,EAAA,CAAA;kBAP1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,OAAA,EACb,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+4MAAA,EAAA,MAAA,EAAA,CAAA,0vOAAA,CAAA,EAAA;;;MEQpC,oBAAoB,CAAA;AARjC,IAAA,WAAA,GAAA;AASU,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;;AAGxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAuB,GAAG,qDAAC;;AAG5C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAkB,UAAU,gDAAC;AAEzC;;;AAGG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAyB,cAAc,uDAAC;;AAG3D,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,mBAAmB,iDAAC;;AAGlC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,iDAAC;;AAGvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,oDAAC;;AAGtB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;;AAGxB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAyB,SAAS,uDAAC;;AAGtD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,IAAI,0DAAC;;AAG5B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,wBAAwB,uDAAC;;AAG7C,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,kBAAkB,mDAAC;;AAGnC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,IAAI,mDAAC;;AAGrB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,EAAE,mDAAC;;AAGnB,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoB,OAAO,kDAAC;;AAG1C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,gBAAgB,gDAAC;;AAG9B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,kBAAkB,mDAAC;;QAGnC,IAAA,CAAA,UAAU,GAAG,MAAM,EAAQ;QAE3B,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MACrB,IAAI,CAAC,OAAO;cACR,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE;cACrD,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACT;AAgDF,IAAA;AA9CC,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,mBAAmB;AACnB,YAAA,CAAA,6BAAA,EAAgC,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE;AAClD,YAAA,CAAA,wBAAA,EAA2B,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AACxC,YAAA,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,GAAG,2BAA2B,GAAG;AACjE;aACE,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;IACd;;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU;AAAE,YAAA,OAAO,KAAK;AAC5C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;IACzD;;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU;AAAE,YAAA,OAAO,KAAK;AAC5C,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG;IAC7D;;AAGA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ;IACxC;;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;QAC1B,IAAI,CAAC,KAAK,GAAG;AAAE,YAAA,OAAO,qCAAqC;QAC3D,IAAI,CAAC,KAAK,GAAG;AAAE,YAAA,OAAO,qCAAqC;AAC3D,QAAA,OAAO,qCAAqC;IAC9C;;AAGA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,QAAA,OAAO,EAAE,KAAK,OAAO,GAAG,CAAA,oCAAA,EAAuC,EAAE,CAAA,CAAE,GAAG,EAAE;IAC1E;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;+GA5GW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,uoECxBjC,u5eA+PA,EAAA,MAAA,EAAA,CAAA,s/LAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDvOa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,u5eAAA,EAAA,MAAA,EAAA,CAAA,s/LAAA,CAAA,EAAA;;;AE4BjD;AAEA;;;;;;AAMG;MA0BU,wBAAwB,CAAA;AAzBrC,IAAA,WAAA,GAAA;AA0BU,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAExC,QAAA,IAAA,CAAA,KAAK,GAAM,KAAK,CAAC,QAAQ,gDAAU;AACnC,QAAA,IAAA,CAAA,OAAO,GAAI,KAAK,CAAC,EAAE,mDAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;QAEvB,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;AAE1B,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAW,MAC5B,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,oDACvD;AAED,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MACrB;YACE,wBAAwB;YACxB,IAAI,CAAC,QAAQ,EAAE,GAAG,kCAAkC,GAAG,EAAE;AAC1D;aACE,MAAM,CAAC,OAAO;AACd,aAAA,IAAI,CAAC,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACb;AAOF,IAAA;IALC,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACvB;IACF;+GA1BW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArBzB;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4mHAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAIU,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAzBpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EACD;;;;;;;;;;;;;;;;;GAiBT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,4mHAAA,CAAA,EAAA;;AA+BjD;AAEA;;;;;;;;;;;;;;;AAeG;MASU,oBAAoB,CAAA;AARjC,IAAA,WAAA,GAAA;AASE;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAsB,EAAE,mDAAC;AAExC;;;AAGG;AACH,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;AAErB;;;AAGG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAsB,cAAc,oDAAC;AAErD;;;;AAIG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,iDAAC;;AAGpB,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,4DAAC;;;QAK1C,IAAA,CAAA,WAAW,GAAG,MAAM,EAAqB;;QAEzC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;;QAEvB,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;;;QAKvB,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MACxB,IAAI,CAAC,OAAO;aACT,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK;AAC/B,aAAA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,0DACf;AAED,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MACrB;YACE,mBAAmB;YACnB,IAAI,CAAC,KAAK,EAAE,GAAG,CAAA,wBAAA,CAA0B,GAAG,EAAE;AAC9C,YAAA,IAAI,CAAC,KAAK,EAAE,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE,GAAG,EAAE;YAC3D,IAAI,CAAC,MAAM,EAAE,GAAG,yBAAyB,GAAG,EAAE;AAC/C;aACE,MAAM,CAAC,OAAO;AACd,aAAA,IAAI,CAAC,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACb;AAgBF,IAAA;;IAZC,MAAM,GAAA;AACJ,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAChD;AAEA,IAAA,aAAa,CAAC,MAAyB,EAAA;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACpB,YAAA,MAAM,CAAC,OAAO,IAAI;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B;IACF;+GAvEW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3IjC,23CAoCA,EAAA,MAAA,EAAA,CAAA,4mHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDgDa,wBAAwB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAuDxB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,wBAAwB,CAAC,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,23CAAA,EAAA,MAAA,EAAA,CAAA,4mHAAA,CAAA,EAAA;;;AE/GjD;AAEA;;;;;;;;;;;;;;;;;;;;;AAqBG;MAcU,iBAAiB,CAAA;AAb9B,IAAA,WAAA,GAAA;;AAeE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAe,WAAW,gDAAC;AAEvC;;;AAGG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAe,IAAI,gDAAC;AAEhC;;;;;AAKG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAgB,SAAS,iDAAC;AAEvC;;;;AAIG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,CAAC,iDAAC;AAExB;;;AAGG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,iDAAC;AAE5C;;;;AAIG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,oDAAC;;AAGtB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAW,MAAK;AAChD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACvC,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KACxC,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM,CAC9C;AACH,QAAA,CAAC,0DAAC;;AAGO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAC9B;YACE,eAAe;AACf,YAAA,CAAA,eAAA,EAAkB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AAC/B,YAAA,CAAA,oBAAA,EAAuB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AACpC,YAAA,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,CAAA,qBAAA,EAAwB,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE;YACxE,IAAI,CAAC,QAAQ,EAAE,GAAG,yBAAyB,GAAG,EAAE;AACjD;aACE,MAAM,CAAC,OAAO;AACd,aAAA,IAAI,CAAC,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACb;AACF,IAAA;+GA1DY,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,k8BC/D9B,2tDAkDA,EAAA,MAAA,EAAA,CAAA,kiEAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDaa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAb7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cACb,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,mBAAmB,EAAE,mBAAmB;AACxC,wBAAA,kBAAkB,EAAE,MAAM;AAC1B,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,2tDAAA,EAAA,MAAA,EAAA,CAAA,kiEAAA,CAAA,EAAA;;;AEvCH;AAEO,MAAM,kBAAkB,GAAwB;AACrD,IAAA;AACE,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE;AACN,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE;AACvC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE;AACxC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;AAClC,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,MAAM,EAAE;AACN,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;AACtC,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,MAAM,EAAE;AACN,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;AACjC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,EAAE;AAC5C,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE;AACvC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACnC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE;AAC9C,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE;AACzC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACnC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE;AAC9C,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE;AACzC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;AAChC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE;AAC3C,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE;AACtC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;AAClC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE;AAC7C,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE;AACzC,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,MAAM,EAAE;AACN,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE;AACzC,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE;AAC5C,SAAA;AACF,KAAA;;AAGH;AAEA;;;;;;;;;;;;;AAaG;MASU,qBAAqB,CAAA;AARlC,IAAA,WAAA,GAAA;AASE;;;AAGG;AACH,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAsB,kBAAkB,kDAAC;AACxD,IAAA;+GANY,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,qNCnGlC,4wBAqBA,EAAA,MAAA,EAAA,CAAA,60BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FD8Ea,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4wBAAA,EAAA,MAAA,EAAA,CAAA,60BAAA,CAAA,EAAA;;;AEpFjD,MAAM,OAAO,GAAgC;IAC3C,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;CAC5D;MAaY,gBAAgB,CAAA;AAX7B,IAAA,WAAA,GAAA;AAYE,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,+CAAC;AAC1C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,oDAAC;AAC/C,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAS,EAAE,+CAAC;AACvB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAc,IAAI,gDAAC;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAmB,MAAM,qDAAC;AAC3C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAe,MAAM,iDAAC;QAEnC,IAAA,CAAA,WAAW,GAAG,MAAM,EAAc;AAElC,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAA,2BAAA,EAA8B,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,qDAAC;AACvE,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,qDAAC;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,wDAAC;AAC/D,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oDAAC;AAC1D,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,mDAAC;AAM/C,IAAA;AAJC,IAAA,aAAa,CAAC,KAAiB,EAAA;QAC7B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;+GAnBW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5B7B,qvDA+CA,EAAA,MAAA,EAAA,CAAA,wtGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3BY,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAQf,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAX5B,SAAS;+BACE,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,CAAC,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,aAAa;AACzB,qBAAA,EAAA,QAAA,EAAA,qvDAAA,EAAA,MAAA,EAAA,CAAA,wtGAAA,CAAA,EAAA;;;AEVH,MAAM,aAAa,GAAqC;IACtD,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;CAC7B;MAaY,qBAAqB,CAAA;AAXlC,IAAA,WAAA,GAAA;AAYE,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAqB,EAAE,mDAAC;AACvC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAmB,IAAI,gDAAC;AACpC,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAS,CAAC,+CAAC;AAEtB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAA,uCAAA,EAA0C,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,qDAAC;QACnF,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;QAC7D,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC1E,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE,yDAAC;AACrD,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,mDAAC;AACrD,IAAA;+GAVY,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BlC,m2BAwBA,EAAA,MAAA,EAAA,CAAA,8xDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDDY,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAQf,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAXjC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,CAAC,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,aAAa;AACzB,qBAAA,EAAA,QAAA,EAAA,m2BAAA,EAAA,MAAA,EAAA,CAAA,8xDAAA,CAAA,EAAA;;;AEOH;AAEA;AACO,MAAM,eAAe,GAA2B;AACrD,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;AACxB,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;AACxB,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;AACxB,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;AACxB,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;AACxB,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;AACxB,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;AACxB,IAAA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;;AAG1B;AACO,MAAM,gBAAgB,GAA2B;;AAEtD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAS,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,aAAa,EAAI,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAS,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,aAAa,EAAI,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAS,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,aAAa,EAAI,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;;AAE/E,IAAA,EAAE,IAAI,EAAE,IAAI,EAAa,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,WAAW,EAAM,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,IAAI,EAAa,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,WAAW,EAAM,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,IAAI,EAAa,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,WAAW,EAAM,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;;AAE/E,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClF,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClF,IAAA,EAAE,IAAI,EAAE,WAAW,EAAM,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClF,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE;AAChF,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClF,IAAA,EAAE,IAAI,EAAE,WAAW,EAAM,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClF,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClF,IAAA,EAAE,IAAI,EAAE,WAAW,EAAM,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClF,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AAC/E,IAAA,EAAE,IAAI,EAAE,WAAW,EAAM,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;;AAE/E,IAAA,EAAE,IAAI,EAAE,SAAS,EAAQ,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE;AAC5G,IAAA,EAAE,IAAI,EAAE,cAAc,EAAG,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE;;AAG9G;AAEA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MASU,mBAAmB,CAAA;AARhC,IAAA,WAAA,GAAA;;AAUE,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,mBAAmB,oDAAC;AAErC;;;AAGG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAyB,eAAe,wDAAC;AAE7D;;;AAGG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAyB,gBAAgB,wDAAC;;AAG9D,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;;AAGvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,sDAAC;;AAGxB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,EAAE,0DAAC;;AAG1B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,IAAI,uDAAC;;AAGzB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,6CAA6C,2DAAC;AACvE,IAAA;+GA9BY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,grCC5HhC,ojEAiDA,EAAA,MAAA,EAAA,CAAA,kmCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FD2Ea,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ojEAAA,EAAA,MAAA,EAAA,CAAA,kmCAAA,CAAA,EAAA;;;AE9EjD;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;MAIU,mBAAmB,CAAA;AAHhC,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAgB;AACjD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAU;AACtC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;;QAGlC,IAAA,CAAA,eAAe,GAAG,IAAI;;QAEtB,IAAA,CAAA,eAAe,GAAyB,WAAW;AA4GrE,IAAA;AA1GC;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;IAChD;AAEA;;AAEG;AACH,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IAC3C;AAEA;;AAEG;AACH,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AAEA;;;;;AAKG;AACH,IAAA,OAAO,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AAC3E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClE;AAEA;;;;;AAKG;AACH,IAAA,KAAK,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AACzE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAChE;AAEA;;;;;AAKG;AACH,IAAA,OAAO,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AAC3E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClE;AAEA;;;;;AAKG;AACH,IAAA,IAAI,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AACxE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/D;AAEA;;;;AAIG;AACH,IAAA,IAAI,CAAC,MAA0B,EAAA;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;AAEzC,QAAA,MAAM,YAAY,GAAiB;YACjC,EAAE;YACF,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe;AACjD,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;AACvC,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe;YACjD,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,IAAI,IAAI;SACpB;AAED,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC;AAC3C,QAAA,OAAO,EAAE;IACX;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,EAAU,EAAA;AAChB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO,CAAA,aAAA,EAAgB,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;IACnF;+GAnHW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;AChCD;;AAEG;AACH,MAAM,iBAAiB,GAAG,eAAe;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MAIU,YAAY,CAAA;AAKvB,IAAA,WAAA,CAAiC,UAAkB,EAAA;QAF3C,IAAA,CAAA,UAAU,GAA0B,IAAI;AAG9C,QAAA,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC;AAE9C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;AAC3C,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CAAc,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AAE1F,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,wBAAwB,EAAE;YAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C;IACF;AAEA;;AAEG;AACH,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AAEA;;AAEG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK;IAChC;AAEA;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI;IACrC;AAEA;;AAEG;AACH,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,KAAK,MAAM;IACzD;AAEA;;;AAGG;AACH,IAAA,QAAQ,CAAC,IAAe,EAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACzB;IACF;AAEA;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AACvC,QAAA,MAAM,OAAO,GAAc,OAAO,CAAC,aAAa,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO;AAC/E,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IACxB;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzB;AAEA;;;AAGG;AACH,IAAA,kBAAkB,CAAC,SAAyB,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;AACrC,QAAA,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACjD,YAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC;YAC3C;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,qBAAqB,CAAC,aAAuB,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;AACrC,QAAA,aAAa,CAAC,OAAO,CAAC,IAAI,IAAG;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC/C,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;AACvC,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACK,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO;QAChB;QAEA,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACtD,QAAA,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC1D,YAAA,OAAO,MAAmB;QAC5B;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,IAAe,EAAA;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QAC7C,OAAO;YACL,IAAI;YACJ,aAAa;YACb,QAAQ,EAAE,CAAA,WAAA,EAAc,aAAa,CAAA;SACtC;IACH;AAEA;;AAEG;AACK,IAAA,YAAY,CAAC,IAAe,EAAA;AAClC,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE;QACnC;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACK,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO;QAChB;AACA,QAAA,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO;IACrF;AAEA;;AAEG;IACK,wBAAwB,GAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;QAEA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAW;YAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAC/C,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACzB;AACF,QAAA,CAAC;;AAGD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE;YACpC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACtD;IACF;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,MAAmB,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;;QAGrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;;QAG5D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;;QAGnC,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IAC5D;AAEA;;AAEG;AACK,IAAA,YAAY,CAAC,IAAe,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AACA,QAAA,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAC/C;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,IAAY,EAAA;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE;QAC/D,OAAO,CAAA,OAAA,EAAU,SAAS,CAAA,CAAE;IAC9B;AA1NW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,kBAKH,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AALpB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAMc,MAAM;2BAAC,WAAW;;;AC9DjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;MAIU,cAAc,CAAA;AAH3B,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAwB;QAC/C,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAA4B,IAAI,GAAG,EAAE,CAAC;;QAGzE,IAAA,CAAA,SAAS,GAAG,QAAQ;AA6JtC,IAAA;AA3JC;;AAEG;AACH,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;IAC1C;AAEA;;AAEG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAC1E;IACH;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,KAAK,CAAC,CAClD;IACH;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAC9B;IACH;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;AACnC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,KAAK;IACvD;AAEA;;AAEG;IACH,YAAY,GAAA;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC;IAC/E;AAEA;;;;AAIG;AACH,IAAA,KAAK,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAE,OAAgB,EAAA;AACjD,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACzE;AAEA;;;AAGG;AACH,IAAA,IAAI,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACrF;AAEA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,EAAU,EAAE,QAAgB,EAAE,OAAgB,EAAA;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;AACnB,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9C,gBAAA,OAAO,EAAE,OAAO,IAAI,YAAY,CAAC;AAClC,aAAA,CAAC;QACJ;IACF;AAEA;;;;AAIG;IACH,UAAU,CAAC,EAAU,EAAE,OAAe,EAAA;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;QACxD;IACF;AAEA;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACpC;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,EAAU,EAAA;AACf,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,WAAW,CACf,EAAU,EACV,SAA2B,EAC3B,OAAgB,EAAA;AAEhB,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC;AACvB,QAAA,IAAI;YACF,OAAO,MAAM,SAAS,EAAE;QAC1B;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACf;IACF;AAEA;;AAEG;IACK,WAAW,CAAC,EAAU,EAAE,YAA4D,EAAA;AAC1F,QAAA,MAAM,KAAK,GAAiB;YAC1B,EAAE;YACF,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,QAAQ,EAAE,YAAY,CAAC;SACxB;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA;;AAEG;IACK,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtD;+GAjKW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;AClDD;;;AAGG;;ACHH;;;AAGG;AAEH;;;;;;;;AAQG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;AACrC,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,iBAAiB,EAAE,OAAO;AAClC,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG;AACtB,SAAA,WAAW,EAAE;AAClB;AAEA;;;;;;;;AAQG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;AACrC,IAAA,OAAO;SACJ,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;AACrE,SAAA,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;AAClD;AAEA;;;;;;;AAOG;AACG,SAAU,YAAY,CAAC,GAAW,EAAA;AACtC,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC;AAC9B,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD;AAEA;;;;;;;AAOG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;IACrC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC5C;AAEA;;;;;;;AAOG;AACG,SAAU,UAAU,CAAC,GAAW,EAAA;AACpC,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG;AACpB,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD;AAEA;;;;;;;;;;AAUG;AACG,SAAU,QAAQ,CAAC,GAAW,EAAE,SAAiB,EAAE,MAAM,GAAG,KAAK,EAAA;AACrE,IAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS;AAAE,QAAA,OAAO,GAAG;AAC/C,IAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM;AACzD;AAEA;;;;;;;;;AASG;AACG,SAAU,OAAO,CAAC,GAA8B,EAAA;IACpD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;AACxC;AAEA;;;;AAIG;AACG,SAAU,UAAU,CAAC,GAA8B,EAAA;AACvD,IAAA,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;AACtB;AAEA;;;;;;;;AAQG;AACG,SAAU,OAAO,CAAC,GAAW,EAAA;AACjC,IAAA,OAAO;AACJ,SAAA,WAAW;SACX,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAC/B,SAAA,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;AAC5B,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AACvB,SAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,SAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B;AAEA;;;;;;;AAOG;AACG,SAAU,UAAU,CAAC,GAAW,EAAA;AACpC,IAAA,MAAM,WAAW,GAA2B;AAC1C,QAAA,GAAG,EAAE,OAAO;AACZ,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,GAAG,EAAE;KACN;AACD,IAAA,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3D;AAEA;;;;;;;AAOG;AACG,SAAU,SAAS,CAAC,GAAW,EAAA;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;AACpC;AAEA;;;;;;;;;AASG;SACa,WAAW,CAAC,IAAY,EAAE,SAAS,GAAG,CAAC,EAAA;AACrD,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;AAEpB,IAAA,OAAO;SACJ,KAAK,CAAC,KAAK;SACX,MAAM,CAAC,OAAO;AACd,SAAA,KAAK,CAAC,CAAC,EAAE,SAAS;AAClB,SAAA,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;SACxC,IAAI,CAAC,EAAE,CAAC;AACb;AAEA;;;;;;;;;;;AAWG;SACa,SAAS,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAe,EAAA;AACxE,IAAA,OAAO,KAAK,KAAK,CAAC,GAAG,QAAQ,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAA,CAAA,CAAG,CAAC;AAC5D;AAEA;;;;;;;;;;AAUG;SACa,WAAW,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAe,EAAA;AAC1E,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA,CAAE;AACzD;;ACtNA;;;;AAIG;AAsFH;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAQvC,EAAA;IACC,MAAM,KAAK,GAAmB,EAAE;AAEhC,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK;IACrC;AACA,IAAA,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;AACjC,QAAA,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,OAAO;IACzC;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE;AAClC,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ;IAC3C;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ;IAC3C;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ;IAC3C;AACA,IAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AACvB,QAAA,KAAK,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,WAAW;IACjD;AAEA,IAAA,OAAO,KAAK;AACd;AAEA;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAIvC,EAAA;IACC,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;QACd,iBAAiB,EAAE,OAAO,CAAC,UAAU;QACrC,kBAAkB,EAAE,OAAO,CAAC,WAAW;QACvC,YAAY,EAAE,OAAO,CAAC;KACL;AACrB;AAEA;;;;AAIG;AACG,SAAU,sBAAsB,CAAC,OAUtC,EAAA;IACC,MAAM,KAAK,GAAmB,EAAE;AAEhC,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK;IACrC;AACA,IAAA,IAAI,OAAO,CAAC,UAAU,EAAE;AACtB,QAAA,KAAK,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,UAAU;IAC/C;;IAGA,MAAM,gBAAgB,GAAa,EAAE;AACrC,IAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AACvB,QAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5C;IACA,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE;AACtC,QAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACxC;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzC;AACA,IAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,KAAK,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACxD;AAEA,IAAA,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;AACjC,QAAA,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,OAAO;IACzC;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AAEA,IAAA,OAAO,KAAK;AACd;AAEA;;;;AAIG;AACG,SAAU,yBAAyB,CAAC,OAMzC,EAAA;IACC,OAAO;AACL,QAAA,IAAI,EAAE,aAAa;QACnB,eAAe,EAAE,OAAO,CAAC,KAAK;AAC9B,QAAA,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AACjC,QAAA,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG;QACnC,YAAY,EAAE,OAAO,CAAC,KAAK;QAC3B,gBAAgB,EAAE,OAAO,CAAC,SAAS,IAAI,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA,CAAA;KACxD;AACH;AAEA;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,OAKpC,EAAA;IACC,OAAO;AACL,QAAA,GAAG,EAAE;AACH,YAAA,IAAI,EAAE,KAAK;YACX,eAAe,EAAE,OAAO,CAAC,QAAQ;YACjC,eAAe,EAAE,OAAO,CAAC,OAAO;YAChC,eAAe,EAAE,OAAO,CAAC,QAAQ;AACjC,YAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC;AACnC,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,UAAU;YAChB,iBAAiB,EAAE,OAAO,CAAC,KAAK;AAChC,YAAA,aAAa,EAAE,CAAC,OAAO,CAAC,QAAQ;AAChC,YAAA,QAAQ,EAAE;AACX;KACF;AACH;AAEA;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAKvC,EAAA;IACC,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;QACd,eAAe,EAAE,OAAO,CAAC,QAAQ;QACjC,eAAe,EAAE,OAAO,CAAC,QAAQ;QACjC,cAAc,EAAE,OAAO,CAAC,OAAO;QAC/B,eAAe,EAAE,OAAO,CAAC;KAC1B;AACH;AAEA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,QAAiB,EAAA;IAMjD,MAAM,IAAI,GAAG,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC;IAClD,OAAO;AACL,QAAA,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ;QACxB,OAAO,EAAE,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ;QACxB,QAAQ,EAAE,CAAA,EAAG,IAAI,CAAA,OAAA;KAClB;AACH;AAEA;;;AAGG;SACa,uBAAuB,GAAA;IACrC,OAAO;AACL,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,OAAO,EAAE,GAAG;AACZ,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,UAAU,EAAE,QAAQ;AACpB,QAAA,MAAM,EAAE;KACT;AACH;AAEA;;;AAGG;SACa,oBAAoB,GAAA;IAClC,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,OAAO,KAAK;IAC/C,OAAO,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO;AACtE;AAEA;;;AAGG;SACa,mBAAmB,GAAA;IACjC,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,OAAO,KAAK;IAC/C,OAAO,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,OAAO;AAC9D;AAEA;;;;AAIG;SACa,sBAAsB,CACpC,OAAe,EACf,aAAqC,QAAQ,EAAA;IAE7C,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE;IAErC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAClD,IAAA,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC3C,IAAA,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC;AAClD,IAAA,YAAY,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;AAE5D,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;;IAGvC,UAAU,CAAC,MAAK;AACd,QAAA,YAAY,CAAC,WAAW,GAAG,OAAO;IACpC,CAAC,EAAE,GAAG,CAAC;;IAGP,UAAU,CAAC,MAAK;AACd,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;IACzC,CAAC,EAAE,IAAI,CAAC;AACV;AAEA;;;;;AAKG;SACa,cAAc,CAC5B,QAAiB,EACjB,OAAuD,MAAM,EAAA;IAE7D,OAAO,QAAQ,GAAG,IAAI,GAAG,SAAS;AACpC;;ACpXA;;;;AAIG;AAwEH;;;;;;;;;;;;;AAaG;SACa,WAAW,CAAC,OAAe,EAAE,UAAwB,EAAE,EAAA;IACrE,OAAO;AACL,QAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;QAClC,OAAO;AACP,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO;AACrC,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS;QACvC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,cAAc,EAAE,OAAO,CAAC,cAAc;AACtC,QAAA,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI;KACrC;AACH;AAEA;;;;;;;;;AASG;AACG,SAAU,qBAAqB,CACnC,KAAa,EACb,IAAY,EACZ,OAAe,EACf,OAAiD,EAAA;IAEjD,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO;QACP,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,MAAM,EAAE,OAAO,EAAE;KAClB;AACH;AAEA;;;;;;;;;;;;;AAaG;SACa,SAAS,CAAC,KAAc,EAAE,UAAwB,EAAE,EAAA;AAClE,IAAA,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,OAAO,GAAG,2BAA2B;AACzC,IAAA,IAAI,aAAgC;AAEpC,IAAA,IAAI,KAAK,YAAY,KAAK,EAAE;AAC1B,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO;QACvB,aAAa,GAAG,KAAK;IACvB;AAAO,SAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACpC,OAAO,GAAG,KAAK;IACjB;SAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE;AACnE,QAAA,OAAO,GAAG,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC;IAC3D;IAEA,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,GAAG,OAAO;QACV;AACD,KAAA,CAAC;AACJ;AAEA;;;;AAIG;AACG,SAAU,WAAW,CAAC,KAAc,EAAA;IACxC,QACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,MAAM,IAAI,KAAK;AACf,QAAA,SAAS,IAAI,KAAK;AAClB,QAAA,UAAU,IAAI,KAAK;AACnB,QAAA,UAAU,IAAI,KAAK;QACnB,WAAW,IAAI,KAAK;AAExB;AAEA;;;;AAIG;AACG,SAAU,kBAAkB,CAAC,KAAgB,EAAA;IACjD,OAAO,KAAK,CAAC,WAAW;AAC1B;AAEA;;;;;AAKG;SACa,kBAAkB,CAAC,KAAgB,EAAE,WAAW,GAAG,KAAK,EAAA;IACtE,IAAI,WAAW,EAAE;QACf,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAA,CAAE;IAC3C;IACA,OAAO,KAAK,CAAC,OAAO;AACtB;AAEA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,KAAgB,EAAA;AAChD,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,CAAA,CAAA,EAAI,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG;AACpC,QAAA,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG;QACnC,CAAA,CAAA,EAAI,KAAK,CAAC,IAAI,CAAA,CAAA,CAAG;AACjB,QAAA,KAAK,CAAC;KACP;AAED,IAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,QAAA,KAAK,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC;IACzD;AAEA,IAAA,IAAI,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,KAAK,CAAC,aAAa,CAAC,KAAK,CAAA,CAAE,CAAC;IACnD;AAEA,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB;AAEA;;;;;;AAMG;SACa,kBAAkB,CAChC,OAAe,EACf,UAAmB,EACnB,aAAqB,EAAA;IAErB,OAAO,WAAW,CAAC,OAAO,EAAE;QAC1B,IAAI,EAAE,UAAU,GAAG,CAAA,QAAA,EAAW,UAAU,CAAA,CAAE,GAAG,eAAe;AAC5D,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,UAAU,GAAG,EAAE,UAAU,EAAE,GAAG,SAAS;AAChD,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,cAAc,EAAE,4CAA4C;QAC5D;AACD,KAAA,CAAC;AACJ;AAEA;;;;;AAKG;AACG,SAAU,eAAe,CAAC,OAAe,EAAE,aAAqB,EAAA;IACpE,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,QAAQ,EAAE,gBAAgB;AAC1B,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,cAAc,EAAE,sBAAsB;QACtC;AACD,KAAA,CAAC;AACJ;AAEA;;;;;AAKG;AACG,SAAU,wBAAwB,CAAC,OAAe,EAAE,QAAiB,EAAA;IACzE,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,SAAS;AAC5C,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,cAAc,EAAE;AACjB,KAAA,CAAC;AACJ;AAEA;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,OAAe,EAAE,SAAkB,EAAA;IACnE,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,SAAS;AAC9C,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,cAAc,EAAE;AACjB,KAAA,CAAC;AACJ;AAOA;;AAEG;AACH,MAAM,aAAa,GAAuC,IAAI,GAAG,EAAE;AAEnE;;;;;AAKG;AACG,SAAU,oBAAoB,CAAC,QAAuB,EAAE,OAAqB,EAAA;IACjF,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClD,IAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AACtB,IAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAErC,IAAA,OAAO,MAAK;QACV,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnD,IAAI,eAAe,EAAE;YACnB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;AAC9C,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;AACd,gBAAA,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAClC;QACF;AACF,IAAA,CAAC;AACH;AAEA;;;AAGG;AACG,SAAU,WAAW,CAAC,KAAgB,EAAA;AAC1C,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;IACxD,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;IAEzD,CAAC,GAAG,QAAQ,EAAE,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,OAAO,IAAG;AACjD,QAAA,IAAI;YACF,OAAO,CAAC,KAAK,CAAC;QAChB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAC7C;AACF,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;AAKG;AACI,eAAe,QAAQ,CAC5B,SAA2B,EAC3B,YAA2B,EAAA;AAE3B,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE;AAChC,QAAA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;IACvB;IAAE,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3C;AACF;AAEA;;;;;AAKG;AACG,SAAU,OAAO,CACrB,SAAkB,EAClB,YAA2B,EAAA;AAE3B,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,SAAS,EAAE;AAC1B,QAAA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;IACvB;IAAE,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3C;AACF;;AC/VA;AAEA;AACA,MAAM,aAAa,GAA6B;AAC9C,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,KAAK,EAAE,EAAE;CACV;AAED;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;MAYU,aAAa,CAAA;AAX1B,IAAA,WAAA,GAAA;AAYmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;;AAIhD;;;AAGG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAwC,SAAS,gDAAC;AAE9D;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,EAAE,mDAAC;AAEnB;;;AAGG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAW,IAAI,gDAAC;AAE5B;;;;;AAKG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAY,SAAS,iDAAC;AAEnC;;;;;AAKG;AACH,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAY,OAAO,iDAAC;AAEjC;;;;AAIG;AACH,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,qDAAC;;AAIhD,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MACrB;YACE,WAAW;AACX,YAAA,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AAC3B,YAAA,CAAA,WAAA,EAAc,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AAC5B,YAAA,CAAA,WAAA,EAAc,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AAC7B,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC,uDACZ;;AAGD,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,qDAAC;;AAGtD,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;YAC5B,IAAI,QAAQ,EAAE;gBACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC1C;AACA,YAAA,OAAO,IAAI,CAAC,OAAO,EAAE;AACvB,QAAA,CAAC,uDAAC;AAEF,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAW,MAC5B,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,oDAC3D;AACF,IAAA;+GAzEY,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,6yBCvF1B,2kBAuBA,EAAA,MAAA,EAAA,CAAA,2qCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FDgEa,aAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAGhC,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,2kBAAA,EAAA,MAAA,EAAA,CAAA,2qCAAA,CAAA,EAAA;;;AErFvC;;;;;AAKG;AAEH;AACA;AACA;;ACTA;;AAEG;;;;"}