@nice2dev/ui-core 1.0.10

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 (107) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +62 -0
  3. package/dist/core/NiceInlineHelp.d.ts +69 -0
  4. package/dist/core/NiceInlineHelp.d.ts.map +1 -0
  5. package/dist/core/NiceThemeProvider.d.ts +31 -0
  6. package/dist/core/NiceThemeProvider.d.ts.map +1 -0
  7. package/dist/core/NiceThemeVariants.d.ts +55 -0
  8. package/dist/core/NiceThemeVariants.d.ts.map +1 -0
  9. package/dist/core/NiceUserPreferences.d.ts +304 -0
  10. package/dist/core/NiceUserPreferences.d.ts.map +1 -0
  11. package/dist/core/a11y-advanced.d.ts +157 -0
  12. package/dist/core/a11y-advanced.d.ts.map +1 -0
  13. package/dist/core/a11y.d.ts +299 -0
  14. package/dist/core/a11y.d.ts.map +1 -0
  15. package/dist/core/access-control.d.ts +59 -0
  16. package/dist/core/access-control.d.ts.map +1 -0
  17. package/dist/core/adapters.d.ts +178 -0
  18. package/dist/core/adapters.d.ts.map +1 -0
  19. package/dist/core/ai.d.ts +191 -0
  20. package/dist/core/ai.d.ts.map +1 -0
  21. package/dist/core/animations.d.ts +48 -0
  22. package/dist/core/animations.d.ts.map +1 -0
  23. package/dist/core/colorBlind.d.ts +22 -0
  24. package/dist/core/colorBlind.d.ts.map +1 -0
  25. package/dist/core/datasource-advanced.d.ts +261 -0
  26. package/dist/core/datasource-advanced.d.ts.map +1 -0
  27. package/dist/core/datasource-aggregation.d.ts +221 -0
  28. package/dist/core/datasource-aggregation.d.ts.map +1 -0
  29. package/dist/core/datasource-hooks.d.ts +93 -0
  30. package/dist/core/datasource-hooks.d.ts.map +1 -0
  31. package/dist/core/datasource-offline.d.ts +201 -0
  32. package/dist/core/datasource-offline.d.ts.map +1 -0
  33. package/dist/core/datasource.d.ts +181 -0
  34. package/dist/core/datasource.d.ts.map +1 -0
  35. package/dist/core/displayMode.d.ts +46 -0
  36. package/dist/core/displayMode.d.ts.map +1 -0
  37. package/dist/core/displayStyle.d.ts +79 -0
  38. package/dist/core/displayStyle.d.ts.map +1 -0
  39. package/dist/core/helpContext.d.ts +97 -0
  40. package/dist/core/helpContext.d.ts.map +1 -0
  41. package/dist/core/hooks.d.ts +149 -0
  42. package/dist/core/hooks.d.ts.map +1 -0
  43. package/dist/core/i18n.d.ts +10 -0
  44. package/dist/core/i18n.d.ts.map +1 -0
  45. package/dist/core/i18nDictionaries.d.ts +4 -0
  46. package/dist/core/i18nDictionaries.d.ts.map +1 -0
  47. package/dist/core/icons.d.ts +45 -0
  48. package/dist/core/icons.d.ts.map +1 -0
  49. package/dist/core/icuMessageFormat.d.ts +10 -0
  50. package/dist/core/icuMessageFormat.d.ts.map +1 -0
  51. package/dist/core/leak-detector.d.ts +263 -0
  52. package/dist/core/leak-detector.d.ts.map +1 -0
  53. package/dist/core/omniverkTypes.d.ts +164 -0
  54. package/dist/core/omniverkTypes.d.ts.map +1 -0
  55. package/dist/core/pluginSystem.d.ts +97 -0
  56. package/dist/core/pluginSystem.d.ts.map +1 -0
  57. package/dist/core/profiling.d.ts +276 -0
  58. package/dist/core/profiling.d.ts.map +1 -0
  59. package/dist/core/responsive.d.ts +107 -0
  60. package/dist/core/responsive.d.ts.map +1 -0
  61. package/dist/core/rtl.d.ts +47 -0
  62. package/dist/core/rtl.d.ts.map +1 -0
  63. package/dist/core/sanitizeHtml.d.ts +16 -0
  64. package/dist/core/sanitizeHtml.d.ts.map +1 -0
  65. package/dist/core/testing.d.ts +107 -0
  66. package/dist/core/testing.d.ts.map +1 -0
  67. package/dist/core/theme.d.ts +213 -0
  68. package/dist/core/theme.d.ts.map +1 -0
  69. package/dist/core/themeGallery.d.ts +104 -0
  70. package/dist/core/themeGallery.d.ts.map +1 -0
  71. package/dist/core/themePacks.d.ts +53 -0
  72. package/dist/core/themePacks.d.ts.map +1 -0
  73. package/dist/core/themePacksExtended.d.ts +59 -0
  74. package/dist/core/themePacksExtended.d.ts.map +1 -0
  75. package/dist/core/themePresets.d.ts +10 -0
  76. package/dist/core/themePresets.d.ts.map +1 -0
  77. package/dist/core/themeVariants.d.ts +204 -0
  78. package/dist/core/themeVariants.d.ts.map +1 -0
  79. package/dist/core/touch.d.ts +208 -0
  80. package/dist/core/touch.d.ts.map +1 -0
  81. package/dist/core/traceless.d.ts +461 -0
  82. package/dist/core/traceless.d.ts.map +1 -0
  83. package/dist/core/types.d.ts +105 -0
  84. package/dist/core/types.d.ts.map +1 -0
  85. package/dist/core/useThemeIsDark.d.ts +15 -0
  86. package/dist/core/useThemeIsDark.d.ts.map +1 -0
  87. package/dist/index.cjs +128 -0
  88. package/dist/index.cjs.map +1 -0
  89. package/dist/index.d.ts +49 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.mjs +16881 -0
  92. package/dist/index.mjs.map +1 -0
  93. package/dist/performance/concurrent.d.ts +190 -0
  94. package/dist/performance/concurrent.d.ts.map +1 -0
  95. package/dist/performance/images.d.ts +189 -0
  96. package/dist/performance/images.d.ts.map +1 -0
  97. package/dist/performance/index.d.ts +17 -0
  98. package/dist/performance/index.d.ts.map +1 -0
  99. package/dist/performance/memory.d.ts +223 -0
  100. package/dist/performance/memory.d.ts.map +1 -0
  101. package/dist/performance/virtualization.d.ts +166 -0
  102. package/dist/performance/virtualization.d.ts.map +1 -0
  103. package/dist/performance/workers.d.ts +125 -0
  104. package/dist/performance/workers.d.ts.map +1 -0
  105. package/dist/viewSchema.d.ts +81 -0
  106. package/dist/viewSchema.d.ts.map +1 -0
  107. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/core/types.ts","../src/core/themeVariants.ts","../src/core/displayStyle.ts","../src/core/displayMode.tsx","../src/core/sanitizeHtml.ts","../src/core/icons.tsx","../src/core/hooks.ts","../src/core/responsive.ts","../src/core/animations.ts","../src/core/rtl.tsx","../src/core/access-control.tsx","../src/core/touch.tsx","../src/core/a11y.tsx","../src/core/a11y-advanced.ts","../src/core/colorBlind.ts","../src/core/pluginSystem.ts","../src/core/testing.ts","../src/core/profiling.tsx","../src/core/leak-detector.tsx","../src/core/adapters.ts","../src/core/helpContext.tsx","../src/core/NiceInlineHelp.tsx","../src/core/NiceUserPreferences.tsx","../src/core/traceless.ts","../src/core/ai.tsx","../src/core/datasource.ts","../src/core/datasource-advanced.ts","../src/core/datasource-aggregation.ts","../src/core/datasource-hooks.ts","../src/core/datasource-offline.ts","../src/core/theme.ts","../src/core/themeGallery.ts","../src/core/themePresets.ts","../src/core/themePacks.ts","../src/core/themePacksExtended.ts","../src/core/NiceThemeProvider.tsx","../src/core/NiceThemeVariants.tsx","../src/core/useThemeIsDark.ts","../src/viewSchema.ts","../src/performance/virtualization.ts","../src/performance/concurrent.ts","../src/performance/workers.ts","../src/performance/memory.ts","../src/performance/images.ts"],"sourcesContent":["// ============================================================\r\n// Nice2Dev UI — Shared Types\r\n// ============================================================\r\n\r\n/** T-shirt sizing used across all components for consistent visual density. */\r\nexport type NiceSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n\r\n/** @deprecated Legacy size names — use NiceSize values instead. */\r\nexport type NiceSizeLegacy = 'small' | 'medium' | 'large';\r\n\r\n/** Maps deprecated legacy size names to their NiceSize equivalents. */\r\nconst LEGACY_SIZE_MAP: Record<string, NiceSize> = {\r\n small: 'sm',\r\n medium: 'md',\r\n large: 'lg',\r\n};\r\n\r\nconst _warnedSizes = new Set<string>();\r\n\r\n/**\r\n * Normalizes a size value, converting deprecated legacy names to NiceSize.\r\n * Emits a one-time console warning per legacy value in development mode.\r\n */\r\nexport function normalizeSize(size: string | undefined, componentName?: string): NiceSize {\r\n if (!size) {\r\n return 'md';\r\n }\r\n const mapped = LEGACY_SIZE_MAP[size];\r\n if (mapped) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n const key = `${componentName ?? ''}:${size}`;\r\n if (!_warnedSizes.has(key)) {\r\n _warnedSizes.add(key);\r\n console.warn(\r\n `[Nice2Dev] Deprecated size \"${size}\"${componentName ? ` in <${componentName}>` : ''}. ` +\r\n `Use \"${mapped}\" instead. Legacy size names will be removed in v2.0.`,\r\n );\r\n }\r\n }\r\n return mapped;\r\n }\r\n return size as NiceSize;\r\n}\r\n\r\n/**\r\n * Layout sizing for editors, viewers and players.\r\n * - `'minimal'` — smallest usable chrome, toolbar hidden or icon-only\r\n * - `'compact'` — reduced padding, single-row toolbar\r\n * - `'standard'` — default layout with full toolbar\r\n * - `'fullscreen'` — expands to fill the viewport\r\n */\r\nexport type NiceEditorSize = 'minimal' | 'compact' | 'standard' | 'fullscreen';\r\n\r\n/** Visual style variant for buttons, alerts, badges and other themed controls. */\r\nexport type NiceVariant =\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'warning'\r\n | 'error'\r\n | 'info'\r\n | 'ghost'\r\n | 'outline';\r\n\r\n/** Whitespace / padding density preset. */\r\nexport type NiceDensity = 'compact' | 'normal' | 'comfortable';\r\n\r\n/**\r\n * Per-component visibility & interaction level used by the access control system.\r\n * - `'full'` — fully interactive (default)\r\n * - `'readOnly'` — renders but cannot be edited\r\n * - `'disabled'` — renders greyed-out\r\n * - `'hidden'` — not rendered at all\r\n */\r\nexport type NiceAccessMode = 'full' | 'readOnly' | 'disabled' | 'hidden';\r\n\r\n/** Base props inherited by every NiceToDev component. */\r\nexport interface NiceBaseProps {\r\n /** Additional CSS class name(s). */\r\n className?: string;\r\n /** Inline style object. */\r\n style?: React.CSSProperties;\r\n /** HTML `id` attribute. When omitted a stable auto-generated id is used. */\r\n id?: string;\r\n /** Tooltip text shown on hover. */\r\n title?: string;\r\n /** Test identifier for integration / e2e test selectors. */\r\n 'data-testid'?: string;\r\n /** Controls component visibility and interaction — see {@link NiceAccessMode}. */\r\n accessMode?: NiceAccessMode;\r\n /**\r\n * Visual presentation style override.\r\n * When set, overrides the global `displayStyle` from `NiceThemeProvider`.\r\n * @see NiceDisplayStyle\r\n */\r\n displayStyle?: import('../core/displayStyle').NiceDisplayStyle;\r\n}\r\n\r\n/** Extended base props for form-field components (inputs, selects, etc.). */\r\nexport interface NiceFormFieldProps extends NiceBaseProps {\r\n /** Field label displayed above or beside the control. */\r\n label?: string;\r\n /** Assistive text shown below the field. */\r\n helperText?: string;\r\n /** Validation error message — when set the field is styled as invalid. */\r\n error?: string;\r\n /** Marks the field as required (adds visual indicator). */\r\n required?: boolean;\r\n /** Disables the field. */\r\n disabled?: boolean;\r\n /** Makes the field read-only. */\r\n readOnly?: boolean;\r\n /** Visual size of the field. */\r\n size?: NiceSize;\r\n /** HTML `name` attribute used in form serialization. */\r\n name?: string;\r\n /** When true, pressing Enter will trigger the onSubmit callback (if provided). */\r\n submitOnEnter?: boolean;\r\n /** Callback triggered when Enter is pressed (if submitOnEnter is true). */\r\n onSubmit?: () => void;\r\n /** Show a keyboard shortcuts hint icon (?) next to the label. */\r\n showKeyboardHints?: boolean;\r\n /** Label position: 'top' (default, stacked) or 'left' (inline beside the control). */\r\n labelPlacement?: 'top' | 'left';\r\n /** Error/validation position: 'bottom' (default) or 'right' (inline beside the control). */\r\n errorPlacement?: 'bottom' | 'right';\r\n /** Shows a loading spinner inside the control and disables interaction. */\r\n loading?: boolean;\r\n /** Explicit width for the label (e.g. '120px', '30%'). Only applies when labelPlacement is 'left'. */\r\n labelWidth?: string | number;\r\n /** Explicit width for the control (e.g. '200px', '50%'). Defaults to 100% in column layout. */\r\n controlWidth?: string | number;\r\n /** When `true`, the control renders as a clickable label-style display of the current value\r\n * (no input border/chrome). Click switches it into the regular editable control. Useful for\r\n * inline-editable cells or \"click-to-edit\" patterns — replaces the standalone NiceInPlaceEditor. */\r\n displayMode?: boolean;\r\n}\r\n\r\n/** A single option displayed in selects, radio-groups, autocompletes and similar list-based editors. */\r\nexport type NiceOption<T = string> = {\r\n /** The option's backing value. */\r\n value: T;\r\n /** Display text shown to the user. */\r\n label: string;\r\n /** When `true` the option cannot be selected. */\r\n disabled?: boolean;\r\n /** Optional icon rendered before the label. */\r\n icon?: React.ReactNode;\r\n /** Secondary description text. */\r\n description?: string;\r\n /** Grouping key for grouped dropdowns. */\r\n group?: string;\r\n};\r\n","/**\r\n * @file themeVariants.ts\r\n * @description Extended theme variants - radius, shadows, fills, gradients, effects\r\n *\r\n * Allows fine-grained customization of theme appearance\r\n *\r\n * @version 1.0.0\r\n * @since 2026-03\r\n * @license MIT\r\n */\r\n\r\nimport type { NiceTheme } from './theme';\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 1. VARIANT TYPES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Border radius variants\r\n */\r\nexport type RadiusVariant = 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';\r\n\r\n/**\r\n * Shadow variants\r\n */\r\nexport type ShadowVariant = 'none' | 'subtle' | 'md' | 'lg' | 'xl' | 'inner' | 'colored' | 'glow';\r\n\r\n/**\r\n * Fill style variants\r\n */\r\nexport type FillVariant =\r\n | 'solid'\r\n | 'gradient-linear'\r\n | 'gradient-radial'\r\n | 'gradient-conic'\r\n | 'glass'\r\n | 'frosted'\r\n | 'pattern'\r\n | 'texture'\r\n | 'mesh';\r\n\r\n/**\r\n * Button style variants\r\n */\r\nexport type ButtonStyleVariant =\r\n | 'flat'\r\n | 'raised'\r\n | 'outlined'\r\n | 'ghost'\r\n | 'soft'\r\n | 'gradient'\r\n | '3d'\r\n | 'neumorphic'\r\n | 'pill'\r\n | 'link'\r\n | 'brutal';\r\n\r\n/**\r\n * Input style variants\r\n */\r\nexport type InputStyleVariant =\r\n | 'bordered'\r\n | 'filled'\r\n | 'underlined'\r\n | 'floating'\r\n | 'soft'\r\n | 'neumorphic'\r\n | 'pill'\r\n | 'flush';\r\n\r\n/**\r\n * Card style variants\r\n */\r\nexport type CardStyleVariant =\r\n | 'flat'\r\n | 'elevated'\r\n | 'bordered'\r\n | 'glass'\r\n | 'gradient'\r\n | 'neumorphic'\r\n | 'outlined'\r\n | 'paper';\r\n\r\n/**\r\n * Badge / tag style variants\r\n */\r\nexport type BadgeStyleVariant = 'solid' | 'soft' | 'outlined' | 'dot' | 'pill' | 'gradient';\r\n\r\n/**\r\n * Tab style variants\r\n */\r\nexport type TabStyleVariant = 'underline' | 'pills' | 'enclosed' | 'soft' | 'lifted' | 'bordered';\r\n\r\n/**\r\n * Toggle / switch style variants\r\n */\r\nexport type ToggleStyleVariant = 'default' | 'ios' | 'flat' | 'pill' | 'square';\r\n\r\n/**\r\n * Tooltip style variants\r\n */\r\nexport type TooltipStyleVariant = 'dark' | 'light' | 'primary' | 'glass' | 'bordered';\r\n\r\n/**\r\n * Modal / dialog style variants\r\n */\r\nexport type ModalStyleVariant =\r\n | 'default'\r\n | 'centered'\r\n | 'fullscreen'\r\n | 'sheet'\r\n | 'glass'\r\n | 'drawer';\r\n\r\n/**\r\n * Table style variants\r\n */\r\nexport type TableStyleVariant =\r\n | 'default'\r\n | 'striped'\r\n | 'bordered'\r\n | 'compact'\r\n | 'hoverable'\r\n | 'minimal';\r\n\r\n/**\r\n * Menu / dropdown style variants\r\n */\r\nexport type MenuStyleVariant = 'default' | 'compact' | 'glass' | 'bordered' | 'floating';\r\n\r\n/**\r\n * Animation intensity\r\n */\r\nexport type AnimationIntensity = 'none' | 'subtle' | 'normal' | 'playful' | 'dramatic';\r\n\r\n/**\r\n * Density variants\r\n */\r\nexport type DensityVariant = 'compact' | 'normal' | 'comfortable' | 'spacious';\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 2. VARIANT VALUES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Border radius values for each variant\r\n */\r\nexport const RADIUS_VALUES: Record<RadiusVariant, Record<string, string>> = {\r\n none: {\r\n xs: '0',\r\n sm: '0',\r\n md: '0',\r\n lg: '0',\r\n xl: '0',\r\n full: '0',\r\n },\r\n sm: {\r\n xs: '2px',\r\n sm: '3px',\r\n md: '4px',\r\n lg: '6px',\r\n xl: '8px',\r\n full: '9999px',\r\n },\r\n md: {\r\n xs: '4px',\r\n sm: '6px',\r\n md: '8px',\r\n lg: '12px',\r\n xl: '16px',\r\n full: '9999px',\r\n },\r\n lg: {\r\n xs: '6px',\r\n sm: '10px',\r\n md: '14px',\r\n lg: '20px',\r\n xl: '28px',\r\n full: '9999px',\r\n },\r\n xl: {\r\n xs: '10px',\r\n sm: '16px',\r\n md: '24px',\r\n lg: '32px',\r\n xl: '48px',\r\n full: '9999px',\r\n },\r\n '2xl': {\r\n xs: '16px',\r\n sm: '24px',\r\n md: '32px',\r\n lg: '48px',\r\n xl: '64px',\r\n full: '9999px',\r\n },\r\n full: {\r\n xs: '9999px',\r\n sm: '9999px',\r\n md: '9999px',\r\n lg: '9999px',\r\n xl: '9999px',\r\n full: '9999px',\r\n },\r\n};\r\n\r\n/**\r\n * Shadow values for each variant\r\n */\r\nexport const SHADOW_VALUES: Record<ShadowVariant, string> = {\r\n none: 'none',\r\n subtle: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',\r\n xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\r\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.05)',\r\n colored: '0 4px 14px 0 var(--ntd-color-primary-alpha, rgba(99, 102, 241, 0.4))',\r\n glow: '0 0 20px var(--ntd-color-primary-alpha, rgba(99, 102, 241, 0.5))',\r\n};\r\n\r\n/**\r\n * Shadow intensity multipliers for dark mode\r\n */\r\nexport const SHADOW_DARK_MODE_VALUES: Record<ShadowVariant, string> = {\r\n none: 'none',\r\n subtle: '0 1px 2px 0 rgba(0, 0, 0, 0.2)',\r\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.2)',\r\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -4px rgba(0, 0, 0, 0.3)',\r\n xl: '0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4)',\r\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.3)',\r\n colored: '0 4px 14px 0 var(--ntd-color-primary-alpha, rgba(99, 102, 241, 0.5))',\r\n glow: '0 0 30px var(--ntd-color-primary-alpha, rgba(99, 102, 241, 0.6))',\r\n};\r\n\r\n/**\r\n * Density spacing values\r\n */\r\nexport const DENSITY_VALUES: Record<DensityVariant, Record<string, string>> = {\r\n compact: {\r\n paddingX: '8px',\r\n paddingY: '4px',\r\n gap: '4px',\r\n fontSize: '13px',\r\n lineHeight: '1.3',\r\n inputHeight: '28px',\r\n buttonHeight: '28px',\r\n },\r\n normal: {\r\n paddingX: '12px',\r\n paddingY: '8px',\r\n gap: '8px',\r\n fontSize: '14px',\r\n lineHeight: '1.5',\r\n inputHeight: '36px',\r\n buttonHeight: '36px',\r\n },\r\n comfortable: {\r\n paddingX: '16px',\r\n paddingY: '12px',\r\n gap: '12px',\r\n fontSize: '15px',\r\n lineHeight: '1.6',\r\n inputHeight: '44px',\r\n buttonHeight: '44px',\r\n },\r\n spacious: {\r\n paddingX: '24px',\r\n paddingY: '16px',\r\n gap: '16px',\r\n fontSize: '16px',\r\n lineHeight: '1.7',\r\n inputHeight: '52px',\r\n buttonHeight: '52px',\r\n },\r\n};\r\n\r\n/**\r\n * Animation timing presets\r\n */\r\nexport const ANIMATION_VALUES: Record<AnimationIntensity, Record<string, string>> = {\r\n none: {\r\n duration: '0ms',\r\n easing: 'linear',\r\n hoverScale: '1',\r\n clickScale: '1',\r\n enterAnimation: 'none',\r\n exitAnimation: 'none',\r\n },\r\n subtle: {\r\n duration: '150ms',\r\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n hoverScale: '1.01',\r\n clickScale: '0.99',\r\n enterAnimation: 'ntd-fade-in 150ms ease-out',\r\n exitAnimation: 'ntd-fade-out 100ms ease-in',\r\n },\r\n normal: {\r\n duration: '200ms',\r\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n hoverScale: '1.02',\r\n clickScale: '0.98',\r\n enterAnimation: 'ntd-slide-up 200ms ease-out',\r\n exitAnimation: 'ntd-slide-down 150ms ease-in',\r\n },\r\n playful: {\r\n duration: '300ms',\r\n easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\r\n hoverScale: '1.05',\r\n clickScale: '0.95',\r\n enterAnimation: 'ntd-bounce-in 300ms cubic-bezier(0.34, 1.56, 0.64, 1)',\r\n exitAnimation: 'ntd-bounce-out 200ms ease-in',\r\n },\r\n dramatic: {\r\n duration: '400ms',\r\n easing: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\r\n hoverScale: '1.08',\r\n clickScale: '0.92',\r\n enterAnimation: 'ntd-zoom-in 400ms cubic-bezier(0.68, -0.55, 0.265, 1.55)',\r\n exitAnimation: 'ntd-zoom-out 250ms ease-in',\r\n },\r\n};\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 3. FILL STYLES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Generate fill CSS for a variant\r\n */\r\nexport function generateFillStyles(\r\n variant: FillVariant,\r\n primaryColor: string,\r\n secondaryColor?: string,\r\n): Record<string, string> {\r\n switch (variant) {\r\n case 'solid':\r\n return {\r\n background: primaryColor,\r\n };\r\n\r\n case 'gradient-linear':\r\n return {\r\n background: `linear-gradient(135deg, ${primaryColor} 0%, ${secondaryColor || adjustColor(primaryColor, -20)} 100%)`,\r\n };\r\n\r\n case 'gradient-radial':\r\n return {\r\n background: `radial-gradient(circle at top left, ${primaryColor} 0%, ${secondaryColor || adjustColor(primaryColor, -30)} 100%)`,\r\n };\r\n\r\n case 'glass':\r\n return {\r\n background: 'rgba(255, 255, 255, 0.1)',\r\n backdropFilter: 'blur(10px)',\r\n WebkitBackdropFilter: 'blur(10px)',\r\n border: '1px solid rgba(255, 255, 255, 0.2)',\r\n };\r\n\r\n case 'frosted':\r\n return {\r\n background: 'rgba(255, 255, 255, 0.7)',\r\n backdropFilter: 'blur(20px) saturate(180%)',\r\n WebkitBackdropFilter: 'blur(20px) saturate(180%)',\r\n border: '1px solid rgba(255, 255, 255, 0.3)',\r\n };\r\n\r\n case 'pattern':\r\n return {\r\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='${encodeURIComponent(primaryColor)}' fill-opacity='0.05'%3E%3Cpath d='M0 0h20L10 10z'/%3E%3C/g%3E%3C/svg%3E\")`,\r\n backgroundColor: 'var(--ntd-bg-surface)',\r\n };\r\n\r\n case 'texture':\r\n return {\r\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E\")`,\r\n backgroundBlendMode: 'overlay',\r\n backgroundColor: primaryColor,\r\n };\r\n\r\n case 'gradient-conic':\r\n return {\r\n background: `conic-gradient(from 180deg, ${primaryColor}, ${secondaryColor || adjustColor(primaryColor, -20)}, ${primaryColor})`,\r\n };\r\n\r\n case 'mesh':\r\n return {\r\n background: `radial-gradient(at 40% 20%, ${primaryColor} 0%, transparent 50%), radial-gradient(at 80% 0%, ${secondaryColor || adjustColor(primaryColor, 30)} 0%, transparent 50%), radial-gradient(at 0% 50%, ${adjustColor(primaryColor, -20)} 0%, transparent 50%)`,\r\n backgroundColor: 'var(--ntd-bg-surface, #fff)',\r\n };\r\n\r\n default:\r\n return { background: primaryColor };\r\n }\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 4. COMPONENT STYLE GENERATORS\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Generate button styles for a variant\r\n */\r\nexport function generateButtonStyles(\r\n variant: ButtonStyleVariant,\r\n color: string,\r\n): Record<string, string> {\r\n const base = {\r\n transition: 'all var(--ntd-transition-duration, 200ms) var(--ntd-transition-easing, ease)',\r\n };\r\n\r\n switch (variant) {\r\n case 'flat':\r\n return {\r\n ...base,\r\n background: color,\r\n boxShadow: 'none',\r\n border: 'none',\r\n };\r\n\r\n case 'raised':\r\n return {\r\n ...base,\r\n background: color,\r\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\r\n border: 'none',\r\n };\r\n\r\n case 'outlined':\r\n return {\r\n ...base,\r\n background: 'transparent',\r\n border: `2px solid ${color}`,\r\n color: color,\r\n };\r\n\r\n case 'ghost':\r\n return {\r\n ...base,\r\n background: 'transparent',\r\n border: 'none',\r\n color: color,\r\n };\r\n\r\n case 'soft':\r\n return {\r\n ...base,\r\n background: `${color}20`,\r\n border: 'none',\r\n color: color,\r\n };\r\n\r\n case 'gradient':\r\n return {\r\n ...base,\r\n background: `linear-gradient(135deg, ${color} 0%, ${adjustColor(color, -20)} 100%)`,\r\n border: 'none',\r\n boxShadow: `0 4px 14px ${color}40`,\r\n };\r\n\r\n case '3d':\r\n return {\r\n ...base,\r\n background: color,\r\n border: 'none',\r\n boxShadow: `0 4px 0 ${adjustColor(color, -30)}, 0 6px 10px rgba(0, 0, 0, 0.2)`,\r\n transform: 'translateY(-2px)',\r\n };\r\n\r\n case 'neumorphic':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-surface)',\r\n border: 'none',\r\n boxShadow: '5px 5px 10px rgba(0, 0, 0, 0.1), -5px -5px 10px rgba(255, 255, 255, 0.8)',\r\n color: color,\r\n };\r\n\r\n case 'pill':\r\n return {\r\n ...base,\r\n background: color,\r\n border: 'none',\r\n borderRadius: '9999px',\r\n paddingLeft: '24px',\r\n paddingRight: '24px',\r\n };\r\n\r\n case 'link':\r\n return {\r\n ...base,\r\n background: 'transparent',\r\n border: 'none',\r\n color: color,\r\n textDecoration: 'underline',\r\n padding: '0',\r\n };\r\n\r\n case 'brutal':\r\n return {\r\n ...base,\r\n background: color,\r\n border: `3px solid #000`,\r\n boxShadow: '4px 4px 0 #000',\r\n borderRadius: '0',\r\n };\r\n\r\n default:\r\n return base;\r\n }\r\n}\r\n\r\n/**\r\n * Generate input styles for a variant\r\n */\r\nexport function generateInputStyles(variant: InputStyleVariant): Record<string, string> {\r\n const base = {\r\n transition: 'all var(--ntd-transition-duration, 200ms) var(--ntd-transition-easing, ease)',\r\n };\r\n\r\n switch (variant) {\r\n case 'bordered':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-input, var(--bg-primary, transparent))',\r\n border: '1px solid var(--ntd-border-color, var(--border-color, #3a3a3a))',\r\n borderRadius: 'var(--ntd-radius-md, 8px)',\r\n };\r\n\r\n case 'filled':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-input-filled, var(--bg-secondary, rgba(255,255,255,0.06)))',\r\n border: '2px solid transparent',\r\n borderRadius: 'var(--ntd-radius-md, 8px)',\r\n };\r\n\r\n case 'underlined':\r\n return {\r\n ...base,\r\n background: 'transparent',\r\n border: 'none',\r\n borderBottom: '2px solid var(--ntd-border-color, var(--border-color, #3a3a3a))',\r\n borderRadius: '0',\r\n paddingLeft: '0',\r\n paddingRight: '0',\r\n };\r\n\r\n case 'floating':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-input, var(--bg-primary, transparent))',\r\n border: '1px solid var(--ntd-border-color, var(--border-color, #3a3a3a))',\r\n borderRadius: 'var(--ntd-radius-md, 8px)',\r\n paddingTop: '20px',\r\n };\r\n\r\n case 'soft':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-color-primary-alpha, rgba(99, 102, 241, 0.1))',\r\n border: 'none',\r\n borderRadius: 'var(--ntd-radius-md, 8px)',\r\n };\r\n\r\n case 'neumorphic':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-surface, var(--bg-primary, transparent))',\r\n border: 'none',\r\n borderRadius: 'var(--ntd-radius-md, 8px)',\r\n boxShadow:\r\n 'inset 3px 3px 6px rgba(0, 0, 0, 0.2), inset -3px -3px 6px rgba(255, 255, 255, 0.05)',\r\n };\r\n\r\n case 'pill':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-input, var(--bg-primary, transparent))',\r\n border: '1px solid var(--ntd-border-color, var(--border-color, #3a3a3a))',\r\n borderRadius: '9999px',\r\n paddingLeft: '20px',\r\n paddingRight: '20px',\r\n };\r\n\r\n case 'flush':\r\n return {\r\n ...base,\r\n background: 'transparent',\r\n border: 'none',\r\n borderRadius: '0',\r\n padding: '0',\r\n outline: 'none',\r\n };\r\n\r\n default:\r\n return base;\r\n }\r\n}\r\n\r\n/**\r\n * Generate card styles for a variant\r\n */\r\nexport function generateCardStyles(variant: CardStyleVariant): Record<string, string> {\r\n const base = {\r\n transition: 'all var(--ntd-transition-duration, 200ms) var(--ntd-transition-easing, ease)',\r\n };\r\n\r\n switch (variant) {\r\n case 'flat':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-surface, var(--bg-secondary, transparent))',\r\n border: 'none',\r\n boxShadow: 'none',\r\n };\r\n\r\n case 'elevated':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-surface, var(--bg-secondary, transparent))',\r\n border: 'none',\r\n boxShadow: 'var(--ntd-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, 0.1))',\r\n };\r\n\r\n case 'bordered':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-surface, var(--bg-secondary, transparent))',\r\n border: '1px solid var(--ntd-border-color, var(--border-color, #3a3a3a))',\r\n boxShadow: 'none',\r\n };\r\n\r\n case 'glass':\r\n return {\r\n ...base,\r\n background: 'rgba(255, 255, 255, 0.1)',\r\n backdropFilter: 'blur(10px)',\r\n WebkitBackdropFilter: 'blur(10px)',\r\n border: '1px solid rgba(255, 255, 255, 0.2)',\r\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.1)',\r\n };\r\n\r\n case 'gradient':\r\n return {\r\n ...base,\r\n background:\r\n 'linear-gradient(135deg, var(--ntd-bg-surface) 0%, var(--ntd-bg-elevated) 100%)',\r\n border: 'none',\r\n boxShadow: 'var(--ntd-shadow-md)',\r\n };\r\n\r\n case 'neumorphic':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-surface, var(--bg-secondary, transparent))',\r\n border: 'none',\r\n boxShadow: '8px 8px 16px rgba(0, 0, 0, 0.2), -8px -8px 16px rgba(255, 255, 255, 0.05)',\r\n };\r\n\r\n case 'outlined':\r\n return {\r\n ...base,\r\n background: 'transparent',\r\n border: '2px solid var(--ntd-border-color, var(--border-color, #3a3a3a))',\r\n boxShadow: 'none',\r\n };\r\n\r\n case 'paper':\r\n return {\r\n ...base,\r\n background: 'var(--ntd-bg-surface, var(--bg-secondary, transparent))',\r\n border: 'none',\r\n boxShadow: '2px 3px 8px rgba(0,0,0,0.06)',\r\n borderRadius: '2px',\r\n };\r\n\r\n default:\r\n return base;\r\n }\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 4b. NEW COMPONENT STYLE GENERATORS\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/** Generate badge styles */\r\nexport function generateBadgeStyles(\r\n variant: BadgeStyleVariant,\r\n color: string,\r\n): Record<string, string> {\r\n const base = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n fontSize: '0.75rem',\r\n fontWeight: '600',\r\n lineHeight: '1',\r\n };\r\n switch (variant) {\r\n case 'solid':\r\n return { ...base, background: color, color: '#fff', padding: '2px 8px', borderRadius: '4px' };\r\n case 'soft':\r\n return { ...base, background: `${color}20`, color, padding: '2px 8px', borderRadius: '4px' };\r\n case 'outlined':\r\n return {\r\n ...base,\r\n background: 'transparent',\r\n border: `1px solid ${color}`,\r\n color,\r\n padding: '2px 8px',\r\n borderRadius: '4px',\r\n };\r\n case 'dot':\r\n return {\r\n ...base,\r\n background: color,\r\n width: '8px',\r\n height: '8px',\r\n borderRadius: '50%',\r\n padding: '0',\r\n };\r\n case 'pill':\r\n return {\r\n ...base,\r\n background: color,\r\n color: '#fff',\r\n padding: '2px 12px',\r\n borderRadius: '9999px',\r\n };\r\n case 'gradient':\r\n return {\r\n ...base,\r\n background: `linear-gradient(135deg, ${color}, ${adjustColor(color, -20)})`,\r\n color: '#fff',\r\n padding: '2px 8px',\r\n borderRadius: '4px',\r\n };\r\n default:\r\n return base;\r\n }\r\n}\r\n\r\n/** Generate tab styles */\r\nexport function generateTabStyles(\r\n variant: TabStyleVariant,\r\n activeColor: string,\r\n): Record<string, string> {\r\n switch (variant) {\r\n case 'underline':\r\n return {\r\n borderBottom: `2px solid ${activeColor}`,\r\n background: 'transparent',\r\n color: activeColor,\r\n };\r\n case 'pills':\r\n return {\r\n background: activeColor,\r\n color: '#fff',\r\n borderRadius: '9999px',\r\n padding: '6px 16px',\r\n };\r\n case 'enclosed':\r\n return {\r\n background: 'var(--ntd-bg-surface,#fff)',\r\n border: '1px solid var(--ntd-border-color,#e5e7eb)',\r\n borderBottom: 'none',\r\n borderRadius: '8px 8px 0 0',\r\n };\r\n case 'soft':\r\n return {\r\n background: `${activeColor}15`,\r\n color: activeColor,\r\n borderRadius: '6px',\r\n padding: '6px 16px',\r\n };\r\n case 'lifted':\r\n return {\r\n background: 'var(--ntd-bg-surface,#fff)',\r\n boxShadow: '0 -2px 8px rgba(0,0,0,0.06)',\r\n borderRadius: '8px 8px 0 0',\r\n transform: 'translateY(-2px)',\r\n };\r\n case 'bordered':\r\n return {\r\n border: `2px solid ${activeColor}`,\r\n borderBottom: 'none',\r\n background: 'transparent',\r\n borderRadius: '8px 8px 0 0',\r\n };\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\n/** Generate toggle / switch styles */\r\nexport function generateToggleStyles(variant: ToggleStyleVariant): Record<string, string> {\r\n switch (variant) {\r\n case 'default':\r\n return { borderRadius: '12px', width: '44px', height: '24px' };\r\n case 'ios':\r\n return {\r\n borderRadius: '16px',\r\n width: '51px',\r\n height: '31px',\r\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.1)',\r\n };\r\n case 'flat':\r\n return { borderRadius: '4px', width: '40px', height: '22px' };\r\n case 'pill':\r\n return { borderRadius: '9999px', width: '48px', height: '24px' };\r\n case 'square':\r\n return { borderRadius: '0', width: '40px', height: '22px' };\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\n/** Generate tooltip styles */\r\nexport function generateTooltipStyles(variant: TooltipStyleVariant): Record<string, string> {\r\n switch (variant) {\r\n case 'dark':\r\n return {\r\n background: '#1f2937',\r\n color: '#f9fafb',\r\n borderRadius: '6px',\r\n padding: '6px 12px',\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\r\n };\r\n case 'light':\r\n return {\r\n background: '#fff',\r\n color: '#374151',\r\n borderRadius: '6px',\r\n padding: '6px 12px',\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\r\n border: '1px solid #e5e7eb',\r\n };\r\n case 'primary':\r\n return {\r\n background: 'var(--color-primary,#6366f1)',\r\n color: '#fff',\r\n borderRadius: '6px',\r\n padding: '6px 12px',\r\n };\r\n case 'glass':\r\n return {\r\n background: 'rgba(255,255,255,0.15)',\r\n backdropFilter: 'blur(12px)',\r\n color: '#fff',\r\n borderRadius: '8px',\r\n padding: '8px 14px',\r\n };\r\n case 'bordered':\r\n return {\r\n background: '#fff',\r\n color: '#374151',\r\n borderRadius: '6px',\r\n padding: '6px 12px',\r\n border: '2px solid var(--color-primary,#6366f1)',\r\n };\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\n/** Generate table styles */\r\nexport function generateTableStyles(variant: TableStyleVariant): Record<string, string> {\r\n switch (variant) {\r\n case 'default':\r\n return { borderCollapse: 'collapse' };\r\n case 'striped':\r\n return { borderCollapse: 'collapse' };\r\n case 'bordered':\r\n return { border: '1px solid var(--ntd-border-color,#e5e7eb)', borderCollapse: 'collapse' };\r\n case 'compact':\r\n return { borderCollapse: 'collapse', fontSize: '0.8125rem' };\r\n case 'hoverable':\r\n return { borderCollapse: 'collapse' };\r\n case 'minimal':\r\n return {\r\n borderCollapse: 'collapse',\r\n borderBottom: '1px solid var(--ntd-border-color,#e5e7eb)',\r\n };\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 5. THEME VARIANT CONFIG\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Theme variant configuration\r\n */\r\nexport interface ThemeVariantConfig {\r\n /** Border radius variant */\r\n radius: RadiusVariant;\r\n /** Shadow variant */\r\n shadow: ShadowVariant;\r\n /** Fill style */\r\n fill: FillVariant;\r\n /** Button style */\r\n buttonStyle: ButtonStyleVariant;\r\n /** Input style */\r\n inputStyle: InputStyleVariant;\r\n /** Card style */\r\n cardStyle: CardStyleVariant;\r\n /** Badge style */\r\n badgeStyle?: BadgeStyleVariant;\r\n /** Tab style */\r\n tabStyle?: TabStyleVariant;\r\n /** Toggle style */\r\n toggleStyle?: ToggleStyleVariant;\r\n /** Tooltip style */\r\n tooltipStyle?: TooltipStyleVariant;\r\n /** Modal style */\r\n modalStyle?: ModalStyleVariant;\r\n /** Table style */\r\n tableStyle?: TableStyleVariant;\r\n /** Menu style */\r\n menuStyle?: MenuStyleVariant;\r\n /** Animation intensity */\r\n animation: AnimationIntensity;\r\n /** Density */\r\n density: DensityVariant;\r\n /** Custom background image/pattern */\r\n backgroundImage?: string;\r\n /** Gradient overlay for backgrounds */\r\n backgroundOverlay?: string;\r\n}\r\n\r\n/**\r\n * Default variant configuration\r\n */\r\nexport const DEFAULT_VARIANT_CONFIG: ThemeVariantConfig = {\r\n radius: 'md',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'bordered',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'solid',\r\n tabStyle: 'underline',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n modalStyle: 'default',\r\n tableStyle: 'default',\r\n menuStyle: 'default',\r\n animation: 'normal',\r\n density: 'normal',\r\n};\r\n\r\n/**\r\n * Preset variant configurations\r\n */\r\nexport const VARIANT_PRESETS: Record<string, ThemeVariantConfig> = {\r\n minimal: {\r\n radius: 'sm',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'underlined',\r\n cardStyle: 'flat',\r\n badgeStyle: 'soft',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n rounded: {\r\n radius: 'xl',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'filled',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'pill',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'default',\r\n animation: 'normal',\r\n density: 'comfortable',\r\n },\r\n sharp: {\r\n radius: 'none',\r\n shadow: 'lg',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'solid',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'bordered',\r\n animation: 'subtle',\r\n density: 'compact',\r\n },\r\n glass: {\r\n radius: 'lg',\r\n shadow: 'none',\r\n fill: 'glass',\r\n buttonStyle: 'ghost',\r\n inputStyle: 'soft',\r\n cardStyle: 'glass',\r\n badgeStyle: 'soft',\r\n tabStyle: 'soft',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'minimal',\r\n animation: 'normal',\r\n density: 'normal',\r\n },\r\n neumorphic: {\r\n radius: 'lg',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'neumorphic',\r\n inputStyle: 'neumorphic',\r\n cardStyle: 'neumorphic',\r\n badgeStyle: 'soft',\r\n tabStyle: 'lifted',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'light',\r\n tableStyle: 'default',\r\n animation: 'subtle',\r\n density: 'comfortable',\r\n },\r\n playful: {\r\n radius: '2xl',\r\n shadow: 'colored',\r\n fill: 'gradient-linear',\r\n buttonStyle: 'gradient',\r\n inputStyle: 'filled',\r\n cardStyle: 'gradient',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'primary',\r\n tableStyle: 'hoverable',\r\n animation: 'playful',\r\n density: 'comfortable',\r\n },\r\n enterprise: {\r\n radius: 'sm',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'striped',\r\n animation: 'subtle',\r\n density: 'compact',\r\n },\r\n modern3d: {\r\n radius: 'lg',\r\n shadow: 'xl',\r\n fill: 'gradient-linear',\r\n buttonStyle: '3d',\r\n inputStyle: 'filled',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'lifted',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'default',\r\n animation: 'normal',\r\n density: 'normal',\r\n },\r\n brutalist: {\r\n radius: 'none',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'brutal',\r\n inputStyle: 'bordered',\r\n cardStyle: 'outlined',\r\n badgeStyle: 'solid',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'normal',\r\n },\r\n luxe: {\r\n radius: 'sm',\r\n shadow: 'lg',\r\n fill: 'gradient-linear',\r\n buttonStyle: 'gradient',\r\n inputStyle: 'floating',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'underline',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'hoverable',\r\n animation: 'normal',\r\n density: 'comfortable',\r\n },\r\n pill: {\r\n radius: 'full',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'pill',\r\n inputStyle: 'pill',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'pill',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'default',\r\n animation: 'normal',\r\n density: 'normal',\r\n },\r\n flat: {\r\n radius: 'md',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'filled',\r\n cardStyle: 'flat',\r\n badgeStyle: 'soft',\r\n tabStyle: 'soft',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n editorial: {\r\n radius: 'none',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'ghost',\r\n inputStyle: 'underlined',\r\n cardStyle: 'paper',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'comfortable',\r\n },\r\n dashboard: {\r\n radius: 'md',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'bordered',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'solid',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'striped',\r\n animation: 'subtle',\r\n density: 'compact',\r\n },\r\n softCloud: {\r\n radius: 'xl',\r\n shadow: 'subtle',\r\n fill: 'frosted',\r\n buttonStyle: 'soft',\r\n inputStyle: 'soft',\r\n cardStyle: 'glass',\r\n badgeStyle: 'soft',\r\n tabStyle: 'soft',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'hoverable',\r\n animation: 'normal',\r\n density: 'comfortable',\r\n },\r\n cosmic: {\r\n radius: 'lg',\r\n shadow: 'glow',\r\n fill: 'mesh',\r\n buttonStyle: 'gradient',\r\n inputStyle: 'soft',\r\n cardStyle: 'glass',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'pills',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'hoverable',\r\n animation: 'dramatic',\r\n density: 'comfortable',\r\n },\r\n\r\n // ── Additional presets — serious to playful ──────────────\r\n\r\n /** Corporate: safe, grey, no flair */\r\n corporate: {\r\n radius: 'sm',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'striped',\r\n animation: 'none',\r\n density: 'compact',\r\n },\r\n /** Bank: ultra-conservative, heavy borders, no fun */\r\n bank: {\r\n radius: 'none',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'solid',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'compact',\r\n },\r\n /** Government: minimal, accessible, high contrast */\r\n government: {\r\n radius: 'sm',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'bordered',\r\n cardStyle: 'flat',\r\n badgeStyle: 'solid',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'striped',\r\n animation: 'none',\r\n density: 'normal',\r\n },\r\n /** Military: dark, angular, no-nonsense */\r\n military: {\r\n radius: 'none',\r\n shadow: 'lg',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'solid',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'compact',\r\n },\r\n /** Legal: typographic, clean, paper-like */\r\n legal: {\r\n radius: 'none',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'ghost',\r\n inputStyle: 'underlined',\r\n cardStyle: 'paper',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'none',\r\n density: 'comfortable',\r\n },\r\n /** Medical: clean, blue-toned, professional */\r\n medical: {\r\n radius: 'md',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'soft',\r\n inputStyle: 'bordered',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'soft',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'light',\r\n tableStyle: 'striped',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Swiss: grid-based, clean typography, precision */\r\n swiss: {\r\n radius: 'none',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'underlined',\r\n cardStyle: 'flat',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Scandinavian: soft, warm, spacious, hygge */\r\n scandinavian: {\r\n radius: 'lg',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'soft',\r\n inputStyle: 'filled',\r\n cardStyle: 'flat',\r\n badgeStyle: 'soft',\r\n tabStyle: 'soft',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'spacious',\r\n },\r\n /** Bauhaus: geometric, primary colors, strong lines */\r\n bauhaus: {\r\n radius: 'none',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'flat',\r\n inputStyle: 'bordered',\r\n cardStyle: 'outlined',\r\n badgeStyle: 'solid',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'normal',\r\n },\r\n /** Notebook: handwritten feel, paper textures, soft */\r\n notebook: {\r\n radius: 'md',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'ghost',\r\n inputStyle: 'underlined',\r\n cardStyle: 'paper',\r\n badgeStyle: 'soft',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'comfortable',\r\n },\r\n /** Terminal: monospace, dark, retro-computing */\r\n terminal: {\r\n radius: 'none',\r\n shadow: 'glow',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'solid',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'compact',\r\n },\r\n /** Hacker: neon green on black, matrix style */\r\n hacker: {\r\n radius: 'none',\r\n shadow: 'glow',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'outlined',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'subtle',\r\n density: 'compact',\r\n },\r\n /** Retro8bit: pixel art inspired, chunky, fun */\r\n retro8bit: {\r\n radius: 'none',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'brutal',\r\n inputStyle: 'bordered',\r\n cardStyle: 'outlined',\r\n badgeStyle: 'solid',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'normal',\r\n },\r\n /** Vapor: vaporwave 80s aesthetics, gradients, neon */\r\n vapor: {\r\n radius: 'lg',\r\n shadow: 'glow',\r\n fill: 'gradient-linear',\r\n buttonStyle: 'gradient',\r\n inputStyle: 'soft',\r\n cardStyle: 'glass',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'hoverable',\r\n animation: 'playful',\r\n density: 'comfortable',\r\n },\r\n /** Synthwave: 80s synth, neon grids, chrome */\r\n synthwave: {\r\n radius: 'md',\r\n shadow: 'glow',\r\n fill: 'gradient-linear',\r\n buttonStyle: '3d',\r\n inputStyle: 'filled',\r\n cardStyle: 'glass',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'lifted',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'hoverable',\r\n animation: 'dramatic',\r\n density: 'normal',\r\n },\r\n /** Cyberpunk: angular, neon, glitch aesthetics */\r\n cyberpunk: {\r\n radius: 'none',\r\n shadow: 'glow',\r\n fill: 'gradient-linear',\r\n buttonStyle: 'brutal',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'solid',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'dramatic',\r\n density: 'compact',\r\n },\r\n /** Steampunk: brass, gears, Victorian tech */\r\n steampunk: {\r\n radius: 'sm',\r\n shadow: 'inner',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'solid',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Origami: folded paper, subtle shadows, layered */\r\n origami: {\r\n radius: 'none',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'filled',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'soft',\r\n tabStyle: 'lifted',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'default',\r\n animation: 'normal',\r\n density: 'normal',\r\n },\r\n /** Watercolor: soft edges, bleed, artistic */\r\n watercolor: {\r\n radius: '2xl',\r\n shadow: 'subtle',\r\n fill: 'frosted',\r\n buttonStyle: 'soft',\r\n inputStyle: 'soft',\r\n cardStyle: 'glass',\r\n badgeStyle: 'soft',\r\n tabStyle: 'soft',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'minimal',\r\n animation: 'normal',\r\n density: 'comfortable',\r\n },\r\n /** Neon: bright glowing outlines on dark */\r\n neon: {\r\n radius: 'md',\r\n shadow: 'glow',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'outlined',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'dramatic',\r\n density: 'normal',\r\n },\r\n /** Candy: sweet, pastel, rounded, fun */\r\n candy: {\r\n radius: '2xl',\r\n shadow: 'colored',\r\n fill: 'gradient-linear',\r\n buttonStyle: 'pill',\r\n inputStyle: 'pill',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'pill',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'primary',\r\n tableStyle: 'hoverable',\r\n animation: 'playful',\r\n density: 'comfortable',\r\n },\r\n /** Bubblegum: pink, puffy, extremely round */\r\n bubblegum: {\r\n radius: 'full',\r\n shadow: 'colored',\r\n fill: 'gradient-radial',\r\n buttonStyle: 'pill',\r\n inputStyle: 'pill',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'pill',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'primary',\r\n tableStyle: 'hoverable',\r\n animation: 'playful',\r\n density: 'spacious',\r\n },\r\n /** Cartoon: thick outlines, bold colors, exaggerated */\r\n cartoon: {\r\n radius: 'xl',\r\n shadow: 'colored',\r\n fill: 'solid',\r\n buttonStyle: 'brutal',\r\n inputStyle: 'bordered',\r\n cardStyle: 'outlined',\r\n badgeStyle: 'solid',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'playful',\r\n density: 'comfortable',\r\n },\r\n /** Kawaii: cute, pastel, round, sparkly */\r\n kawaii: {\r\n radius: 'full',\r\n shadow: 'colored',\r\n fill: 'gradient-linear',\r\n buttonStyle: 'pill',\r\n inputStyle: 'pill',\r\n cardStyle: 'gradient',\r\n badgeStyle: 'pill',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'primary',\r\n tableStyle: 'hoverable',\r\n animation: 'dramatic',\r\n density: 'spacious',\r\n },\r\n /** Circus: bold, striped, loud, attention-grabbing */\r\n circus: {\r\n radius: 'full',\r\n shadow: 'colored',\r\n fill: 'gradient-conic',\r\n buttonStyle: 'gradient',\r\n inputStyle: 'filled',\r\n cardStyle: 'gradient',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'primary',\r\n tableStyle: 'striped',\r\n animation: 'dramatic',\r\n density: 'spacious',\r\n },\r\n /** Paper: minimal white, subtle shadows, like paper on desk */\r\n paper: {\r\n radius: 'sm',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'ghost',\r\n inputStyle: 'underlined',\r\n cardStyle: 'paper',\r\n badgeStyle: 'soft',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'comfortable',\r\n },\r\n /** Zen: ultra-minimal, lots of whitespace, calm */\r\n zen: {\r\n radius: 'md',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'ghost',\r\n inputStyle: 'underlined',\r\n cardStyle: 'flat',\r\n badgeStyle: 'soft',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'spacious',\r\n },\r\n /** Monochrome: black & white only, pure typography */\r\n monochrome: {\r\n radius: 'none',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'outlined',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'normal',\r\n },\r\n /** Windows95: chunky, beveled 3D, classic OS */\r\n windows95: {\r\n radius: 'none',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'solid',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'none',\r\n density: 'compact',\r\n },\r\n /** Material: Google Material Design inspired */\r\n material: {\r\n radius: 'md',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'filled',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'solid',\r\n tabStyle: 'underline',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'default',\r\n animation: 'normal',\r\n density: 'normal',\r\n },\r\n /** Fluent: Microsoft Fluent Design — acrylic, reveal, depth */\r\n fluent: {\r\n radius: 'md',\r\n shadow: 'subtle',\r\n fill: 'frosted',\r\n buttonStyle: 'soft',\r\n inputStyle: 'filled',\r\n cardStyle: 'glass',\r\n badgeStyle: 'soft',\r\n tabStyle: 'soft',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'hoverable',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Cupertino: Apple iOS/macOS style */\r\n cupertino: {\r\n radius: 'xl',\r\n shadow: 'md',\r\n fill: 'frosted',\r\n buttonStyle: 'soft',\r\n inputStyle: 'filled',\r\n cardStyle: 'glass',\r\n badgeStyle: 'pill',\r\n tabStyle: 'pills',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'minimal',\r\n animation: 'normal',\r\n density: 'comfortable',\r\n },\r\n /** Ant: Ant Design inspired — clean, professional */\r\n ant: {\r\n radius: 'md',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'bordered',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'solid',\r\n tabStyle: 'underline',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'default',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Bootstrap: Bootstrap-like rounded, standard */\r\n bootstrap: {\r\n radius: 'md',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'bordered',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'pill',\r\n tabStyle: 'underline',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'striped',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Chakra: Chakra UI inspired — accessible, clean */\r\n chakra: {\r\n radius: 'md',\r\n shadow: 'md',\r\n fill: 'solid',\r\n buttonStyle: 'raised',\r\n inputStyle: 'bordered',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'soft',\r\n tabStyle: 'enclosed',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'default',\r\n animation: 'normal',\r\n density: 'normal',\r\n },\r\n /** Notion: Notion-like clean, text-focused, minimal UI */\r\n notion: {\r\n radius: 'sm',\r\n shadow: 'none',\r\n fill: 'solid',\r\n buttonStyle: 'ghost',\r\n inputStyle: 'flush',\r\n cardStyle: 'flat',\r\n badgeStyle: 'soft',\r\n tabStyle: 'underline',\r\n toggleStyle: 'flat',\r\n tooltipStyle: 'light',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Linear: Linear app inspired — sleek, dark, polished */\r\n linear: {\r\n radius: 'md',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'soft',\r\n inputStyle: 'filled',\r\n cardStyle: 'elevated',\r\n badgeStyle: 'soft',\r\n tabStyle: 'soft',\r\n toggleStyle: 'ios',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'hoverable',\r\n animation: 'subtle',\r\n density: 'compact',\r\n },\r\n /** Vercel: Vercel/Next.js — black/white, sharp, modern */\r\n vercel: {\r\n radius: 'md',\r\n shadow: 'subtle',\r\n fill: 'solid',\r\n buttonStyle: 'outlined',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'outlined',\r\n tabStyle: 'underline',\r\n toggleStyle: 'default',\r\n tooltipStyle: 'dark',\r\n tableStyle: 'minimal',\r\n animation: 'subtle',\r\n density: 'normal',\r\n },\r\n /** Gaming: dark, neon accents, angular, aggressive */\r\n gaming: {\r\n radius: 'none',\r\n shadow: 'glow',\r\n fill: 'gradient-linear',\r\n buttonStyle: '3d',\r\n inputStyle: 'bordered',\r\n cardStyle: 'bordered',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'bordered',\r\n toggleStyle: 'square',\r\n tooltipStyle: 'bordered',\r\n tableStyle: 'bordered',\r\n animation: 'dramatic',\r\n density: 'normal',\r\n },\r\n /** Kiddo: colorful, big, puffy, child-friendly */\r\n kiddo: {\r\n radius: '2xl',\r\n shadow: 'colored',\r\n fill: 'gradient-radial',\r\n buttonStyle: 'pill',\r\n inputStyle: 'pill',\r\n cardStyle: 'gradient',\r\n badgeStyle: 'pill',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'primary',\r\n tableStyle: 'hoverable',\r\n animation: 'playful',\r\n density: 'spacious',\r\n },\r\n /** Disco: flashing, colorful, animated, party time */\r\n disco: {\r\n radius: 'full',\r\n shadow: 'glow',\r\n fill: 'gradient-conic',\r\n buttonStyle: 'gradient',\r\n inputStyle: 'filled',\r\n cardStyle: 'gradient',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'glass',\r\n tableStyle: 'hoverable',\r\n animation: 'dramatic',\r\n density: 'comfortable',\r\n },\r\n /** Clown: maximum chaos, the least serious possible */\r\n clown: {\r\n radius: 'full',\r\n shadow: 'colored',\r\n fill: 'gradient-conic',\r\n buttonStyle: 'brutal',\r\n inputStyle: 'pill',\r\n cardStyle: 'gradient',\r\n badgeStyle: 'gradient',\r\n tabStyle: 'pills',\r\n toggleStyle: 'pill',\r\n tooltipStyle: 'primary',\r\n tableStyle: 'striped',\r\n animation: 'dramatic',\r\n density: 'spacious',\r\n },\r\n};\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 6. CSS GENERATION\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Generate CSS variables from variant config.\r\n *\r\n * @param config Resolved variant configuration.\r\n * @param selector CSS selector the declarations are emitted under.\r\n * Defaults to `:root` (global). Pass e.g.\r\n * `'[data-ntd-provider=\"pr0\"]'` to scope the variables\r\n * to one provider instance.\r\n */\r\nexport function generateVariantCSS(config: ThemeVariantConfig, selector: string = ':root'): string {\r\n const radius = RADIUS_VALUES[config.radius];\r\n const shadow = config.shadow;\r\n const density = DENSITY_VALUES[config.density];\r\n const animation = ANIMATION_VALUES[config.animation];\r\n\r\n const lines: string[] = [`${selector} {`];\r\n\r\n // Radius variables\r\n for (const [key, value] of Object.entries(radius)) {\r\n lines.push(` --ntd-radius-${key}: ${value};`);\r\n }\r\n\r\n // Shadow variables\r\n lines.push(` --ntd-shadow: ${SHADOW_VALUES[shadow]};`);\r\n lines.push(` --ntd-shadow-dark: ${SHADOW_DARK_MODE_VALUES[shadow]};`);\r\n\r\n // Density variables\r\n for (const [key, value] of Object.entries(density)) {\r\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n lines.push(` --ntd-${cssKey}: ${value};`);\r\n }\r\n\r\n // Animation variables\r\n for (const [key, value] of Object.entries(animation)) {\r\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n lines.push(` --ntd-animation-${cssKey}: ${value};`);\r\n }\r\n\r\n // Custom background\r\n if (config.backgroundImage) {\r\n lines.push(` --ntd-bg-image: url('${config.backgroundImage}');`);\r\n }\r\n\r\n if (config.backgroundOverlay) {\r\n lines.push(` --ntd-bg-overlay: ${config.backgroundOverlay};`);\r\n }\r\n\r\n lines.push('}');\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Apply variant config to DOM.\r\n *\r\n * When `scopeId` is omitted, declarations are written under `:root` to a\r\n * single global `<style id=\"ntd-variant-styles\">` (previous behaviour).\r\n *\r\n * When `scopeId` is provided, declarations are scoped to\r\n * `[data-ntd-provider=\"<scopeId>\"]` and written to a dedicated\r\n * `<style id=\"ntd-variant-styles-<scopeId>\">`. The attribute is also\r\n * set on `element` so descendants match the scope. This lets two\r\n * NiceThemeProviders coexist with different `displayStyle`s without\r\n * fighting over one global style element.\r\n */\r\nexport function applyVariantConfig(\r\n config: ThemeVariantConfig,\r\n element: HTMLElement = document.documentElement,\r\n scopeId?: string,\r\n): void {\r\n const selector = scopeId ? `[data-ntd-provider=\"${scopeId}\"]` : ':root';\r\n const styleElId = scopeId ? `ntd-variant-styles-${scopeId}` : 'ntd-variant-styles';\r\n\r\n const css = generateVariantCSS(config, selector);\r\n\r\n // Find or create style element\r\n let styleEl = document.getElementById(styleElId) as HTMLStyleElement | null;\r\n if (!styleEl) {\r\n styleEl = document.createElement('style');\r\n styleEl.id = styleElId;\r\n document.head.appendChild(styleEl);\r\n }\r\n\r\n styleEl.textContent = css;\r\n\r\n if (scopeId) {\r\n element.setAttribute('data-ntd-provider', scopeId);\r\n }\r\n\r\n // Set data attributes for component styling\r\n element.dataset.ntdRadius = config.radius;\r\n element.dataset.ntdShadow = config.shadow;\r\n element.dataset.ntdFill = config.fill;\r\n element.dataset.ntdButton = config.buttonStyle;\r\n element.dataset.ntdInput = config.inputStyle;\r\n element.dataset.ntdCard = config.cardStyle;\r\n element.dataset.ntdAnimation = config.animation;\r\n element.dataset.ntdDensity = config.density;\r\n if (config.badgeStyle) {\r\n element.dataset.ntdBadge = config.badgeStyle;\r\n }\r\n if (config.tabStyle) {\r\n element.dataset.ntdTab = config.tabStyle;\r\n }\r\n if (config.toggleStyle) {\r\n element.dataset.ntdToggle = config.toggleStyle;\r\n }\r\n if (config.tooltipStyle) {\r\n element.dataset.ntdTooltip = config.tooltipStyle;\r\n }\r\n if (config.modalStyle) {\r\n element.dataset.ntdModal = config.modalStyle;\r\n }\r\n if (config.tableStyle) {\r\n element.dataset.ntdTable = config.tableStyle;\r\n }\r\n if (config.menuStyle) {\r\n element.dataset.ntdMenu = config.menuStyle;\r\n }\r\n}\r\n\r\n/**\r\n * Remove a scoped variant config previously applied via\r\n * `applyVariantConfig(config, element, scopeId)`.\r\n *\r\n * Safe to call on unmount; if the style element is absent this is a\r\n * no-op. Does not remove the shared global `ntd-variant-styles` element.\r\n */\r\nexport function removeVariantConfig(scopeId: string, element?: HTMLElement): void {\r\n const styleEl = document.getElementById(`ntd-variant-styles-${scopeId}`);\r\n if (styleEl) {\r\n styleEl.remove();\r\n }\r\n if (element) {\r\n element.removeAttribute('data-ntd-provider');\r\n }\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 7. UTILITIES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Adjust color lightness\r\n */\r\nfunction adjustColor(color: string, amount: number): string {\r\n // Simple hex color adjustment\r\n if (color.startsWith('#')) {\r\n const hex = color.slice(1);\r\n const num = parseInt(hex, 16);\r\n const r = Math.max(0, Math.min(255, ((num >> 16) & 255) + amount));\r\n const g = Math.max(0, Math.min(255, ((num >> 8) & 255) + amount));\r\n const b = Math.max(0, Math.min(255, (num & 255) + amount));\r\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;\r\n }\r\n return color;\r\n}\r\n\r\n/**\r\n * Create theme with variants applied\r\n * Returns a modified theme with variant-specific CSS custom properties\r\n */\r\nexport function applyVariantsToTheme(\r\n theme: NiceTheme,\r\n config: Partial<ThemeVariantConfig>,\r\n): NiceTheme & { variantConfig: ThemeVariantConfig } {\r\n const mergedConfig = { ...DEFAULT_VARIANT_CONFIG, ...config };\r\n\r\n return {\r\n ...theme,\r\n variantConfig: mergedConfig,\r\n };\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Unified Display Style System\r\n// ============================================================\r\n//\r\n// Provides a global + per-component mechanism for switching\r\n// visual presentation styles. Each NiceDisplayStyle maps to a\r\n// ThemeVariantConfig that controls every component category\r\n// (buttons, inputs, cards, tabs, toggles, badges, tables, …).\r\n//\r\n// Usage:\r\n// <NiceThemeProvider theme={t} displayStyle=\"glass\">\r\n// <NiceButton>Uses glass button style</NiceButton>\r\n// <NiceButton displayStyle=\"brutalist\">Override per-component</NiceButton>\r\n// </NiceThemeProvider>\r\n// ============================================================\r\n\r\nimport { createContext, useContext } from 'react';\r\n\r\nimport type { ThemeVariantConfig } from './themeVariants';\r\nimport {\r\n VARIANT_PRESETS,\r\n DEFAULT_VARIANT_CONFIG,\r\n generateButtonStyles,\r\n generateInputStyles,\r\n generateCardStyles,\r\n generateBadgeStyles,\r\n generateTabStyles,\r\n generateToggleStyles,\r\n generateTooltipStyles,\r\n generateTableStyles,\r\n DENSITY_VALUES,\r\n ANIMATION_VALUES,\r\n} from './themeVariants';\r\n\r\n// ── Display style type ──────────────────────────────────────\r\n\r\n/**\r\n * Cross-component visual presentation style.\r\n * Each style maps 1:1 to a ThemeVariantConfig preset controlling\r\n * buttons, inputs, cards, badges, tabs, toggles, tooltips, tables, etc.\r\n */\r\nexport type NiceDisplayStyle =\r\n | 'default'\r\n | 'minimal'\r\n | 'rounded'\r\n | 'sharp'\r\n | 'glass'\r\n | 'neumorphic'\r\n | 'playful'\r\n | 'enterprise'\r\n | 'modern3d'\r\n | 'brutalist'\r\n | 'luxe'\r\n | 'pill'\r\n | 'flat'\r\n | 'editorial'\r\n | 'dashboard'\r\n | 'softCloud'\r\n | 'cosmic'\r\n // ── Serious / Professional ──\r\n | 'corporate'\r\n | 'bank'\r\n | 'government'\r\n | 'military'\r\n | 'legal'\r\n | 'medical'\r\n | 'swiss'\r\n | 'scandinavian'\r\n // ── Artistic / Design ──\r\n | 'bauhaus'\r\n | 'notebook'\r\n | 'origami'\r\n | 'watercolor'\r\n | 'monochrome'\r\n | 'paper'\r\n | 'zen'\r\n // ── Tech / Retro ──\r\n | 'terminal'\r\n | 'hacker'\r\n | 'retro8bit'\r\n | 'synthwave'\r\n | 'cyberpunk'\r\n | 'steampunk'\r\n | 'vapor'\r\n | 'neon'\r\n | 'windows95'\r\n // ── Design Systems ──\r\n | 'material'\r\n | 'fluent'\r\n | 'cupertino'\r\n | 'ant'\r\n | 'bootstrap'\r\n | 'chakra'\r\n | 'notion'\r\n | 'linear'\r\n | 'vercel'\r\n // ── Fun / Silly ──\r\n | 'candy'\r\n | 'bubblegum'\r\n | 'cartoon'\r\n | 'kawaii'\r\n | 'circus'\r\n | 'gaming'\r\n | 'kiddo'\r\n | 'disco'\r\n | 'clown';\r\n\r\n/** All available display style names. */\r\nexport const NICE_DISPLAY_STYLES: NiceDisplayStyle[] = [\r\n // Core\r\n 'default',\r\n 'minimal',\r\n 'rounded',\r\n 'sharp',\r\n 'glass',\r\n 'neumorphic',\r\n 'playful',\r\n 'enterprise',\r\n 'modern3d',\r\n 'brutalist',\r\n 'luxe',\r\n 'pill',\r\n 'flat',\r\n 'editorial',\r\n 'dashboard',\r\n 'softCloud',\r\n 'cosmic',\r\n // Professional\r\n 'corporate',\r\n 'bank',\r\n 'government',\r\n 'military',\r\n 'legal',\r\n 'medical',\r\n 'swiss',\r\n 'scandinavian',\r\n // Artistic\r\n 'bauhaus',\r\n 'notebook',\r\n 'origami',\r\n 'watercolor',\r\n 'monochrome',\r\n 'paper',\r\n 'zen',\r\n // Tech / Retro\r\n 'terminal',\r\n 'hacker',\r\n 'retro8bit',\r\n 'synthwave',\r\n 'cyberpunk',\r\n 'steampunk',\r\n 'vapor',\r\n 'neon',\r\n 'windows95',\r\n // Design Systems\r\n 'material',\r\n 'fluent',\r\n 'cupertino',\r\n 'ant',\r\n 'bootstrap',\r\n 'chakra',\r\n 'notion',\r\n 'linear',\r\n 'vercel',\r\n // Fun\r\n 'candy',\r\n 'bubblegum',\r\n 'cartoon',\r\n 'kawaii',\r\n 'circus',\r\n 'gaming',\r\n 'kiddo',\r\n 'disco',\r\n 'clown',\r\n];\r\n\r\n// ── Display style → variant config mapping ──────────────────\r\n\r\n/** Resolves a display style name to a full ThemeVariantConfig. */\r\nexport function resolveDisplayStyleConfig(style: NiceDisplayStyle): ThemeVariantConfig {\r\n if (style === 'default') {\r\n return DEFAULT_VARIANT_CONFIG;\r\n }\r\n return VARIANT_PRESETS[style] ?? DEFAULT_VARIANT_CONFIG;\r\n}\r\n\r\n// ── Component type enum ─────────────────────────────────────\r\n\r\n/** Component categories for style resolution. */\r\nexport type NiceComponentType =\r\n | 'button'\r\n | 'input'\r\n | 'card'\r\n | 'badge'\r\n | 'tab'\r\n | 'toggle'\r\n | 'tooltip'\r\n | 'modal'\r\n | 'table'\r\n | 'menu';\r\n\r\n// ── Context ─────────────────────────────────────────────────\r\n\r\nexport interface NiceDisplayStyleContextValue {\r\n /** Currently active global display style. */\r\n displayStyle: NiceDisplayStyle;\r\n /** Resolved variant config for the current display style. */\r\n variantConfig: ThemeVariantConfig;\r\n /** Change the global display style. */\r\n setDisplayStyle: (style: NiceDisplayStyle) => void;\r\n}\r\n\r\nexport const NiceDisplayStyleContext = createContext<NiceDisplayStyleContextValue>({\r\n displayStyle: 'default',\r\n variantConfig: DEFAULT_VARIANT_CONFIG,\r\n setDisplayStyle: () => {},\r\n});\r\n\r\n// ── Hooks ───────────────────────────────────────────────────\r\n\r\n/**\r\n * Returns the current global display style from context.\r\n */\r\nexport function useNiceDisplayStyle(): NiceDisplayStyleContextValue {\r\n return useContext(NiceDisplayStyleContext);\r\n}\r\n\r\n/**\r\n * Resolves the effective display style for a component, with priority:\r\n * prop (per-component) → context (global) → 'default'\r\n */\r\nexport function useResolvedDisplayStyle(propStyle?: NiceDisplayStyle): {\r\n style: NiceDisplayStyle;\r\n config: ThemeVariantConfig;\r\n} {\r\n const ctx = useContext(NiceDisplayStyleContext);\r\n const effective = propStyle ?? ctx.displayStyle ?? 'default';\r\n const config = resolveDisplayStyleConfig(effective);\r\n return { style: effective, config };\r\n}\r\n\r\n/**\r\n * Returns inline CSS properties for a specific component type\r\n * based on the resolved display style.\r\n *\r\n * @param componentType - Which component category to style\r\n * @param propStyle - Optional per-component display style override\r\n * @param primaryColor - Primary color for style generators (e.g. badge, button)\r\n */\r\nexport function useComponentDisplayStyle(\r\n componentType: NiceComponentType,\r\n propStyle?: NiceDisplayStyle,\r\n primaryColor = 'var(--color-primary, #6366f1)',\r\n): React.CSSProperties {\r\n const { config } = useResolvedDisplayStyle(propStyle);\r\n return getComponentStyleFromConfig(componentType, config, primaryColor);\r\n}\r\n\r\n/**\r\n * Returns the CSS class suffix for a given component type and display style.\r\n * Components use this to apply style-specific classes: e.g. `nice-btn--style-gradient`\r\n */\r\nexport function useComponentDisplayClass(\r\n componentType: NiceComponentType,\r\n propStyle?: NiceDisplayStyle,\r\n): string {\r\n const { config } = useResolvedDisplayStyle(propStyle);\r\n switch (componentType) {\r\n case 'button':\r\n return config.buttonStyle;\r\n case 'input':\r\n return config.inputStyle;\r\n case 'card':\r\n return config.cardStyle;\r\n case 'badge':\r\n return config.badgeStyle ?? 'solid';\r\n case 'tab':\r\n return config.tabStyle ?? 'underline';\r\n case 'toggle':\r\n return config.toggleStyle ?? 'default';\r\n case 'tooltip':\r\n return config.tooltipStyle ?? 'dark';\r\n case 'modal':\r\n return config.modalStyle ?? 'default';\r\n case 'table':\r\n return config.tableStyle ?? 'default';\r\n case 'menu':\r\n return config.menuStyle ?? 'default';\r\n default:\r\n return 'default';\r\n }\r\n}\r\n\r\n/**\r\n * Returns density CSS properties for the current display style.\r\n */\r\nexport function useDisplayDensity(propStyle?: NiceDisplayStyle): React.CSSProperties {\r\n const { config } = useResolvedDisplayStyle(propStyle);\r\n const d = DENSITY_VALUES[config.density];\r\n return {\r\n '--ntd-padding-x': d.paddingX,\r\n '--ntd-padding-y': d.paddingY,\r\n '--ntd-gap': d.gap,\r\n '--ntd-font-size': d.fontSize,\r\n '--ntd-line-height': d.lineHeight,\r\n '--ntd-input-height': d.inputHeight,\r\n '--ntd-button-height': d.buttonHeight,\r\n } as React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Returns animation CSS properties for the current display style.\r\n */\r\nexport function useDisplayAnimation(propStyle?: NiceDisplayStyle): React.CSSProperties {\r\n const { config } = useResolvedDisplayStyle(propStyle);\r\n const a = ANIMATION_VALUES[config.animation];\r\n return {\r\n '--ntd-anim-duration': a.duration,\r\n '--ntd-anim-easing': a.easing,\r\n '--ntd-hover-scale': a.hoverScale,\r\n '--ntd-click-scale': a.clickScale,\r\n } as React.CSSProperties;\r\n}\r\n\r\n// ── Pure helpers (no React, for SSR/testing) ────────────────\r\n\r\n/**\r\n * Generates inline style properties for a specific component type\r\n * from a ThemeVariantConfig.\r\n */\r\nexport function getComponentStyleFromConfig(\r\n componentType: NiceComponentType,\r\n config: ThemeVariantConfig,\r\n primaryColor = '#6366f1',\r\n): React.CSSProperties {\r\n switch (componentType) {\r\n case 'button':\r\n return generateButtonStyles(config.buttonStyle, primaryColor) as React.CSSProperties;\r\n case 'input':\r\n return generateInputStyles(config.inputStyle) as React.CSSProperties;\r\n case 'card':\r\n return generateCardStyles(config.cardStyle) as React.CSSProperties;\r\n case 'badge':\r\n return generateBadgeStyles(config.badgeStyle ?? 'solid', primaryColor) as React.CSSProperties;\r\n case 'tab':\r\n return generateTabStyles(config.tabStyle ?? 'underline', primaryColor) as React.CSSProperties;\r\n case 'toggle':\r\n return generateToggleStyles(config.toggleStyle ?? 'default') as React.CSSProperties;\r\n case 'tooltip':\r\n return generateTooltipStyles(config.tooltipStyle ?? 'dark') as React.CSSProperties;\r\n case 'table':\r\n return generateTableStyles(config.tableStyle ?? 'default') as React.CSSProperties;\r\n case 'menu':\r\n return {} as React.CSSProperties;\r\n case 'modal':\r\n return {} as React.CSSProperties;\r\n default:\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Returns a CSS class string expressing the display-style data attributes.\r\n * Apply this to a container to let CSS selectors respond to the style.\r\n */\r\nexport function getDisplayStyleDataAttrs(style: NiceDisplayStyle): Record<string, string> {\r\n const config = resolveDisplayStyleConfig(style);\r\n return {\r\n 'data-ntd-display-style': style,\r\n 'data-ntd-density': config.density,\r\n 'data-ntd-animation': config.animation,\r\n 'data-ntd-radius': config.radius,\r\n 'data-ntd-button': config.buttonStyle,\r\n 'data-ntd-input': config.inputStyle,\r\n 'data-ntd-card': config.cardStyle,\r\n };\r\n}\r\n\r\n/**\r\n * Describes a display style for UI pickers / documentation.\r\n */\r\nexport interface NiceDisplayStyleInfo {\r\n name: NiceDisplayStyle;\r\n label: string;\r\n description: string;\r\n density: string;\r\n animation: string;\r\n}\r\n\r\n/** Metadata for all built-in display styles. */\r\nexport const NICE_DISPLAY_STYLE_INFO: NiceDisplayStyleInfo[] = [\r\n // ── Core (17) ──\r\n {\r\n name: 'default',\r\n label: 'Default',\r\n description: 'Standard balanced look',\r\n density: 'normal',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'minimal',\r\n label: 'Minimal',\r\n description: 'Subtle shadows, underlined inputs',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'rounded',\r\n label: 'Rounded',\r\n description: 'Large radii, pill tabs, filled inputs',\r\n density: 'comfortable',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'sharp',\r\n label: 'Sharp',\r\n description: 'Zero radius, bordered cards, compact',\r\n density: 'compact',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'glass',\r\n label: 'Glass',\r\n description: 'Glassmorphism with frosted backdrops',\r\n density: 'normal',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'neumorphic',\r\n label: 'Neumorphic',\r\n description: 'Soft raised and sunken surfaces',\r\n density: 'comfortable',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'playful',\r\n label: 'Playful',\r\n description: 'Gradients, bouncy animations, colorful',\r\n density: 'comfortable',\r\n animation: 'playful',\r\n },\r\n {\r\n name: 'enterprise',\r\n label: 'Enterprise',\r\n description: 'Conservative, outlined, striped tables',\r\n density: 'compact',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'modern3d',\r\n label: 'Modern 3D',\r\n description: 'Deep shadows, 3D buttons, elevated',\r\n density: 'normal',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'brutalist',\r\n label: 'Brutalist',\r\n description: 'Raw bold borders, no radius, no shadow',\r\n density: 'normal',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'luxe',\r\n label: 'Luxe',\r\n description: 'Premium feel with gradients and depth',\r\n density: 'comfortable',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'pill',\r\n label: 'Pill',\r\n description: 'Full-radius pill shapes everywhere',\r\n density: 'normal',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'flat',\r\n label: 'Flat',\r\n description: 'No shadows, filled inputs, soft badges',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'editorial',\r\n label: 'Editorial',\r\n description: 'Clean typographic, paper cards',\r\n density: 'comfortable',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'dashboard',\r\n label: 'Dashboard',\r\n description: 'Data-dense, enclosed tabs, striped',\r\n density: 'compact',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'softCloud',\r\n label: 'Soft Cloud',\r\n description: 'Frosted glass, soft iOS-style toggles',\r\n density: 'comfortable',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'cosmic',\r\n label: 'Cosmic',\r\n description: 'Mesh backgrounds, glowing shadows',\r\n density: 'comfortable',\r\n animation: 'dramatic',\r\n },\r\n // ── Serious / Professional (8) ──\r\n {\r\n name: 'corporate',\r\n label: 'Corporate',\r\n description: 'Safe, grey, no flair — boardroom ready',\r\n density: 'compact',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'bank',\r\n label: 'Bank',\r\n description: 'Ultra-conservative, heavy borders',\r\n density: 'compact',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'government',\r\n label: 'Government',\r\n description: 'Accessible, high-contrast, minimal',\r\n density: 'normal',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'military',\r\n label: 'Military',\r\n description: 'Dark, angular, no-nonsense tactical',\r\n density: 'compact',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'legal',\r\n label: 'Legal',\r\n description: 'Typographic, paper-like, document feel',\r\n density: 'comfortable',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'medical',\r\n label: 'Medical',\r\n description: 'Clean clinical, professional blue-toned',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'swiss',\r\n label: 'Swiss',\r\n description: 'Grid-based, Helvetica spirit, precision',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'scandinavian',\r\n label: 'Scandinavian',\r\n description: 'Warm, spacious, hygge-inspired calm',\r\n density: 'spacious',\r\n animation: 'subtle',\r\n },\r\n // ── Artistic / Design (7) ──\r\n {\r\n name: 'bauhaus',\r\n label: 'Bauhaus',\r\n description: 'Geometric, primary colours, strong lines',\r\n density: 'normal',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'notebook',\r\n label: 'Notebook',\r\n description: 'Handwritten feel, paper textures, ruled',\r\n density: 'comfortable',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'origami',\r\n label: 'Origami',\r\n description: 'Folded paper, subtle shadows, layered',\r\n density: 'normal',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'watercolor',\r\n label: 'Watercolor',\r\n description: 'Soft bleeding edges, artistic, dreamy',\r\n density: 'comfortable',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'monochrome',\r\n label: 'Monochrome',\r\n description: 'Pure black & white, typography focus',\r\n density: 'normal',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'paper',\r\n label: 'Paper',\r\n description: 'Minimal white, subtle shadows, like stationery',\r\n density: 'comfortable',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'zen',\r\n label: 'Zen',\r\n description: 'Ultra-minimal, whitespace, meditative calm',\r\n density: 'spacious',\r\n animation: 'subtle',\r\n },\r\n // ── Tech / Retro (9) ──\r\n {\r\n name: 'terminal',\r\n label: 'Terminal',\r\n description: 'Monospace, dark, retro-computing green',\r\n density: 'compact',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'hacker',\r\n label: 'Hacker',\r\n description: 'Matrix-style, neon green on black',\r\n density: 'compact',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'retro8bit',\r\n label: '8-bit Retro',\r\n description: 'Pixel art, chunky borders, game boy era',\r\n density: 'normal',\r\n animation: 'none',\r\n },\r\n {\r\n name: 'synthwave',\r\n label: 'Synthwave',\r\n description: '80s synth, neon grids, chrome gradients',\r\n density: 'normal',\r\n animation: 'dramatic',\r\n },\r\n {\r\n name: 'cyberpunk',\r\n label: 'Cyberpunk',\r\n description: 'Angular, neon, glitch aesthetics, dark',\r\n density: 'compact',\r\n animation: 'dramatic',\r\n },\r\n {\r\n name: 'steampunk',\r\n label: 'Steampunk',\r\n description: 'Brass, gears, Victorian-era technology',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'vapor',\r\n label: 'Vaporwave',\r\n description: '80s/90s aesthetics, pink/teal gradients',\r\n density: 'comfortable',\r\n animation: 'playful',\r\n },\r\n {\r\n name: 'neon',\r\n label: 'Neon',\r\n description: 'Bright glowing outlines on dark surfaces',\r\n density: 'normal',\r\n animation: 'dramatic',\r\n },\r\n {\r\n name: 'windows95',\r\n label: 'Windows 95',\r\n description: 'Chunky beveled 3D, classic OS nostalgia',\r\n density: 'compact',\r\n animation: 'none',\r\n },\r\n // ── Design Systems (9) ──\r\n {\r\n name: 'material',\r\n label: 'Material',\r\n description: 'Google Material Design — depth & motion',\r\n density: 'normal',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'fluent',\r\n label: 'Fluent',\r\n description: 'Microsoft Fluent — acrylic, reveal, depth',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'cupertino',\r\n label: 'Cupertino',\r\n description: 'Apple iOS/macOS style — frosted, rounded',\r\n density: 'comfortable',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'ant',\r\n label: 'Ant Design',\r\n description: 'Ant Design — clean, reliable, professional',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'bootstrap',\r\n label: 'Bootstrap',\r\n description: 'Bootstrap-like — rounded, striped tables',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'chakra',\r\n label: 'Chakra',\r\n description: 'Chakra UI — accessible, clean, modern',\r\n density: 'normal',\r\n animation: 'normal',\r\n },\r\n {\r\n name: 'notion',\r\n label: 'Notion',\r\n description: 'Notion-like — text-focused, minimal chrome',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'linear',\r\n label: 'Linear',\r\n description: 'Linear app — sleek, dark, polished',\r\n density: 'compact',\r\n animation: 'subtle',\r\n },\r\n {\r\n name: 'vercel',\r\n label: 'Vercel',\r\n description: 'Vercel/Next.js — black/white, sharp, modern',\r\n density: 'normal',\r\n animation: 'subtle',\r\n },\r\n // ── Fun / Silly (9) ──\r\n {\r\n name: 'candy',\r\n label: 'Candy',\r\n description: 'Sweet pastels, rounded, sugar rush!',\r\n density: 'comfortable',\r\n animation: 'playful',\r\n },\r\n {\r\n name: 'bubblegum',\r\n label: 'Bubblegum',\r\n description: 'Pink puffy bubbles, extremely round',\r\n density: 'spacious',\r\n animation: 'playful',\r\n },\r\n {\r\n name: 'cartoon',\r\n label: 'Cartoon',\r\n description: 'Thick outlines, bold colours, exaggerated',\r\n density: 'comfortable',\r\n animation: 'playful',\r\n },\r\n {\r\n name: 'kawaii',\r\n label: 'Kawaii',\r\n description: 'Cute, pastel, sparkly, UwU aesthetic',\r\n density: 'spacious',\r\n animation: 'dramatic',\r\n },\r\n {\r\n name: 'circus',\r\n label: 'Circus',\r\n description: 'Bold stripes, loud, step right up!',\r\n density: 'spacious',\r\n animation: 'dramatic',\r\n },\r\n {\r\n name: 'gaming',\r\n label: 'Gaming',\r\n description: 'Dark, neon accents, angular, RGB everything',\r\n density: 'normal',\r\n animation: 'dramatic',\r\n },\r\n {\r\n name: 'kiddo',\r\n label: 'Kiddo',\r\n description: 'Colourful, puffy, child-friendly, big touch',\r\n density: 'spacious',\r\n animation: 'playful',\r\n },\r\n {\r\n name: 'disco',\r\n label: 'Disco',\r\n description: 'Flashing, spinning, Saturday night fever 🕺',\r\n density: 'comfortable',\r\n animation: 'dramatic',\r\n },\r\n {\r\n name: 'clown',\r\n label: 'Clown',\r\n description: 'Maximum chaos, honk honk, pure madness 🤡',\r\n density: 'spacious',\r\n animation: 'dramatic',\r\n },\r\n];\r\n","/**\r\n * Shared helpers for the `displayMode` prop on form-field controls.\r\n *\r\n * When `displayMode` is `true`, a control should render as a label-style,\r\n * clickable text representation of its value (no input chrome). Clicking it\r\n * (or focusing via Tab + Enter) should switch the control into the regular\r\n * editable rendering for in-place editing — this replaces the standalone\r\n * NiceInPlaceEditor and gives every base control the \"click-to-edit\" pattern.\r\n */\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseDisplayModeOptions {\r\n enabled?: boolean;\r\n readOnly?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface UseDisplayModeResult {\r\n /** True when the control should render as a clickable label (not the editor). */\r\n isDisplay: boolean;\r\n /** Switches into edit mode (focus the editor on next render). */\r\n enterEdit: () => void;\r\n /** Switches back into display mode. */\r\n exitEdit: () => void;\r\n /** Ref-callback that, when set on the editable input/textarea/etc., focuses it on enter. */\r\n autoFocusRef: (node: HTMLElement | null) => void;\r\n}\r\n\r\n/**\r\n * Tracks edit/display state for a control that supports `displayMode`.\r\n * The editor is rendered when display mode is off OR the user has clicked\r\n * to edit. On blur the control returns to display mode.\r\n */\r\nexport function useDisplayModeEdit({\r\n enabled,\r\n readOnly,\r\n disabled,\r\n}: UseDisplayModeOptions): UseDisplayModeResult {\r\n const [editing, setEditing] = useState(false);\r\n const wantFocusRef = useRef(false);\r\n\r\n const enterEdit = useCallback(() => {\r\n if (readOnly || disabled || !enabled) {\r\n return;\r\n }\r\n wantFocusRef.current = true;\r\n setEditing(true);\r\n }, [readOnly, disabled, enabled]);\r\n\r\n const exitEdit = useCallback(() => {\r\n setEditing(false);\r\n }, []);\r\n\r\n const autoFocusRef = useCallback((node: HTMLElement | null) => {\r\n if (node && wantFocusRef.current) {\r\n wantFocusRef.current = false;\r\n // Defer to the next frame so layout/styling settle before focus.\r\n requestAnimationFrame(() => {\r\n node.focus();\r\n if (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement) {\r\n try {\r\n node.select();\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n });\r\n }\r\n }, []);\r\n\r\n // If the control becomes disabled/readOnly while editing, fall back to display.\r\n useEffect(() => {\r\n if ((readOnly || disabled) && editing) {\r\n setEditing(false);\r\n }\r\n }, [readOnly, disabled, editing]);\r\n\r\n return {\r\n isDisplay: !!enabled && !editing,\r\n enterEdit,\r\n exitEdit,\r\n autoFocusRef,\r\n };\r\n}\r\n\r\nexport interface DisplayModeViewProps {\r\n value: React.ReactNode;\r\n placeholder?: React.ReactNode;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n onActivate: () => void;\r\n className?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\n/**\r\n * Renders a clickable label-style view of the value. Pressing Enter or Space\r\n * (when focused) activates edit mode just like clicking it.\r\n */\r\nexport const DisplayModeView: React.FC<DisplayModeViewProps> = ({\r\n value,\r\n placeholder,\r\n disabled,\r\n readOnly,\r\n onActivate,\r\n className,\r\n ariaLabel,\r\n}) => {\r\n const isEmpty = value == null || value === '';\r\n const handleKey = (e: React.KeyboardEvent<HTMLSpanElement>) => {\r\n if (disabled || readOnly) {\r\n return;\r\n }\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onActivate();\r\n }\r\n };\r\n return (\r\n <span\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n className={`nice-display-value ${isEmpty ? 'nice-display-value--empty' : ''} ${\r\n disabled ? 'nice-display-value--disabled' : ''\r\n } ${readOnly ? 'nice-display-value--readonly' : ''} ${className || ''}`.trim()}\r\n onClick={() => {\r\n if (!disabled && !readOnly) {\r\n onActivate();\r\n }\r\n }}\r\n onKeyDown={handleKey}\r\n aria-label={ariaLabel}\r\n aria-disabled={disabled || undefined}\r\n >\r\n {isEmpty ? (placeholder ?? '—') : value}\r\n </span>\r\n );\r\n};\r\n","/**\r\n * sanitizeHtml — lightweight HTML sanitizer for dangerouslySetInnerHTML.\r\n *\r\n * Strips known XSS vectors (script tags, event handlers, javascript: URIs)\r\n * without requiring an external dependency. For full-featured sanitization,\r\n * consider using DOMPurify.\r\n */\r\n\r\n/** Remove <script> tags, event handler attributes, and dangerous URIs from HTML. */\r\nexport function sanitizeHtml(html: string): string {\r\n if (!html) {\r\n return '';\r\n }\r\n let result = html;\r\n // Remove script tags and their content\r\n result = result.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\r\n // Remove event handler attributes (onclick, onerror, onload, etc.)\r\n result = result.replace(/\\s+on\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '');\r\n // Remove javascript: and vbscript: URIs in href/src/action attributes\r\n result = result.replace(\r\n /(href|src|action)\\s*=\\s*(?:\"javascript:[^\"]*\"|'javascript:[^']*')/gi,\r\n '$1=\"\"',\r\n );\r\n result = result.replace(\r\n /(href|src|action)\\s*=\\s*(?:\"vbscript:[^\"]*\"|'vbscript:[^']*')/gi,\r\n '$1=\"\"',\r\n );\r\n // Remove <iframe>, <object>, <embed>, <form> tags\r\n result = result.replace(/<\\/?(iframe|object|embed|form)\\b[^>]*>/gi, '');\r\n return result;\r\n}\r\n\r\n/**\r\n * Validate a URL for use in href/src attributes.\r\n * Allows only http:, https:, data:image, blob:, and relative paths.\r\n * Rejects javascript:, vbscript:, data:text/html, and other dangerous schemes.\r\n */\r\nexport function isSafeUrl(url: string): boolean {\r\n const trimmed = url.trim().toLowerCase();\r\n if (\r\n trimmed.startsWith('http://') ||\r\n trimmed.startsWith('https://') ||\r\n trimmed.startsWith('blob:')\r\n ) {\r\n return true;\r\n }\r\n if (trimmed.startsWith('data:image/')) {\r\n return true;\r\n }\r\n if (trimmed.startsWith('/') || trimmed.startsWith('./') || trimmed.startsWith('../')) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\nimport React, { createContext, useContext, useCallback } from 'react';\r\n\r\n// ============================================================\r\n// Built-in SVG icon paths (minimal set for UI chrome)\r\n// ============================================================\r\nconst BUILTIN_PATHS: Record<string, string> = {\r\n // Navigation\r\n 'chevron-down': 'M6 9l6 6 6-6',\r\n 'chevron-up': 'M18 15l-6-6-6 6',\r\n 'chevron-left': 'M15 18l-6-6 6-6',\r\n 'chevron-right': 'M9 6l6 6-6 6',\r\n 'arrow-left': 'M19 12H5m0 0l7 7m-7-7l7-7',\r\n 'arrow-right': 'M5 12h14m0 0l-7-7m7 7l-7 7',\r\n 'arrow-up': 'M12 19V5m0 0l-7 7m7-7l7 7',\r\n 'arrow-down': 'M12 5v14m0 0l7-7m-7 7l-7-7',\r\n\r\n // Actions\r\n close: 'M18 6L6 18M6 6l12 12',\r\n plus: 'M12 5v14m-7-7h14',\r\n minus: 'M5 12h14',\r\n check: 'M5 13l4 4L19 7',\r\n edit: 'M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7M18.5 2.5a2.121 2.121 0 113 3L12 15l-4 1 1-4 9.5-9.5z',\r\n trash:\r\n 'M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16',\r\n copy: 'M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z',\r\n download: 'M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4',\r\n upload: 'M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12',\r\n refresh: 'M4 4v5h5M20 20v-5h-5M20.49 9A9 9 0 005.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 013.51 15',\r\n\r\n // UI\r\n search: 'M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z',\r\n filter:\r\n 'M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z',\r\n 'sort-asc': 'M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12',\r\n 'sort-desc': 'M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4',\r\n menu: 'M4 6h16M4 12h16M4 18h16',\r\n 'more-vertical': 'M12 5v.01M12 12v.01M12 19v.01',\r\n 'more-horizontal': 'M5 12h.01M12 12h.01M19 12h.01',\r\n settings:\r\n 'M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z',\r\n eye: 'M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z M15 12a3 3 0 11-6 0 3 3 0 016 0z',\r\n 'eye-off':\r\n 'M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 11-4.24-4.24 M1 1l22 22',\r\n lock: 'M19 11H5a2 2 0 00-2 2v7a2 2 0 002 2h14a2 2 0 002-2v-7a2 2 0 00-2-2zm-3-4a4 4 0 10-8 0v4h8V7z',\r\n\r\n // Status\r\n info: 'M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',\r\n warning:\r\n 'M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z',\r\n error: 'M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z',\r\n success: 'M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z',\r\n help: 'M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',\r\n\r\n // Content\r\n calendar:\r\n 'M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z',\r\n clock: 'M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z',\r\n file: 'M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z',\r\n folder: 'M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z',\r\n image:\r\n 'M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z',\r\n link: 'M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1',\r\n mail: 'M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z',\r\n phone:\r\n 'M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z',\r\n user: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z',\r\n users:\r\n 'M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z',\r\n home: 'M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6',\r\n star: 'M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z',\r\n heart:\r\n 'M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z',\r\n bell: 'M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9',\r\n grip: 'M4 6h2m4 0h2m4 0h2M4 12h2m4 0h2m4 0h2M4 18h2m4 0h2m4 0h2',\r\n\r\n // Media\r\n play: 'M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z M21 12a9 9 0 11-18 0 9 9 0 0118 0z',\r\n pause: 'M10 9v6m4-6v6m7-3a9 9 0 11-18 0 9 9 0 0118 0z',\r\n stop: 'M21 12a9 9 0 11-18 0 9 9 0 0118 0z M9 10a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4z',\r\n\r\n // Toggle\r\n expand:\r\n 'M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4',\r\n collapse:\r\n 'M9 9V5m0 4H5m4 0L4 4m11 5h4m-4 0V5m0 4l5-5M9 15v4m0-4H5m4 0l-5 5m15-5h-4m4 0v4m0-4l-5 5',\r\n 'external-link': 'M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14',\r\n};\r\n\r\n// ============================================================\r\n// NiceIcon component — renders built-in or resolved icons\r\n// ============================================================\r\n/** T-shirt size for icons mapped to pixel values (xs=12, sm=16, md=20, lg=24, xl=32). */\r\nexport type NiceIconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nconst ICON_SIZES: Record<NiceIconSize, number> = {\r\n xs: 12,\r\n sm: 16,\r\n md: 20,\r\n lg: 24,\r\n xl: 32,\r\n};\r\n\r\n/** Props for the {@link NiceIcon} component. */\r\nexport interface NiceIconProps {\r\n /** Icon name (resolved via provider) or React node */\r\n name: string;\r\n size?: NiceIconSize | number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n color?: string;\r\n title?: string;\r\n onClick?: (e: React.MouseEvent) => void;\r\n}\r\n\r\n/**\r\n * Resolver function used by {@link NiceIconProvider} to map icon names to React nodes.\r\n * Return `undefined` to fall back to built-in SVG icons.\r\n */\r\nexport type NiceIconResolver = (name: string, size: number) => React.ReactNode | undefined;\r\n\r\n// ============================================================\r\n// Context\r\n// ============================================================\r\ninterface NiceIconContextValue {\r\n resolver?: NiceIconResolver;\r\n}\r\n\r\nconst NiceIconContext = createContext<NiceIconContextValue>({});\r\n\r\n/** Props for the {@link NiceIconProvider}. */\r\nexport interface NiceIconProviderProps {\r\n /** Custom icon resolver (e.g. FontAwesome, Material Icons) */\r\n resolver: NiceIconResolver;\r\n children: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Provides a custom icon resolver to all nested NiceToDev components.\r\n * Use this to plug in icon libraries like FontAwesome or Material Icons.\r\n */\r\nexport const NiceIconProvider: React.FC<NiceIconProviderProps> = ({ resolver, children }) => {\r\n return React.createElement(NiceIconContext.Provider, { value: { resolver } }, children);\r\n};\r\n\r\n// ============================================================\r\n// Built-in SVG renderer\r\n// ============================================================\r\nfunction BuiltinSvgIcon({\r\n path,\r\n size,\r\n className,\r\n style,\r\n color,\r\n title,\r\n onClick,\r\n}: {\r\n path: string;\r\n size: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n color?: string;\r\n title?: string;\r\n onClick?: (e: React.MouseEvent) => void;\r\n}) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={color || 'currentColor'}\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={`nice-icon ${className || ''}`}\r\n style={style}\r\n role={title ? 'img' : 'presentation'}\r\n aria-label={title}\r\n aria-hidden={!title}\r\n onClick={onClick}\r\n >\r\n {title && <title>{title}</title>}\r\n <path d={path} />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================\r\n// NiceIcon — main icon component\r\n// ============================================================\r\n/**\r\n * Renders an icon — tries the provider's custom resolver first, then falls back to built-in SVG icons.\r\n * If the name is unresolvable, renders nothing.\r\n */\r\nexport const NiceIcon: React.FC<NiceIconProps> = ({\r\n name,\r\n size = 'md',\r\n className,\r\n style,\r\n color,\r\n title,\r\n onClick,\r\n}) => {\r\n const { resolver } = useContext(NiceIconContext);\r\n const pxSize = typeof size === 'number' ? size : ICON_SIZES[size];\r\n\r\n // 1. Try custom resolver first\r\n if (resolver) {\r\n const resolved = resolver(name, pxSize);\r\n if (resolved) {\r\n return (\r\n <span className={`nice-icon-wrap ${className || ''}`} style={style} onClick={onClick}>\r\n {resolved}\r\n </span>\r\n );\r\n }\r\n }\r\n\r\n // 2. Fall back to built-in SVG\r\n const path = BUILTIN_PATHS[name];\r\n if (path) {\r\n return (\r\n <BuiltinSvgIcon\r\n path={path}\r\n size={pxSize}\r\n className={className}\r\n style={style}\r\n color={color}\r\n title={title}\r\n onClick={onClick}\r\n />\r\n );\r\n }\r\n\r\n // 3. Unknown icon — render nothing\r\n return null;\r\n};\r\n\r\n// ============================================================\r\n// Hook for components to resolve icons\r\n// ============================================================\r\n/**\r\n * Hook that provides a `renderIcon` helper for resolving icon names or React nodes.\r\n * Used internally by components that accept `icon: string | ReactNode` props.\r\n */\r\nexport function useNiceIcon() {\r\n const { resolver } = useContext(NiceIconContext);\r\n\r\n const renderIcon = useCallback(\r\n (\r\n icon: React.ReactNode | string | undefined,\r\n size: NiceIconSize | number = 'md',\r\n ): React.ReactNode => {\r\n if (icon === undefined || icon === null) {\r\n return null;\r\n }\r\n if (typeof icon !== 'string') {\r\n return icon;\r\n } // Already a ReactNode\r\n return React.createElement(NiceIcon, { name: icon, size });\r\n },\r\n [resolver],\r\n );\r\n\r\n return { renderIcon };\r\n}\r\n\r\n/** Array of all 78 built-in icon names available without a custom resolver. */\r\nexport const NICE_BUILTIN_ICONS = Object.keys(BUILTIN_PATHS);\r\n","import { useId, useState, useRef, useEffect, useCallback } from 'react';\r\n\r\n/**\r\n * Returns `true` when the primary pointer is coarse (touch device).\r\n * Listens for media-query changes so it reacts to device switching.\r\n */\r\nexport function useIsTouchDevice(): boolean {\r\n const [isTouch, setIsTouch] = useState(() =>\r\n typeof window !== 'undefined' ? window.matchMedia('(pointer: coarse)').matches : false,\r\n );\r\n useEffect(() => {\r\n const mq = window.matchMedia('(pointer: coarse)');\r\n setIsTouch(mq.matches);\r\n const handler = (e: MediaQueryListEvent) => setIsTouch(e.matches);\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, []);\r\n return isTouch;\r\n}\r\n\r\n/**\r\n * Tracks the current input mode by watching `touchstart` and `pointerdown` events.\r\n * @returns `'touch'` after a touch event, `'mouse'` after a mouse/trackpad event.\r\n */\r\nexport function useInputMode(): 'touch' | 'mouse' {\r\n const [mode, setMode] = useState<'touch' | 'mouse'>(() =>\r\n typeof window !== 'undefined' && window.matchMedia('(pointer: coarse)').matches\r\n ? 'touch'\r\n : 'mouse',\r\n );\r\n useEffect(() => {\r\n const onTouch = () => setMode('touch');\r\n const onMouse = (e: PointerEvent) => {\r\n if (e.pointerType === 'mouse') {\r\n setMode('mouse');\r\n }\r\n };\r\n window.addEventListener('touchstart', onTouch, { passive: true, capture: true });\r\n window.addEventListener('pointerdown', onMouse, { capture: true });\r\n return () => {\r\n window.removeEventListener('touchstart', onTouch, { capture: true } as EventListenerOptions);\r\n window.removeEventListener('pointerdown', onMouse, { capture: true } as EventListenerOptions);\r\n };\r\n }, []);\r\n return mode;\r\n}\r\n\r\n/**\r\n * Returns pointer event handlers that trigger `callback` after a sustained touch of `holdMs` milliseconds.\r\n * Mouse/pen interactions are ignored — this is touch-only.\r\n * @param callback - Function invoked after the hold duration.\r\n * @param holdMs - Hold duration in milliseconds (default `500`).\r\n */\r\nexport function useLongPress(\r\n callback: () => void,\r\n holdMs = 500,\r\n): {\r\n onPointerDown: (e: React.PointerEvent) => void;\r\n onPointerUp: () => void;\r\n onPointerCancel: () => void;\r\n} {\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const clear = useCallback(() => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n }, []);\r\n const onPointerDown = useCallback(\r\n (e: React.PointerEvent) => {\r\n if (e.pointerType !== 'touch') {\r\n return;\r\n }\r\n clear();\r\n timerRef.current = setTimeout(callback, holdMs);\r\n },\r\n [callback, holdMs, clear],\r\n );\r\n return { onPointerDown, onPointerUp: clear, onPointerCancel: clear };\r\n}\r\n\r\n/**\r\n * Returns a stable unique HTML id. Passes through `externalId` when provided,\r\n * otherwise generates one via React's `useId()`.\r\n * @param externalId - Optional id explicitly set by the consumer.\r\n */\r\nexport function useControlId(externalId?: string): string {\r\n const generated = useId();\r\n return externalId || generated;\r\n}\r\n\r\n/**\r\n * Debounces a rapidly-changing value. The returned value only updates\r\n * after the source has been stable for `delayMs` milliseconds.\r\n * @param value - Source value to debounce.\r\n * @param delayMs - Debounce delay in milliseconds.\r\n */\r\nexport function useDebouncedValue<T>(value: T, delayMs: number): T {\r\n const [debounced, setDebounced] = useState(value);\r\n useEffect(() => {\r\n const timer = setTimeout(() => setDebounced(value), delayMs);\r\n return () => clearTimeout(timer);\r\n }, [value, delayMs]);\r\n return debounced;\r\n}\r\n\r\n/**\r\n * Calls `handler` whenever a `mousedown` or `touchstart` event occurs outside the referenced element.\r\n * @param ref - React ref to the element whose outside clicks should be detected.\r\n * @param handler - Callback invoked on outside click.\r\n */\r\nexport function useClickOutside(ref: React.RefObject<HTMLElement | null>, handler: () => void) {\r\n useEffect(() => {\r\n const listener = (e: MouseEvent | TouchEvent) => {\r\n if (!ref.current || ref.current.contains(e.target as Node)) {\r\n return;\r\n }\r\n handler();\r\n };\r\n document.addEventListener('mousedown', listener);\r\n document.addEventListener('touchstart', listener);\r\n return () => {\r\n document.removeEventListener('mousedown', listener);\r\n document.removeEventListener('touchstart', listener);\r\n };\r\n }, [ref, handler]);\r\n}\r\n\r\n/**\r\n * Traps keyboard focus within the referenced container while `active` is `true`.\r\n * On activation the first focusable element receives focus.\r\n * `Tab` / `Shift+Tab` cycle through focusable children without leaving the container.\r\n * @param ref - Container element ref.\r\n * @param active - Enable/disable the trap.\r\n */\r\nexport function useFocusTrap(ref: React.RefObject<HTMLElement | null>, active: boolean) {\r\n useEffect(() => {\r\n if (!active || !ref.current) {\r\n return;\r\n }\r\n const el = ref.current;\r\n // Store previously focused element for restoration\r\n const previouslyFocused = document.activeElement as HTMLElement | null;\r\n\r\n const focusable = el.querySelectorAll<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n\r\n const trap = (e: KeyboardEvent) => {\r\n if (e.key !== 'Tab') {\r\n return;\r\n }\r\n if (e.shiftKey) {\r\n if (document.activeElement === first) {\r\n e.preventDefault();\r\n last?.focus();\r\n }\r\n } else {\r\n if (document.activeElement === last) {\r\n e.preventDefault();\r\n first?.focus();\r\n }\r\n }\r\n };\r\n\r\n first?.focus();\r\n el.addEventListener('keydown', trap);\r\n return () => {\r\n el.removeEventListener('keydown', trap);\r\n // Restore focus to previously focused element\r\n previouslyFocused?.focus?.();\r\n };\r\n }, [ref, active]);\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════════\r\n// Dark Mode Hooks\r\n// ═══════════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface UseDarkModeOptions {\r\n /** Default mode if no preference stored */\r\n defaultMode?: 'light' | 'dark' | 'system';\r\n /** localStorage key for persisting preference */\r\n storageKey?: string;\r\n /** CSS class applied to documentElement for dark mode */\r\n darkClass?: string;\r\n /** CSS class applied to documentElement for light mode */\r\n lightClass?: string;\r\n}\r\n\r\nexport interface UseDarkModeReturn {\r\n /** Current resolved mode ('light' or 'dark') */\r\n isDark: boolean;\r\n /** User preference ('light', 'dark', or 'system') */\r\n mode: 'light' | 'dark' | 'system';\r\n /** System preference detected via prefers-color-scheme */\r\n systemPreference: 'light' | 'dark';\r\n /** Set mode to light */\r\n setLight: () => void;\r\n /** Set mode to dark */\r\n setDark: () => void;\r\n /** Set mode to follow system preference */\r\n setSystem: () => void;\r\n /** Toggle between light and dark (ignores system) */\r\n toggle: () => void;\r\n}\r\n\r\n/**\r\n * Hook for managing dark mode with system preference detection and persistence.\r\n * Automatically applies CSS classes to documentElement.\r\n *\r\n * @example\r\n * ```tsx\r\n * const { isDark, toggle, mode, setSystem } = useDarkMode();\r\n * return (\r\n * <button onClick={toggle}>\r\n * {isDark ? '☀️ Light' : '🌙 Dark'}\r\n * </button>\r\n * );\r\n * ```\r\n */\r\nexport function useDarkMode(options: UseDarkModeOptions = {}): UseDarkModeReturn {\r\n const {\r\n defaultMode = 'system',\r\n storageKey = 'nice-color-mode',\r\n darkClass = 'nice-dark',\r\n lightClass = 'nice-light',\r\n } = options;\r\n\r\n // Detect system preference\r\n const [systemPreference, setSystemPreference] = useState<'light' | 'dark'>(() => {\r\n if (typeof window === 'undefined') {\r\n return 'light';\r\n }\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\r\n });\r\n\r\n // User preference from storage or default\r\n const [mode, setMode] = useState<'light' | 'dark' | 'system'>(() => {\r\n if (typeof window === 'undefined') {\r\n return defaultMode;\r\n }\r\n const stored = localStorage.getItem(storageKey);\r\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\r\n return stored;\r\n }\r\n return defaultMode;\r\n });\r\n\r\n // Listen for system preference changes\r\n useEffect(() => {\r\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handler = (e: MediaQueryListEvent) => setSystemPreference(e.matches ? 'dark' : 'light');\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, []);\r\n\r\n // Resolve actual dark state\r\n const isDark = mode === 'system' ? systemPreference === 'dark' : mode === 'dark';\r\n\r\n // Apply classes to document\r\n useEffect(() => {\r\n const root = document.documentElement;\r\n if (isDark) {\r\n root.classList.add(darkClass);\r\n root.classList.remove(lightClass);\r\n } else {\r\n root.classList.add(lightClass);\r\n root.classList.remove(darkClass);\r\n }\r\n return () => {\r\n root.classList.remove(darkClass, lightClass);\r\n };\r\n }, [isDark, darkClass, lightClass]);\r\n\r\n // Persist preference\r\n useEffect(() => {\r\n localStorage.setItem(storageKey, mode);\r\n }, [mode, storageKey]);\r\n\r\n const setLight = useCallback(() => setMode('light'), []);\r\n const setDark = useCallback(() => setMode('dark'), []);\r\n const setSystem = useCallback(() => setMode('system'), []);\r\n const toggle = useCallback(\r\n () =>\r\n setMode((prev) => {\r\n if (prev === 'system') {\r\n return systemPreference === 'dark' ? 'light' : 'dark';\r\n }\r\n return prev === 'dark' ? 'light' : 'dark';\r\n }),\r\n [systemPreference],\r\n );\r\n\r\n return { isDark, mode, systemPreference, setLight, setDark, setSystem, toggle };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════════\r\n// Brand Color Extraction\r\n// ═══════════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface BrandColors {\r\n /** Primary brand color (most dominant) */\r\n primary: string;\r\n /** Secondary brand color */\r\n secondary: string;\r\n /** Accent color (most vibrant) */\r\n accent: string;\r\n /** All extracted colors sorted by dominance */\r\n palette: string[];\r\n /** Suggested text color for primary background */\r\n primaryText: string;\r\n /** Suggested text color for secondary background */\r\n secondaryText: string;\r\n}\r\n\r\nexport interface UseBrandColorsOptions {\r\n /** Number of colors to extract (default: 5) */\r\n colorCount?: number;\r\n /** Quality of color extraction 1-10 (default: 5) */\r\n quality?: number;\r\n}\r\n\r\n/**\r\n * Extracts dominant colors from an image to generate brand colors.\r\n * Uses canvas for color sampling and k-means clustering for color extraction.\r\n *\r\n * @example\r\n * ```tsx\r\n * const { colors, loading, error } = useBrandColors('/logo.png');\r\n * if (colors) {\r\n * console.log('Primary:', colors.primary);\r\n * console.log('Palette:', colors.palette);\r\n * }\r\n * ```\r\n */\r\nexport function useBrandColors(\r\n imageSource: string | HTMLImageElement | null,\r\n options: UseBrandColorsOptions = {},\r\n): {\r\n colors: BrandColors | null;\r\n loading: boolean;\r\n error: string | null;\r\n} {\r\n const { colorCount = 5, quality = 5 } = options;\r\n const [colors, setColors] = useState<BrandColors | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!imageSource) {\r\n setColors(null);\r\n return;\r\n }\r\n\r\n const extractColors = async () => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n // Load image\r\n let img: HTMLImageElement;\r\n if (typeof imageSource === 'string') {\r\n img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n await new Promise<void>((resolve, reject) => {\r\n img.onload = () => resolve();\r\n img.onerror = () => reject(new Error('Failed to load image'));\r\n img.src = imageSource;\r\n });\r\n } else {\r\n img = imageSource;\r\n }\r\n\r\n // Create canvas and draw image\r\n const canvas = document.createElement('canvas');\r\n const maxSize = 100; // Downsample for performance\r\n const scale = Math.min(maxSize / img.width, maxSize / img.height, 1);\r\n canvas.width = img.width * scale;\r\n canvas.height = img.height * scale;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n throw new Error('Canvas context unavailable');\r\n }\r\n\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n // Sample pixels\r\n const pixels: [number, number, number][] = [];\r\n const step = Math.max(1, Math.floor(11 - quality));\r\n for (let i = 0; i < imageData.data.length; i += 4 * step) {\r\n const r = imageData.data[i];\r\n const g = imageData.data[i + 1];\r\n const b = imageData.data[i + 2];\r\n const a = imageData.data[i + 3];\r\n // Skip transparent and near-white/black pixels\r\n if (a > 200) {\r\n const brightness = (r + g + b) / 3;\r\n if (brightness > 20 && brightness < 235) {\r\n pixels.push([r, g, b]);\r\n }\r\n }\r\n }\r\n\r\n if (pixels.length === 0) {\r\n throw new Error('No valid colors found in image');\r\n }\r\n\r\n // Simple k-means clustering\r\n const extractedColors = kMeansClustering(pixels, colorCount);\r\n\r\n // Sort by saturation/vibrancy\r\n const sortedColors = extractedColors.sort((a, b) => {\r\n const satA = Math.max(...a) - Math.min(...a);\r\n const satB = Math.max(...b) - Math.min(...b);\r\n return satB - satA;\r\n });\r\n\r\n const toHex = (rgb: [number, number, number]) =>\r\n '#' + rgb.map((c) => Math.round(c).toString(16).padStart(2, '0')).join('');\r\n\r\n const getContrastText = (rgb: [number, number, number]) => {\r\n const lum = (0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]) / 255;\r\n return lum > 0.5 ? '#000000' : '#ffffff';\r\n };\r\n\r\n // Sort by dominance (count-based would be more accurate but this is simpler)\r\n const dominantSorted = sortedColors.slice();\r\n\r\n setColors({\r\n primary: toHex(dominantSorted[0] || [100, 100, 100]),\r\n secondary: toHex(dominantSorted[1] || dominantSorted[0] || [150, 150, 150]),\r\n accent: toHex(sortedColors[0] || [100, 100, 100]), // Most vibrant\r\n palette: dominantSorted.map(toHex),\r\n primaryText: getContrastText(dominantSorted[0] || [100, 100, 100]),\r\n secondaryText: getContrastText(dominantSorted[1] || dominantSorted[0] || [150, 150, 150]),\r\n });\r\n } catch (e) {\r\n setError(e instanceof Error ? e.message : 'Unknown error');\r\n setColors(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n extractColors();\r\n }, [imageSource, colorCount, quality]);\r\n\r\n return { colors, loading, error };\r\n}\r\n\r\n/**\r\n * Simple k-means clustering for color extraction.\r\n */\r\nfunction kMeansClustering(\r\n pixels: [number, number, number][],\r\n k: number,\r\n maxIterations = 20,\r\n): [number, number, number][] {\r\n if (pixels.length <= k) {\r\n return pixels;\r\n }\r\n\r\n // Initialize centroids randomly\r\n const centroids: [number, number, number][] = [];\r\n const used = new Set<number>();\r\n while (centroids.length < k) {\r\n const idx = Math.floor(Math.random() * pixels.length);\r\n if (!used.has(idx)) {\r\n used.add(idx);\r\n centroids.push([...pixels[idx]]);\r\n }\r\n }\r\n\r\n for (let iter = 0; iter < maxIterations; iter++) {\r\n // Assign pixels to nearest centroid\r\n const clusters: [number, number, number][][] = Array.from({ length: k }, () => []);\r\n\r\n for (const pixel of pixels) {\r\n let minDist = Infinity;\r\n let closest = 0;\r\n for (let c = 0; c < k; c++) {\r\n const dist = Math.sqrt(\r\n (pixel[0] - centroids[c][0]) ** 2 +\r\n (pixel[1] - centroids[c][1]) ** 2 +\r\n (pixel[2] - centroids[c][2]) ** 2,\r\n );\r\n if (dist < minDist) {\r\n minDist = dist;\r\n closest = c;\r\n }\r\n }\r\n clusters[closest].push(pixel);\r\n }\r\n\r\n // Update centroids\r\n let changed = false;\r\n for (let c = 0; c < k; c++) {\r\n if (clusters[c].length === 0) {\r\n continue;\r\n }\r\n const newCentroid: [number, number, number] = [0, 0, 0];\r\n for (const p of clusters[c]) {\r\n newCentroid[0] += p[0];\r\n newCentroid[1] += p[1];\r\n newCentroid[2] += p[2];\r\n }\r\n newCentroid[0] /= clusters[c].length;\r\n newCentroid[1] /= clusters[c].length;\r\n newCentroid[2] /= clusters[c].length;\r\n\r\n if (\r\n Math.abs(newCentroid[0] - centroids[c][0]) > 1 ||\r\n Math.abs(newCentroid[1] - centroids[c][1]) > 1 ||\r\n Math.abs(newCentroid[2] - centroids[c][2]) > 1\r\n ) {\r\n changed = true;\r\n }\r\n centroids[c] = newCentroid;\r\n }\r\n\r\n if (!changed) {\r\n break;\r\n }\r\n }\r\n\r\n return centroids;\r\n}\r\n\r\n/**\r\n * Generate a cohesive color palette from a single brand color.\r\n * Creates variations for backgrounds, text, and accents.\r\n *\r\n * @example\r\n * ```tsx\r\n * const palette = generatePaletteFromColor('#3b82f6');\r\n * // { light: '#dbeafe', base: '#3b82f6', dark: '#1e40af', ... }\r\n * ```\r\n */\r\nexport function generatePaletteFromColor(baseColor: string): {\r\n lightest: string;\r\n lighter: string;\r\n light: string;\r\n base: string;\r\n dark: string;\r\n darker: string;\r\n darkest: string;\r\n text: string;\r\n textInverse: string;\r\n} {\r\n // Parse hex color\r\n const hex = baseColor.replace('#', '');\r\n const r = parseInt(hex.slice(0, 2), 16);\r\n const g = parseInt(hex.slice(2, 4), 16);\r\n const b = parseInt(hex.slice(4, 6), 16);\r\n\r\n // Convert to HSL\r\n const max = Math.max(r, g, b) / 255;\r\n const min = Math.min(r, g, b) / 255;\r\n let h = 0,\r\n s = 0;\r\n const l = (max + min) / 2;\r\n\r\n if (max !== min) {\r\n const d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r / 255:\r\n h = ((g / 255 - b / 255) / d + (g < b ? 6 : 0)) / 6;\r\n break;\r\n case g / 255:\r\n h = ((b / 255 - r / 255) / d + 2) / 6;\r\n break;\r\n case b / 255:\r\n h = ((r / 255 - g / 255) / d + 4) / 6;\r\n break;\r\n }\r\n }\r\n\r\n const hslToHex = (h: number, s: number, l: number): string => {\r\n const hue2rgb = (p: number, q: number, t: number) => {\r\n if (t < 0) {\r\n t += 1;\r\n }\r\n if (t > 1) {\r\n t -= 1;\r\n }\r\n if (t < 1 / 6) {\r\n return p + (q - p) * 6 * t;\r\n }\r\n if (t < 1 / 2) {\r\n return q;\r\n }\r\n if (t < 2 / 3) {\r\n return p + (q - p) * (2 / 3 - t) * 6;\r\n }\r\n return p;\r\n };\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n const rr = Math.round(hue2rgb(p, q, h + 1 / 3) * 255);\r\n const gg = Math.round(hue2rgb(p, q, h) * 255);\r\n const bb = Math.round(hue2rgb(p, q, h - 1 / 3) * 255);\r\n return '#' + [rr, gg, bb].map((c) => c.toString(16).padStart(2, '0')).join('');\r\n };\r\n\r\n return {\r\n lightest: hslToHex(h, Math.min(s * 0.3, 1), 0.97),\r\n lighter: hslToHex(h, Math.min(s * 0.5, 1), 0.9),\r\n light: hslToHex(h, Math.min(s * 0.7, 1), 0.8),\r\n base: baseColor,\r\n dark: hslToHex(h, Math.min(s * 1.1, 1), Math.max(l - 0.15, 0.1)),\r\n darker: hslToHex(h, Math.min(s * 1.2, 1), Math.max(l - 0.25, 0.05)),\r\n darkest: hslToHex(h, Math.min(s * 1.3, 1), Math.max(l - 0.35, 0.02)),\r\n text: l > 0.5 ? '#000000' : '#ffffff',\r\n textInverse: l > 0.5 ? '#ffffff' : '#000000',\r\n };\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Responsive Utilities\r\n// Breakpoint-aware hooks and responsive props\r\n// ============================================================\r\n\r\nimport { useState, useEffect, useMemo, useCallback } from 'react';\r\n\r\n// ── Breakpoints ────────────────────────────────────────────\r\n\r\nexport interface NiceBreakpoints {\r\n xs: number;\r\n sm: number;\r\n md: number;\r\n lg: number;\r\n xl: number;\r\n xxl: number;\r\n}\r\n\r\nexport const NICE_BREAKPOINTS: NiceBreakpoints = {\r\n xs: 0,\r\n sm: 576,\r\n md: 768,\r\n lg: 992,\r\n xl: 1200,\r\n xxl: 1400,\r\n};\r\n\r\nexport type NiceBreakpoint = keyof NiceBreakpoints;\r\n\r\nconst BREAKPOINT_ORDER: NiceBreakpoint[] = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];\r\n\r\n// ── useBreakpoint hook ─────────────────────────────────────\r\n\r\nexport interface UseBreakpointResult {\r\n /** Current breakpoint name */\r\n current: NiceBreakpoint;\r\n /** Window width in pixels */\r\n width: number;\r\n /** True if viewport >= the given breakpoint */\r\n isAbove: (bp: NiceBreakpoint) => boolean;\r\n /** True if viewport < the given breakpoint */\r\n isBelow: (bp: NiceBreakpoint) => boolean;\r\n /** True if viewport is between two breakpoints (inclusive lower, exclusive upper) */\r\n isBetween: (lower: NiceBreakpoint, upper: NiceBreakpoint) => boolean;\r\n /** True if viewport is mobile (< md) */\r\n isMobile: boolean;\r\n /** True if viewport is tablet (md–lg) */\r\n isTablet: boolean;\r\n /** True if viewport is desktop (>= lg) */\r\n isDesktop: boolean;\r\n}\r\n\r\nexport function useBreakpoint(\r\n breakpoints: NiceBreakpoints = NICE_BREAKPOINTS,\r\n): UseBreakpointResult {\r\n const [width, setWidth] = useState(() =>\r\n typeof window !== 'undefined' ? window.innerWidth : breakpoints.lg,\r\n );\r\n\r\n useEffect(() => {\r\n let raf: number;\r\n const handleResize = () => {\r\n if (raf) {\r\n cancelAnimationFrame(raf);\r\n }\r\n raf = requestAnimationFrame(() => setWidth(window.innerWidth));\r\n };\r\n window.addEventListener('resize', handleResize);\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n if (raf) {\r\n cancelAnimationFrame(raf);\r\n }\r\n };\r\n }, []);\r\n\r\n const current = useMemo<NiceBreakpoint>(() => {\r\n for (let i = BREAKPOINT_ORDER.length - 1; i >= 0; i--) {\r\n if (width >= breakpoints[BREAKPOINT_ORDER[i]]) {\r\n return BREAKPOINT_ORDER[i];\r\n }\r\n }\r\n return 'xs';\r\n }, [width, breakpoints]);\r\n\r\n const isAbove = useCallback(\r\n (bp: NiceBreakpoint) => width >= breakpoints[bp],\r\n [width, breakpoints],\r\n );\r\n const isBelow = useCallback(\r\n (bp: NiceBreakpoint) => width < breakpoints[bp],\r\n [width, breakpoints],\r\n );\r\n const isBetween = useCallback(\r\n (lower: NiceBreakpoint, upper: NiceBreakpoint) =>\r\n width >= breakpoints[lower] && width < breakpoints[upper],\r\n [width, breakpoints],\r\n );\r\n\r\n return {\r\n current,\r\n width,\r\n isAbove,\r\n isBelow,\r\n isBetween,\r\n isMobile: width < breakpoints.md,\r\n isTablet: width >= breakpoints.md && width < breakpoints.lg,\r\n isDesktop: width >= breakpoints.lg,\r\n };\r\n}\r\n\r\n// ── useMediaQuery hook ─────────────────────────────────────\r\n\r\nexport function useMediaQuery(query: string): boolean {\r\n const [matches, setMatches] = useState(() => {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n return window.matchMedia(query).matches;\r\n });\r\n\r\n useEffect(() => {\r\n const mq = window.matchMedia(query);\r\n setMatches(mq.matches);\r\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n\r\n// ── Responsive value resolver ──────────────────────────────\r\n\r\n/**\r\n * Define a value per breakpoint. Missing breakpoints inherit from the\r\n * nearest smaller breakpoint.\r\n *\r\n * @example\r\n * const cols = useResponsiveValue({ xs: 1, sm: 2, lg: 4 });\r\n * // On a 1024px screen (lg), cols = 4\r\n * // On a 600px screen (sm), cols = 2\r\n */\r\nexport type NiceResponsiveValue<T> = T | Partial<Record<NiceBreakpoint, T>>;\r\n\r\nexport function useResponsiveValue<T>(\r\n value: NiceResponsiveValue<T>,\r\n breakpoints: NiceBreakpoints = NICE_BREAKPOINTS,\r\n): T {\r\n const { current } = useBreakpoint(breakpoints);\r\n\r\n return useMemo(() => {\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n typeof value !== 'object' ||\r\n Array.isArray(value)\r\n ) {\r\n return value as T;\r\n }\r\n\r\n const map = value as Partial<Record<NiceBreakpoint, T>>;\r\n const idx = BREAKPOINT_ORDER.indexOf(current);\r\n\r\n // Walk down from current breakpoint to find nearest defined value\r\n for (let i = idx; i >= 0; i--) {\r\n const val = map[BREAKPOINT_ORDER[i]];\r\n if (val !== undefined) {\r\n return val;\r\n }\r\n }\r\n\r\n // Walk up if nothing found below\r\n for (let i = idx + 1; i < BREAKPOINT_ORDER.length; i++) {\r\n const val = map[BREAKPOINT_ORDER[i]];\r\n if (val !== undefined) {\r\n return val;\r\n }\r\n }\r\n\r\n return undefined as unknown as T;\r\n }, [value, current]);\r\n}\r\n\r\n// ── Container query hook (element-based responsive) ────────\r\n\r\nexport interface UseContainerSizeResult {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport function useContainerSize(ref: React.RefObject<HTMLElement | null>): UseContainerSizeResult {\r\n const [size, setSize] = useState<UseContainerSizeResult>({ width: 0, height: 0 });\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el) {\r\n return;\r\n }\r\n\r\n const observer = new ResizeObserver(([entry]) => {\r\n const { width, height } = entry.contentRect;\r\n setSize({ width, height });\r\n });\r\n\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }, [ref]);\r\n\r\n return size;\r\n}\r\n\r\n// ── Device-specific detection ──────────────────────────────\r\n\r\nexport interface UseDeviceResult {\r\n /** Is a mobile device (phone/tablet based on screen + touch) */\r\n isMobile: boolean;\r\n /** Has touch capability */\r\n isTouch: boolean;\r\n /** Is a phone-sized device (< 768px and touch) */\r\n isPhone: boolean;\r\n /** Is a tablet-sized device (768-1024px and touch) */\r\n isTablet: boolean;\r\n /** Is a desktop device (no touch OR > 1024px) */\r\n isDesktop: boolean;\r\n /** Prefers reduced motion */\r\n prefersReducedMotion: boolean;\r\n /** Is in portrait orientation */\r\n isPortrait: boolean;\r\n /** Device pixel ratio */\r\n pixelRatio: number;\r\n}\r\n\r\nexport function useDevice(): UseDeviceResult {\r\n const { width, isMobile: screenIsMobile } = useBreakpoint();\r\n\r\n const isTouch = useMemo(() => {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n }, []);\r\n\r\n const prefersReducedMotion = useMediaQuery('(prefers-reduced-motion: reduce)');\r\n const isPortrait = useMediaQuery('(orientation: portrait)');\r\n\r\n const pixelRatio = useMemo(() => {\r\n if (typeof window === 'undefined') {\r\n return 1;\r\n }\r\n return window.devicePixelRatio || 1;\r\n }, []);\r\n\r\n const isPhone = screenIsMobile && isTouch;\r\n const isTablet = !screenIsMobile && width < NICE_BREAKPOINTS.lg && isTouch;\r\n const isDesktop = !isTouch || width >= NICE_BREAKPOINTS.lg;\r\n\r\n return {\r\n isMobile: isPhone || isTablet,\r\n isTouch,\r\n isPhone,\r\n isTablet,\r\n isDesktop,\r\n prefersReducedMotion,\r\n isPortrait,\r\n pixelRatio,\r\n };\r\n}\r\n\r\n// ── Adaptive component selection ───────────────────────────\r\n\r\nexport type AdaptiveVariant = 'desktop' | 'tablet' | 'mobile';\r\n\r\nexport interface UseAdaptiveVariantOptions {\r\n /** Force a specific variant */\r\n forceVariant?: AdaptiveVariant;\r\n /** Breakpoints config */\r\n breakpoints?: NiceBreakpoints;\r\n}\r\n\r\n/**\r\n * Hook to determine which component variant to render.\r\n * Returns 'mobile', 'tablet', or 'desktop' based on device.\r\n */\r\nexport function useAdaptiveVariant(options: UseAdaptiveVariantOptions = {}): AdaptiveVariant {\r\n const { forceVariant, breakpoints = NICE_BREAKPOINTS } = options;\r\n const { isMobile, isTablet, isDesktop } = useBreakpoint(breakpoints);\r\n const device = useDevice();\r\n\r\n if (forceVariant) {\r\n return forceVariant;\r\n }\r\n\r\n // Prefer touch-aware detection\r\n if (device.isPhone) {\r\n return 'mobile';\r\n }\r\n if (device.isTablet) {\r\n return 'tablet';\r\n }\r\n if (device.isDesktop) {\r\n return 'desktop';\r\n }\r\n\r\n // Fallback to breakpoint-based\r\n if (isMobile) {\r\n return 'mobile';\r\n }\r\n if (isTablet) {\r\n return 'tablet';\r\n }\r\n return 'desktop';\r\n}\r\n\r\n// ── Show/hide based on breakpoint ──────────────────────────\r\n\r\nexport interface UseShowAtOptions {\r\n /** Show at these breakpoints */\r\n showAt?: NiceBreakpoint[];\r\n /** Hide at these breakpoints */\r\n hideAt?: NiceBreakpoint[];\r\n /** Show only on mobile */\r\n mobileOnly?: boolean;\r\n /** Show only on desktop */\r\n desktopOnly?: boolean;\r\n /** Show only on tablet */\r\n tabletOnly?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to determine visibility based on breakpoint.\r\n */\r\nexport function useShowAt(options: UseShowAtOptions = {}): boolean {\r\n const { showAt, hideAt, mobileOnly, desktopOnly, tabletOnly } = options;\r\n const { current, isMobile, isTablet, isDesktop } = useBreakpoint();\r\n\r\n if (mobileOnly) {\r\n return isMobile;\r\n }\r\n if (desktopOnly) {\r\n return isDesktop;\r\n }\r\n if (tabletOnly) {\r\n return isTablet;\r\n }\r\n\r\n if (hideAt && hideAt.includes(current)) {\r\n return false;\r\n }\r\n if (showAt) {\r\n return showAt.includes(current);\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// ── Orientation lock detection ─────────────────────────────\r\n\r\nexport type ScreenOrientation = 'portrait' | 'landscape';\r\n\r\nexport function useOrientation(): ScreenOrientation {\r\n const isPortrait = useMediaQuery('(orientation: portrait)');\r\n return isPortrait ? 'portrait' : 'landscape';\r\n}\r\n\r\n// ── Safe area insets ───────────────────────────────────────\r\n\r\nexport interface SafeAreaInsets {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n}\r\n\r\n/**\r\n * Hook to get safe area insets for notched devices.\r\n * Returns CSS env() values as numbers.\r\n */\r\nexport function useSafeAreaInsets(): SafeAreaInsets {\r\n const [insets, setInsets] = useState<SafeAreaInsets>({\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined' || !CSS.supports('padding-top', 'env(safe-area-inset-top)')) {\r\n return;\r\n }\r\n\r\n const measure = () => {\r\n const style = getComputedStyle(document.documentElement);\r\n const getValue = (prop: string) => {\r\n const value = style.getPropertyValue(prop);\r\n return parseInt(value, 10) || 0;\r\n };\r\n\r\n // Create a test element to measure env() values\r\n const testEl = document.createElement('div');\r\n testEl.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);\r\n visibility: hidden;\r\n pointer-events: none;\r\n `;\r\n document.body.appendChild(testEl);\r\n\r\n const computed = getComputedStyle(testEl);\r\n setInsets({\r\n top: parseInt(computed.paddingTop, 10) || 0,\r\n right: parseInt(computed.paddingRight, 10) || 0,\r\n bottom: parseInt(computed.paddingBottom, 10) || 0,\r\n left: parseInt(computed.paddingLeft, 10) || 0,\r\n });\r\n\r\n document.body.removeChild(testEl);\r\n };\r\n\r\n measure();\r\n window.addEventListener('resize', measure);\r\n window.addEventListener('orientationchange', measure);\r\n\r\n return () => {\r\n window.removeEventListener('resize', measure);\r\n window.removeEventListener('orientationchange', measure);\r\n };\r\n }, []);\r\n\r\n return insets;\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Animation System\r\n// CSS transition/animation utilities with prefers-reduced-motion\r\n// ============================================================\r\n\r\nimport { useRef, useState, useEffect, useCallback, useMemo } from 'react';\r\n\r\n// ── Animation presets ──────────────────────────────────────\r\n\r\nexport type NiceAnimationPreset =\r\n | 'fade'\r\n | 'slideUp'\r\n | 'slideDown'\r\n | 'slideLeft'\r\n | 'slideRight'\r\n | 'scaleUp'\r\n | 'scaleDown'\r\n | 'zoom'\r\n | 'flip'\r\n | 'none';\r\n\r\nexport type NiceAnimationTiming = 'fast' | 'normal' | 'slow' | number;\r\n\r\nexport interface NiceAnimationConfig {\r\n /** Animation preset or 'none' to disable */\r\n type: NiceAnimationPreset;\r\n /** Duration: 'fast'=120ms, 'normal'=200ms, 'slow'=300ms, or number in ms */\r\n duration?: NiceAnimationTiming;\r\n /** CSS easing function */\r\n easing?: string;\r\n /** Delay before animation starts (ms) */\r\n delay?: number;\r\n}\r\n\r\n// ── Duration resolver ──────────────────────────────────────\r\n\r\nfunction resolveDuration(d: NiceAnimationTiming = 'normal'): number {\r\n if (typeof d === 'number') {\r\n return d;\r\n }\r\n return d === 'fast' ? 120 : d === 'slow' ? 300 : 200;\r\n}\r\n\r\n// ── CSS class names for each preset ────────────────────────\r\n\r\nconst PRESET_ENTER_CLASS: Record<NiceAnimationPreset, string> = {\r\n fade: 'nice-anim-fade-enter',\r\n slideUp: 'nice-anim-slide-up-enter',\r\n slideDown: 'nice-anim-slide-down-enter',\r\n slideLeft: 'nice-anim-slide-left-enter',\r\n slideRight: 'nice-anim-slide-right-enter',\r\n scaleUp: 'nice-anim-scale-up-enter',\r\n scaleDown: 'nice-anim-scale-down-enter',\r\n zoom: 'nice-anim-zoom-enter',\r\n flip: 'nice-anim-flip-enter',\r\n none: '',\r\n};\r\n\r\nconst PRESET_EXIT_CLASS: Record<NiceAnimationPreset, string> = {\r\n fade: 'nice-anim-fade-exit',\r\n slideUp: 'nice-anim-slide-up-exit',\r\n slideDown: 'nice-anim-slide-down-exit',\r\n slideLeft: 'nice-anim-slide-left-exit',\r\n slideRight: 'nice-anim-slide-right-exit',\r\n scaleUp: 'nice-anim-scale-up-exit',\r\n scaleDown: 'nice-anim-scale-down-exit',\r\n zoom: 'nice-anim-zoom-exit',\r\n flip: 'nice-anim-flip-exit',\r\n none: '',\r\n};\r\n\r\n// ── Transition hook ────────────────────────────────────────\r\n\r\nexport type NiceTransitionState = 'entering' | 'entered' | 'exiting' | 'exited';\r\n\r\nexport interface UseNiceTransitionOptions {\r\n /** Whether the element is visible/shown */\r\n visible: boolean;\r\n /** Animation preset */\r\n animation?: NiceAnimationPreset;\r\n /** Duration */\r\n duration?: NiceAnimationTiming;\r\n /** Called when enter transition completes */\r\n onEntered?: () => void;\r\n /** Called when exit transition completes */\r\n onExited?: () => void;\r\n}\r\n\r\nexport interface UseNiceTransitionResult {\r\n /** Current transition state */\r\n state: NiceTransitionState;\r\n /** Whether element should be rendered in DOM */\r\n shouldRender: boolean;\r\n /** CSS class name to apply */\r\n className: string;\r\n /** Inline style with transition duration */\r\n style: React.CSSProperties;\r\n}\r\n\r\nexport function useNiceTransition(options: UseNiceTransitionOptions): UseNiceTransitionResult {\r\n const { visible, animation = 'fade', duration = 'normal', onEntered, onExited } = options;\r\n const [state, setState] = useState<NiceTransitionState>(visible ? 'entered' : 'exited');\r\n const [shouldRender, setShouldRender] = useState(visible);\r\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\r\n const ms = resolveDuration(duration);\r\n\r\n // Check reduced motion preference\r\n const prefersReduced = useMemo(() => {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n }, []);\r\n\r\n const effectiveDuration = prefersReduced || animation === 'none' ? 0 : ms;\r\n\r\n useEffect(() => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current);\r\n }\r\n\r\n if (visible) {\r\n setShouldRender(true);\r\n setState('entering');\r\n timerRef.current = setTimeout(() => {\r\n setState('entered');\r\n onEntered?.();\r\n }, effectiveDuration);\r\n } else {\r\n setState('exiting');\r\n timerRef.current = setTimeout(() => {\r\n setState('exited');\r\n setShouldRender(false);\r\n onExited?.();\r\n }, effectiveDuration);\r\n }\r\n\r\n return () => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current);\r\n }\r\n };\r\n }, [visible, effectiveDuration]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const className = useMemo(() => {\r\n if (animation === 'none' || prefersReduced) {\r\n return '';\r\n }\r\n if (state === 'entering') {\r\n return PRESET_ENTER_CLASS[animation];\r\n }\r\n if (state === 'exiting') {\r\n return PRESET_EXIT_CLASS[animation];\r\n }\r\n if (state === 'entered') {\r\n return `${PRESET_ENTER_CLASS[animation]} nice-anim-active`;\r\n }\r\n return '';\r\n }, [animation, state, prefersReduced]);\r\n\r\n const style = useMemo<React.CSSProperties>(\r\n () => ({\r\n animationDuration: `${effectiveDuration}ms`,\r\n transitionDuration: `${effectiveDuration}ms`,\r\n }),\r\n [effectiveDuration],\r\n );\r\n\r\n return { state, shouldRender, className, style };\r\n}\r\n\r\n// ── Collapse transition hook ───────────────────────────────\r\n\r\nexport interface UseNiceCollapseOptions {\r\n expanded: boolean;\r\n duration?: NiceAnimationTiming;\r\n}\r\n\r\nexport function useNiceCollapse(\r\n ref: React.RefObject<HTMLElement | null>,\r\n options: UseNiceCollapseOptions,\r\n): React.CSSProperties {\r\n const { expanded, duration = 'normal' } = options;\r\n const [height, setHeight] = useState<number | 'auto'>(expanded ? 'auto' : 0);\r\n const ms = resolveDuration(duration);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el) {\r\n return;\r\n }\r\n if (expanded) {\r\n const h = el.scrollHeight;\r\n setHeight(h);\r\n const timer = setTimeout(() => setHeight('auto'), ms);\r\n return () => clearTimeout(timer);\r\n } else {\r\n // Set to current height first, then 0 on next frame\r\n const h = el.scrollHeight;\r\n setHeight(h);\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => setHeight(0));\r\n });\r\n }\r\n }, [expanded, ms, ref]);\r\n\r\n return {\r\n overflow: 'hidden',\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n transition: `height ${ms}ms ease`,\r\n };\r\n}\r\n\r\n// ── Stagger helper ─────────────────────────────────────────\r\n\r\n/**\r\n * Returns animation-delay for staggering child animations.\r\n * Usage: style={{ animationDelay: niceStaggerDelay(index, 50) }}\r\n */\r\nexport function niceStaggerDelay(index: number, interval: number = 50): string {\r\n return `${index * interval}ms`;\r\n}\r\n\r\n// ── CSS keyframe preset getter ─────────────────────────────\r\n\r\nexport function getNiceAnimationClass(\r\n preset: NiceAnimationPreset,\r\n phase: 'enter' | 'exit',\r\n): string {\r\n return phase === 'enter' ? PRESET_ENTER_CLASS[preset] : PRESET_EXIT_CLASS[preset];\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — RTL (Right-to-Left) Support\r\n// Full bidirectional layout for Arabic, Hebrew, Farsi, etc.\r\n// ============================================================\r\n\r\nimport React, { createContext, useContext, useEffect, useMemo, useCallback } from 'react';\r\n\r\n// ── Types ──────────────────────────────────────────────────\r\n\r\nexport type NiceDirection = 'ltr' | 'rtl' | 'auto';\r\n\r\nexport interface NiceRTLConfig {\r\n direction: NiceDirection;\r\n}\r\n\r\nexport interface NiceRTLProviderProps {\r\n direction: NiceDirection;\r\n children: React.ReactNode;\r\n}\r\n\r\n// ── Context ────────────────────────────────────────────────\r\n\r\ninterface RTLContextValue {\r\n direction: 'ltr' | 'rtl';\r\n isRTL: boolean;\r\n /**\r\n * Flip a CSS logical value: swaps 'left' ↔ 'right',\r\n * 'start' ↔ 'end' for RTL mode.\r\n */\r\n flip: (value: 'left' | 'right' | 'start' | 'end') => 'left' | 'right' | 'start' | 'end';\r\n /**\r\n * Flip a horizontal numeric value (e.g., margin-left → margin-right).\r\n * Returns { marginInlineStart: v } style for use in inline styles.\r\n */\r\n flipStyle: (\r\n property: 'paddingLeft' | 'paddingRight' | 'marginLeft' | 'marginRight',\r\n value: string | number,\r\n ) => React.CSSProperties;\r\n}\r\n\r\nconst NiceRTLContext = createContext<RTLContextValue>({\r\n direction: 'ltr',\r\n isRTL: false,\r\n flip: (v) => v,\r\n flipStyle: (p, v) => ({ [p]: v }),\r\n});\r\n\r\n// ── Provider ───────────────────────────────────────────────\r\n\r\nexport const NiceRTLProvider: React.FC<NiceRTLProviderProps> = ({ direction, children }) => {\r\n // Resolve 'auto' from the document or browser language\r\n const resolved: 'ltr' | 'rtl' = useMemo(() => {\r\n if (direction !== 'auto') {\r\n return direction;\r\n }\r\n if (typeof document !== 'undefined') {\r\n const dir = document.documentElement.getAttribute('dir');\r\n if (dir === 'rtl') {\r\n return 'rtl';\r\n }\r\n }\r\n return 'ltr';\r\n }, [direction]);\r\n\r\n const isRTL = resolved === 'rtl';\r\n\r\n // Apply dir attribute to document root\r\n useEffect(() => {\r\n if (direction !== 'auto') {\r\n document.documentElement.setAttribute('dir', resolved);\r\n document.documentElement.style.direction = resolved;\r\n }\r\n return () => {\r\n if (direction !== 'auto') {\r\n document.documentElement.removeAttribute('dir');\r\n document.documentElement.style.direction = '';\r\n }\r\n };\r\n }, [direction, resolved]);\r\n\r\n const flip = useCallback(\r\n (value: 'left' | 'right' | 'start' | 'end'): 'left' | 'right' | 'start' | 'end' => {\r\n if (!isRTL) {\r\n return value;\r\n }\r\n const map: Record<string, 'left' | 'right' | 'start' | 'end'> = {\r\n left: 'right',\r\n right: 'left',\r\n start: 'end',\r\n end: 'start',\r\n };\r\n return map[value] ?? value;\r\n },\r\n [isRTL],\r\n );\r\n\r\n const flipStyle = useCallback(\r\n (property: string, value: string | number): React.CSSProperties => {\r\n if (!isRTL) {\r\n return { [property]: value };\r\n }\r\n const flipMap: Record<string, string> = {\r\n paddingLeft: 'paddingRight',\r\n paddingRight: 'paddingLeft',\r\n marginLeft: 'marginRight',\r\n marginRight: 'marginLeft',\r\n };\r\n return { [flipMap[property] || property]: value };\r\n },\r\n [isRTL],\r\n );\r\n\r\n const ctx = useMemo<RTLContextValue>(\r\n () => ({\r\n direction: resolved,\r\n isRTL,\r\n flip,\r\n flipStyle,\r\n }),\r\n [resolved, isRTL, flip, flipStyle],\r\n );\r\n\r\n return (\r\n <NiceRTLContext.Provider value={ctx}>\r\n <div dir={resolved} style={{ direction: resolved, display: 'contents' }}>\r\n {children}\r\n </div>\r\n </NiceRTLContext.Provider>\r\n );\r\n};\r\n\r\nNiceRTLProvider.displayName = 'NiceRTLProvider';\r\n\r\n// ── Hook ───────────────────────────────────────────────────\r\n\r\nexport function useNiceRTL(): RTLContextValue {\r\n return useContext(NiceRTLContext);\r\n}\r\n\r\n// ── CSS logical property helpers ───────────────────────────\r\n\r\n/**\r\n * Convert physical CSS properties to logical equivalents.\r\n * Use these instead of left/right for RTL-safe components.\r\n */\r\nexport const logicalProps = {\r\n marginStart: 'marginInlineStart' as const,\r\n marginEnd: 'marginInlineEnd' as const,\r\n paddingStart: 'paddingInlineStart' as const,\r\n paddingEnd: 'paddingInlineEnd' as const,\r\n borderStart: 'borderInlineStart' as const,\r\n borderEnd: 'borderInlineEnd' as const,\r\n insetStart: 'insetInlineStart' as const,\r\n insetEnd: 'insetInlineEnd' as const,\r\n start: 'insetInlineStart' as const,\r\n end: 'insetInlineEnd' as const,\r\n textAlign: {\r\n start: 'start' as const,\r\n end: 'end' as const,\r\n },\r\n};\r\n","import React, { createContext, useContext, useMemo } from 'react';\r\n\r\nimport type { NiceAccessMode } from './types';\r\n\r\n/* ═══════════════════════════════════════════════════════\r\n NiceAccessControl — Global access restriction system\r\n ═══════════════════════════════════════════════════════ */\r\n\r\nexport type { NiceAccessMode };\r\n\r\nexport interface NiceAccessPermissions {\r\n /** Default access mode for all components under this provider */\r\n defaultMode?: NiceAccessMode;\r\n /** Per-component overrides: componentId → accessMode */\r\n components?: Record<string, NiceAccessMode>;\r\n /** Per-field overrides: \"component.field\" → accessMode */\r\n fields?: Record<string, NiceAccessMode>;\r\n}\r\n\r\ninterface NiceAccessContextValue {\r\n permissions: NiceAccessPermissions;\r\n /** Resolve effective access mode for a component */\r\n getAccessMode: (componentId?: string, fieldId?: string) => NiceAccessMode;\r\n}\r\n\r\nconst NiceAccessContext = createContext<NiceAccessContextValue>({\r\n permissions: {},\r\n getAccessMode: () => 'full',\r\n});\r\n\r\nexport interface NiceAccessControlProps {\r\n permissions: NiceAccessPermissions;\r\n children: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Provider that sets access control policies for all NiceToDev components\r\n * within its tree. Components auto-check permissions via `useNiceAccessMode`.\r\n *\r\n * @example\r\n * ```tsx\r\n * <NiceAccessControl permissions={{\r\n * defaultMode: 'readOnly',\r\n * components: { 'userForm': 'full', 'adminGrid': 'hidden' },\r\n * fields: { 'userForm.email': 'disabled' },\r\n * }}>\r\n * <App />\r\n * </NiceAccessControl>\r\n * ```\r\n */\r\nexport const NiceAccessControl: React.FC<NiceAccessControlProps> = ({ permissions, children }) => {\r\n const value = useMemo<NiceAccessContextValue>(\r\n () => ({\r\n permissions,\r\n getAccessMode: (componentId?: string, fieldId?: string) => {\r\n // Most specific wins: field > component > default > 'full'\r\n if (fieldId && componentId && permissions.fields?.[`${componentId}.${fieldId}`]) {\r\n return permissions.fields[`${componentId}.${fieldId}`];\r\n }\r\n if (componentId && permissions.components?.[componentId]) {\r\n return permissions.components[componentId];\r\n }\r\n return permissions.defaultMode ?? 'full';\r\n },\r\n }),\r\n [permissions],\r\n );\r\n\r\n return <NiceAccessContext.Provider value={value}>{children}</NiceAccessContext.Provider>;\r\n};\r\n\r\nNiceAccessControl.displayName = 'NiceAccessControl';\r\n\r\n/**\r\n * Hook to resolve the effective access mode for the current component.\r\n * Merges provider-level and prop-level access settings.\r\n *\r\n * @param propAccessMode - Explicit prop passed to the component (highest priority)\r\n * @param componentId - Optional ID to look up in provider permissions\r\n * @param fieldId - Optional field-level ID for form field granularity\r\n * @returns The resolved NiceAccessMode\r\n *\r\n * @example\r\n * ```tsx\r\n * const accessMode = useNiceAccessMode(props.accessMode, props.id);\r\n * if (accessMode === 'hidden') return null;\r\n * const isReadOnly = accessMode === 'readOnly' || accessMode === 'disabled';\r\n * ```\r\n */\r\nexport function useNiceAccessMode(\r\n propAccessMode?: NiceAccessMode,\r\n componentId?: string,\r\n fieldId?: string,\r\n): NiceAccessMode {\r\n const ctx = useContext(NiceAccessContext);\r\n // Prop-level override takes highest priority\r\n if (propAccessMode) {\r\n return propAccessMode;\r\n }\r\n return ctx.getAccessMode(componentId, fieldId);\r\n}\r\n\r\n/**\r\n * Utility: apply access mode effects on HTML attributes.\r\n * Returns props to spread onto interactive elements.\r\n */\r\nexport function accessModeAttrs(mode: NiceAccessMode): {\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n 'aria-disabled'?: boolean;\r\n tabIndex?: number;\r\n} {\r\n switch (mode) {\r\n case 'disabled':\r\n return { disabled: true, 'aria-disabled': true, tabIndex: -1 };\r\n case 'readOnly':\r\n return { readOnly: true };\r\n default:\r\n return {};\r\n }\r\n}\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n// ============================================================\r\n// Nice2Dev UI — Touch Gestures & Mobile Utilities\r\n// Sprint 4 — Mobile & Touch Optimization\r\n// ============================================================\r\n\r\nimport React, {\r\n useRef,\r\n useState,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n createContext,\r\n useContext,\r\n} from 'react';\r\n\r\n// ── Types ──────────────────────────────────────────────────\r\n\r\nexport interface TouchPoint {\r\n x: number;\r\n y: number;\r\n timestamp: number;\r\n}\r\n\r\nexport interface SwipeGesture {\r\n direction: 'left' | 'right' | 'up' | 'down';\r\n distance: number;\r\n velocity: number;\r\n duration: number;\r\n}\r\n\r\nexport interface PinchGesture {\r\n scale: number;\r\n center: { x: number; y: number };\r\n}\r\n\r\nexport interface PanGesture {\r\n deltaX: number;\r\n deltaY: number;\r\n velocityX: number;\r\n velocityY: number;\r\n}\r\n\r\n// ── Swipe Hook ─────────────────────────────────────────────\r\n\r\nexport interface UseSwipeOptions {\r\n /** Minimum distance in px to trigger a swipe (default 50) */\r\n threshold?: number;\r\n /** Maximum time in ms for a valid swipe (default 300) */\r\n maxDuration?: number;\r\n /** Callback when swipe is detected */\r\n onSwipe?: (gesture: SwipeGesture) => void;\r\n /** Callback when swiping left */\r\n onSwipeLeft?: (gesture: SwipeGesture) => void;\r\n /** Callback when swiping right */\r\n onSwipeRight?: (gesture: SwipeGesture) => void;\r\n /** Callback when swiping up */\r\n onSwipeUp?: (gesture: SwipeGesture) => void;\r\n /** Callback when swiping down */\r\n onSwipeDown?: (gesture: SwipeGesture) => void;\r\n /** Whether swipe detection is enabled (default true) */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseSwipeResult {\r\n ref: React.RefObject<HTMLElement | null>;\r\n isSwiping: boolean;\r\n swipeDirection: SwipeGesture['direction'] | null;\r\n}\r\n\r\n/**\r\n * Hook for detecting swipe gestures on touch devices.\r\n * Returns a ref to attach to the swipeable element.\r\n */\r\nexport function useSwipe(options: UseSwipeOptions = {}): UseSwipeResult {\r\n const {\r\n threshold = 50,\r\n maxDuration = 300,\r\n onSwipe,\r\n onSwipeLeft,\r\n onSwipeRight,\r\n onSwipeUp,\r\n onSwipeDown,\r\n enabled = true,\r\n } = options;\r\n\r\n const ref = useRef<HTMLElement | null>(null);\r\n const [isSwiping, setIsSwiping] = useState(false);\r\n const [swipeDirection, setSwipeDirection] = useState<SwipeGesture['direction'] | null>(null);\r\n const startPoint = useRef<TouchPoint | null>(null);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el || !enabled) {\r\n return;\r\n }\r\n\r\n const handleTouchStart = (e: TouchEvent) => {\r\n if (e.touches.length !== 1) {\r\n return;\r\n }\r\n const touch = e.touches[0];\r\n startPoint.current = {\r\n x: touch.clientX,\r\n y: touch.clientY,\r\n timestamp: Date.now(),\r\n };\r\n setIsSwiping(true);\r\n setSwipeDirection(null);\r\n };\r\n\r\n const handleTouchMove = (e: TouchEvent) => {\r\n if (!startPoint.current || e.touches.length !== 1) {\r\n return;\r\n }\r\n const touch = e.touches[0];\r\n const deltaX = touch.clientX - startPoint.current.x;\r\n const deltaY = touch.clientY - startPoint.current.y;\r\n\r\n // Determine dominant direction during swipe\r\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\r\n setSwipeDirection(deltaX > 0 ? 'right' : 'left');\r\n } else {\r\n setSwipeDirection(deltaY > 0 ? 'down' : 'up');\r\n }\r\n };\r\n\r\n const handleTouchEnd = (e: TouchEvent) => {\r\n if (!startPoint.current) {\r\n return;\r\n }\r\n\r\n const touch = e.changedTouches[0];\r\n const endPoint: TouchPoint = {\r\n x: touch.clientX,\r\n y: touch.clientY,\r\n timestamp: Date.now(),\r\n };\r\n\r\n const deltaX = endPoint.x - startPoint.current.x;\r\n const deltaY = endPoint.y - startPoint.current.y;\r\n const duration = endPoint.timestamp - startPoint.current.timestamp;\r\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\r\n const velocity = distance / duration;\r\n\r\n setIsSwiping(false);\r\n\r\n if (duration <= maxDuration && distance >= threshold) {\r\n let direction: SwipeGesture['direction'];\r\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\r\n direction = deltaX > 0 ? 'right' : 'left';\r\n } else {\r\n direction = deltaY > 0 ? 'down' : 'up';\r\n }\r\n\r\n const gesture: SwipeGesture = { direction, distance, velocity, duration };\r\n onSwipe?.(gesture);\r\n\r\n switch (direction) {\r\n case 'left':\r\n onSwipeLeft?.(gesture);\r\n break;\r\n case 'right':\r\n onSwipeRight?.(gesture);\r\n break;\r\n case 'up':\r\n onSwipeUp?.(gesture);\r\n break;\r\n case 'down':\r\n onSwipeDown?.(gesture);\r\n break;\r\n }\r\n }\r\n\r\n startPoint.current = null;\r\n setSwipeDirection(null);\r\n };\r\n\r\n const handleTouchCancel = () => {\r\n startPoint.current = null;\r\n setIsSwiping(false);\r\n setSwipeDirection(null);\r\n };\r\n\r\n el.addEventListener('touchstart', handleTouchStart, { passive: true });\r\n el.addEventListener('touchmove', handleTouchMove, { passive: true });\r\n el.addEventListener('touchend', handleTouchEnd, { passive: true });\r\n el.addEventListener('touchcancel', handleTouchCancel, { passive: true });\r\n\r\n return () => {\r\n el.removeEventListener('touchstart', handleTouchStart);\r\n el.removeEventListener('touchmove', handleTouchMove);\r\n el.removeEventListener('touchend', handleTouchEnd);\r\n el.removeEventListener('touchcancel', handleTouchCancel);\r\n };\r\n }, [enabled, threshold, maxDuration, onSwipe, onSwipeLeft, onSwipeRight, onSwipeUp, onSwipeDown]);\r\n\r\n return { ref, isSwiping, swipeDirection };\r\n}\r\n\r\n// ── Pinch/Zoom Hook ────────────────────────────────────────\r\n\r\nexport interface UsePinchOptions {\r\n /** Callback during pinch gesture */\r\n onPinch?: (gesture: PinchGesture) => void;\r\n /** Callback when pinch starts */\r\n onPinchStart?: () => void;\r\n /** Callback when pinch ends */\r\n onPinchEnd?: (finalScale: number) => void;\r\n /** Minimum scale factor (default 0.5) */\r\n minScale?: number;\r\n /** Maximum scale factor (default 3) */\r\n maxScale?: number;\r\n /** Whether pinch is enabled (default true) */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UsePinchResult {\r\n ref: React.RefObject<HTMLElement | null>;\r\n scale: number;\r\n isPinching: boolean;\r\n}\r\n\r\n/**\r\n * Hook for detecting pinch-to-zoom gestures.\r\n */\r\nexport function usePinch(options: UsePinchOptions = {}): UsePinchResult {\r\n const {\r\n onPinch,\r\n onPinchStart,\r\n onPinchEnd,\r\n minScale = 0.5,\r\n maxScale = 3,\r\n enabled = true,\r\n } = options;\r\n\r\n const ref = useRef<HTMLElement | null>(null);\r\n const [scale, setScale] = useState(1);\r\n const [isPinching, setIsPinching] = useState(false);\r\n const initialDistance = useRef<number | null>(null);\r\n const initialScale = useRef(1);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el || !enabled) {\r\n return;\r\n }\r\n\r\n const getDistance = (t1: Touch, t2: Touch) => {\r\n const dx = t1.clientX - t2.clientX;\r\n const dy = t1.clientY - t2.clientY;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n };\r\n\r\n const getCenter = (t1: Touch, t2: Touch) => ({\r\n x: (t1.clientX + t2.clientX) / 2,\r\n y: (t1.clientY + t2.clientY) / 2,\r\n });\r\n\r\n const handleTouchStart = (e: TouchEvent) => {\r\n if (e.touches.length === 2) {\r\n initialDistance.current = getDistance(e.touches[0], e.touches[1]);\r\n initialScale.current = scale;\r\n setIsPinching(true);\r\n onPinchStart?.();\r\n }\r\n };\r\n\r\n const handleTouchMove = (e: TouchEvent) => {\r\n if (e.touches.length !== 2 || !initialDistance.current) {\r\n return;\r\n }\r\n\r\n const currentDistance = getDistance(e.touches[0], e.touches[1]);\r\n const newScale = Math.min(\r\n maxScale,\r\n Math.max(minScale, initialScale.current * (currentDistance / initialDistance.current)),\r\n );\r\n\r\n setScale(newScale);\r\n onPinch?.({\r\n scale: newScale,\r\n center: getCenter(e.touches[0], e.touches[1]),\r\n });\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n if (isPinching) {\r\n setIsPinching(false);\r\n onPinchEnd?.(scale);\r\n initialDistance.current = null;\r\n }\r\n };\r\n\r\n el.addEventListener('touchstart', handleTouchStart, { passive: true });\r\n el.addEventListener('touchmove', handleTouchMove, { passive: true });\r\n el.addEventListener('touchend', handleTouchEnd, { passive: true });\r\n el.addEventListener('touchcancel', handleTouchEnd, { passive: true });\r\n\r\n return () => {\r\n el.removeEventListener('touchstart', handleTouchStart);\r\n el.removeEventListener('touchmove', handleTouchMove);\r\n el.removeEventListener('touchend', handleTouchEnd);\r\n el.removeEventListener('touchcancel', handleTouchEnd);\r\n };\r\n }, [enabled, scale, isPinching, minScale, maxScale, onPinch, onPinchStart, onPinchEnd]);\r\n\r\n return { ref, scale, isPinching };\r\n}\r\n\r\n// ── Pan/Drag Hook ──────────────────────────────────────────\r\n\r\nexport interface UsePanOptions {\r\n /** Callback during pan */\r\n onPan?: (gesture: PanGesture) => void;\r\n /** Callback when pan starts */\r\n onPanStart?: () => void;\r\n /** Callback when pan ends */\r\n onPanEnd?: (gesture: PanGesture) => void;\r\n /** Whether pan is enabled (default true) */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UsePanResult {\r\n ref: React.RefObject<HTMLElement | null>;\r\n isPanning: boolean;\r\n deltaX: number;\r\n deltaY: number;\r\n}\r\n\r\n/**\r\n * Hook for detecting pan/drag gestures.\r\n */\r\nexport function usePan(options: UsePanOptions = {}): UsePanResult {\r\n const { onPan, onPanStart, onPanEnd, enabled = true } = options;\r\n\r\n const ref = useRef<HTMLElement | null>(null);\r\n const [isPanning, setIsPanning] = useState(false);\r\n const [deltaX, setDeltaX] = useState(0);\r\n const [deltaY, setDeltaY] = useState(0);\r\n const startPoint = useRef<TouchPoint | null>(null);\r\n const lastPoint = useRef<TouchPoint | null>(null);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el || !enabled) {\r\n return;\r\n }\r\n\r\n const handleTouchStart = (e: TouchEvent) => {\r\n if (e.touches.length !== 1) {\r\n return;\r\n }\r\n const touch = e.touches[0];\r\n const point: TouchPoint = {\r\n x: touch.clientX,\r\n y: touch.clientY,\r\n timestamp: Date.now(),\r\n };\r\n startPoint.current = point;\r\n lastPoint.current = point;\r\n setIsPanning(true);\r\n setDeltaX(0);\r\n setDeltaY(0);\r\n onPanStart?.();\r\n };\r\n\r\n const handleTouchMove = (e: TouchEvent) => {\r\n if (!startPoint.current || !lastPoint.current || e.touches.length !== 1) {\r\n return;\r\n }\r\n\r\n const touch = e.touches[0];\r\n const now = Date.now();\r\n const currentPoint: TouchPoint = { x: touch.clientX, y: touch.clientY, timestamp: now };\r\n\r\n const dx = currentPoint.x - startPoint.current.x;\r\n const dy = currentPoint.y - startPoint.current.y;\r\n const dt = currentPoint.timestamp - lastPoint.current.timestamp || 1;\r\n\r\n const velocityX = (currentPoint.x - lastPoint.current.x) / dt;\r\n const velocityY = (currentPoint.y - lastPoint.current.y) / dt;\r\n\r\n setDeltaX(dx);\r\n setDeltaY(dy);\r\n\r\n onPan?.({ deltaX: dx, deltaY: dy, velocityX, velocityY });\r\n lastPoint.current = currentPoint;\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n if (!isPanning || !startPoint.current || !lastPoint.current) {\r\n return;\r\n }\r\n\r\n const dx = deltaX;\r\n const dy = deltaY;\r\n const dt = lastPoint.current.timestamp - startPoint.current.timestamp || 1;\r\n\r\n onPanEnd?.({\r\n deltaX: dx,\r\n deltaY: dy,\r\n velocityX: dx / dt,\r\n velocityY: dy / dt,\r\n });\r\n\r\n setIsPanning(false);\r\n startPoint.current = null;\r\n lastPoint.current = null;\r\n };\r\n\r\n el.addEventListener('touchstart', handleTouchStart, { passive: true });\r\n el.addEventListener('touchmove', handleTouchMove, { passive: true });\r\n el.addEventListener('touchend', handleTouchEnd, { passive: true });\r\n el.addEventListener('touchcancel', handleTouchEnd, { passive: true });\r\n\r\n return () => {\r\n el.removeEventListener('touchstart', handleTouchStart);\r\n el.removeEventListener('touchmove', handleTouchMove);\r\n el.removeEventListener('touchend', handleTouchEnd);\r\n el.removeEventListener('touchcancel', handleTouchEnd);\r\n };\r\n }, [enabled, isPanning, deltaX, deltaY, onPan, onPanStart, onPanEnd]);\r\n\r\n return { ref, isPanning, deltaX, deltaY };\r\n}\r\n\r\n// ── Pull to Refresh Hook ───────────────────────────────────\r\n\r\nexport interface UsePullToRefreshOptions {\r\n /** Callback when refresh is triggered */\r\n onRefresh: () => Promise<void> | void;\r\n /** Pull distance to trigger refresh (default 80) */\r\n threshold?: number;\r\n /** Maximum pull distance (default 120) */\r\n maxPull?: number;\r\n /** Whether pull to refresh is enabled (default true) */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UsePullToRefreshResult {\r\n ref: React.RefObject<HTMLElement | null>;\r\n isPulling: boolean;\r\n isRefreshing: boolean;\r\n pullDistance: number;\r\n pullProgress: number;\r\n}\r\n\r\n/**\r\n * Hook for implementing pull-to-refresh functionality.\r\n */\r\nexport function usePullToRefresh(options: UsePullToRefreshOptions): UsePullToRefreshResult {\r\n const { onRefresh, threshold = 80, maxPull = 120, enabled = true } = options;\r\n\r\n const ref = useRef<HTMLElement | null>(null);\r\n const [isPulling, setIsPulling] = useState(false);\r\n const [isRefreshing, setIsRefreshing] = useState(false);\r\n const [pullDistance, setPullDistance] = useState(0);\r\n const startY = useRef<number | null>(null);\r\n\r\n const pullProgress = Math.min(1, pullDistance / threshold);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el || !enabled || isRefreshing) {\r\n return;\r\n }\r\n\r\n const handleTouchStart = (e: TouchEvent) => {\r\n // Only enable when scrolled to top\r\n if (el.scrollTop > 0) {\r\n return;\r\n }\r\n if (e.touches.length !== 1) {\r\n return;\r\n }\r\n startY.current = e.touches[0].clientY;\r\n };\r\n\r\n const handleTouchMove = (e: TouchEvent) => {\r\n if (startY.current === null || e.touches.length !== 1) {\r\n return;\r\n }\r\n\r\n const currentY = e.touches[0].clientY;\r\n const delta = currentY - startY.current;\r\n\r\n // Only pull down\r\n if (delta <= 0) {\r\n setPullDistance(0);\r\n setIsPulling(false);\r\n return;\r\n }\r\n\r\n // Apply resistance\r\n const resistance = 0.5;\r\n const pull = Math.min(maxPull, delta * resistance);\r\n\r\n setPullDistance(pull);\r\n setIsPulling(pull > 0);\r\n\r\n // Prevent scroll while pulling\r\n if (pull > 0) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const handleTouchEnd = async () => {\r\n if (pullDistance >= threshold && !isRefreshing) {\r\n setIsRefreshing(true);\r\n setPullDistance(threshold); // Hold at threshold during refresh\r\n\r\n try {\r\n await onRefresh();\r\n } finally {\r\n setIsRefreshing(false);\r\n setPullDistance(0);\r\n }\r\n } else {\r\n setPullDistance(0);\r\n }\r\n\r\n setIsPulling(false);\r\n startY.current = null;\r\n };\r\n\r\n el.addEventListener('touchstart', handleTouchStart, { passive: true });\r\n el.addEventListener('touchmove', handleTouchMove, { passive: false });\r\n el.addEventListener('touchend', handleTouchEnd, { passive: true });\r\n el.addEventListener('touchcancel', handleTouchEnd, { passive: true });\r\n\r\n return () => {\r\n el.removeEventListener('touchstart', handleTouchStart);\r\n el.removeEventListener('touchmove', handleTouchMove);\r\n el.removeEventListener('touchend', handleTouchEnd);\r\n el.removeEventListener('touchcancel', handleTouchEnd);\r\n };\r\n }, [enabled, isRefreshing, pullDistance, threshold, maxPull, onRefresh]);\r\n\r\n return { ref, isPulling, isRefreshing, pullDistance, pullProgress };\r\n}\r\n\r\n// ── Swipeable List Item Component ──────────────────────────\r\n\r\nexport interface SwipeAction {\r\n /** Unique key for the action */\r\n key: string;\r\n /** Icon or text content */\r\n content: React.ReactNode;\r\n /** Background color */\r\n color: string;\r\n /** Callback when action is triggered */\r\n onAction: () => void;\r\n}\r\n\r\nexport interface NiceSwipeableListItemProps {\r\n /** Content of the list item */\r\n children: React.ReactNode;\r\n /** Actions revealed when swiping left */\r\n leftActions?: SwipeAction[];\r\n /** Actions revealed when swiping right */\r\n rightActions?: SwipeAction[];\r\n /** Width of each action button (default 80) */\r\n actionWidth?: number;\r\n /** Maximum swipe distance as multiplier of action buttons (default 1.5) */\r\n maxSwipe?: number;\r\n /** Threshold to auto-complete swipe (default 0.5) */\r\n threshold?: number;\r\n /** Additional className */\r\n className?: string;\r\n /** Additional styles */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * A list item component with swipe-to-reveal actions (like iOS).\r\n */\r\nexport const NiceSwipeableListItem: React.FC<NiceSwipeableListItemProps> = ({\r\n children,\r\n leftActions = [],\r\n rightActions = [],\r\n actionWidth = 80,\r\n maxSwipe = 1.5,\r\n threshold = 0.5,\r\n className,\r\n style,\r\n}) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n const [offset, setOffset] = useState(0);\r\n const [isAnimating, setIsAnimating] = useState(false);\r\n const startX = useRef(0);\r\n const currentOffset = useRef(0);\r\n\r\n const leftWidth = leftActions.length * actionWidth;\r\n const rightWidth = rightActions.length * actionWidth;\r\n const maxLeftSwipe = leftWidth * maxSwipe;\r\n const maxRightSwipe = rightWidth * maxSwipe;\r\n\r\n const handleTouchStart = useCallback(\r\n (e: React.TouchEvent) => {\r\n setIsAnimating(false);\r\n startX.current = e.touches[0].clientX;\r\n currentOffset.current = offset;\r\n },\r\n [offset],\r\n );\r\n\r\n const handleTouchMove = useCallback(\r\n (e: React.TouchEvent) => {\r\n const deltaX = e.touches[0].clientX - startX.current;\r\n let newOffset = currentOffset.current + deltaX;\r\n\r\n // Apply bounds with resistance\r\n if (newOffset > maxLeftSwipe) {\r\n newOffset = maxLeftSwipe + (newOffset - maxLeftSwipe) * 0.2;\r\n } else if (newOffset < -maxRightSwipe) {\r\n newOffset = -maxRightSwipe + (newOffset + maxRightSwipe) * 0.2;\r\n }\r\n\r\n // Only allow swipe if actions exist\r\n if (newOffset > 0 && leftActions.length === 0) {\r\n return;\r\n }\r\n if (newOffset < 0 && rightActions.length === 0) {\r\n return;\r\n }\r\n\r\n setOffset(newOffset);\r\n },\r\n [maxLeftSwipe, maxRightSwipe, leftActions.length, rightActions.length],\r\n );\r\n\r\n const handleTouchEnd = useCallback(() => {\r\n setIsAnimating(true);\r\n\r\n // Determine final position\r\n if (offset > leftWidth * threshold) {\r\n // Snap to show left actions\r\n setOffset(leftWidth);\r\n } else if (offset < -rightWidth * threshold) {\r\n // Snap to show right actions\r\n setOffset(-rightWidth);\r\n } else {\r\n // Snap back to closed\r\n setOffset(0);\r\n }\r\n }, [offset, leftWidth, rightWidth, threshold]);\r\n\r\n const handleActionClick = useCallback((action: SwipeAction) => {\r\n setIsAnimating(true);\r\n setOffset(0);\r\n action.onAction();\r\n }, []);\r\n\r\n const close = useCallback(() => {\r\n setIsAnimating(true);\r\n setOffset(0);\r\n }, []);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`nice-swipeable ${className || ''}`}\r\n style={{ ...style, position: 'relative', overflow: 'hidden' }}\r\n >\r\n {/* Left actions (revealed on swipe right) */}\r\n <div\r\n className=\"nice-swipeable__actions nice-swipeable__actions--left\"\r\n style={{\r\n position: 'absolute',\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n display: 'flex',\r\n width: leftWidth,\r\n }}\r\n >\r\n {leftActions.map((action) => (\r\n <button\r\n key={action.key}\r\n className=\"nice-swipeable__action\"\r\n style={{\r\n width: actionWidth,\r\n background: action.color,\r\n border: 'none',\r\n color: 'var(--bg-primary, #fff)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n cursor: 'pointer',\r\n }}\r\n onClick={() => handleActionClick(action)}\r\n >\r\n {action.content}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Right actions (revealed on swipe left) */}\r\n <div\r\n className=\"nice-swipeable__actions nice-swipeable__actions--right\"\r\n style={{\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n display: 'flex',\r\n width: rightWidth,\r\n }}\r\n >\r\n {rightActions.map((action) => (\r\n <button\r\n key={action.key}\r\n className=\"nice-swipeable__action\"\r\n style={{\r\n width: actionWidth,\r\n background: action.color,\r\n border: 'none',\r\n color: 'var(--bg-primary, #fff)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n cursor: 'pointer',\r\n }}\r\n onClick={() => handleActionClick(action)}\r\n >\r\n {action.content}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Content */}\r\n <div\r\n ref={contentRef}\r\n className=\"nice-swipeable__content\"\r\n style={{\r\n transform: `translateX(${offset}px)`,\r\n transition: isAnimating ? 'transform 0.3s ease-out' : 'none',\r\n background: 'var(--bg-primary, #fff)',\r\n position: 'relative',\r\n zIndex: 1,\r\n }}\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n onClick={offset !== 0 ? close : undefined}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ── Pull to Refresh Component ──────────────────────────────\r\n\r\nexport interface NicePullToRefreshProps {\r\n /** Content to display */\r\n children: React.ReactNode;\r\n /** Callback when refresh triggered */\r\n onRefresh: () => Promise<void>;\r\n /** Pull threshold to trigger refresh (default 80) */\r\n threshold?: number;\r\n /** Custom pulling indicator */\r\n pullingContent?: React.ReactNode;\r\n /** Custom refreshing indicator */\r\n refreshingContent?: React.ReactNode;\r\n /** Whether pull to refresh is enabled */\r\n enabled?: boolean;\r\n /** Additional className */\r\n className?: string;\r\n /** Additional styles */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * A container component that adds pull-to-refresh functionality.\r\n */\r\nexport const NicePullToRefresh: React.FC<NicePullToRefreshProps> = ({\r\n children,\r\n onRefresh,\r\n threshold = 80,\r\n pullingContent,\r\n refreshingContent,\r\n enabled = true,\r\n className,\r\n style,\r\n}) => {\r\n const { ref, isPulling, isRefreshing, pullDistance, pullProgress } = usePullToRefresh({\r\n onRefresh,\r\n threshold,\r\n enabled,\r\n });\r\n\r\n const showIndicator = isPulling || isRefreshing;\r\n\r\n return (\r\n <div\r\n ref={ref as React.RefObject<HTMLDivElement>}\r\n className={`nice-pull-refresh ${className || ''}`}\r\n style={{\r\n ...style,\r\n position: 'relative',\r\n overflow: 'auto',\r\n overscrollBehavior: 'contain',\r\n }}\r\n >\r\n {/* Pull indicator */}\r\n <div\r\n className=\"nice-pull-refresh__indicator\"\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: pullDistance,\r\n overflow: 'hidden',\r\n transition: isPulling ? 'none' : 'height 0.2s ease-out',\r\n }}\r\n >\r\n {isRefreshing\r\n ? refreshingContent || (\r\n <div className=\"nice-pull-refresh__spinner\">\r\n <div className=\"nice-spinner nice-spinner--sm\" />\r\n </div>\r\n )\r\n : pullingContent || (\r\n <div\r\n className=\"nice-pull-refresh__arrow\"\r\n style={{\r\n transform: `rotate(${pullProgress >= 1 ? 180 : 0}deg)`,\r\n transition: 'transform 0.2s ease',\r\n opacity: pullProgress,\r\n }}\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 stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Content */}\r\n <div\r\n className=\"nice-pull-refresh__content\"\r\n style={{\r\n transform: `translateY(${pullDistance}px)`,\r\n transition: isPulling ? 'none' : 'transform 0.2s ease-out',\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ── Haptic Feedback ────────────────────────────────────────\r\n\r\nexport type HapticFeedbackType =\r\n | 'light'\r\n | 'medium'\r\n | 'heavy'\r\n | 'selection'\r\n | 'success'\r\n | 'warning'\r\n | 'error';\r\n\r\n/**\r\n * Triggers haptic feedback on supported devices.\r\n * Falls back silently if not supported.\r\n */\r\nexport function triggerHaptic(type: HapticFeedbackType = 'light'): void {\r\n if (!('vibrate' in navigator)) {\r\n return;\r\n }\r\n\r\n const patterns: Record<HapticFeedbackType, number | number[]> = {\r\n light: 10,\r\n medium: 20,\r\n heavy: 30,\r\n selection: 5,\r\n success: [10, 30, 10],\r\n warning: [20, 20, 20],\r\n error: [30, 30, 30, 30],\r\n };\r\n\r\n try {\r\n navigator.vibrate(patterns[type]);\r\n } catch {\r\n // Silently fail if not supported\r\n }\r\n}\r\n\r\n/**\r\n * Hook that returns a function to trigger haptic feedback.\r\n */\r\nexport function useHaptic() {\r\n return useCallback((type: HapticFeedbackType = 'light') => {\r\n triggerHaptic(type);\r\n }, []);\r\n}\r\n\r\n// ── Touch Target Size Helper ───────────────────────────────\r\n\r\nexport interface TouchTargetProps {\r\n /** Minimum touch target size in pixels (default 44, WCAG 2.5.8) */\r\n minSize?: number;\r\n /** Content to wrap */\r\n children: React.ReactNode;\r\n /** Additional className */\r\n className?: string;\r\n /** Additional styles */\r\n style?: React.CSSProperties;\r\n /** onClick handler */\r\n onClick?: () => void;\r\n}\r\n\r\n/**\r\n * Wrapper component that ensures minimum touch target size.\r\n * Adds invisible padding to small elements to meet WCAG 2.5.8.\r\n */\r\nexport const NiceTouchTarget: React.FC<TouchTargetProps> = ({\r\n minSize = 44,\r\n children,\r\n className,\r\n style,\r\n onClick,\r\n}) => {\r\n return (\r\n <div\r\n className={`nice-touch-target ${className || ''}`}\r\n style={{\r\n ...style,\r\n position: 'relative',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minWidth: minSize,\r\n minHeight: minSize,\r\n cursor: onClick ? 'pointer' : undefined,\r\n }}\r\n onClick={onClick}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\n// ── Virtual Keyboard Detection ─────────────────────────────\r\n\r\nexport interface UseVirtualKeyboardResult {\r\n isKeyboardVisible: boolean;\r\n keyboardHeight: number;\r\n}\r\n\r\n/**\r\n * Hook to detect virtual keyboard visibility on mobile devices.\r\n * Uses viewport height changes as the primary detection method.\r\n */\r\nexport function useVirtualKeyboard(): UseVirtualKeyboardResult {\r\n const [isKeyboardVisible, setIsKeyboardVisible] = useState(false);\r\n const [keyboardHeight, setKeyboardHeight] = useState(0);\r\n const initialHeight = useRef(typeof window !== 'undefined' ? window.innerHeight : 0);\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n // Use Visual Viewport API if available (more accurate)\r\n if ('visualViewport' in window && window.visualViewport) {\r\n const vv = window.visualViewport;\r\n\r\n const handleResize = () => {\r\n const heightDiff = initialHeight.current - vv.height;\r\n const threshold = 150; // Keyboard is probably visible if height reduced by > 150px\r\n\r\n setIsKeyboardVisible(heightDiff > threshold);\r\n setKeyboardHeight(heightDiff > threshold ? heightDiff : 0);\r\n };\r\n\r\n vv.addEventListener('resize', handleResize);\r\n return () => vv.removeEventListener('resize', handleResize);\r\n }\r\n\r\n // Fallback: listen to window resize\r\n const handleResize = () => {\r\n const heightDiff = initialHeight.current - window.innerHeight;\r\n const threshold = 150;\r\n\r\n setIsKeyboardVisible(heightDiff > threshold);\r\n setKeyboardHeight(heightDiff > threshold ? heightDiff : 0);\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, []);\r\n\r\n return { isKeyboardVisible, keyboardHeight };\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Accessibility (a11y) Infrastructure\r\n// WCAG 2.1 AA compliant utilities\r\n// ============================================================\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useCallback,\r\n useRef,\r\n useEffect,\r\n useState,\r\n useMemo,\r\n} from 'react';\r\n\r\n// ── Configuration ──────────────────────────────────────────\r\n\r\nexport interface NiceA11yConfig {\r\n /** Announce state changes to screen readers (default: true) */\r\n announceChanges: boolean;\r\n /** Reduce motion for users with vestibular motion disorders (default: 'auto' = respect OS setting) */\r\n reduceMotion: 'auto' | 'always' | 'never';\r\n /** High contrast mode (default: 'auto' = respect OS setting) */\r\n highContrast: 'auto' | 'always' | 'never';\r\n /** Focus visible style: 'auto' uses :focus-visible, 'always' shows on any focus */\r\n focusStyle: 'auto' | 'always';\r\n /** Whether keyboard shortcuts are enabled (default: true) */\r\n keyboardShortcuts: boolean;\r\n /** Minimum touch target size in px (WCAG 2.5.8 — 24px minimum) */\r\n minTouchTarget: number;\r\n}\r\n\r\nconst defaultConfig: NiceA11yConfig = {\r\n announceChanges: true,\r\n reduceMotion: 'auto',\r\n highContrast: 'auto',\r\n focusStyle: 'auto',\r\n keyboardShortcuts: true,\r\n minTouchTarget: 44,\r\n};\r\n\r\n// ── Context ────────────────────────────────────────────────\r\n\r\ninterface A11yContextValue {\r\n config: NiceA11yConfig;\r\n announce: (message: string, priority?: 'polite' | 'assertive') => void;\r\n prefersReducedMotion: boolean;\r\n prefersHighContrast: boolean;\r\n}\r\n\r\nconst NiceA11yContext = createContext<A11yContextValue | null>(null);\r\n\r\n// ── Provider ───────────────────────────────────────────────\r\n\r\nexport interface NiceA11yProviderProps {\r\n config?: Partial<NiceA11yConfig>;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const NiceA11yProvider: React.FC<NiceA11yProviderProps> = ({\r\n config: userConfig,\r\n children,\r\n}) => {\r\n const config = useMemo(() => ({ ...defaultConfig, ...userConfig }), [userConfig]);\r\n const politeRef = useRef<HTMLDivElement>(null);\r\n const assertiveRef = useRef<HTMLDivElement>(null);\r\n\r\n // Detect OS preference for reduced motion\r\n const [osReducedMotion, setOsReducedMotion] = useState(false);\r\n useEffect(() => {\r\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\r\n setOsReducedMotion(mq.matches);\r\n const handler = (e: MediaQueryListEvent) => setOsReducedMotion(e.matches);\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, []);\r\n\r\n // Detect OS preference for high contrast\r\n const [osHighContrast, setOsHighContrast] = useState(false);\r\n useEffect(() => {\r\n const mq = window.matchMedia('(prefers-contrast: more)');\r\n setOsHighContrast(mq.matches);\r\n const handler = (e: MediaQueryListEvent) => setOsHighContrast(e.matches);\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, []);\r\n\r\n const prefersReducedMotion =\r\n config.reduceMotion === 'always'\r\n ? true\r\n : config.reduceMotion === 'never'\r\n ? false\r\n : osReducedMotion;\r\n\r\n const prefersHighContrast =\r\n config.highContrast === 'always'\r\n ? true\r\n : config.highContrast === 'never'\r\n ? false\r\n : osHighContrast;\r\n\r\n const announce = useCallback(\r\n (message: string, priority: 'polite' | 'assertive' = 'polite') => {\r\n if (!config.announceChanges) {\r\n return;\r\n }\r\n const el = priority === 'assertive' ? assertiveRef.current : politeRef.current;\r\n if (!el) {\r\n return;\r\n }\r\n // Clear and re-set to trigger screen reader announcement\r\n el.textContent = '';\r\n requestAnimationFrame(() => {\r\n el.textContent = message;\r\n });\r\n },\r\n [config.announceChanges],\r\n );\r\n\r\n const value = useMemo<A11yContextValue>(\r\n () => ({\r\n config,\r\n announce,\r\n prefersReducedMotion,\r\n prefersHighContrast,\r\n }),\r\n [config, announce, prefersReducedMotion, prefersHighContrast],\r\n );\r\n\r\n return (\r\n <NiceA11yContext.Provider value={value}>\r\n {children}\r\n {/* Live regions for screen reader announcements */}\r\n <div\r\n ref={politeRef}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n style={srOnlyStyle}\r\n />\r\n <div\r\n ref={assertiveRef}\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n aria-atomic=\"true\"\r\n style={srOnlyStyle}\r\n />\r\n </NiceA11yContext.Provider>\r\n );\r\n};\r\n\r\nNiceA11yProvider.displayName = 'NiceA11yProvider';\r\n\r\n// ── Hook ───────────────────────────────────────────────────\r\n\r\nexport function useNiceA11y(): A11yContextValue {\r\n const ctx = useContext(NiceA11yContext);\r\n if (ctx) {\r\n return ctx;\r\n }\r\n\r\n // Fallback if no provider — works standalone\r\n return {\r\n config: defaultConfig,\r\n announce: () => {},\r\n prefersReducedMotion: false,\r\n prefersHighContrast: false,\r\n };\r\n}\r\n\r\n// ── Screen-reader-only style ───────────────────────────────\r\n\r\nconst srOnlyStyle: React.CSSProperties = {\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// ── ARIA helper utilities ──────────────────────────────────\r\n\r\n/** Build aria-describedby from helper/error text ids */\r\nexport function buildAriaDescribedBy(\r\n ...ids: (string | undefined | null | false)[]\r\n): string | undefined {\r\n const filtered = ids.filter(Boolean) as string[];\r\n return filtered.length > 0 ? filtered.join(' ') : undefined;\r\n}\r\n\r\n/** Build standard form field ARIA attributes */\r\nexport function buildFormFieldAria(props: {\r\n id: string;\r\n label?: string;\r\n error?: string;\r\n helperText?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n}): Record<string, string | boolean | undefined> {\r\n const errorId = props.error ? `${props.id}-error` : undefined;\r\n const helperId = props.helperText ? `${props.id}-helper` : undefined;\r\n\r\n return {\r\n 'aria-invalid': props.error ? true : undefined,\r\n 'aria-required': props.required || undefined,\r\n 'aria-disabled': props.disabled || undefined,\r\n 'aria-readonly': props.readOnly || undefined,\r\n 'aria-describedby': buildAriaDescribedBy(errorId, helperId),\r\n 'aria-errormessage': errorId,\r\n };\r\n}\r\n\r\n// ── Keyboard navigation helpers ────────────────────────────\r\n\r\nexport type ArrowDirection = 'horizontal' | 'vertical' | 'both' | 'grid';\r\n\r\nexport interface UseRovingTabIndexOptions {\r\n /** Direction of arrow key navigation */\r\n direction: ArrowDirection;\r\n /** Wrap around from last to first and vice versa (default: true) */\r\n wrap?: boolean;\r\n /** Selector for focusable items within the container */\r\n itemSelector?: string;\r\n}\r\n\r\n/**\r\n * Roving tabindex for keyboard navigation in composite widgets\r\n * (toolbars, radio groups, menu bars, tab lists, grids).\r\n *\r\n * Only one item has tabIndex=0 (the active one); others have tabIndex=-1.\r\n * Arrow keys move focus between items.\r\n */\r\nexport function useRovingTabIndex(\r\n containerRef: React.RefObject<HTMLElement | null>,\r\n options: UseRovingTabIndexOptions,\r\n) {\r\n const {\r\n direction,\r\n wrap = true,\r\n itemSelector = '[role=\"option\"], [role=\"tab\"], [role=\"menuitem\"], [role=\"radio\"], button, a, [tabindex]',\r\n } = options;\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) {\r\n return;\r\n }\r\n\r\n const getItems = (): HTMLElement[] =>\r\n Array.from(container.querySelectorAll<HTMLElement>(itemSelector)).filter(\r\n (el) => !el.hasAttribute('disabled') && el.getAttribute('aria-disabled') !== 'true',\r\n );\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n const items = getItems();\r\n if (items.length === 0) {\r\n return;\r\n }\r\n\r\n const current = document.activeElement as HTMLElement;\r\n const idx = items.indexOf(current);\r\n if (idx === -1) {\r\n return;\r\n }\r\n\r\n let next = -1;\r\n const isH = direction === 'horizontal' || direction === 'both' || direction === 'grid';\r\n const isV = direction === 'vertical' || direction === 'both' || direction === 'grid';\r\n\r\n if (isH && e.key === 'ArrowRight') {\r\n next = idx + 1;\r\n } else if (isH && e.key === 'ArrowLeft') {\r\n next = idx - 1;\r\n } else if (isV && e.key === 'ArrowDown') {\r\n next = idx + 1;\r\n } else if (isV && e.key === 'ArrowUp') {\r\n next = idx - 1;\r\n } else if (e.key === 'Home') {\r\n next = 0;\r\n } else if (e.key === 'End') {\r\n next = items.length - 1;\r\n } else {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n if (wrap) {\r\n next = ((next % items.length) + items.length) % items.length;\r\n } else {\r\n next = Math.max(0, Math.min(items.length - 1, next));\r\n }\r\n\r\n items.forEach((item, i) => {\r\n item.tabIndex = i === next ? 0 : -1;\r\n });\r\n items[next]?.focus();\r\n };\r\n\r\n container.addEventListener('keydown', handleKeyDown);\r\n return () => container.removeEventListener('keydown', handleKeyDown);\r\n }, [containerRef, direction, wrap, itemSelector]);\r\n}\r\n\r\n// ── Focus management ───────────────────────────────────────\r\n\r\n/** Return focus to the element that was focused before the component mounted */\r\nexport function useRestoreFocus(active: boolean) {\r\n const previousRef = useRef<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (active) {\r\n previousRef.current = document.activeElement as HTMLElement;\r\n }\r\n return () => {\r\n if (active && previousRef.current && typeof previousRef.current.focus === 'function') {\r\n previousRef.current.focus();\r\n }\r\n };\r\n }, [active]);\r\n}\r\n\r\n/** VisuallyHidden component for screen-reader-only text */\r\nexport const NiceVisuallyHidden: React.FC<{\r\n children: React.ReactNode;\r\n as?: keyof JSX.IntrinsicElements;\r\n}> = ({ children, as: Tag = 'span' }) => React.createElement(Tag, { style: srOnlyStyle }, children);\r\n\r\nNiceVisuallyHidden.displayName = 'NiceVisuallyHidden';\r\n\r\n// ── Skip link component ───────────────────────────────────\r\n\r\nexport interface NiceSkipLinkProps {\r\n /** Target element id (without #) */\r\n targetId: string;\r\n /** Link text (default: 'Skip to main content') */\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const NiceSkipLink: React.FC<NiceSkipLinkProps> = ({\r\n targetId,\r\n children = 'Skip to main content',\r\n}) => (\r\n <a\r\n href={`#${targetId}`}\r\n className=\"nice-skip-link\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n const target = document.getElementById(targetId);\r\n if (target) {\r\n target.tabIndex = -1;\r\n target.focus();\r\n }\r\n }}\r\n >\r\n {children}\r\n </a>\r\n);\r\n\r\nNiceSkipLink.displayName = 'NiceSkipLink';\r\n\r\n// ── Keyboard Shortcut Definitions ──────────────────────────\r\n\r\n/** Standard keyboard shortcut definition for a control */\r\nexport interface KeyboardShortcut {\r\n /** Key combination (e.g., 'Enter', 'Ctrl+S', 'Escape') */\r\n key: string;\r\n /** Description of what the shortcut does */\r\n description: string;\r\n /** i18n key for the description */\r\n descriptionKey?: string;\r\n /** Modifier keys required */\r\n modifiers?: ('ctrl' | 'alt' | 'shift' | 'meta')[];\r\n}\r\n\r\n/** Common keyboard shortcuts used across controls */\r\nexport const COMMON_SHORTCUTS = {\r\n // Form controls\r\n submit: { key: 'Enter', description: 'Submit / Confirm', descriptionKey: 'shortcuts.submit' },\r\n cancel: { key: 'Escape', description: 'Cancel / Close', descriptionKey: 'shortcuts.cancel' },\r\n clear: {\r\n key: 'Delete',\r\n description: 'Clear value',\r\n descriptionKey: 'shortcuts.clear',\r\n modifiers: ['ctrl'] as const,\r\n },\r\n\r\n // Navigation\r\n moveUp: { key: 'ArrowUp', description: 'Move up', descriptionKey: 'shortcuts.moveUp' },\r\n moveDown: { key: 'ArrowDown', description: 'Move down', descriptionKey: 'shortcuts.moveDown' },\r\n moveLeft: { key: 'ArrowLeft', description: 'Move left', descriptionKey: 'shortcuts.moveLeft' },\r\n moveRight: {\r\n key: 'ArrowRight',\r\n description: 'Move right',\r\n descriptionKey: 'shortcuts.moveRight',\r\n },\r\n first: { key: 'Home', description: 'Go to first', descriptionKey: 'shortcuts.first' },\r\n last: { key: 'End', description: 'Go to last', descriptionKey: 'shortcuts.last' },\r\n pageUp: { key: 'PageUp', description: 'Page up', descriptionKey: 'shortcuts.pageUp' },\r\n pageDown: { key: 'PageDown', description: 'Page down', descriptionKey: 'shortcuts.pageDown' },\r\n\r\n // Selection\r\n selectAll: {\r\n key: 'A',\r\n description: 'Select all',\r\n descriptionKey: 'shortcuts.selectAll',\r\n modifiers: ['ctrl'] as const,\r\n },\r\n toggleSelect: {\r\n key: 'Space',\r\n description: 'Toggle selection',\r\n descriptionKey: 'shortcuts.toggleSelect',\r\n },\r\n\r\n // Editing\r\n undo: {\r\n key: 'Z',\r\n description: 'Undo',\r\n descriptionKey: 'shortcuts.undo',\r\n modifiers: ['ctrl'] as const,\r\n },\r\n redo: {\r\n key: 'Y',\r\n description: 'Redo',\r\n descriptionKey: 'shortcuts.redo',\r\n modifiers: ['ctrl'] as const,\r\n },\r\n copy: {\r\n key: 'C',\r\n description: 'Copy',\r\n descriptionKey: 'shortcuts.copy',\r\n modifiers: ['ctrl'] as const,\r\n },\r\n paste: {\r\n key: 'V',\r\n description: 'Paste',\r\n descriptionKey: 'shortcuts.paste',\r\n modifiers: ['ctrl'] as const,\r\n },\r\n cut: {\r\n key: 'X',\r\n description: 'Cut',\r\n descriptionKey: 'shortcuts.cut',\r\n modifiers: ['ctrl'] as const,\r\n },\r\n\r\n // DataGrid specific\r\n edit: { key: 'Enter', description: 'Edit cell', descriptionKey: 'shortcuts.edit' },\r\n tab: { key: 'Tab', description: 'Next cell', descriptionKey: 'shortcuts.tab' },\r\n shiftTab: {\r\n key: 'Tab',\r\n description: 'Previous cell',\r\n descriptionKey: 'shortcuts.shiftTab',\r\n modifiers: ['shift'] as const,\r\n },\r\n\r\n // Dropdown/Popup\r\n open: { key: 'ArrowDown', description: 'Open dropdown', descriptionKey: 'shortcuts.open' },\r\n close: { key: 'Escape', description: 'Close popup', descriptionKey: 'shortcuts.close' },\r\n\r\n // Increment/Decrement\r\n increment: {\r\n key: 'ArrowUp',\r\n description: 'Increase value',\r\n descriptionKey: 'shortcuts.increment',\r\n },\r\n decrement: {\r\n key: 'ArrowDown',\r\n description: 'Decrease value',\r\n descriptionKey: 'shortcuts.decrement',\r\n },\r\n incrementBig: {\r\n key: 'PageUp',\r\n description: 'Increase by 10',\r\n descriptionKey: 'shortcuts.incrementBig',\r\n },\r\n decrementBig: {\r\n key: 'PageDown',\r\n description: 'Decrease by 10',\r\n descriptionKey: 'shortcuts.decrementBig',\r\n },\r\n} as const;\r\n\r\n/** Format a keyboard shortcut for display */\r\nexport function formatShortcut(shortcut: KeyboardShortcut): string {\r\n const parts: string[] = [];\r\n if (shortcut.modifiers?.includes('ctrl')) {\r\n parts.push('Ctrl');\r\n }\r\n if (shortcut.modifiers?.includes('alt')) {\r\n parts.push('Alt');\r\n }\r\n if (shortcut.modifiers?.includes('shift')) {\r\n parts.push('Shift');\r\n }\r\n if (shortcut.modifiers?.includes('meta')) {\r\n parts.push('⌘');\r\n }\r\n parts.push(shortcut.key);\r\n return parts.join('+');\r\n}\r\n\r\n/** Check if a keyboard event matches a shortcut */\r\nexport function matchesShortcut(\r\n e: React.KeyboardEvent | KeyboardEvent,\r\n shortcut: KeyboardShortcut,\r\n): boolean {\r\n const keyMatch = e.key === shortcut.key || e.key.toLowerCase() === shortcut.key.toLowerCase();\r\n if (!keyMatch) {\r\n return false;\r\n }\r\n\r\n const mods = shortcut.modifiers ?? [];\r\n if (mods.includes('ctrl') !== (e.ctrlKey || e.metaKey)) {\r\n return false;\r\n }\r\n if (mods.includes('alt') !== e.altKey) {\r\n return false;\r\n }\r\n if (mods.includes('shift') !== e.shiftKey) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// ── Keyboard Hint Component ────────────────────────────────\r\n\r\nexport interface NiceKeyboardHintProps {\r\n /** Array of keyboard shortcuts to display */\r\n shortcuts: KeyboardShortcut[];\r\n /** Position of the tooltip */\r\n position?: 'top' | 'bottom' | 'left' | 'right';\r\n /** Custom trigger icon (default: ?) */\r\n icon?: React.ReactNode;\r\n /** Size of the hint trigger */\r\n size?: 'sm' | 'md';\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A small question mark icon that shows keyboard shortcuts on hover.\r\n * Use this to inform users about available keyboard interactions.\r\n */\r\nexport const NiceKeyboardHint: React.FC<NiceKeyboardHintProps> = ({\r\n shortcuts,\r\n position = 'top',\r\n icon,\r\n size = 'sm',\r\n className,\r\n}) => {\r\n const [visible, setVisible] = useState(false);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const [coords, setCoords] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\r\n\r\n const updatePosition = useCallback(() => {\r\n if (!triggerRef.current) {\r\n return;\r\n }\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const offset = 8;\r\n\r\n let top = 0,\r\n left = 0;\r\n switch (position) {\r\n case 'top':\r\n top = rect.top - offset;\r\n left = rect.left + rect.width / 2;\r\n break;\r\n case 'bottom':\r\n top = rect.bottom + offset;\r\n left = rect.left + rect.width / 2;\r\n break;\r\n case 'left':\r\n top = rect.top + rect.height / 2;\r\n left = rect.left - offset;\r\n break;\r\n case 'right':\r\n top = rect.top + rect.height / 2;\r\n left = rect.right + offset;\r\n break;\r\n }\r\n setCoords({ top, left });\r\n }, [position]);\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n updatePosition();\r\n setVisible(true);\r\n }, [updatePosition]);\r\n\r\n const handleFocus = useCallback(() => {\r\n updatePosition();\r\n setVisible(true);\r\n }, [updatePosition]);\r\n\r\n if (shortcuts.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n className={`nice-keyboard-hint nice-keyboard-hint--${size} ${className || ''}`}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={() => setVisible(false)}\r\n onFocus={handleFocus}\r\n onBlur={() => setVisible(false)}\r\n aria-label=\"Keyboard shortcuts\"\r\n tabIndex={-1}\r\n >\r\n {icon || '?'}\r\n </button>\r\n {visible && (\r\n <div\r\n className={`nice-keyboard-hint__tooltip nice-keyboard-hint__tooltip--${position}`}\r\n style={{\r\n position: 'fixed',\r\n top: coords.top,\r\n left: coords.left,\r\n transform:\r\n position === 'top'\r\n ? 'translate(-50%, -100%)'\r\n : position === 'bottom'\r\n ? 'translate(-50%, 0)'\r\n : position === 'left'\r\n ? 'translate(-100%, -50%)'\r\n : 'translate(0, -50%)',\r\n }}\r\n role=\"tooltip\"\r\n >\r\n <div className=\"nice-keyboard-hint__title\">Keyboard Shortcuts</div>\r\n <ul className=\"nice-keyboard-hint__list\">\r\n {shortcuts.map((s, i) => (\r\n <li key={i} className=\"nice-keyboard-hint__item\">\r\n <kbd className=\"nice-keyboard-hint__key\">{formatShortcut(s)}</kbd>\r\n <span className=\"nice-keyboard-hint__desc\">{s.description}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nNiceKeyboardHint.displayName = 'NiceKeyboardHint';\r\n\r\n// ── Submit on Enter Hook ───────────────────────────────────\r\n\r\nexport interface UseSubmitOnEnterOptions {\r\n /** Enable submit on Enter (default: false) */\r\n enabled?: boolean;\r\n /** Callback to execute on Enter */\r\n onSubmit?: () => void;\r\n /** Prevent default behavior (default: true) */\r\n preventDefault?: boolean;\r\n /** Require Ctrl+Enter instead of just Enter (default: false) */\r\n requireCtrl?: boolean;\r\n /** Skip if in a textarea (default: true) */\r\n skipTextarea?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to handle Enter key as submit trigger.\r\n * Returns a keydown handler to attach to the control.\r\n */\r\nexport function useSubmitOnEnter(\r\n options: UseSubmitOnEnterOptions = {},\r\n): (e: React.KeyboardEvent) => void {\r\n const {\r\n enabled = false,\r\n onSubmit,\r\n preventDefault = true,\r\n requireCtrl = false,\r\n skipTextarea = true,\r\n } = options;\r\n\r\n return useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (!enabled || !onSubmit) {\r\n return;\r\n }\r\n if (e.key !== 'Enter') {\r\n return;\r\n }\r\n if (requireCtrl && !e.ctrlKey && !e.metaKey) {\r\n return;\r\n }\r\n if (skipTextarea && (e.target as HTMLElement).tagName === 'TEXTAREA') {\r\n return;\r\n }\r\n\r\n if (preventDefault) {\r\n e.preventDefault();\r\n }\r\n onSubmit();\r\n },\r\n [enabled, onSubmit, preventDefault, requireCtrl, skipTextarea],\r\n );\r\n}\r\n\r\n// ── Accessible Click Hook ──────────────────────────────────\r\n\r\nexport interface UseAccessibleClickOptions {\r\n /** Click handler invoked on mouse click, Enter, or Space */\r\n onClick?: (e: React.SyntheticEvent) => void;\r\n /** Disable interaction (default: false) */\r\n disabled?: boolean;\r\n /** ARIA role to apply (default: 'button') */\r\n role?: string;\r\n /** Override tabIndex (default: 0 when enabled, -1 when disabled) */\r\n tabIndex?: number;\r\n /** Trigger on Space key in addition to Enter (default: true) */\r\n triggerOnSpace?: boolean;\r\n}\r\n\r\nexport interface AccessibleClickProps {\r\n role: string;\r\n tabIndex: number;\r\n onClick: (e: React.MouseEvent) => void;\r\n onKeyDown: (e: React.KeyboardEvent) => void;\r\n 'aria-disabled'?: boolean;\r\n}\r\n\r\n/**\r\n * Returns props to attach to a non-semantic element (e.g. <div>) to make it\r\n * keyboard-accessible — handles Enter / Space activation, role, tabIndex,\r\n * and respects the disabled state. Prefer a real <button> when possible;\r\n * use this hook only when semantic elements are not feasible.\r\n *\r\n * Example:\r\n * ```tsx\r\n * const clickProps = useAccessibleClick({ onClick: handleSelect });\r\n * return <div {...clickProps}>Click me</div>;\r\n * ```\r\n */\r\nexport function useAccessibleClick(options: UseAccessibleClickOptions = {}): AccessibleClickProps {\r\n const { onClick, disabled = false, role = 'button', tabIndex, triggerOnSpace = true } = options;\r\n\r\n const handleClick = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (disabled) {\r\n return;\r\n }\r\n onClick?.(e);\r\n },\r\n [disabled, onClick],\r\n );\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (disabled) {\r\n return;\r\n }\r\n const isSpace = triggerOnSpace && (e.key === ' ' || e.key === 'Spacebar');\r\n if (e.key === 'Enter' || isSpace) {\r\n e.preventDefault();\r\n onClick?.(e);\r\n }\r\n },\r\n [disabled, onClick, triggerOnSpace],\r\n );\r\n\r\n const props: AccessibleClickProps = {\r\n role,\r\n tabIndex: tabIndex ?? (disabled ? -1 : 0),\r\n onClick: handleClick,\r\n onKeyDown: handleKeyDown,\r\n };\r\n if (disabled) {\r\n props['aria-disabled'] = true;\r\n }\r\n return props;\r\n}\r\n","/**\r\n * a11y-advanced.ts — Advanced accessibility features.\r\n *\r\n * Voice control, screen reader optimizations, cognitive accessibility,\r\n * and WCAG 2.2 AAA compliance utilities.\r\n */\r\n\r\n// Web Speech API type shims — not all TS libs include these.\r\ninterface SpeechRecognitionEvent extends Event {\r\n readonly results: SpeechRecognitionResultList;\r\n readonly resultIndex: number;\r\n}\r\ninterface SpeechRecognitionErrorEvent extends Event {\r\n readonly error: string;\r\n readonly message: string;\r\n}\r\ninterface SpeechRecognitionInstance extends EventTarget {\r\n lang: string;\r\n continuous: boolean;\r\n interimResults: boolean;\r\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\r\n onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;\r\n onend: (() => void) | null;\r\n start(): void;\r\n stop(): void;\r\n abort(): void;\r\n}\r\ninterface SpeechRecognitionConstructor {\r\n new (): SpeechRecognitionInstance;\r\n}\r\n\r\nimport { useState, useEffect, useCallback, useRef } from 'react';\r\n\r\n// ── Voice Control ───────────────────────────────────────────────\r\n\r\nexport interface VoiceCommand {\r\n phrase: string | RegExp;\r\n action: (matches: string[], transcript: string) => void;\r\n description?: string;\r\n}\r\n\r\nexport interface VoiceControlOptions {\r\n language?: string;\r\n continuous?: boolean;\r\n interimResults?: boolean;\r\n commands?: VoiceCommand[];\r\n onTranscript?: (text: string, isFinal: boolean) => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\nexport interface VoiceControlApi {\r\n isListening: boolean;\r\n isSupported: boolean;\r\n start: () => void;\r\n stop: () => void;\r\n transcript: string;\r\n}\r\n\r\n/**\r\n * Hook for voice-controlled UI interaction.\r\n *\r\n * Usage:\r\n * const { isListening, start, stop } = useVoiceControl({\r\n * commands: [\r\n * { phrase: /open (.+)/i, action: ([, name]) => openPage(name) },\r\n * { phrase: \"scroll down\", action: () => window.scrollBy(0, 300) },\r\n * ],\r\n * });\r\n */\r\nexport function useVoiceControl(options: VoiceControlOptions = {}): VoiceControlApi {\r\n const [isListening, setIsListening] = useState(false);\r\n const [transcript, setTranscript] = useState('');\r\n const recognitionRef = useRef<SpeechRecognitionInstance | null>(null);\r\n\r\n const isSupported =\r\n typeof window !== 'undefined' &&\r\n ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window);\r\n\r\n const processTranscript = useCallback(\r\n (text: string) => {\r\n if (!options.commands) {\r\n return;\r\n }\r\n const lower = text.toLowerCase().trim();\r\n\r\n for (const cmd of options.commands) {\r\n if (typeof cmd.phrase === 'string') {\r\n if (lower === cmd.phrase.toLowerCase()) {\r\n cmd.action([], text);\r\n return;\r\n }\r\n } else {\r\n const match = text.match(cmd.phrase);\r\n if (match) {\r\n cmd.action(Array.from(match), text);\r\n return;\r\n }\r\n }\r\n }\r\n },\r\n [options.commands],\r\n );\r\n\r\n const start = useCallback(() => {\r\n if (!isSupported || isListening) {\r\n return;\r\n }\r\n\r\n const Ctor =\r\n (window as unknown as Record<string, SpeechRecognitionConstructor>).SpeechRecognition ??\r\n (window as unknown as Record<string, SpeechRecognitionConstructor>).webkitSpeechRecognition;\r\n\r\n const recognition = new Ctor();\r\n recognition.lang = options.language ?? 'en-US';\r\n recognition.continuous = options.continuous ?? true;\r\n recognition.interimResults = options.interimResults ?? false;\r\n\r\n recognition.onresult = (event: SpeechRecognitionEvent) => {\r\n const last = event.results[event.results.length - 1];\r\n const text = last[0].transcript;\r\n const isFinal = last.isFinal;\r\n\r\n setTranscript(text);\r\n options.onTranscript?.(text, isFinal);\r\n\r\n if (isFinal) {\r\n processTranscript(text);\r\n }\r\n };\r\n\r\n recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\r\n options.onError?.(event.error);\r\n if (event.error === 'not-allowed') {\r\n setIsListening(false);\r\n }\r\n };\r\n\r\n recognition.onend = () => {\r\n if (isListening && options.continuous) {\r\n try {\r\n recognition.start();\r\n } catch {\r\n setIsListening(false);\r\n }\r\n } else {\r\n setIsListening(false);\r\n }\r\n };\r\n\r\n recognitionRef.current = recognition;\r\n recognition.start();\r\n setIsListening(true);\r\n }, [isSupported, isListening, options.language, options.continuous]);\r\n\r\n const stop = useCallback(() => {\r\n recognitionRef.current?.stop();\r\n recognitionRef.current = null;\r\n setIsListening(false);\r\n }, []);\r\n\r\n useEffect(() => () => stop(), []);\r\n\r\n return { isListening, isSupported, start, stop, transcript };\r\n}\r\n\r\n// ── Screen Reader Optimizations ─────────────────────────────────\r\n\r\nexport interface LiveRegionOptions {\r\n politeness?: 'polite' | 'assertive' | 'off';\r\n atomic?: boolean;\r\n relevant?: 'additions' | 'removals' | 'text' | 'all';\r\n clearAfterMs?: number;\r\n}\r\n\r\n/**\r\n * Hook to announce dynamic content to screen readers via ARIA live regions.\r\n */\r\nexport function useLiveAnnouncement(options: LiveRegionOptions = {}) {\r\n const [message, setMessage] = useState('');\r\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\r\n\r\n const announce = useCallback(\r\n (text: string) => {\r\n // Clear first to ensure re-announcement of same message\r\n setMessage('');\r\n requestAnimationFrame(() => {\r\n setMessage(text);\r\n if (options.clearAfterMs) {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current);\r\n }\r\n timerRef.current = setTimeout(() => setMessage(''), options.clearAfterMs);\r\n }\r\n });\r\n },\r\n [options.clearAfterMs],\r\n );\r\n\r\n useEffect(\r\n () => () => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current);\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const regionProps = {\r\n role: 'status' as const,\r\n 'aria-live': options.politeness ?? ('polite' as const),\r\n 'aria-atomic': options.atomic ?? true,\r\n 'aria-relevant': options.relevant ?? ('additions text' as const),\r\n style: {\r\n position: 'absolute' as const,\r\n width: 1,\r\n height: 1,\r\n overflow: 'hidden' as const,\r\n clip: 'rect(0 0 0 0)',\r\n whiteSpace: 'nowrap' as const,\r\n },\r\n };\r\n\r\n return { message, announce, regionProps };\r\n}\r\n\r\n/**\r\n * Screen reader-friendly route announcement.\r\n */\r\nexport function useRouteAnnouncement() {\r\n const { announce, regionProps, message } = useLiveAnnouncement({\r\n politeness: 'assertive',\r\n clearAfterMs: 3000,\r\n });\r\n\r\n const announcePageChange = useCallback(\r\n (pageTitle: string) => {\r\n announce(`Nawigacja do: ${pageTitle}`);\r\n // Also update document title for screen readers\r\n if (typeof document !== 'undefined') {\r\n document.title = pageTitle;\r\n }\r\n },\r\n [announce],\r\n );\r\n\r\n return { announcePageChange, regionProps, message };\r\n}\r\n\r\n/**\r\n * Enhanced focus management for complex widgets.\r\n */\r\nexport function useFocusManagement() {\r\n const containerRef = useRef<HTMLElement>(null);\r\n\r\n /** Move focus to first focusable element within container. */\r\n const focusFirst = useCallback(() => {\r\n const el = containerRef.current?.querySelector<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n el?.focus();\r\n }, []);\r\n\r\n /** Move focus to the element matching selector. */\r\n const focusElement = useCallback((selector: string) => {\r\n containerRef.current?.querySelector<HTMLElement>(selector)?.focus();\r\n }, []);\r\n\r\n /** Get all focusable elements. */\r\n const getFocusableElements = useCallback((): HTMLElement[] => {\r\n if (!containerRef.current) {\r\n return [];\r\n }\r\n return Array.from(\r\n containerRef.current.querySelectorAll<HTMLElement>(\r\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n ),\r\n );\r\n }, []);\r\n\r\n return { containerRef, focusFirst, focusElement, getFocusableElements };\r\n}\r\n\r\n// ── Cognitive Accessibility ─────────────────────────────────────\r\n\r\nexport interface CognitiveAccessibilityOptions {\r\n /** Simplify interface by hiding non-essential elements. */\r\n simplifiedMode?: boolean;\r\n /** Increase spacing between interactive elements. */\r\n increasedSpacing?: boolean;\r\n /** Show reading guides (horizontal line that follows cursor). */\r\n readingGuide?: boolean;\r\n /** Highlight focused element with thick outline. */\r\n enhancedFocus?: boolean;\r\n /** Reduce animation motion. */\r\n reduceMotion?: boolean;\r\n /** Show text labels alongside icons. */\r\n iconLabels?: boolean;\r\n /** Larger click targets (56px minimum). */\r\n largeTargets?: boolean;\r\n /** Dyslexia-friendly font. */\r\n dyslexiaFont?: boolean;\r\n /** Line spacing multiplier (1.0 - 3.0). */\r\n lineSpacing?: number;\r\n /** Word spacing multiplier (1.0 - 3.0). */\r\n wordSpacing?: number;\r\n}\r\n\r\nconst DEFAULT_COGNITIVE: CognitiveAccessibilityOptions = {\r\n simplifiedMode: false,\r\n increasedSpacing: false,\r\n readingGuide: false,\r\n enhancedFocus: false,\r\n reduceMotion: false,\r\n iconLabels: false,\r\n largeTargets: false,\r\n dyslexiaFont: false,\r\n lineSpacing: 1.5,\r\n wordSpacing: 1.0,\r\n};\r\n\r\n/**\r\n * Hook for cognitive accessibility features.\r\n *\r\n * Returns CSS class names and inline styles to apply to the app root.\r\n */\r\nexport function useCognitiveAccessibility(\r\n options: CognitiveAccessibilityOptions = DEFAULT_COGNITIVE,\r\n) {\r\n const [settings, setSettings] = useState({ ...DEFAULT_COGNITIVE, ...options });\r\n\r\n const updateSetting = useCallback(\r\n <K extends keyof CognitiveAccessibilityOptions>(\r\n key: K,\r\n value: CognitiveAccessibilityOptions[K],\r\n ) => {\r\n setSettings((prev) => ({ ...prev, [key]: value }));\r\n },\r\n [],\r\n );\r\n\r\n /** Generate CSS to apply cognitive accessibility styles. */\r\n const css = generateCognitiveCSS(settings);\r\n\r\n /** CSS classes to apply to root element. */\r\n const rootClasses = [\r\n settings.simplifiedMode && 'nice-a11y-simplified',\r\n settings.increasedSpacing && 'nice-a11y-spacing',\r\n settings.enhancedFocus && 'nice-a11y-enhanced-focus',\r\n settings.reduceMotion && 'nice-a11y-reduce-motion',\r\n settings.iconLabels && 'nice-a11y-icon-labels',\r\n settings.largeTargets && 'nice-a11y-large-targets',\r\n settings.dyslexiaFont && 'nice-a11y-dyslexia',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n /** Inline styles for text adjustments. */\r\n const rootStyle: Record<string, string> = {};\r\n if (settings.lineSpacing && settings.lineSpacing !== 1.5) {\r\n rootStyle.lineHeight = String(settings.lineSpacing);\r\n }\r\n if (settings.wordSpacing && settings.wordSpacing !== 1.0) {\r\n rootStyle.wordSpacing = `${(settings.wordSpacing - 1) * 0.25}em`;\r\n }\r\n\r\n return { settings, updateSetting, css, rootClasses, rootStyle };\r\n}\r\n\r\nfunction generateCognitiveCSS(settings: CognitiveAccessibilityOptions): string {\r\n const rules: string[] = [];\r\n\r\n if (settings.simplifiedMode) {\r\n rules.push(`\r\n.nice-a11y-simplified .nice-secondary,\r\n.nice-a11y-simplified .nice-decorative,\r\n.nice-a11y-simplified [role=\"presentation\"] { display: none !important; }\r\n.nice-a11y-simplified .nice-card { box-shadow: none !important; border: 2px solid #333 !important; }`);\r\n }\r\n\r\n if (settings.increasedSpacing) {\r\n rules.push(`\r\n.nice-a11y-spacing button,\r\n.nice-a11y-spacing input,\r\n.nice-a11y-spacing select,\r\n.nice-a11y-spacing [role=\"button\"] { margin: 8px !important; }`);\r\n }\r\n\r\n if (settings.enhancedFocus) {\r\n rules.push(`\r\n.nice-a11y-enhanced-focus *:focus { outline: 4px solid #0066ff !important; outline-offset: 4px !important; }\r\n.nice-a11y-enhanced-focus *:focus-visible { box-shadow: 0 0 0 6px rgba(0,102,255,0.3) !important; }`);\r\n }\r\n\r\n if (settings.reduceMotion) {\r\n rules.push(`\r\n.nice-a11y-reduce-motion *, .nice-a11y-reduce-motion *::before, .nice-a11y-reduce-motion *::after {\r\n animation-duration: 0.01ms !important; animation-iteration-count: 1 !important;\r\n transition-duration: 0.01ms !important; scroll-behavior: auto !important;\r\n}`);\r\n }\r\n\r\n if (settings.largeTargets) {\r\n rules.push(`\r\n.nice-a11y-large-targets button, .nice-a11y-large-targets a, .nice-a11y-large-targets input,\r\n.nice-a11y-large-targets select, .nice-a11y-large-targets [role=\"button\"] {\r\n min-height: 56px !important; min-width: 56px !important; font-size: 18px !important;\r\n}`);\r\n }\r\n\r\n if (settings.dyslexiaFont) {\r\n rules.push(`\r\n.nice-a11y-dyslexia { font-family: 'OpenDyslexic', 'Comic Sans MS', sans-serif !important; letter-spacing: 0.05em !important; }`);\r\n }\r\n\r\n return rules.join('\\n');\r\n}\r\n\r\n// ── WCAG 2.2 AAA Compliance ─────────────────────────────────────\r\n\r\nexport interface WCAGCheckResult {\r\n rule: string;\r\n level: 'A' | 'AA' | 'AAA';\r\n passed: boolean;\r\n message: string;\r\n element?: string;\r\n}\r\n\r\n/**\r\n * Check color contrast against WCAG AAA requirements.\r\n * AAA requires 7:1 for normal text, 4.5:1 for large text.\r\n */\r\nexport function checkContrastAAA(\r\n foreground: string,\r\n background: string,\r\n isLargeText = false,\r\n): WCAGCheckResult {\r\n const fgLum = relativeLuminance(parseColor(foreground));\r\n const bgLum = relativeLuminance(parseColor(background));\r\n const ratio = contrastRatio(fgLum, bgLum);\r\n const threshold = isLargeText ? 4.5 : 7;\r\n\r\n return {\r\n rule: '1.4.6',\r\n level: 'AAA',\r\n passed: ratio >= threshold,\r\n message: `Contrast ratio ${ratio.toFixed(2)}:1 (requires ${threshold}:1 for AAA${isLargeText ? ' large text' : ''})`,\r\n };\r\n}\r\n\r\n/**\r\n * Run a comprehensive WCAG 2.2 AAA audit on the current document.\r\n */\r\nexport function auditWCAG22AAA(): WCAGCheckResult[] {\r\n if (typeof document === 'undefined') {\r\n return [];\r\n }\r\n const results: WCAGCheckResult[] = [];\r\n\r\n // 2.4.9 Link Purpose (Link Only) — AAA\r\n document.querySelectorAll('a').forEach((a) => {\r\n const text = a.textContent?.trim() ?? '';\r\n const hasAriaLabel = !!a.getAttribute('aria-label');\r\n const generic = ['click here', 'read more', 'learn more', 'here', 'link'];\r\n if (generic.includes(text.toLowerCase()) && !hasAriaLabel) {\r\n results.push({\r\n rule: '2.4.9',\r\n level: 'AAA',\r\n passed: false,\r\n message: `Link with generic text \"${text}\" lacks descriptive label`,\r\n element: a.outerHTML.slice(0, 100),\r\n });\r\n }\r\n });\r\n\r\n // 2.4.10 Section Headings — AAA\r\n const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');\r\n const sections = document.querySelectorAll('section, article, main, aside');\r\n sections.forEach((section) => {\r\n const hasHeading = section.querySelector('h1, h2, h3, h4, h5, h6');\r\n if (!hasHeading) {\r\n results.push({\r\n rule: '2.4.10',\r\n level: 'AAA',\r\n passed: false,\r\n message: `<${section.tagName.toLowerCase()}> lacks a heading element`,\r\n element: section.tagName.toLowerCase(),\r\n });\r\n }\r\n });\r\n\r\n // 1.4.8 Visual Presentation — AAA (text blocks max 80 chars wide)\r\n document.querySelectorAll('p, li, td, span').forEach((el) => {\r\n const style = window.getComputedStyle(el);\r\n const width = parseFloat(style.width);\r\n const fontSize = parseFloat(style.fontSize);\r\n if (fontSize > 0 && width / fontSize > 80) {\r\n results.push({\r\n rule: '1.4.8',\r\n level: 'AAA',\r\n passed: false,\r\n message: `Text block exceeds 80 character width (${Math.round(width / fontSize)} chars)`,\r\n element: el.tagName.toLowerCase(),\r\n });\r\n }\r\n });\r\n\r\n // 3.2.5 Change on Request — AAA (no context changes on input)\r\n document.querySelectorAll('input[type=\"checkbox\"], input[type=\"radio\"], select').forEach((el) => {\r\n const hasOnChange = el.hasAttribute('onchange');\r\n if (hasOnChange) {\r\n results.push({\r\n rule: '3.2.5',\r\n level: 'AAA',\r\n passed: false,\r\n message: 'Form control has inline onchange handler — may cause unexpected context change',\r\n element: el.tagName.toLowerCase(),\r\n });\r\n }\r\n });\r\n\r\n // 2.2.3 No Timing — AAA\r\n // Check for auto-playing media\r\n document.querySelectorAll('video[autoplay], audio[autoplay]').forEach((el) => {\r\n results.push({\r\n rule: '2.2.3',\r\n level: 'AAA',\r\n passed: false,\r\n message: 'Auto-playing media found — user should control timing',\r\n element: el.tagName.toLowerCase(),\r\n });\r\n });\r\n\r\n return results;\r\n}\r\n\r\n// ── Color Utilities (for WCAG) ──────────────────────────────────\r\n\r\nfunction parseColor(color: string): [number, number, number] {\r\n if (color.startsWith('#')) {\r\n const hex = color.slice(1);\r\n const r = parseInt(hex.slice(0, 2), 16) / 255;\r\n const g = parseInt(hex.slice(2, 4), 16) / 255;\r\n const b = parseInt(hex.slice(4, 6), 16) / 255;\r\n return [r, g, b];\r\n }\r\n return [0, 0, 0];\r\n}\r\n\r\nfunction relativeLuminance([r, g, b]: [number, number, number]): number {\r\n const linearize = (c: number) => (c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\r\n return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\r\n}\r\n\r\nfunction contrastRatio(l1: number, l2: number): number {\r\n const lighter = Math.max(l1, l2);\r\n const darker = Math.min(l1, l2);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Color Vision Deficiency simulation\r\n// Helps designers/developers verify contrast & affordance for\r\n// users with protanopia / deuteranopia / tritanopia / achromatopsia.\r\n//\r\n// Approach: inject a single <svg> sprite with feColorMatrix filters\r\n// and toggle a CSS filter on the chosen root element via a class.\r\n// Pure CSS — zero per-frame cost beyond the GPU compositor.\r\n// ============================================================\r\n\r\nimport { useEffect, useRef } from 'react';\r\n\r\nexport type NiceColorBlindMode =\r\n | 'none'\r\n | 'protanopia'\r\n | 'protanomaly'\r\n | 'deuteranopia'\r\n | 'deuteranomaly'\r\n | 'tritanopia'\r\n | 'tritanomaly'\r\n | 'achromatopsia'\r\n | 'achromatomaly';\r\n\r\nexport const NICE_COLOR_BLIND_MODES: NiceColorBlindMode[] = [\r\n 'none',\r\n 'protanopia',\r\n 'protanomaly',\r\n 'deuteranopia',\r\n 'deuteranomaly',\r\n 'tritanopia',\r\n 'tritanomaly',\r\n 'achromatopsia',\r\n 'achromatomaly',\r\n];\r\n\r\nconst SPRITE_ID = 'nice2dev-color-blind-filters';\r\nconst STYLE_ID = 'nice2dev-color-blind-styles';\r\n\r\n// Color matrices sourced from public color vision research\r\n// (Brettel/Vienot/Mollon model, simplified). Values match commonly\r\n// referenced libraries (color-blind, react-colorblind).\r\nconst FILTERS: Record<Exclude<NiceColorBlindMode, 'none'>, string> = {\r\n protanopia: '0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0',\r\n protanomaly: '0.817 0.183 0 0 0 0.333 0.667 0 0 0 0 0.125 0.875 0 0 0 0 0 1 0',\r\n deuteranopia: '0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0',\r\n deuteranomaly: '0.8 0.2 0 0 0 0.258 0.742 0 0 0 0 0.142 0.858 0 0 0 0 0 1 0',\r\n tritanopia: '0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0',\r\n tritanomaly: '0.967 0.033 0 0 0 0 0.733 0.267 0 0 0 0.183 0.817 0 0 0 0 0 1 0',\r\n achromatopsia: '0.299 0.587 0.114 0 0 0.299 0.587 0.114 0 0 0.299 0.587 0.114 0 0 0 0 0 1 0',\r\n achromatomaly: '0.618 0.320 0.062 0 0 0.163 0.775 0.062 0 0 0.163 0.320 0.516 0 0 0 0 0 1 0',\r\n};\r\n\r\nfunction ensureSprite(): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n if (document.getElementById(SPRITE_ID)) {\r\n return;\r\n }\r\n\r\n const svgNs = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(svgNs, 'svg');\r\n svg.id = SPRITE_ID;\r\n svg.setAttribute('aria-hidden', 'true');\r\n svg.setAttribute('focusable', 'false');\r\n svg.style.position = 'absolute';\r\n svg.style.width = '0';\r\n svg.style.height = '0';\r\n svg.style.overflow = 'hidden';\r\n\r\n const defs = document.createElementNS(svgNs, 'defs');\r\n for (const [mode, matrix] of Object.entries(FILTERS)) {\r\n const filter = document.createElementNS(svgNs, 'filter');\r\n filter.id = `nice-cb-${mode}`;\r\n filter.setAttribute('color-interpolation-filters', 'sRGB');\r\n const fe = document.createElementNS(svgNs, 'feColorMatrix');\r\n fe.setAttribute('type', 'matrix');\r\n fe.setAttribute('values', matrix);\r\n filter.appendChild(fe);\r\n defs.appendChild(filter);\r\n }\r\n svg.appendChild(defs);\r\n document.body.appendChild(svg);\r\n\r\n if (!document.getElementById(STYLE_ID)) {\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = Object.keys(FILTERS)\r\n .map((m) => `.nice-color-blind-${m}{filter:url(#nice-cb-${m})!important;}`)\r\n .join('');\r\n document.head.appendChild(style);\r\n }\r\n}\r\n\r\nfunction clearAllClasses(target: HTMLElement): void {\r\n for (const mode of Object.keys(FILTERS)) {\r\n target.classList.remove(`nice-color-blind-${mode}`);\r\n }\r\n}\r\n\r\n/** Apply a color-blind simulation filter to the given element. */\r\nexport function applyColorBlindMode(\r\n mode: NiceColorBlindMode,\r\n target: HTMLElement | null = typeof document !== 'undefined' ? document.documentElement : null,\r\n): void {\r\n if (!target) {\r\n return;\r\n }\r\n ensureSprite();\r\n clearAllClasses(target);\r\n if (mode !== 'none') {\r\n target.classList.add(`nice-color-blind-${mode}`);\r\n }\r\n}\r\n\r\nexport interface UseColorBlindModeOptions {\r\n /** Element to filter. Defaults to <html>. */\r\n target?: HTMLElement | null;\r\n}\r\n\r\n/**\r\n * React hook that applies the chosen color-blind simulation filter to the\r\n * target element (defaults to <html>) and cleans up automatically on unmount.\r\n *\r\n * Useful for accessibility audits — drop into your app shell and expose a\r\n * select control to QA teams or designers.\r\n */\r\nexport function useColorBlindMode(\r\n mode: NiceColorBlindMode,\r\n options: UseColorBlindModeOptions = {},\r\n): void {\r\n const { target } = options;\r\n const lastTargetRef = useRef<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n const root = target ?? (typeof document !== 'undefined' ? document.documentElement : null);\r\n lastTargetRef.current = root;\r\n applyColorBlindMode(mode, root);\r\n return () => {\r\n const r = lastTargetRef.current;\r\n if (r) {\r\n clearAllClasses(r);\r\n }\r\n };\r\n }, [mode, target]);\r\n}\r\n\r\n/** Imperative helper exposed to controls outside React. */\r\nexport function createColorBlindController(\r\n target: HTMLElement | null = typeof document !== 'undefined' ? document.documentElement : null,\r\n): {\r\n set: (mode: NiceColorBlindMode) => void;\r\n clear: () => void;\r\n} {\r\n return {\r\n set: (mode) => applyColorBlindMode(mode, target),\r\n clear: () => {\r\n if (target) {\r\n clearAllClasses(target);\r\n }\r\n },\r\n };\r\n}\r\n","/**\r\n * NicePluginSystem — runtime plugin loading skeleton (v1.0.10 stub, E2.5).\r\n *\r\n * Goals:\r\n * - Discover, register, activate and deactivate plugins at runtime.\r\n * - Decouple plugin authors from internal modules via a typed `NicePluginContext`.\r\n * - Stay framework-agnostic: zero React imports, safe to use from SSR or workers.\r\n *\r\n * NOT IN SCOPE (deferred to v1.0.11+):\r\n * - Sandbox / iframe execution\r\n * - Permission prompts UI\r\n * - Marketplace fetching / version resolution\r\n * - Hot reload semantics\r\n */\r\n\r\n/** Lifecycle phase a plugin is currently in. */\r\nexport type NicePluginStatus =\r\n | 'registered'\r\n | 'activating'\r\n | 'active'\r\n | 'deactivating'\r\n | 'inactive'\r\n | 'error';\r\n\r\n/** Permission a plugin may request. Coarse-grained by design. */\r\nexport type NicePluginPermission =\r\n | 'storage:read'\r\n | 'storage:write'\r\n | 'network:fetch'\r\n | 'ui:overlay'\r\n | 'ui:command'\r\n | 'theme:read'\r\n | 'i18n:contribute'\r\n | 'events:listen'\r\n | 'events:emit';\r\n\r\n/** Static metadata supplied by plugin authors. */\r\nexport interface NicePluginManifest {\r\n /** Stable, unique id (reverse-DNS recommended, e.g. `com.acme.timer`). */\r\n id: string;\r\n /** Human-readable name. */\r\n name: string;\r\n /** SemVer string. */\r\n version: string;\r\n /** Short description (≤ 160 chars). */\r\n description?: string;\r\n /** Author display name. */\r\n author?: string;\r\n /** Permissions the plugin requests. Empty = sandbox mode. */\r\n permissions?: NicePluginPermission[];\r\n /** IDs of other plugins this one depends on. */\r\n dependsOn?: string[];\r\n /** Optional entry-point hint (URL or module path). */\r\n entry?: string;\r\n /** Free-form metadata (icons, tags, marketplace info). */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n/** Runtime context handed to a plugin during activation. */\r\nexport interface NicePluginContext {\r\n /** The granted permissions (intersection of requested + host policy). */\r\n readonly permissions: ReadonlySet<NicePluginPermission>;\r\n /** Logger scoped to this plugin id. */\r\n log: (level: 'debug' | 'info' | 'warn' | 'error', ...args: unknown[]) => void;\r\n /** Subscribe to a host event. Returns an unsubscribe function. */\r\n on: (event: string, handler: (payload: unknown) => void) => () => void;\r\n /** Emit an event to the host (subject to `events:emit` permission). */\r\n emit: (event: string, payload?: unknown) => void;\r\n /** Persist a value (subject to `storage:write`). */\r\n setItem: (key: string, value: unknown) => Promise<void>;\r\n /** Read a previously stored value (subject to `storage:read`). */\r\n getItem: <T = unknown>(key: string) => Promise<T | undefined>;\r\n}\r\n\r\n/** A loadable plugin module. */\r\nexport interface NicePlugin {\r\n manifest: NicePluginManifest;\r\n /** Called once when the plugin is activated. */\r\n activate(ctx: NicePluginContext): void | Promise<void>;\r\n /** Called when the plugin is deactivated or unloaded. */\r\n deactivate?(): void | Promise<void>;\r\n}\r\n\r\n/** Public registry record exposed to consumers. */\r\nexport interface NicePluginRecord {\r\n manifest: NicePluginManifest;\r\n status: NicePluginStatus;\r\n error?: string;\r\n activatedAt?: number;\r\n}\r\n\r\n/** Options accepted by {@link createNicePluginSystem}. */\r\nexport interface NicePluginSystemOptions {\r\n /** Default permission policy. Returns the subset that should be granted. */\r\n permissionPolicy?: (\r\n requested: ReadonlyArray<NicePluginPermission>,\r\n manifest: NicePluginManifest,\r\n ) => NicePluginPermission[];\r\n /** Storage backend (defaults to in-memory map). */\r\n storage?: {\r\n getItem: (key: string) => Promise<unknown>;\r\n setItem: (key: string, value: unknown) => Promise<void>;\r\n };\r\n /** Optional logger sink. */\r\n logger?: (pluginId: string, level: 'debug' | 'info' | 'warn' | 'error', args: unknown[]) => void;\r\n}\r\n\r\n/** Public surface returned by {@link createNicePluginSystem}. */\r\nexport interface NicePluginSystem {\r\n register(plugin: NicePlugin): NicePluginRecord;\r\n unregister(id: string): boolean;\r\n activate(id: string): Promise<NicePluginRecord>;\r\n deactivate(id: string): Promise<NicePluginRecord>;\r\n list(): NicePluginRecord[];\r\n get(id: string): NicePluginRecord | undefined;\r\n on(\r\n event: 'register' | 'activate' | 'deactivate' | 'error',\r\n handler: (record: NicePluginRecord) => void,\r\n ): () => void;\r\n}\r\n\r\ninterface InternalEntry {\r\n plugin: NicePlugin;\r\n record: NicePluginRecord;\r\n cleanups: Array<() => void | Promise<void>>;\r\n}\r\n\r\nconst defaultPolicy = (requested: ReadonlyArray<NicePluginPermission>): NicePluginPermission[] => [\r\n ...requested,\r\n];\r\n\r\nconst defaultStorage = (): NonNullable<NicePluginSystemOptions['storage']> => {\r\n const map = new Map<string, unknown>();\r\n return {\r\n getItem: (k) => Promise.resolve(map.get(k)),\r\n setItem: (k, v) => {\r\n map.set(k, v);\r\n return Promise.resolve();\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Create a fresh plugin system instance. Multiple isolated systems can coexist\r\n * (e.g. one per workspace, one for tests).\r\n */\r\nexport function createNicePluginSystem(options: NicePluginSystemOptions = {}): NicePluginSystem {\r\n const policy = options.permissionPolicy ?? defaultPolicy;\r\n const storage = options.storage ?? defaultStorage();\r\n const logger = options.logger;\r\n const entries = new Map<string, InternalEntry>();\r\n const hostEvents = new Map<string, Set<(payload: unknown) => void>>();\r\n const systemEvents = new Map<string, Set<(record: NicePluginRecord) => void>>();\r\n\r\n const emitSystem = (\r\n event: 'register' | 'activate' | 'deactivate' | 'error',\r\n record: NicePluginRecord,\r\n ): void => {\r\n const set = systemEvents.get(event);\r\n if (!set) {\r\n return;\r\n }\r\n for (const h of set) {\r\n try {\r\n h(record);\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n };\r\n\r\n const buildContext = (\r\n manifest: NicePluginManifest,\r\n granted: NicePluginPermission[],\r\n cleanups: InternalEntry['cleanups'],\r\n ): NicePluginContext => {\r\n const grantedSet = new Set(granted);\r\n return {\r\n permissions: grantedSet,\r\n log: (level, ...args) => {\r\n if (logger) {\r\n logger(manifest.id, level, args);\r\n }\r\n },\r\n on: (event, handler) => {\r\n let set = hostEvents.get(event);\r\n if (!set) {\r\n set = new Set();\r\n hostEvents.set(event, set);\r\n }\r\n set.add(handler);\r\n const off = (): void => {\r\n set!.delete(handler);\r\n };\r\n cleanups.push(off);\r\n return off;\r\n },\r\n emit: (event, payload) => {\r\n if (!grantedSet.has('events:emit')) {\r\n return;\r\n }\r\n const set = hostEvents.get(event);\r\n if (!set) {\r\n return;\r\n }\r\n for (const h of set) {\r\n try {\r\n h(payload);\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n },\r\n setItem: async (key, value) => {\r\n if (!grantedSet.has('storage:write')) {\r\n return;\r\n }\r\n await storage.setItem(`${manifest.id}:${key}`, value);\r\n },\r\n getItem: async <T = unknown>(key: string): Promise<T | undefined> => {\r\n if (!grantedSet.has('storage:read')) {\r\n return undefined;\r\n }\r\n return (await storage.getItem(`${manifest.id}:${key}`)) as T | undefined;\r\n },\r\n };\r\n };\r\n\r\n return {\r\n register(plugin) {\r\n const id = plugin.manifest.id;\r\n if (entries.has(id)) {\r\n throw new Error(`Plugin \"${id}\" already registered`);\r\n }\r\n const record: NicePluginRecord = {\r\n manifest: plugin.manifest,\r\n status: 'registered',\r\n };\r\n entries.set(id, { plugin, record, cleanups: [] });\r\n emitSystem('register', record);\r\n return record;\r\n },\r\n unregister(id) {\r\n const entry = entries.get(id);\r\n if (!entry) {\r\n return false;\r\n }\r\n entries.delete(id);\r\n return true;\r\n },\r\n async activate(id) {\r\n const entry = entries.get(id);\r\n if (!entry) {\r\n throw new Error(`Unknown plugin \"${id}\"`);\r\n }\r\n if (entry.record.status === 'active') {\r\n return entry.record;\r\n }\r\n // Resolve dependencies first.\r\n for (const dep of entry.plugin.manifest.dependsOn ?? []) {\r\n const depEntry = entries.get(dep);\r\n if (!depEntry) {\r\n entry.record.status = 'error';\r\n entry.record.error = `Missing dependency: ${dep}`;\r\n emitSystem('error', entry.record);\r\n throw new Error(entry.record.error);\r\n }\r\n if (depEntry.record.status !== 'active') {\r\n await this.activate(dep);\r\n }\r\n }\r\n entry.record.status = 'activating';\r\n try {\r\n const granted = policy(entry.plugin.manifest.permissions ?? [], entry.plugin.manifest);\r\n const ctx = buildContext(entry.plugin.manifest, granted, entry.cleanups);\r\n await entry.plugin.activate(ctx);\r\n entry.record.status = 'active';\r\n entry.record.activatedAt = Date.now();\r\n entry.record.error = undefined;\r\n emitSystem('activate', entry.record);\r\n } catch (err) {\r\n entry.record.status = 'error';\r\n entry.record.error = err instanceof Error ? err.message : String(err);\r\n emitSystem('error', entry.record);\r\n throw err;\r\n }\r\n return entry.record;\r\n },\r\n async deactivate(id) {\r\n const entry = entries.get(id);\r\n if (!entry) {\r\n throw new Error(`Unknown plugin \"${id}\"`);\r\n }\r\n if (entry.record.status !== 'active') {\r\n return entry.record;\r\n }\r\n entry.record.status = 'deactivating';\r\n try {\r\n await entry.plugin.deactivate?.();\r\n for (const c of entry.cleanups.splice(0)) {\r\n await c();\r\n }\r\n entry.record.status = 'inactive';\r\n emitSystem('deactivate', entry.record);\r\n } catch (err) {\r\n entry.record.status = 'error';\r\n entry.record.error = err instanceof Error ? err.message : String(err);\r\n emitSystem('error', entry.record);\r\n throw err;\r\n }\r\n return entry.record;\r\n },\r\n list() {\r\n return [...entries.values()].map((e) => ({ ...e.record }));\r\n },\r\n get(id) {\r\n const entry = entries.get(id);\r\n return entry ? { ...entry.record } : undefined;\r\n },\r\n on(event, handler) {\r\n let set = systemEvents.get(event);\r\n if (!set) {\r\n set = new Set();\r\n systemEvents.set(event, set);\r\n }\r\n set.add(handler);\r\n return () => {\r\n set!.delete(handler);\r\n };\r\n },\r\n };\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Testing Utilities\r\n// Helpers for @testing-library/react compatible tests\r\n// ============================================================\r\n\r\nimport React from 'react';\r\n\r\n// ── Test ID builder ────────────────────────────────────────\r\n\r\n/**\r\n * Generate consistent data-testid attributes.\r\n *\r\n * @example\r\n * testId('nice-button', 'submit') // 'nice-button-submit'\r\n * testId('nice-datagrid', 'row', 3) // 'nice-datagrid-row-3'\r\n */\r\nexport function testId(...parts: (string | number)[]): string {\r\n return parts.join('-');\r\n}\r\n\r\n// ── Query helpers (for use with @testing-library/react) ────\r\n\r\n/**\r\n * Selectors for querying Nice2Dev components in tests.\r\n * Every nice component renders a data-testid by convention.\r\n *\r\n * @example\r\n * import { niceSelectors } from '@nice2dev/ui/testing';\r\n * const btn = screen.getByTestId(niceSelectors.button('submit'));\r\n * const grid = screen.getByTestId(niceSelectors.dataGrid());\r\n */\r\nexport const niceSelectors = {\r\n button: (id?: string) => (id ? `nice-button-${id}` : 'nice-button'),\r\n textInput: (id?: string) => (id ? `nice-text-input-${id}` : 'nice-text-input'),\r\n numberInput: (id?: string) => (id ? `nice-number-input-${id}` : 'nice-number-input'),\r\n select: (id?: string) => (id ? `nice-select-${id}` : 'nice-select'),\r\n checkbox: (id?: string) => (id ? `nice-checkbox-${id}` : 'nice-checkbox'),\r\n toggle: (id?: string) => (id ? `nice-toggle-${id}` : 'nice-toggle'),\r\n datePicker: (id?: string) => (id ? `nice-date-picker-${id}` : 'nice-date-picker'),\r\n dataGrid: (id?: string) => (id ? `nice-datagrid-${id}` : 'nice-datagrid'),\r\n table: (id?: string) => (id ? `nice-table-${id}` : 'nice-table'),\r\n list: (id?: string) => (id ? `nice-list-${id}` : 'nice-list'),\r\n treeView: (id?: string) => (id ? `nice-tree-${id}` : 'nice-tree'),\r\n modal: (id?: string) => (id ? `nice-modal-${id}` : 'nice-modal'),\r\n drawer: (id?: string) => (id ? `nice-drawer-${id}` : 'nice-drawer'),\r\n form: (id?: string) => (id ? `nice-form-${id}` : 'nice-form'),\r\n tabs: (id?: string) => (id ? `nice-tabs-${id}` : 'nice-tabs'),\r\n menu: (id?: string) => (id ? `nice-menu-${id}` : 'nice-menu'),\r\n chart: (id?: string) => (id ? `nice-chart-${id}` : 'nice-chart'),\r\n scheduler: (id?: string) => (id ? `nice-scheduler-${id}` : 'nice-scheduler'),\r\n};\r\n\r\n// ── Wrapper with all providers ─────────────────────────────\r\n\r\nexport interface NiceTestWrapperProps {\r\n children: React.ReactNode;\r\n /** Optional theme to apply */\r\n theme?: Record<string, unknown>;\r\n /** Direction for RTL testing */\r\n direction?: 'ltr' | 'rtl';\r\n /** Custom translation function */\r\n t?: (key: string, defaultValue: string) => string;\r\n}\r\n\r\n/**\r\n * Wraps components with all necessary providers for testing.\r\n * Creates a clean environment with i18n, theme, and a11y contexts.\r\n *\r\n * @example\r\n * render(<NiceButton>Click</NiceButton>, { wrapper: NiceTestWrapper });\r\n *\r\n * // Or with options:\r\n * const Wrapper = ({ children }) => (\r\n * <NiceTestWrapper direction=\"rtl\">{children}</NiceTestWrapper>\r\n * );\r\n * render(<NiceButton>Click</NiceButton>, { wrapper: Wrapper });\r\n */\r\nexport const NiceTestWrapper: React.FC<NiceTestWrapperProps> = ({ children, direction = 'ltr' }) =>\r\n React.createElement(\r\n 'div',\r\n {\r\n dir: direction,\r\n 'data-testid': 'nice-test-root',\r\n style: { direction },\r\n },\r\n children,\r\n );\r\n\r\nNiceTestWrapper.displayName = 'NiceTestWrapper';\r\n\r\n// ── Simulation helpers ─────────────────────────────────────\r\n\r\n/**\r\n * Simulate keyboard events for testing keyboard navigation.\r\n *\r\n * @example\r\n * const el = screen.getByTestId('nice-select');\r\n * simulateKeyboard(el, 'ArrowDown');\r\n * simulateKeyboard(el, 'Enter');\r\n */\r\nexport function simulateKeyboard(\r\n element: HTMLElement,\r\n key: string,\r\n options?: Partial<KeyboardEventInit>,\r\n): void {\r\n const evt = new KeyboardEvent('keydown', {\r\n key,\r\n bubbles: true,\r\n cancelable: true,\r\n ...options,\r\n });\r\n element.dispatchEvent(evt);\r\n}\r\n\r\n/**\r\n * Simulate typing into an input element.\r\n * Dispatches input and change events as @testing-library would.\r\n */\r\nexport function simulateType(element: HTMLInputElement | HTMLTextAreaElement, text: string): void {\r\n const nativeSetter =\r\n Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set ||\r\n Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, 'value')?.set;\r\n\r\n if (nativeSetter) {\r\n nativeSetter.call(element, text);\r\n }\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n}\r\n\r\n// ── Data source mocks ──────────────────────────────────────\r\n\r\nexport interface MockDataSourceOptions<T> {\r\n data: T[];\r\n delay?: number;\r\n keyField?: string;\r\n}\r\n\r\n/**\r\n * Create a mock data source for testing data-bound components.\r\n *\r\n * @example\r\n * const ds = createMockDataSource({\r\n * data: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }],\r\n * });\r\n * render(<NiceDataGrid dataSource={ds} columns={[...]} />);\r\n */\r\nexport function createMockDataSource<T extends Record<string, unknown>>(\r\n options: MockDataSourceOptions<T>,\r\n) {\r\n const { data, delay = 0, keyField = 'id' } = options;\r\n let items = [...data];\r\n\r\n return {\r\n key: keyField,\r\n load: async () => {\r\n if (delay > 0) {\r\n await new Promise((r) => setTimeout(r, delay));\r\n }\r\n return { data: [...items], totalCount: items.length };\r\n },\r\n insert: async (item: T) => {\r\n items.push(item);\r\n return item;\r\n },\r\n update: async (key: unknown, values: Partial<T>) => {\r\n const idx = items.findIndex((i) => i[keyField] === key);\r\n if (idx >= 0) {\r\n items[idx] = { ...items[idx], ...values };\r\n }\r\n },\r\n remove: async (key: unknown) => {\r\n items = items.filter((i) => i[keyField] !== key);\r\n },\r\n getData: () => [...items],\r\n reset: () => {\r\n items = [...data];\r\n },\r\n };\r\n}\r\n\r\n// ── Aria assertion helpers ─────────────────────────────────\r\n\r\n/**\r\n * Check if element has proper ARIA attributes for a11y compliance.\r\n * Returns an array of violations (empty = passed).\r\n */\r\nexport function checkAriaCompliance(element: HTMLElement): string[] {\r\n const violations: string[] = [];\r\n\r\n // Check interactive elements have accessible name\r\n const interactive = element.querySelectorAll<HTMLElement>(\r\n 'button, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"radio\"]',\r\n );\r\n interactive.forEach((el) => {\r\n const name =\r\n el.getAttribute('aria-label') ||\r\n el.getAttribute('aria-labelledby') ||\r\n el.textContent?.trim() ||\r\n el.getAttribute('title');\r\n if (!name) {\r\n violations.push(\r\n `${el.tagName.toLowerCase()}${el.id ? '#' + el.id : ''} missing accessible name`,\r\n );\r\n }\r\n });\r\n\r\n // Check images have alt text\r\n const images = element.querySelectorAll<HTMLImageElement>('img');\r\n images.forEach((img) => {\r\n if (!img.alt && img.getAttribute('role') !== 'presentation') {\r\n violations.push(\r\n `img${img.src ? '[src=\"' + img.src.substring(0, 40) + '...\"]' : ''} missing alt text`,\r\n );\r\n }\r\n });\r\n\r\n // Check form inputs have labels\r\n const inputs = element.querySelectorAll<HTMLInputElement>(\r\n 'input:not([type=\"hidden\"]), select, textarea',\r\n );\r\n inputs.forEach((input) => {\r\n const hasLabel = input.id && element.querySelector(`label[for=\"${input.id}\"]`);\r\n const hasAriaLabel = input.getAttribute('aria-label') || input.getAttribute('aria-labelledby');\r\n if (!hasLabel && !hasAriaLabel) {\r\n violations.push(\r\n `${input.tagName.toLowerCase()}${input.name ? '[name=\"' + input.name + '\"]' : ''} missing label`,\r\n );\r\n }\r\n });\r\n\r\n return violations;\r\n}\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/**\r\n * @file profiling.tsx\r\n * @description Performance profiling tools for Nice2Dev UI components\r\n *\r\n * Features:\r\n * - Component render profiling\r\n * - Re-render detection\r\n * - Performance marks and measures\r\n * - React DevTools Profiler integration\r\n * - User Timing API integration\r\n * - Render count tracking\r\n * - Performance regression detection\r\n *\r\n * @version 1.0.0\r\n * @since 2026-03\r\n * @license MIT\r\n */\r\n\r\nimport React, {\r\n Profiler,\r\n ProfilerOnRenderCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n useCallback,\r\n useMemo,\r\n memo,\r\n} from 'react';\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 1. TYPES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Render timing data\r\n */\r\nexport interface RenderTiming {\r\n /** Component name */\r\n componentName: string;\r\n /** Unique render ID */\r\n renderId: string;\r\n /** Render phase */\r\n phase: 'mount' | 'update' | 'nested-update';\r\n /** Actual render duration (ms) */\r\n actualDuration: number;\r\n /** Base render duration without memoization (ms) */\r\n baseDuration: number;\r\n /** Start time relative to page load */\r\n startTime: number;\r\n /** Commit time */\r\n commitTime: number;\r\n /** Interactions that triggered render */\r\n interactions: Set<{ id: number; name: string; timestamp: number }>;\r\n /** Timestamp */\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Component render stats\r\n */\r\nexport interface RenderStats {\r\n /** Component name */\r\n componentName: string;\r\n /** Total render count */\r\n renderCount: number;\r\n /** Mount count */\r\n mountCount: number;\r\n /** Update count */\r\n updateCount: number;\r\n /** Average render time (ms) */\r\n avgRenderTime: number;\r\n /** Max render time (ms) */\r\n maxRenderTime: number;\r\n /** Min render time (ms) */\r\n minRenderTime: number;\r\n /** Total render time (ms) */\r\n totalRenderTime: number;\r\n /** Last render timestamp */\r\n lastRenderAt: number;\r\n /** Slow render count (>16ms) */\r\n slowRenderCount: number;\r\n}\r\n\r\n/**\r\n * Profiler configuration\r\n */\r\nexport interface ProfilerConfig {\r\n /** Enable profiling (default: true in dev) */\r\n enabled?: boolean;\r\n /** Log renders to console */\r\n logToConsole?: boolean;\r\n /** Slow render threshold (ms) */\r\n slowRenderThreshold?: number;\r\n /** Custom render callback */\r\n onRender?: (timing: RenderTiming) => void;\r\n /** Custom slow render callback */\r\n onSlowRender?: (timing: RenderTiming) => void;\r\n /** Sampling rate (0-1) */\r\n samplingRate?: number;\r\n /** Component names to ignore */\r\n ignoreComponents?: string[];\r\n /** Enable User Timing API marks */\r\n enableUserTiming?: boolean;\r\n /** Track individual props changes */\r\n trackPropsChanges?: boolean;\r\n}\r\n\r\n/**\r\n * Props change info\r\n */\r\nexport interface PropsChange {\r\n propName: string;\r\n oldValue: unknown;\r\n newValue: unknown;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Performance mark\r\n */\r\nexport interface PerformanceMark {\r\n name: string;\r\n startTime: number;\r\n duration?: number;\r\n detail?: Record<string, unknown>;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 2. GLOBAL STATE\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nconst IS_DEV = process.env.NODE_ENV === 'development';\r\n\r\nlet globalConfig: ProfilerConfig = {\r\n enabled: IS_DEV,\r\n logToConsole: false,\r\n slowRenderThreshold: 16, // ~60fps\r\n samplingRate: 1,\r\n enableUserTiming: true,\r\n trackPropsChanges: false,\r\n};\r\n\r\nconst renderTimings: RenderTiming[] = [];\r\nconst componentStats = new Map<string, RenderStats>();\r\nconst performanceMarks = new Map<string, PerformanceMark>();\r\n\r\nlet nextRenderId = 1;\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 3. CONFIGURATION\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Configure the profiler globally\r\n *\r\n * @example\r\n * ```tsx\r\n * configureProfiler({\r\n * enabled: true,\r\n * logToConsole: true,\r\n * slowRenderThreshold: 16,\r\n * onSlowRender: (timing) => reportSlowRender(timing),\r\n * });\r\n * ```\r\n */\r\nexport function configureProfiler(config: Partial<ProfilerConfig>): void {\r\n globalConfig = { ...globalConfig, ...config };\r\n}\r\n\r\n/**\r\n * Get profiler stats for all components\r\n */\r\nexport function getProfilingStats(): Map<string, RenderStats> {\r\n return new Map(componentStats);\r\n}\r\n\r\n/**\r\n * Get profiling stats for a specific component\r\n */\r\nexport function getComponentStats(componentName: string): RenderStats | undefined {\r\n return componentStats.get(componentName);\r\n}\r\n\r\n/**\r\n * Get recent render timings\r\n */\r\nexport function getRecentTimings(limit: number = 100): RenderTiming[] {\r\n return renderTimings.slice(-limit);\r\n}\r\n\r\n/**\r\n * Clear all profiling data\r\n */\r\nexport function clearProfilingData(): void {\r\n renderTimings.length = 0;\r\n componentStats.clear();\r\n performanceMarks.clear();\r\n}\r\n\r\n/**\r\n * Get slow renders (above threshold)\r\n */\r\nexport function getSlowRenders(thresholdMs?: number): RenderTiming[] {\r\n const threshold = thresholdMs ?? globalConfig.slowRenderThreshold ?? 16;\r\n return renderTimings.filter((t) => t.actualDuration > threshold);\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 4. UTILITIES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nfunction shouldSample(): boolean {\r\n return Math.random() < (globalConfig.samplingRate ?? 1);\r\n}\r\n\r\nfunction updateStats(timing: RenderTiming): void {\r\n const existing = componentStats.get(timing.componentName);\r\n\r\n if (existing) {\r\n existing.renderCount++;\r\n if (timing.phase === 'mount') {\r\n existing.mountCount++;\r\n } else {\r\n existing.updateCount++;\r\n }\r\n existing.totalRenderTime += timing.actualDuration;\r\n existing.avgRenderTime = existing.totalRenderTime / existing.renderCount;\r\n existing.maxRenderTime = Math.max(existing.maxRenderTime, timing.actualDuration);\r\n existing.minRenderTime = Math.min(existing.minRenderTime, timing.actualDuration);\r\n existing.lastRenderAt = timing.timestamp;\r\n if (timing.actualDuration > (globalConfig.slowRenderThreshold ?? 16)) {\r\n existing.slowRenderCount++;\r\n }\r\n } else {\r\n componentStats.set(timing.componentName, {\r\n componentName: timing.componentName,\r\n renderCount: 1,\r\n mountCount: timing.phase === 'mount' ? 1 : 0,\r\n updateCount: timing.phase === 'mount' ? 0 : 1,\r\n avgRenderTime: timing.actualDuration,\r\n maxRenderTime: timing.actualDuration,\r\n minRenderTime: timing.actualDuration,\r\n totalRenderTime: timing.actualDuration,\r\n lastRenderAt: timing.timestamp,\r\n slowRenderCount: timing.actualDuration > (globalConfig.slowRenderThreshold ?? 16) ? 1 : 0,\r\n });\r\n }\r\n}\r\n\r\nfunction formatDuration(ms: number): string {\r\n if (ms < 1) {\r\n return `${(ms * 1000).toFixed(0)}μs`;\r\n }\r\n if (ms < 1000) {\r\n return `${ms.toFixed(2)}ms`;\r\n }\r\n return `${(ms / 1000).toFixed(2)}s`;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 5. NICE PROFILER COMPONENT\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\ninterface NiceProfilerProps {\r\n /** Unique ID for the profiler */\r\n id: string;\r\n /** Children to profile */\r\n children: React.ReactNode;\r\n /** Additional render callback */\r\n onRender?: (timing: RenderTiming) => void;\r\n /** Additional slow render callback */\r\n onSlowRender?: (timing: RenderTiming) => void;\r\n /** Override slow threshold */\r\n slowThreshold?: number;\r\n /** Enable console logging for this profiler */\r\n logToConsole?: boolean;\r\n}\r\n\r\n/**\r\n * NiceProfiler - Wrapper component for profiling\r\n *\r\n * @example\r\n * ```tsx\r\n * <NiceProfiler id=\"DataGrid\" onSlowRender={handleSlowRender}>\r\n * <NiceDataGrid data={data} />\r\n * </NiceProfiler>\r\n * ```\r\n */\r\nexport const NiceProfiler: React.FC<NiceProfilerProps> = ({\r\n id,\r\n children,\r\n onRender,\r\n onSlowRender,\r\n slowThreshold,\r\n logToConsole,\r\n}) => {\r\n const handleRender: ProfilerOnRenderCallback = useCallback(\r\n (\r\n profilerId: string,\r\n phase: 'mount' | 'update' | 'nested-update',\r\n actualDuration: number,\r\n baseDuration: number,\r\n startTime: number,\r\n commitTime: number,\r\n ) => {\r\n if (!globalConfig.enabled || !shouldSample()) {\r\n return;\r\n }\r\n if (globalConfig.ignoreComponents?.includes(profilerId)) {\r\n return;\r\n }\r\n\r\n const timing: RenderTiming = {\r\n componentName: profilerId,\r\n renderId: `render-${nextRenderId++}`,\r\n phase,\r\n actualDuration,\r\n baseDuration,\r\n startTime,\r\n commitTime,\r\n interactions: new Set(),\r\n timestamp: Date.now(),\r\n };\r\n\r\n renderTimings.push(timing);\r\n updateStats(timing);\r\n\r\n // User Timing API\r\n if (globalConfig.enableUserTiming) {\r\n try {\r\n performance.measure(`Nice:${profilerId}:${phase}`, {\r\n start: startTime,\r\n duration: actualDuration,\r\n });\r\n } catch {\r\n // Ignore if User Timing API not available\r\n }\r\n }\r\n\r\n // Console logging\r\n const shouldLog = logToConsole ?? globalConfig.logToConsole;\r\n if (shouldLog) {\r\n const threshold = slowThreshold ?? globalConfig.slowRenderThreshold ?? 16;\r\n const isSlow = actualDuration > threshold;\r\n\r\n console.log(\r\n `%c[Profile] ${profilerId} ${phase}`,\r\n `color: ${isSlow ? 'var(--color-error, #dc2626)' : 'var(--color-success, #22c55e)'}; font-weight: ${isSlow ? 'bold' : 'normal'}`,\r\n {\r\n actual: formatDuration(actualDuration),\r\n base: formatDuration(baseDuration),\r\n savings: `${((1 - actualDuration / baseDuration) * 100).toFixed(1)}%`,\r\n },\r\n );\r\n }\r\n\r\n // Callbacks\r\n onRender?.(timing);\r\n globalConfig.onRender?.(timing);\r\n\r\n const threshold = slowThreshold ?? globalConfig.slowRenderThreshold ?? 16;\r\n if (actualDuration > threshold) {\r\n onSlowRender?.(timing);\r\n globalConfig.onSlowRender?.(timing);\r\n }\r\n },\r\n [id, onRender, onSlowRender, slowThreshold, logToConsole],\r\n );\r\n\r\n if (!globalConfig.enabled) {\r\n return <>{children}</>;\r\n }\r\n\r\n return (\r\n <Profiler id={id} onRender={handleRender}>\r\n {children}\r\n </Profiler>\r\n );\r\n};\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 6. WHY DID YOU RENDER HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Hook to track why a component re-rendered\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent({ items, onClick }) {\r\n * useWhyDidYouRender('MyComponent', { items, onClick });\r\n * return <div>...</div>;\r\n * }\r\n * ```\r\n */\r\nexport function useWhyDidYouRender(componentName: string, props: Record<string, unknown>): void {\r\n const prevPropsRef = useRef<Record<string, unknown>>();\r\n const renderCountRef = useRef(0);\r\n\r\n useEffect(() => {\r\n if (!globalConfig.enabled || !globalConfig.trackPropsChanges) {\r\n return;\r\n }\r\n\r\n renderCountRef.current++;\r\n\r\n if (renderCountRef.current === 1) {\r\n // First render (mount)\r\n prevPropsRef.current = props;\r\n return;\r\n }\r\n\r\n const prevProps = prevPropsRef.current;\r\n const changes: PropsChange[] = [];\r\n\r\n // Compare props\r\n const allKeys = new Set([...Object.keys(prevProps || {}), ...Object.keys(props)]);\r\n\r\n for (const key of allKeys) {\r\n const oldValue = prevProps?.[key];\r\n const newValue = props[key];\r\n\r\n if (!Object.is(oldValue, newValue)) {\r\n changes.push({\r\n propName: key,\r\n oldValue,\r\n newValue,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n if (changes.length > 0 && globalConfig.logToConsole) {\r\n console.log(\r\n `%c[Why render?] ${componentName}`,\r\n 'color: #6366f1; font-weight: bold',\r\n `Render #${renderCountRef.current}`,\r\n changes.map((c) => ({\r\n prop: c.propName,\r\n from: c.oldValue,\r\n to: c.newValue,\r\n type: typeof c.newValue,\r\n })),\r\n );\r\n }\r\n\r\n prevPropsRef.current = props;\r\n });\r\n}\r\n\r\n/**\r\n * HOC version of useWhyDidYouRender\r\n */\r\nexport function withWhyDidYouRender<P extends object>(\r\n Component: React.ComponentType<P>,\r\n displayName?: string,\r\n): React.FC<P> {\r\n const name = displayName || Component.displayName || Component.name || 'Unknown';\r\n\r\n const WrappedComponent: React.FC<P> = (props) => {\r\n useWhyDidYouRender(name, props as Record<string, unknown>);\r\n return <Component {...props} />;\r\n };\r\n\r\n WrappedComponent.displayName = `WhyDidYouRender(${name})`;\r\n\r\n return WrappedComponent;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 7. RENDER COUNT HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Hook to count component renders\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n * const renderCount = useRenderCount('MyComponent');\r\n * console.log('Render count:', renderCount);\r\n * return <div>...</div>;\r\n * }\r\n * ```\r\n */\r\nexport function useRenderCount(componentName?: string): number {\r\n const countRef = useRef(0);\r\n countRef.current++;\r\n\r\n useEffect(() => {\r\n if (globalConfig.enabled && globalConfig.logToConsole && componentName) {\r\n console.log(\r\n `%c[Render count] ${componentName}: ${countRef.current}`,\r\n `color: ${countRef.current > 10 ? 'var(--color-warning, #f59e0b)' : 'var(--color-success, #22c55e)'}`,\r\n );\r\n }\r\n });\r\n\r\n return countRef.current;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 8. PERFORMANCE MARKS & MEASURES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Start a performance mark\r\n *\r\n * @example\r\n * ```tsx\r\n * startMark('fetchData');\r\n * await fetchData();\r\n * const duration = endMark('fetchData');\r\n * console.log('Fetch took:', duration, 'ms');\r\n * ```\r\n */\r\nexport function startMark(name: string, detail?: Record<string, unknown>): void {\r\n if (!globalConfig.enabled) {\r\n return;\r\n }\r\n\r\n const mark: PerformanceMark = {\r\n name,\r\n startTime: performance.now(),\r\n detail,\r\n };\r\n\r\n performanceMarks.set(name, mark);\r\n\r\n if (globalConfig.enableUserTiming) {\r\n try {\r\n performance.mark(`Nice:${name}:start`, { detail });\r\n } catch {\r\n // Ignore\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * End a performance mark and return duration\r\n */\r\nexport function endMark(name: string): number {\r\n if (!globalConfig.enabled) {\r\n return 0;\r\n }\r\n\r\n const mark = performanceMarks.get(name);\r\n if (!mark) {\r\n console.warn(`[Profile] No mark found for: ${name}`);\r\n return 0;\r\n }\r\n\r\n const duration = performance.now() - mark.startTime;\r\n mark.duration = duration;\r\n\r\n if (globalConfig.enableUserTiming) {\r\n try {\r\n performance.mark(`Nice:${name}:end`);\r\n performance.measure(`Nice:${name}`, `Nice:${name}:start`, `Nice:${name}:end`);\r\n } catch {\r\n // Ignore\r\n }\r\n }\r\n\r\n if (globalConfig.logToConsole) {\r\n console.log(\r\n `%c[Measure] ${name}: ${formatDuration(duration)}`,\r\n `color: ${duration > 100 ? 'var(--color-warning, #f59e0b)' : 'var(--color-success, #22c55e)'}`,\r\n );\r\n }\r\n\r\n return duration;\r\n}\r\n\r\n/**\r\n * Measure an async operation\r\n */\r\nexport async function measureAsync<T>(\r\n name: string,\r\n operation: () => Promise<T>,\r\n detail?: Record<string, unknown>,\r\n): Promise<T> {\r\n startMark(name, detail);\r\n try {\r\n return await operation();\r\n } finally {\r\n endMark(name);\r\n }\r\n}\r\n\r\n/**\r\n * Measure a sync operation\r\n */\r\nexport function measureSync<T>(\r\n name: string,\r\n operation: () => T,\r\n detail?: Record<string, unknown>,\r\n): T {\r\n startMark(name, detail);\r\n try {\r\n return operation();\r\n } finally {\r\n endMark(name);\r\n }\r\n}\r\n\r\n/**\r\n * Hook for measuring effect duration\r\n */\r\nexport function useMeasureEffect(\r\n name: string,\r\n effect: () => void | (() => void),\r\n deps: React.DependencyList,\r\n): void {\r\n useEffect(() => {\r\n startMark(name);\r\n const cleanup = effect();\r\n endMark(name);\r\n\r\n return cleanup;\r\n }, deps);\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 9. PERFORMANCE REPORT\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Get a complete performance report\r\n */\r\nexport function getPerformanceReport(): {\r\n stats: RenderStats[];\r\n slowRenders: RenderTiming[];\r\n totalRenders: number;\r\n avgRenderTime: number;\r\n marks: PerformanceMark[];\r\n} {\r\n const stats = Array.from(componentStats.values());\r\n const slowRenders = getSlowRenders();\r\n const totalRenders = stats.reduce((sum, s) => sum + s.renderCount, 0);\r\n const avgRenderTime =\r\n stats.length > 0 ? stats.reduce((sum, s) => sum + s.avgRenderTime, 0) / stats.length : 0;\r\n const marks = Array.from(performanceMarks.values());\r\n\r\n return { stats, slowRenders, totalRenders, avgRenderTime, marks };\r\n}\r\n\r\n/**\r\n * Print performance report to console\r\n */\r\nexport function printPerformanceReport(): void {\r\n const report = getPerformanceReport();\r\n\r\n console.group(\r\n '%c[Nice2Dev Performance Report]',\r\n 'color: #6366f1; font-weight: bold; font-size: 14px',\r\n );\r\n\r\n console.log(`Total renders: ${report.totalRenders}`);\r\n console.log(`Average render time: ${formatDuration(report.avgRenderTime)}`);\r\n console.log(`Slow renders: ${report.slowRenders.length}`);\r\n\r\n console.group('Component Stats');\r\n console.table(\r\n report.stats\r\n .sort((a, b) => b.totalRenderTime - a.totalRenderTime)\r\n .map((s) => ({\r\n Name: s.componentName,\r\n Renders: s.renderCount,\r\n 'Avg Time': formatDuration(s.avgRenderTime),\r\n 'Max Time': formatDuration(s.maxRenderTime),\r\n 'Total Time': formatDuration(s.totalRenderTime),\r\n 'Slow Renders': s.slowRenderCount,\r\n })),\r\n );\r\n console.groupEnd();\r\n\r\n if (report.slowRenders.length > 0) {\r\n console.group('Slow Renders (last 10)');\r\n console.table(\r\n report.slowRenders.slice(-10).map((t) => ({\r\n Component: t.componentName,\r\n Phase: t.phase,\r\n Duration: formatDuration(t.actualDuration),\r\n Time: new Date(t.timestamp).toLocaleTimeString(),\r\n })),\r\n );\r\n console.groupEnd();\r\n }\r\n\r\n if (report.marks.length > 0) {\r\n console.group('Custom Marks');\r\n console.table(\r\n report.marks\r\n .filter((m) => m.duration)\r\n .map((m) => ({\r\n Name: m.name,\r\n Duration: formatDuration(m.duration!),\r\n })),\r\n );\r\n console.groupEnd();\r\n }\r\n\r\n console.groupEnd();\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 10. REGRESSION DETECTION\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nconst baselineStats = new Map<string, RenderStats>();\r\n\r\n/**\r\n * Save current stats as baseline for regression detection\r\n */\r\nexport function saveBaseline(): void {\r\n for (const [name, stats] of componentStats) {\r\n baselineStats.set(name, { ...stats });\r\n }\r\n console.log('[Profile] Baseline saved');\r\n}\r\n\r\n/**\r\n * Compare current stats against baseline\r\n */\r\nexport function checkRegression(thresholdPercent: number = 20): Array<{\r\n componentName: string;\r\n metric: string;\r\n baseline: number;\r\n current: number;\r\n changePercent: number;\r\n}> {\r\n const regressions: Array<{\r\n componentName: string;\r\n metric: string;\r\n baseline: number;\r\n current: number;\r\n changePercent: number;\r\n }> = [];\r\n\r\n for (const [name, current] of componentStats) {\r\n const baseline = baselineStats.get(name);\r\n if (!baseline) {\r\n continue;\r\n }\r\n\r\n // Check avg render time regression\r\n const avgChange =\r\n ((current.avgRenderTime - baseline.avgRenderTime) / baseline.avgRenderTime) * 100;\r\n if (avgChange > thresholdPercent) {\r\n regressions.push({\r\n componentName: name,\r\n metric: 'avgRenderTime',\r\n baseline: baseline.avgRenderTime,\r\n current: current.avgRenderTime,\r\n changePercent: avgChange,\r\n });\r\n }\r\n\r\n // Check max render time regression\r\n const maxChange =\r\n ((current.maxRenderTime - baseline.maxRenderTime) / baseline.maxRenderTime) * 100;\r\n if (maxChange > thresholdPercent) {\r\n regressions.push({\r\n componentName: name,\r\n metric: 'maxRenderTime',\r\n baseline: baseline.maxRenderTime,\r\n current: current.maxRenderTime,\r\n changePercent: maxChange,\r\n });\r\n }\r\n }\r\n\r\n if (regressions.length > 0 && globalConfig.logToConsole) {\r\n console.warn(\r\n '%c[Regression] Performance regressions detected!',\r\n 'color: #dc2626; font-weight: bold',\r\n regressions,\r\n );\r\n }\r\n\r\n return regressions;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 11. PROFILER OVERLAY COMPONENT\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\ninterface ProfilerOverlayProps {\r\n /** Position on screen */\r\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\r\n /** Initial collapsed state */\r\n defaultCollapsed?: boolean;\r\n}\r\n\r\n/**\r\n * Debug overlay showing profiling stats\r\n *\r\n * @example\r\n * ```tsx\r\n * {process.env.NODE_ENV === 'development' && <ProfilerOverlay position=\"bottom-right\" />}\r\n * ```\r\n */\r\nexport const ProfilerOverlay: React.FC<ProfilerOverlayProps> = memo(\r\n ({ position = 'bottom-right', defaultCollapsed = true }) => {\r\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\r\n const [stats, setStats] = useState<RenderStats[]>([]);\r\n const [memory, setMemory] = useState({ used: 0, total: 0 });\r\n\r\n // Update stats periodically\r\n useEffect(() => {\r\n const update = () => {\r\n const allStats = Array.from(componentStats.values());\r\n setStats(allStats.sort((a, b) => b.totalRenderTime - a.totalRenderTime).slice(0, 10));\r\n\r\n const perf = window.performance as Performance & {\r\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number };\r\n };\r\n if (perf.memory) {\r\n setMemory({\r\n used: perf.memory.usedJSHeapSize / 1024 / 1024,\r\n total: perf.memory.totalJSHeapSize / 1024 / 1024,\r\n });\r\n }\r\n };\r\n\r\n update();\r\n const interval = setInterval(update, 2000);\r\n return () => clearInterval(interval);\r\n }, []);\r\n\r\n if (!globalConfig.enabled) {\r\n return null;\r\n }\r\n\r\n const positionStyles: React.CSSProperties = {\r\n position: 'fixed',\r\n zIndex: 99999,\r\n ...(position.includes('top') ? { top: 8 } : { bottom: 8 }),\r\n ...(position.includes('left') ? { left: 8 } : { right: 8 }),\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n ...positionStyles,\r\n background: 'rgba(0, 0, 0, 0.85)',\r\n color: 'var(--bg-primary, #fff)',\r\n borderRadius: 8,\r\n fontSize: 11,\r\n fontFamily: 'Monaco, Consolas, monospace',\r\n padding: collapsed ? '4px 8px' : 8,\r\n maxWidth: collapsed ? 'auto' : 300,\r\n maxHeight: collapsed ? 'auto' : 400,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <div\r\n style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 8 }}\r\n onClick={() => setCollapsed((c) => !c)}\r\n >\r\n <span style={{ color: 'var(--color-success, #22c55e)' }}>●</span>\r\n <span>Profiler</span>\r\n {memory.used > 0 && (\r\n <span\r\n style={{\r\n color:\r\n memory.used > 100\r\n ? 'var(--color-warning, #f59e0b)'\r\n : 'var(--text-muted, #64748b)',\r\n }}\r\n >\r\n {memory.used.toFixed(0)}MB\r\n </span>\r\n )}\r\n <span style={{ marginLeft: 'auto', opacity: 0.5 }}>{collapsed ? '▼' : '▲'}</span>\r\n </div>\r\n\r\n {!collapsed && (\r\n <div style={{ marginTop: 8 }}>\r\n <div\r\n style={{\r\n borderBottom: '1px solid var(--border-color, #333)',\r\n paddingBottom: 4,\r\n marginBottom: 8,\r\n }}\r\n >\r\n <strong>Top Components</strong>\r\n </div>\r\n {stats.map((s) => (\r\n <div key={s.componentName} style={{ marginBottom: 4, display: 'flex', gap: 8 }}>\r\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {s.componentName}\r\n </span>\r\n <span\r\n style={{\r\n color:\r\n s.avgRenderTime > 16\r\n ? 'var(--color-warning, #f59e0b)'\r\n : 'var(--color-success, #22c55e)',\r\n }}\r\n >\r\n {formatDuration(s.avgRenderTime)}\r\n </span>\r\n <span\r\n style={{ color: 'var(--text-muted, #64748b)', minWidth: 30, textAlign: 'right' }}\r\n >\r\n x{s.renderCount}\r\n </span>\r\n </div>\r\n ))}\r\n\r\n <div style={{ marginTop: 8, display: 'flex', gap: 8 }}>\r\n <button\r\n onClick={printPerformanceReport}\r\n style={{\r\n flex: 1,\r\n padding: '4px 8px',\r\n background: 'var(--bg-tertiary, #333)',\r\n border: 'none',\r\n borderRadius: 4,\r\n color: 'var(--bg-primary, #fff)',\r\n cursor: 'pointer',\r\n fontSize: 10,\r\n }}\r\n >\r\n Print Report\r\n </button>\r\n <button\r\n onClick={clearProfilingData}\r\n style={{\r\n flex: 1,\r\n padding: '4px 8px',\r\n background: 'var(--bg-tertiary, #333)',\r\n border: 'none',\r\n borderRadius: 4,\r\n color: 'var(--bg-primary, #fff)',\r\n cursor: 'pointer',\r\n fontSize: 10,\r\n }}\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nProfilerOverlay.displayName = 'ProfilerOverlay';\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 12. INTEGRATION WITH REACT DEVTOOLS\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Setup integration with React DevTools Profiler\r\n */\r\nexport function setupReactDevToolsIntegration(): void {\r\n if (!IS_DEV) {\r\n return;\r\n }\r\n\r\n // Expose global functions for DevTools console\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- DevTools console hook: untyped global expando for ad-hoc inspection\r\n (window as any).__NICE2DEV_PROFILER__ = {\r\n getStats: getProfilingStats,\r\n getComponentStats,\r\n getSlowRenders,\r\n printReport: printPerformanceReport,\r\n clear: clearProfilingData,\r\n saveBaseline,\r\n checkRegression,\r\n configure: configureProfiler,\r\n };\r\n\r\n console.log(\r\n '%c[Nice2Dev Profiler] DevTools integration ready. Use __NICE2DEV_PROFILER__ in console.',\r\n 'color: #6366f1',\r\n );\r\n}\r\n","/**\r\n * @file leak-detector.tsx\r\n * @description Memory leak detection utilities for development\r\n *\r\n * Detects common React memory leaks:\r\n * - Unmounted component setState calls\r\n * - Orphaned event listeners\r\n * - Uncleared timers/intervals\r\n * - WebSocket connections not closed\r\n * - AbortController not aborted\r\n * - Large retained closures\r\n *\r\n * @version 1.0.0\r\n * @since 2026-03\r\n * @license MIT\r\n */\r\n\r\nimport { useEffect, useRef, useState, useCallback, useMemo } from 'react';\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 1. TYPES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Memory leak warning severity\r\n */\r\nexport type LeakSeverity = 'info' | 'warning' | 'critical';\r\n\r\n/**\r\n * Type of memory leak detected\r\n */\r\nexport type LeakType =\r\n | 'setState-after-unmount'\r\n | 'timer-not-cleared'\r\n | 'listener-not-removed'\r\n | 'subscription-not-unsubscribed'\r\n | 'websocket-not-closed'\r\n | 'abort-controller-not-aborted'\r\n | 'large-closure'\r\n | 'component-retained'\r\n | 'detached-dom-node';\r\n\r\n/**\r\n * Memory leak report entry\r\n */\r\nexport interface LeakReport {\r\n /** Unique ID */\r\n id: string;\r\n /** Type of leak */\r\n type: LeakType;\r\n /** Severity level */\r\n severity: LeakSeverity;\r\n /** Component name (if available) */\r\n componentName?: string;\r\n /** Description of the leak */\r\n message: string;\r\n /** Stack trace (if available) */\r\n stack?: string;\r\n /** Timestamp */\r\n timestamp: number;\r\n /** Additional data */\r\n data?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Leak detector configuration\r\n */\r\nexport interface LeakDetectorConfig {\r\n /** Enable detection (default: true in dev) */\r\n enabled?: boolean;\r\n /** Log to console */\r\n logToConsole?: boolean;\r\n /** Custom reporter */\r\n onLeak?: (report: LeakReport) => void;\r\n /** Component names to ignore */\r\n ignoreComponents?: string[];\r\n /** Sampling rate (0-1, default: 1) */\r\n samplingRate?: number;\r\n /** Track detached DOM nodes */\r\n trackDetachedNodes?: boolean;\r\n /** Closure size threshold (bytes) */\r\n closureSizeThreshold?: number;\r\n}\r\n\r\n/**\r\n * Tracked timer info\r\n */\r\ninterface TrackedTimer {\r\n id: number;\r\n type: 'timeout' | 'interval';\r\n componentName?: string;\r\n stack?: string;\r\n createdAt: number;\r\n}\r\n\r\n/**\r\n * Tracked listener info\r\n */\r\ninterface TrackedListener {\r\n target: EventTarget;\r\n type: string;\r\n listener: EventListener;\r\n componentName?: string;\r\n stack?: string;\r\n createdAt: number;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 2. GLOBAL STATE\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nconst IS_DEV = process.env.NODE_ENV === 'development';\r\n\r\nlet globalConfig: LeakDetectorConfig = {\r\n enabled: IS_DEV,\r\n logToConsole: true,\r\n samplingRate: 1,\r\n trackDetachedNodes: false,\r\n closureSizeThreshold: 1024 * 1024, // 1MB\r\n};\r\n\r\nconst leakReports: LeakReport[] = [];\r\nconst trackedTimers = new Map<number, TrackedTimer>();\r\nconst trackedListeners = new Map<string, TrackedListener>();\r\nconst mountedComponents = new WeakMap<object, { name: string; mountedAt: number }>();\r\n\r\nlet nextReportId = 1;\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 3. UTILITIES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nfunction shouldSample(): boolean {\r\n return Math.random() < (globalConfig.samplingRate ?? 1);\r\n}\r\n\r\nfunction getStack(): string {\r\n try {\r\n throw new Error();\r\n } catch (e) {\r\n return (e as Error).stack?.split('\\n').slice(3).join('\\n') ?? '';\r\n }\r\n}\r\n\r\nfunction generateListenerId(target: EventTarget, type: string, listener: EventListener): string {\r\n return `${(target as { __ntd_id?: string | number }).__ntd_id ?? Math.random()}-${type}-${listener.toString().slice(0, 50)}`;\r\n}\r\n\r\nfunction reportLeak(\r\n type: LeakType,\r\n message: string,\r\n severity: LeakSeverity = 'warning',\r\n componentName?: string,\r\n data?: Record<string, unknown>,\r\n): void {\r\n if (!globalConfig.enabled || !shouldSample()) {\r\n return;\r\n }\r\n if (componentName && globalConfig.ignoreComponents?.includes(componentName)) {\r\n return;\r\n }\r\n\r\n const report: LeakReport = {\r\n id: `leak-${nextReportId++}`,\r\n type,\r\n severity,\r\n componentName,\r\n message,\r\n stack: getStack(),\r\n timestamp: Date.now(),\r\n data,\r\n };\r\n\r\n leakReports.push(report);\r\n\r\n if (globalConfig.logToConsole) {\r\n const method = severity === 'critical' ? 'error' : severity === 'warning' ? 'warn' : 'info';\r\n\r\n console[method](\r\n `%c[NTD Leak Detector] ${type}`,\r\n `color: ${\r\n severity === 'critical'\r\n ? 'var(--color-error, #dc2626)'\r\n : severity === 'warning'\r\n ? 'var(--color-warning, #f59e0b)'\r\n : 'var(--color-primary, #3b82f6)'\r\n }; font-weight: bold`,\r\n message,\r\n componentName ? `(${componentName})` : '',\r\n data || '',\r\n );\r\n }\r\n\r\n globalConfig.onLeak?.(report);\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 4. CONFIGURATION\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Configure the leak detector globally\r\n *\r\n * @example\r\n * ```tsx\r\n * configureLeakDetector({\r\n * enabled: process.env.NODE_ENV === 'development',\r\n * logToConsole: true,\r\n * onLeak: (report) => sendToAnalytics(report),\r\n * ignoreComponents: ['ThirdPartyComponent'],\r\n * });\r\n * ```\r\n */\r\nexport function configureLeakDetector(config: Partial<LeakDetectorConfig>): void {\r\n globalConfig = { ...globalConfig, ...config };\r\n}\r\n\r\n/**\r\n * Get all leaked reports\r\n */\r\nexport function getLeakReports(): LeakReport[] {\r\n return [...leakReports];\r\n}\r\n\r\n/**\r\n * Clear all leak reports\r\n */\r\nexport function clearLeakReports(): void {\r\n leakReports.length = 0;\r\n}\r\n\r\n/**\r\n * Get summary of leaks by type\r\n */\r\nexport function getLeakSummary(): Record<LeakType, number> {\r\n return leakReports.reduce(\r\n (acc, report) => {\r\n acc[report.type] = (acc[report.type] || 0) + 1;\r\n return acc;\r\n },\r\n {} as Record<LeakType, number>,\r\n );\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 5. SAFE STATE HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * useState that prevents setState calls after unmount\r\n * Logs a warning if setState is called after unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * const [data, setData] = useSafeState<Data | null>(null);\r\n *\r\n * useEffect(() => {\r\n * fetchData().then(setData); // Safe even if component unmounts\r\n * }, []);\r\n * ```\r\n */\r\nexport function useSafeState<T>(\r\n initialState: T | (() => T),\r\n componentName?: string,\r\n): [T, React.Dispatch<React.SetStateAction<T>>] {\r\n const [state, setState] = useState(initialState);\r\n const mountedRef = useRef(true);\r\n const nameRef = useRef(componentName);\r\n\r\n useEffect(() => {\r\n mountedRef.current = true;\r\n\r\n return () => {\r\n mountedRef.current = false;\r\n };\r\n }, []);\r\n\r\n const safeSetState = useCallback((value: React.SetStateAction<T>) => {\r\n if (mountedRef.current) {\r\n setState(value);\r\n } else if (globalConfig.enabled) {\r\n reportLeak(\r\n 'setState-after-unmount',\r\n 'setState called on unmounted component',\r\n 'warning',\r\n nameRef.current,\r\n );\r\n }\r\n }, []);\r\n\r\n return [state, safeSetState];\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 6. SAFE TIMEOUT/INTERVAL HOOKS\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * setTimeout that auto-clears on unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * const [startTimeout, clearTimeout] = useSafeTimeout();\r\n *\r\n * startTimeout(() => {\r\n * console.log('Delayed action');\r\n * }, 1000);\r\n * ```\r\n */\r\nexport function useSafeTimeout(\r\n componentName?: string,\r\n): [(callback: () => void, delay: number) => void, () => void] {\r\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n const nameRef = useRef(componentName);\r\n\r\n const clear = useCallback(() => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n if (globalConfig.enabled) {\r\n trackedTimers.delete(timeoutRef.current as unknown as number);\r\n }\r\n timeoutRef.current = null;\r\n }\r\n }, []);\r\n\r\n const start = useCallback(\r\n (callback: () => void, delay: number) => {\r\n clear();\r\n timeoutRef.current = setTimeout(callback, delay);\r\n\r\n if (globalConfig.enabled) {\r\n trackedTimers.set(timeoutRef.current as unknown as number, {\r\n id: timeoutRef.current as unknown as number,\r\n type: 'timeout',\r\n componentName: nameRef.current,\r\n stack: getStack(),\r\n createdAt: Date.now(),\r\n });\r\n }\r\n },\r\n [clear],\r\n );\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n if (globalConfig.enabled) {\r\n reportLeak(\r\n 'timer-not-cleared',\r\n 'Timeout would have leaked without cleanup',\r\n 'info',\r\n nameRef.current,\r\n );\r\n }\r\n clear();\r\n }\r\n };\r\n }, [clear]);\r\n\r\n return [start, clear];\r\n}\r\n\r\n/**\r\n * setInterval that auto-clears on unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * const [startInterval, clearInterval] = useSafeInterval();\r\n *\r\n * useEffect(() => {\r\n * startInterval(() => {\r\n * console.log('Tick');\r\n * }, 1000);\r\n * }, [startInterval]);\r\n * ```\r\n */\r\nexport function useSafeInterval(\r\n componentName?: string,\r\n): [(callback: () => void, delay: number) => void, () => void] {\r\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n const nameRef = useRef(componentName);\r\n\r\n const clear = useCallback(() => {\r\n if (intervalRef.current) {\r\n clearInterval(intervalRef.current as ReturnType<typeof setInterval>);\r\n if (globalConfig.enabled) {\r\n trackedTimers.delete(intervalRef.current as unknown as number);\r\n }\r\n intervalRef.current = null;\r\n }\r\n }, []);\r\n\r\n const start = useCallback(\r\n (callback: () => void, delay: number) => {\r\n clear();\r\n intervalRef.current = setInterval(callback, delay);\r\n\r\n if (globalConfig.enabled) {\r\n trackedTimers.set(intervalRef.current as unknown as number, {\r\n id: intervalRef.current as unknown as number,\r\n type: 'interval',\r\n componentName: nameRef.current,\r\n stack: getStack(),\r\n createdAt: Date.now(),\r\n });\r\n }\r\n },\r\n [clear],\r\n );\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (intervalRef.current) {\r\n if (globalConfig.enabled) {\r\n reportLeak(\r\n 'timer-not-cleared',\r\n 'Interval would have leaked without cleanup',\r\n 'warning',\r\n nameRef.current,\r\n );\r\n }\r\n clear();\r\n }\r\n };\r\n }, [clear]);\r\n\r\n return [start, clear];\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 7. SAFE EVENT LISTENER HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * addEventListener with auto-cleanup on unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * const addListener = useSafeEventListener();\r\n *\r\n * useEffect(() => {\r\n * const cleanup = addListener(window, 'resize', handleResize);\r\n * return cleanup;\r\n * }, [addListener, handleResize]);\r\n * ```\r\n */\r\nexport function useSafeEventListener(\r\n componentName?: string,\r\n): <K extends keyof WindowEventMap>(\r\n target: EventTarget,\r\n type: K | string,\r\n listener: EventListener,\r\n options?: AddEventListenerOptions,\r\n) => () => void {\r\n const listenersRef = useRef<\r\n Array<{\r\n target: EventTarget;\r\n type: string;\r\n listener: EventListener;\r\n options?: AddEventListenerOptions;\r\n }>\r\n >([]);\r\n const nameRef = useRef(componentName);\r\n\r\n useEffect(() => {\r\n return () => {\r\n // Cleanup all listeners on unmount\r\n for (const { target, type, listener, options } of listenersRef.current) {\r\n target.removeEventListener(type, listener, options);\r\n\r\n if (globalConfig.enabled) {\r\n const id = generateListenerId(target, type, listener);\r\n trackedListeners.delete(id);\r\n }\r\n }\r\n\r\n if (listenersRef.current.length > 0 && globalConfig.enabled) {\r\n reportLeak(\r\n 'listener-not-removed',\r\n `${listenersRef.current.length} event listener(s) would have leaked without cleanup`,\r\n 'info',\r\n nameRef.current,\r\n );\r\n }\r\n\r\n listenersRef.current = [];\r\n };\r\n }, []);\r\n\r\n return useCallback(\r\n <K extends keyof WindowEventMap>(\r\n target: EventTarget,\r\n type: K | string,\r\n listener: EventListener,\r\n options?: AddEventListenerOptions,\r\n ) => {\r\n target.addEventListener(type as string, listener, options);\r\n listenersRef.current.push({ target, type: type as string, listener, options });\r\n\r\n if (globalConfig.enabled) {\r\n const id = generateListenerId(target, type as string, listener);\r\n trackedListeners.set(id, {\r\n target,\r\n type: type as string,\r\n listener,\r\n componentName: nameRef.current,\r\n stack: getStack(),\r\n createdAt: Date.now(),\r\n });\r\n }\r\n\r\n return () => {\r\n target.removeEventListener(type as string, listener, options);\r\n listenersRef.current = listenersRef.current.filter(\r\n (l) => l.target !== target || l.type !== type || l.listener !== listener,\r\n );\r\n\r\n if (globalConfig.enabled) {\r\n const id = generateListenerId(target, type as string, listener);\r\n trackedListeners.delete(id);\r\n }\r\n };\r\n },\r\n [],\r\n );\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 8. SAFE ABORT CONTROLLER HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * AbortController that auto-aborts on unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * const getAbortSignal = useSafeAbortController();\r\n *\r\n * useEffect(() => {\r\n * const signal = getAbortSignal();\r\n * fetch('/api/data', { signal }).then(handleData).catch(handleError);\r\n * }, [getAbortSignal]);\r\n * ```\r\n */\r\nexport function useSafeAbortController(componentName?: string): () => AbortSignal {\r\n const controllerRef = useRef<AbortController | null>(null);\r\n const nameRef = useRef(componentName);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (controllerRef.current && !controllerRef.current.signal.aborted) {\r\n controllerRef.current.abort();\r\n\r\n if (globalConfig.enabled) {\r\n reportLeak(\r\n 'abort-controller-not-aborted',\r\n 'AbortController was auto-aborted on unmount (fetch may have leaked)',\r\n 'info',\r\n nameRef.current,\r\n );\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n return useCallback(() => {\r\n // Abort previous controller if exists\r\n if (controllerRef.current) {\r\n controllerRef.current.abort();\r\n }\r\n\r\n controllerRef.current = new AbortController();\r\n return controllerRef.current.signal;\r\n }, []);\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 9. SAFE FETCH HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Fetch with auto-abort on unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * const safeFetch = useSafeFetch();\r\n *\r\n * useEffect(() => {\r\n * safeFetch('/api/data')\r\n * .then(res => res.json())\r\n * .then(setData)\r\n * .catch(err => {\r\n * if (err.name !== 'AbortError') {\r\n * setError(err);\r\n * }\r\n * });\r\n * }, [safeFetch]);\r\n * ```\r\n */\r\nexport function useSafeFetch(\r\n componentName?: string,\r\n): (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> {\r\n const getAbortSignal = useSafeAbortController(componentName);\r\n\r\n return useCallback(\r\n (input: RequestInfo | URL, init?: RequestInit) => {\r\n const signal = getAbortSignal();\r\n return fetch(input, { ...init, signal });\r\n },\r\n [getAbortSignal],\r\n );\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 10. SAFE SUBSCRIPTION HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Subscription manager with auto-cleanup\r\n *\r\n * @example\r\n * ```tsx\r\n * const subscribe = useSafeSubscription();\r\n *\r\n * useEffect(() => {\r\n * subscribe(eventEmitter.on('event', handleEvent));\r\n * // or with custom cleanup\r\n * subscribe(() => cleanup());\r\n * }, [subscribe]);\r\n * ```\r\n */\r\nexport function useSafeSubscription(\r\n componentName?: string,\r\n): (cleanup: (() => void) | { unsubscribe: () => void }) => void {\r\n const cleanupsRef = useRef<Array<() => void>>([]);\r\n const nameRef = useRef(componentName);\r\n\r\n useEffect(() => {\r\n return () => {\r\n for (const cleanup of cleanupsRef.current) {\r\n try {\r\n cleanup();\r\n } catch (e) {\r\n console.error('Error during subscription cleanup:', e);\r\n }\r\n }\r\n\r\n if (cleanupsRef.current.length > 0 && globalConfig.enabled) {\r\n reportLeak(\r\n 'subscription-not-unsubscribed',\r\n `${cleanupsRef.current.length} subscription(s) would have leaked without cleanup`,\r\n 'info',\r\n nameRef.current,\r\n );\r\n }\r\n\r\n cleanupsRef.current = [];\r\n };\r\n }, []);\r\n\r\n return useCallback((cleanup: (() => void) | { unsubscribe: () => void }) => {\r\n if (typeof cleanup === 'function') {\r\n cleanupsRef.current.push(cleanup);\r\n } else if (cleanup && typeof cleanup.unsubscribe === 'function') {\r\n cleanupsRef.current.push(() => cleanup.unsubscribe());\r\n }\r\n }, []);\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 11. SAFE WEBSOCKET HOOK\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * WebSocket with auto-close on unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * const { socket, send, close } = useSafeWebSocket('wss://api.example.com');\r\n *\r\n * useEffect(() => {\r\n * if (socket) {\r\n * socket.onmessage = (e) => handleMessage(e.data);\r\n * }\r\n * }, [socket]);\r\n * ```\r\n */\r\nexport function useSafeWebSocket(\r\n url: string | null,\r\n protocols?: string | string[],\r\n componentName?: string,\r\n): {\r\n socket: WebSocket | null;\r\n readyState: number;\r\n send: (data: string | ArrayBufferLike | Blob | ArrayBufferView) => void;\r\n close: (code?: number, reason?: string) => void;\r\n} {\r\n const [socket, setSocket] = useState<WebSocket | null>(null);\r\n const [readyState, setReadyState] = useState<number>(WebSocket.CLOSED);\r\n const nameRef = useRef(componentName);\r\n\r\n useEffect(() => {\r\n if (!url) {\r\n return;\r\n }\r\n\r\n const ws = new WebSocket(url, protocols);\r\n setSocket(ws);\r\n\r\n ws.onopen = () => setReadyState(ws.readyState as number);\r\n ws.onclose = () => setReadyState(ws.readyState as number);\r\n ws.onerror = () => setReadyState(ws.readyState as number);\r\n\r\n return () => {\r\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\r\n ws.close();\r\n\r\n if (globalConfig.enabled) {\r\n reportLeak(\r\n 'websocket-not-closed',\r\n 'WebSocket was auto-closed on unmount',\r\n 'info',\r\n nameRef.current,\r\n );\r\n }\r\n }\r\n };\r\n }, [url, protocols]);\r\n\r\n const send = useCallback(\r\n (data: string | ArrayBufferLike | Blob | ArrayBufferView) => {\r\n if (socket?.readyState === WebSocket.OPEN) {\r\n socket.send(data);\r\n }\r\n },\r\n [socket],\r\n );\r\n\r\n const close = useCallback(\r\n (code?: number, reason?: string) => {\r\n socket?.close(code, reason);\r\n },\r\n [socket],\r\n );\r\n\r\n return { socket, readyState, send, close };\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 12. COMPONENT LEAK TRACKER\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * HOC to track component mount/unmount for leak detection\r\n * Use in development to identify retained components\r\n *\r\n * @example\r\n * ```tsx\r\n * const TrackedMyComponent = withLeakTracking(MyComponent, 'MyComponent');\r\n * ```\r\n */\r\nexport function withLeakTracking<P extends object>(\r\n Component: React.ComponentType<P>,\r\n displayName?: string,\r\n): React.FC<P> {\r\n const name = displayName || Component.displayName || Component.name || 'Unknown';\r\n\r\n const TrackedComponent: React.FC<P> = (props) => {\r\n const instanceRef = useRef<object>({});\r\n\r\n useEffect(() => {\r\n if (!globalConfig.enabled) {\r\n return;\r\n }\r\n\r\n mountedComponents.set(instanceRef.current, {\r\n name,\r\n mountedAt: Date.now(),\r\n });\r\n\r\n return () => {\r\n // Component should be GC'd, but we can't detect that directly\r\n // This is just for tracking purposes\r\n mountedComponents.delete(instanceRef.current);\r\n };\r\n }, []);\r\n\r\n return <Component {...props} />;\r\n };\r\n\r\n TrackedComponent.displayName = `LeakTracked(${name})`;\r\n\r\n return TrackedComponent;\r\n}\r\n\r\n/**\r\n * Hook to log when component unmounts\r\n * Useful for debugging component lifecycle\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n * useUnmountLog('MyComponent');\r\n * // ...\r\n * }\r\n * ```\r\n */\r\nexport function useUnmountLog(componentName: string): void {\r\n const mountTimeRef = useRef(Date.now());\r\n\r\n useEffect(() => {\r\n if (globalConfig.enabled && globalConfig.logToConsole) {\r\n console.log(`%c[NTD] ${componentName} mounted`, 'color: #22c55e');\r\n }\r\n\r\n return () => {\r\n if (globalConfig.enabled && globalConfig.logToConsole) {\r\n const lifetime = Date.now() - mountTimeRef.current;\r\n console.log(\r\n `%c[NTD] ${componentName} unmounted (lifetime: ${lifetime}ms)`,\r\n 'color: #f59e0b',\r\n );\r\n }\r\n };\r\n }, [componentName]);\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 13. MEMORY SNAPSHOT UTILITIES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Take a memory snapshot (Chrome DevTools only)\r\n * Use in development for debugging memory issues\r\n */\r\nexport async function takeMemorySnapshot(label?: string): Promise<void> {\r\n if (!IS_DEV) {\r\n return;\r\n }\r\n\r\n const performance = window.performance as Performance & {\r\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number; jsHeapSizeLimit: number };\r\n };\r\n\r\n if (performance.memory) {\r\n const memory = performance.memory;\r\n console.log(\r\n `%c[Memory Snapshot${label ? `: ${label}` : ''}]`,\r\n 'color: #6366f1; font-weight: bold',\r\n {\r\n usedJSHeapSize: `${(memory.usedJSHeapSize / 1024 / 1024).toFixed(2)} MB`,\r\n totalJSHeapSize: `${(memory.totalJSHeapSize / 1024 / 1024).toFixed(2)} MB`,\r\n jsHeapSizeLimit: `${(memory.jsHeapSizeLimit / 1024 / 1024).toFixed(2)} MB`,\r\n },\r\n );\r\n }\r\n\r\n // Suggest manual heap snapshot\r\n console.log(\r\n '%cTip: Use Chrome DevTools Memory tab for detailed heap snapshots',\r\n 'color: #64748b; font-style: italic',\r\n );\r\n}\r\n\r\n/**\r\n * Force garbage collection (Chrome with --expose-gc flag only)\r\n */\r\nexport function forceGC(): void {\r\n if (!IS_DEV) {\r\n return;\r\n }\r\n\r\n if ((window as Window & { gc?: () => void }).gc) {\r\n (window as Window & { gc?: () => void }).gc!();\r\n console.log('%c[GC] Forced garbage collection', 'color: #22c55e');\r\n } else {\r\n console.log('%c[GC] gc() not available. Run Chrome with --expose-gc flag', 'color: #f59e0b');\r\n }\r\n}\r\n\r\n/**\r\n * Hook to monitor memory usage\r\n */\r\nexport function useMemoryMonitor(\r\n intervalMs: number = 5000,\r\n warnThresholdMB: number = 100,\r\n): {\r\n usedMB: number;\r\n totalMB: number;\r\n limitMB: number;\r\n isWarning: boolean;\r\n} {\r\n const [memory, setMemory] = useState({\r\n usedMB: 0,\r\n totalMB: 0,\r\n limitMB: 0,\r\n isWarning: false,\r\n });\r\n\r\n useEffect(() => {\r\n const performance = window.performance as Performance & {\r\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number; jsHeapSizeLimit: number };\r\n };\r\n\r\n if (!performance.memory) {\r\n return;\r\n }\r\n\r\n const update = () => {\r\n const mem = performance.memory;\r\n if (!mem) {\r\n return;\r\n }\r\n const usedMB = mem.usedJSHeapSize / 1024 / 1024;\r\n const totalMB = mem.totalJSHeapSize / 1024 / 1024;\r\n const limitMB = mem.jsHeapSizeLimit / 1024 / 1024;\r\n const isWarning = usedMB > warnThresholdMB;\r\n\r\n setMemory({ usedMB, totalMB, limitMB, isWarning });\r\n\r\n if (isWarning && globalConfig.enabled) {\r\n reportLeak(\r\n 'large-closure',\r\n `Memory usage exceeded ${warnThresholdMB}MB (${usedMB.toFixed(2)}MB)`,\r\n 'warning',\r\n );\r\n }\r\n };\r\n\r\n update();\r\n const interval = setInterval(update, intervalMs);\r\n\r\n return () => clearInterval(interval);\r\n }, [intervalMs, warnThresholdMB]);\r\n\r\n return memory;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 14. REACT DEVTOOLS INTEGRATION\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Display leak detector status in React DevTools (via component props)\r\n */\r\nexport const LeakDetectorStatus: React.FC = () => {\r\n const leaks = useMemo(() => getLeakSummary(), []);\r\n const totalLeaks = Object.values(leaks).reduce((a, b) => a + b, 0);\r\n\r\n if (!globalConfig.enabled || totalLeaks === 0) {\r\n return null;\r\n }\r\n\r\n // This component exists mainly for DevTools inspection\r\n return null;\r\n};\r\n\r\n(LeakDetectorStatus as React.FC & { displayName?: string }).displayName = 'NiceLeakDetectorStatus';\r\n","/**\r\n * adapters.ts — Integration adapters for popular state management & data libraries.\r\n *\r\n * React Query, Zustand, Redux, GraphQL subscriptions, OpenAPI.\r\n */\r\n\r\n// ── Types (shared) ──────────────────────────────────────────────\r\n\r\nexport interface NiceDataSourceConfig<T = unknown> {\r\n load: (params?: Record<string, unknown>) => Promise<T[]>;\r\n insert?: (item: T) => Promise<T>;\r\n update?: (key: unknown, values: Partial<T>) => Promise<T>;\r\n remove?: (key: unknown) => Promise<void>;\r\n}\r\n\r\n// ── React Query Adapter ─────────────────────────────────────────\r\n\r\n/**\r\n * Creates a NiceDataSource-compatible config from React Query hooks.\r\n *\r\n * Usage:\r\n * const config = createReactQueryAdapter({\r\n * queryKey: ['users'],\r\n * queryFn: () => fetch('/api/users').then(r => r.json()),\r\n * mutationFn: (item) => fetch('/api/users', { method: 'POST', body: JSON.stringify(item) }),\r\n * });\r\n */\r\nexport interface ReactQueryAdapterConfig<T> {\r\n queryKey: unknown[];\r\n queryFn: (params?: Record<string, unknown>) => Promise<T[]>;\r\n mutationFn?: (item: T) => Promise<T>;\r\n updateMutationFn?: (args: { key: unknown; values: Partial<T> }) => Promise<T>;\r\n deleteMutationFn?: (key: unknown) => Promise<void>;\r\n /** React Query's QueryClient instance. */\r\n queryClient?: {\r\n invalidateQueries: (opts: { queryKey: unknown[] }) => void;\r\n };\r\n}\r\n\r\nexport function createReactQueryAdapter<T>(\r\n config: ReactQueryAdapterConfig<T>,\r\n): NiceDataSourceConfig<T> {\r\n const invalidate = () => {\r\n config.queryClient?.invalidateQueries({ queryKey: config.queryKey });\r\n };\r\n\r\n return {\r\n load: (params) => config.queryFn(params),\r\n insert: config.mutationFn\r\n ? async (item: T) => {\r\n const result = await config.mutationFn!(item);\r\n invalidate();\r\n return result;\r\n }\r\n : undefined,\r\n update: config.updateMutationFn\r\n ? async (key: unknown, values: Partial<T>) => {\r\n const result = await config.updateMutationFn!({ key, values });\r\n invalidate();\r\n return result;\r\n }\r\n : undefined,\r\n remove: config.deleteMutationFn\r\n ? async (key: unknown) => {\r\n await config.deleteMutationFn!(key);\r\n invalidate();\r\n }\r\n : undefined,\r\n };\r\n}\r\n\r\n// ── Zustand Adapter ─────────────────────────────────────────────\r\n\r\n/**\r\n * Connects a Zustand store to NiceDataSource.\r\n *\r\n * Usage:\r\n * const adapter = createZustandAdapter(useUserStore, {\r\n * getData: (state) => state.users,\r\n * addItem: (state) => state.addUser,\r\n * updateItem: (state) => state.updateUser,\r\n * removeItem: (state) => state.removeUser,\r\n * });\r\n */\r\nexport interface ZustandAdapterConfig<TStore, T> {\r\n getData: (state: TStore) => T[];\r\n addItem?: (state: TStore) => (item: T) => void;\r\n updateItem?: (state: TStore) => (key: unknown, values: Partial<T>) => void;\r\n removeItem?: (state: TStore) => (key: unknown) => void;\r\n}\r\n\r\nexport function createZustandAdapter<TStore, T>(\r\n useStore: { getState: () => TStore },\r\n config: ZustandAdapterConfig<TStore, T>,\r\n): NiceDataSourceConfig<T> {\r\n return {\r\n load: async () => config.getData(useStore.getState()),\r\n insert: config.addItem\r\n ? async (item: T) => {\r\n const state = useStore.getState();\r\n config.addItem!(state)(item);\r\n return item;\r\n }\r\n : undefined,\r\n update: config.updateItem\r\n ? async (key: unknown, values: Partial<T>) => {\r\n const state = useStore.getState();\r\n config.updateItem!(state)(key, values);\r\n return { ...values } as T;\r\n }\r\n : undefined,\r\n remove: config.removeItem\r\n ? async (key: unknown) => {\r\n const state = useStore.getState();\r\n config.removeItem!(state)(key);\r\n }\r\n : undefined,\r\n };\r\n}\r\n\r\n// ── Redux Middleware ─────────────────────────────────────────────\r\n\r\n/**\r\n * Redux middleware that syncs NiceDataGrid/NiceForm state with Redux store.\r\n *\r\n * Usage:\r\n * const middleware = createNiceReduxMiddleware({\r\n * actionPrefix: 'nice',\r\n * onGridStateChange: (gridId, state) => store.dispatch(setGridState(gridId, state)),\r\n * });\r\n * const store = configureStore({ middleware: [middleware] });\r\n */\r\nexport interface NiceReduxMiddlewareConfig {\r\n actionPrefix?: string;\r\n onGridStateChange?: (gridId: string, state: Record<string, unknown>) => void;\r\n onFormStateChange?: (formId: string, values: Record<string, unknown>) => void;\r\n}\r\n\r\nexport interface ReduxAction {\r\n type: string;\r\n payload?: unknown;\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\nexport type ReduxMiddleware = (store: {\r\n getState: () => unknown;\r\n dispatch: (action: ReduxAction) => void;\r\n}) => (next: (action: ReduxAction) => unknown) => (action: ReduxAction) => unknown;\r\n\r\nexport function createNiceReduxMiddleware(config: NiceReduxMiddlewareConfig = {}): ReduxMiddleware {\r\n const prefix = config.actionPrefix ?? 'nice';\r\n\r\n return (store) => (next) => (action) => {\r\n const result = next(action);\r\n\r\n if (action.type.startsWith(`${prefix}/grid/`)) {\r\n const parts = action.type.split('/');\r\n const gridId = parts[2];\r\n if (gridId && config.onGridStateChange) {\r\n config.onGridStateChange(gridId, action.payload as Record<string, unknown>);\r\n }\r\n }\r\n\r\n if (action.type.startsWith(`${prefix}/form/`)) {\r\n const parts = action.type.split('/');\r\n const formId = parts[2];\r\n if (formId && config.onFormStateChange) {\r\n config.onFormStateChange(formId, action.payload as Record<string, unknown>);\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n}\r\n\r\n/** Redux actions for Nice components. */\r\nexport function niceReduxActions(prefix = 'nice') {\r\n return {\r\n setGridState: (gridId: string, state: Record<string, unknown>): ReduxAction => ({\r\n type: `${prefix}/grid/${gridId}/setState`,\r\n payload: state,\r\n }),\r\n setGridFilter: (gridId: string, filter: unknown): ReduxAction => ({\r\n type: `${prefix}/grid/${gridId}/setFilter`,\r\n payload: filter,\r\n }),\r\n setGridSort: (gridId: string, sort: unknown): ReduxAction => ({\r\n type: `${prefix}/grid/${gridId}/setSort`,\r\n payload: sort,\r\n }),\r\n setFormValues: (formId: string, values: Record<string, unknown>): ReduxAction => ({\r\n type: `${prefix}/form/${formId}/setValues`,\r\n payload: values,\r\n }),\r\n resetForm: (formId: string): ReduxAction => ({\r\n type: `${prefix}/form/${formId}/reset`,\r\n }),\r\n };\r\n}\r\n\r\n/** Redux reducer for Nice component state. */\r\nexport function niceReduxReducer(prefix = 'nice') {\r\n type State = Record<string, Record<string, unknown>>;\r\n return (state: State = {}, action: ReduxAction): State => {\r\n if (!action.type.startsWith(`${prefix}/`)) {\r\n return state;\r\n }\r\n const parts = action.type.split('/');\r\n const [, kind, id, op] = parts;\r\n if (!kind || !id) {\r\n return state;\r\n }\r\n\r\n const key = `${kind}/${id}`;\r\n switch (op) {\r\n case 'setState':\r\n return {\r\n ...state,\r\n [key]: { ...(state[key] ?? {}), ...(action.payload as Record<string, unknown>) },\r\n };\r\n case 'setFilter':\r\n case 'setSort':\r\n case 'setValues':\r\n return { ...state, [key]: { ...(state[key] ?? {}), [op]: action.payload } };\r\n case 'reset':\r\n return { ...state, [key]: {} };\r\n default:\r\n return state;\r\n }\r\n };\r\n}\r\n\r\n// ── GraphQL Subscriptions ───────────────────────────────────────\r\n\r\n/**\r\n * Creates a data source backed by GraphQL subscriptions for real-time data.\r\n *\r\n * Usage:\r\n * const source = createGraphQLSubscriptionSource({\r\n * url: 'wss://api.example.com/graphql',\r\n * query: 'subscription { usersUpdated { id name } }',\r\n * queryFn: () => fetch('/api/users').then(r => r.json()),\r\n * });\r\n */\r\nexport interface GraphQLSubscriptionConfig<T> {\r\n url: string;\r\n query: string;\r\n variables?: Record<string, unknown>;\r\n queryFn: () => Promise<T[]>;\r\n onData?: (data: T[]) => void;\r\n extractData?: (payload: unknown) => T[];\r\n connectionParams?: Record<string, unknown>;\r\n}\r\n\r\nexport interface GraphQLSubscriptionSource<T> extends NiceDataSourceConfig<T> {\r\n subscribe: () => () => void;\r\n unsubscribe: () => void;\r\n}\r\n\r\nexport function createGraphQLSubscriptionSource<T>(\r\n config: GraphQLSubscriptionConfig<T>,\r\n): GraphQLSubscriptionSource<T> {\r\n let ws: WebSocket | null = null;\r\n let latestData: T[] = [];\r\n\r\n const subscribe = (): (() => void) => {\r\n ws = new WebSocket(config.url, 'graphql-ws');\r\n\r\n ws.onopen = () => {\r\n ws!.send(\r\n JSON.stringify({\r\n type: 'connection_init',\r\n payload: config.connectionParams ?? {},\r\n }),\r\n );\r\n ws!.send(\r\n JSON.stringify({\r\n type: 'start',\r\n id: '1',\r\n payload: {\r\n query: config.query,\r\n variables: config.variables,\r\n },\r\n }),\r\n );\r\n };\r\n\r\n ws.onmessage = (event) => {\r\n try {\r\n const msg = JSON.parse(event.data);\r\n if (msg.type === 'data' && msg.payload?.data) {\r\n const extract =\r\n config.extractData ??\r\n ((p: unknown) => {\r\n const obj = p as Record<string, unknown>;\r\n const firstKey = Object.keys(obj)[0];\r\n return (firstKey ? obj[firstKey] : []) as T[];\r\n });\r\n latestData = extract(msg.payload.data);\r\n config.onData?.(latestData);\r\n }\r\n } catch {\r\n // skip invalid messages\r\n }\r\n };\r\n\r\n return () => {\r\n ws?.close();\r\n ws = null;\r\n };\r\n };\r\n\r\n const unsubscribe = () => {\r\n ws?.close();\r\n ws = null;\r\n };\r\n\r\n return {\r\n load: async () => {\r\n if (latestData.length > 0) {\r\n return latestData;\r\n }\r\n const data = await config.queryFn();\r\n latestData = data;\r\n return data;\r\n },\r\n subscribe,\r\n unsubscribe,\r\n };\r\n}\r\n\r\n// ── OpenAPI Schema Integration ──────────────────────────────────\r\n\r\n/**\r\n * Generates NiceDataGrid columns and NiceForm fields from an OpenAPI schema.\r\n *\r\n * Usage:\r\n * const { columns, formFields } = await generateFromOpenAPI('/api/swagger.json', 'User');\r\n */\r\nexport interface OpenAPIProperty {\r\n type?: string;\r\n format?: string;\r\n title?: string;\r\n description?: string;\r\n enum?: string[];\r\n minimum?: number;\r\n maximum?: number;\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: string;\r\n readOnly?: boolean;\r\n nullable?: boolean;\r\n $ref?: string;\r\n items?: OpenAPIProperty;\r\n}\r\n\r\nexport interface OpenAPISchema {\r\n type?: string;\r\n properties?: Record<string, OpenAPIProperty>;\r\n required?: string[];\r\n}\r\n\r\nexport interface GridColumnDef {\r\n dataField: string;\r\n caption: string;\r\n dataType: 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'object';\r\n width?: number;\r\n allowEditing?: boolean;\r\n visible?: boolean;\r\n validationRules?: Record<string, unknown>[];\r\n lookup?: { dataSource: string[]; valueExpr: string; displayExpr: string };\r\n}\r\n\r\nexport interface FormFieldDef {\r\n dataField: string;\r\n label: string;\r\n editorType: string;\r\n editorOptions?: Record<string, unknown>;\r\n validationRules?: Record<string, unknown>[];\r\n isRequired?: boolean;\r\n colSpan?: number;\r\n}\r\n\r\nexport interface OpenAPIGeneratedUI {\r\n columns: GridColumnDef[];\r\n formFields: FormFieldDef[];\r\n schema: OpenAPISchema;\r\n}\r\n\r\nexport async function generateFromOpenAPI(\r\n swaggerUrl: string,\r\n schemaName: string,\r\n): Promise<OpenAPIGeneratedUI> {\r\n const response = await fetch(swaggerUrl);\r\n if (!response.ok) {\r\n throw new Error(`OpenAPI fetch failed: ${response.status}`);\r\n }\r\n const spec = await response.json();\r\n\r\n const schemas = spec.components?.schemas ?? spec.definitions ?? {};\r\n const schema: OpenAPISchema = schemas[schemaName];\r\n if (!schema) {\r\n throw new Error(`Schema \"${schemaName}\" not found in OpenAPI spec`);\r\n }\r\n\r\n const required = new Set(schema.required ?? []);\r\n const columns: GridColumnDef[] = [];\r\n const formFields: FormFieldDef[] = [];\r\n\r\n for (const [name, prop] of Object.entries(schema.properties ?? {})) {\r\n const dataType = mapOpenAPIType(prop);\r\n const caption = prop.title ?? humanize(name);\r\n\r\n columns.push({\r\n dataField: name,\r\n caption,\r\n dataType,\r\n allowEditing: !prop.readOnly,\r\n visible: !name.toLowerCase().endsWith('id') || name === 'id',\r\n ...(prop.enum\r\n ? { lookup: { dataSource: prop.enum, valueExpr: 'this', displayExpr: 'this' } }\r\n : {}),\r\n });\r\n\r\n formFields.push({\r\n dataField: name,\r\n label: caption,\r\n editorType: mapToEditorType(prop, dataType),\r\n isRequired: required.has(name),\r\n editorOptions: buildEditorOptions(prop),\r\n ...(required.has(name)\r\n ? { validationRules: [{ type: 'required', message: `${caption} jest wymagane` }] }\r\n : {}),\r\n });\r\n }\r\n\r\n return { columns, formFields, schema };\r\n}\r\n\r\n/** Generate columns from schema object directly (no fetch). */\r\nexport function generateColumnsFromSchema(schema: OpenAPISchema): GridColumnDef[] {\r\n const columns: GridColumnDef[] = [];\r\n for (const [name, prop] of Object.entries(schema.properties ?? {})) {\r\n columns.push({\r\n dataField: name,\r\n caption: prop.title ?? humanize(name),\r\n dataType: mapOpenAPIType(prop),\r\n allowEditing: !prop.readOnly,\r\n });\r\n }\r\n return columns;\r\n}\r\n\r\n/** Generate form fields from schema object directly (no fetch). */\r\nexport function generateFormFieldsFromSchema(schema: OpenAPISchema): FormFieldDef[] {\r\n const required = new Set(schema.required ?? []);\r\n const fields: FormFieldDef[] = [];\r\n for (const [name, prop] of Object.entries(schema.properties ?? {})) {\r\n const dataType = mapOpenAPIType(prop);\r\n fields.push({\r\n dataField: name,\r\n label: prop.title ?? humanize(name),\r\n editorType: mapToEditorType(prop, dataType),\r\n isRequired: required.has(name),\r\n editorOptions: buildEditorOptions(prop),\r\n });\r\n }\r\n return fields;\r\n}\r\n\r\n// ── Helpers ─────────────────────────────────────────────────────\r\n\r\nfunction mapOpenAPIType(prop: OpenAPIProperty): GridColumnDef['dataType'] {\r\n if (prop.type === 'integer' || prop.type === 'number') {\r\n return 'number';\r\n }\r\n if (prop.type === 'boolean') {\r\n return 'boolean';\r\n }\r\n if (prop.format === 'date') {\r\n return 'date';\r\n }\r\n if (prop.format === 'date-time') {\r\n return 'datetime';\r\n }\r\n if (prop.type === 'object' || prop.type === 'array') {\r\n return 'object';\r\n }\r\n return 'string';\r\n}\r\n\r\nfunction mapToEditorType(prop: OpenAPIProperty, dataType: string): string {\r\n if (prop.enum) {\r\n return 'NiceSelect';\r\n }\r\n if (prop.format === 'email') {\r\n return 'NiceTextInput';\r\n }\r\n if (prop.format === 'uri' || prop.format === 'url') {\r\n return 'NiceTextInput';\r\n }\r\n if (prop.format === 'password') {\r\n return 'NicePasswordInput';\r\n }\r\n if (dataType === 'number') {\r\n return 'NiceNumberInput';\r\n }\r\n if (dataType === 'boolean') {\r\n return 'NiceToggle';\r\n }\r\n if (dataType === 'date') {\r\n return 'NiceDatePicker';\r\n }\r\n if (dataType === 'datetime') {\r\n return 'NiceDateTimePicker';\r\n }\r\n if (prop.maxLength && prop.maxLength > 200) {\r\n return 'NiceTextArea';\r\n }\r\n return 'NiceTextInput';\r\n}\r\n\r\nfunction buildEditorOptions(prop: OpenAPIProperty): Record<string, unknown> {\r\n const opts: Record<string, unknown> = {};\r\n if (prop.minimum !== undefined) {\r\n opts.min = prop.minimum;\r\n }\r\n if (prop.maximum !== undefined) {\r\n opts.max = prop.maximum;\r\n }\r\n if (prop.minLength !== undefined) {\r\n opts.minLength = prop.minLength;\r\n }\r\n if (prop.maxLength !== undefined) {\r\n opts.maxLength = prop.maxLength;\r\n }\r\n if (prop.pattern) {\r\n opts.pattern = prop.pattern;\r\n }\r\n if (prop.enum) {\r\n opts.items = prop.enum.map((v) => ({ label: v, value: v }));\r\n }\r\n if (prop.description) {\r\n opts.hint = prop.description;\r\n }\r\n return Object.keys(opts).length > 0 ? opts : {};\r\n}\r\n\r\nfunction humanize(name: string): string {\r\n return name\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/[_-]/g, ' ')\r\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\r\n .trim();\r\n}\r\n","/**\r\n * NiceHelpContext — Global context for inline help system\r\n *\r\n * Provides:\r\n * - Global enable/disable for inline help\r\n * - Per-component help visibility control\r\n * - Help content loading from .doc.json files\r\n * - Localization support\r\n *\r\n * @since 2.6.0\r\n */\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useState,\r\n useCallback,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\n\r\n// ─── Types ─────────────────────────────────────────────────\r\n\r\nexport interface HelpProp {\r\n name: string;\r\n type: string;\r\n required?: boolean;\r\n default?: string | number | boolean;\r\n description: string;\r\n}\r\n\r\nexport interface HelpExample {\r\n title: string;\r\n code: string;\r\n language?: string;\r\n}\r\n\r\nexport interface HelpContent {\r\n name: string;\r\n description: string;\r\n category: string;\r\n version?: string;\r\n since?: string;\r\n status?: 'stable' | 'beta' | 'deprecated';\r\n author?: string;\r\n props?: HelpProp[];\r\n examples?: HelpExample[];\r\n tips?: string[];\r\n seeAlso?: string[];\r\n}\r\n\r\nexport interface HelpConfig {\r\n /** Global enable/disable for all inline help */\r\n enabled: boolean;\r\n /** Default visibility for help panels (collapsed/expanded) */\r\n defaultExpanded: boolean;\r\n /** Show help icon in component headers */\r\n showHelpIcon: boolean;\r\n /** Help panel position */\r\n position: 'top' | 'bottom' | 'tooltip' | 'sidebar';\r\n /** Locale for help content */\r\n locale: string;\r\n /** Custom help content loader */\r\n contentLoader?: (componentName: string, locale: string) => Promise<HelpContent | null>;\r\n}\r\n\r\nexport interface HelpContextValue {\r\n /** Current help configuration */\r\n config: HelpConfig;\r\n /** Update help configuration */\r\n setConfig: (config: Partial<HelpConfig>) => void;\r\n /** Toggle global help visibility */\r\n toggleGlobalHelp: () => void;\r\n /** Per-component disabled set */\r\n disabledComponents: Set<string>;\r\n /** Disable help for specific component */\r\n disableComponentHelp: (componentName: string) => void;\r\n /** Enable help for specific component */\r\n enableComponentHelp: (componentName: string) => void;\r\n /** Check if help is enabled for component */\r\n isHelpEnabled: (componentName: string) => boolean;\r\n /** Get help content for component */\r\n getHelpContent: (componentName: string) => Promise<HelpContent | null>;\r\n /** Loaded help content cache */\r\n helpCache: Map<string, HelpContent>;\r\n}\r\n\r\n// ─── Default Configuration ─────────────────────────────────\r\n\r\nconst defaultHelpConfig: HelpConfig = {\r\n enabled: true,\r\n defaultExpanded: false,\r\n showHelpIcon: true,\r\n position: 'tooltip',\r\n locale: 'en',\r\n};\r\n\r\n// ─── Default Content Loader ────────────────────────────────\r\n\r\nconst defaultContentLoader = async (\r\n componentName: string,\r\n locale: string,\r\n): Promise<HelpContent | null> => {\r\n // Try to load from .doc.json files (dynamic import)\r\n // This would be replaced by actual file loading in production\r\n try {\r\n // For now, return null - actual loading depends on bundler setup\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\n// ─── Context ───────────────────────────────────────────────\r\n\r\nconst HelpContext = createContext<HelpContextValue | null>(null);\r\n\r\n// ─── Provider ──────────────────────────────────────────────\r\n\r\nexport interface NiceHelpProviderProps {\r\n children: ReactNode;\r\n /** Initial configuration */\r\n config?: Partial<HelpConfig>;\r\n /** Preloaded help content */\r\n helpContent?: Record<string, HelpContent>;\r\n}\r\n\r\nexport const NiceHelpProvider: React.FC<NiceHelpProviderProps> = ({\r\n children,\r\n config: initialConfig,\r\n helpContent: preloadedContent,\r\n}) => {\r\n const [config, setConfigState] = useState<HelpConfig>({\r\n ...defaultHelpConfig,\r\n ...initialConfig,\r\n });\r\n\r\n const [disabledComponents, setDisabledComponents] = useState<Set<string>>(new Set());\r\n const [helpCache, setHelpCache] = useState<Map<string, HelpContent>>(\r\n () => new Map(Object.entries(preloadedContent || {})),\r\n );\r\n\r\n const setConfig = useCallback((newConfig: Partial<HelpConfig>) => {\r\n setConfigState((prev) => ({ ...prev, ...newConfig }));\r\n }, []);\r\n\r\n const toggleGlobalHelp = useCallback(() => {\r\n setConfigState((prev) => ({ ...prev, enabled: !prev.enabled }));\r\n }, []);\r\n\r\n const disableComponentHelp = useCallback((componentName: string) => {\r\n setDisabledComponents((prev) => new Set(prev).add(componentName));\r\n }, []);\r\n\r\n const enableComponentHelp = useCallback((componentName: string) => {\r\n setDisabledComponents((prev) => {\r\n const next = new Set(prev);\r\n next.delete(componentName);\r\n return next;\r\n });\r\n }, []);\r\n\r\n const isHelpEnabled = useCallback(\r\n (componentName: string): boolean => {\r\n return config.enabled && !disabledComponents.has(componentName);\r\n },\r\n [config.enabled, disabledComponents],\r\n );\r\n\r\n const getHelpContent = useCallback(\r\n async (componentName: string): Promise<HelpContent | null> => {\r\n // Check cache first\r\n if (helpCache.has(componentName)) {\r\n return helpCache.get(componentName) || null;\r\n }\r\n\r\n // Load content\r\n const loader = config.contentLoader || defaultContentLoader;\r\n const content = await loader(componentName, config.locale);\r\n\r\n if (content) {\r\n setHelpCache((prev) => new Map(prev).set(componentName, content));\r\n }\r\n\r\n return content;\r\n },\r\n [helpCache, config.contentLoader, config.locale],\r\n );\r\n\r\n const value = useMemo<HelpContextValue>(\r\n () => ({\r\n config,\r\n setConfig,\r\n toggleGlobalHelp,\r\n disabledComponents,\r\n disableComponentHelp,\r\n enableComponentHelp,\r\n isHelpEnabled,\r\n getHelpContent,\r\n helpCache,\r\n }),\r\n [\r\n config,\r\n setConfig,\r\n toggleGlobalHelp,\r\n disabledComponents,\r\n disableComponentHelp,\r\n enableComponentHelp,\r\n isHelpEnabled,\r\n getHelpContent,\r\n helpCache,\r\n ],\r\n );\r\n\r\n return <HelpContext.Provider value={value}>{children}</HelpContext.Provider>;\r\n};\r\n\r\nNiceHelpProvider.displayName = 'NiceHelpProvider';\r\n\r\n// ─── Hook ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Hook to access global help configuration and utilities\r\n */\r\nexport function useNiceHelp(): HelpContextValue {\r\n const ctx = useContext(HelpContext);\r\n if (!ctx) {\r\n // Return default context for components outside provider\r\n return {\r\n config: defaultHelpConfig,\r\n setConfig: () => {},\r\n toggleGlobalHelp: () => {},\r\n disabledComponents: new Set(),\r\n disableComponentHelp: () => {},\r\n enableComponentHelp: () => {},\r\n isHelpEnabled: () => true,\r\n getHelpContent: async () => null,\r\n helpCache: new Map(),\r\n };\r\n }\r\n return ctx;\r\n}\r\n\r\n/**\r\n * Hook to get help content for a specific component\r\n */\r\nexport function useComponentHelp(componentName: string) {\r\n const { isHelpEnabled, getHelpContent, helpCache, config } = useNiceHelp();\r\n const [content, setContent] = useState<HelpContent | null>(helpCache.get(componentName) || null);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const enabled = isHelpEnabled(componentName);\r\n\r\n const loadContent = useCallback(async () => {\r\n if (!enabled) {\r\n return;\r\n }\r\n setLoading(true);\r\n const helpContent = await getHelpContent(componentName);\r\n setContent(helpContent);\r\n setLoading(false);\r\n }, [enabled, componentName, getHelpContent]);\r\n\r\n return {\r\n content,\r\n loading,\r\n enabled,\r\n loadContent,\r\n position: config.position,\r\n defaultExpanded: config.defaultExpanded,\r\n showHelpIcon: config.showHelpIcon,\r\n };\r\n}\r\n\r\nexport default NiceHelpProvider;\r\n","/**\r\n * NiceInlineHelp — Inline help panel for components\r\n *\r\n * Shows contextual help, tips, and documentation directly within the component.\r\n * Supports multiple display modes: tooltip, collapsible panel, sidebar.\r\n *\r\n * @since 2.6.0\r\n */\r\n\r\nimport React, { useState, useEffect, useCallback, type ReactNode } from 'react';\r\n\r\nimport { useComponentHelp, type HelpContent, type HelpProp } from './helpContext';\r\nimport { useNiceTranslation } from './i18n';\r\n\r\n// ─── Types ─────────────────────────────────────────────────\r\n\r\nexport interface NiceInlineHelpProps {\r\n /** Component name for help lookup */\r\n componentName: string;\r\n /** Override help content (instead of loading from .doc.json) */\r\n content?: HelpContent;\r\n /** Custom children to render inside help panel */\r\n children?: ReactNode;\r\n /** Position override */\r\n position?: 'top' | 'bottom' | 'tooltip' | 'inline';\r\n /** Initial expanded state */\r\n defaultExpanded?: boolean;\r\n /** Disable help for this instance */\r\n disabled?: boolean;\r\n /** Additional className */\r\n className?: string;\r\n /** Custom trigger icon */\r\n icon?: ReactNode;\r\n /** Title override */\r\n title?: string;\r\n /** Show props table */\r\n showProps?: boolean;\r\n /** Show examples */\r\n showExamples?: boolean;\r\n /** Show tips */\r\n showTips?: boolean;\r\n /** Compact mode */\r\n compact?: boolean;\r\n}\r\n\r\n// ─── Sub-components ────────────────────────────────────────\r\n\r\ninterface PropsTableProps {\r\n props: HelpProp[];\r\n compact?: boolean;\r\n}\r\n\r\nconst PropsTable: React.FC<PropsTableProps> = ({ props, compact }) => {\r\n const { t } = useNiceTranslation();\r\n\r\n if (!props || props.length === 0) {\r\n return null;\r\n }\r\n\r\n if (compact) {\r\n return (\r\n <div className=\"nice-help__props-compact\">\r\n {props.slice(0, 5).map((prop) => (\r\n <div key={prop.name} className=\"nice-help__prop-chip\">\r\n <code>{prop.name}</code>\r\n {prop.required && <span className=\"nice-help__required\">*</span>}\r\n </div>\r\n ))}\r\n {props.length > 5 && (\r\n <span className=\"nice-help__more\">\r\n +{props.length - 5} {t('help.moreProps', 'more')}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"nice-help__props\">\r\n <h4 className=\"nice-help__section-title\">{t('help.props', 'Properties')}</h4>\r\n <table className=\"nice-help__props-table\">\r\n <thead>\r\n <tr>\r\n <th>{t('help.propName', 'Name')}</th>\r\n <th>{t('help.propType', 'Type')}</th>\r\n <th>{t('help.propDefault', 'Default')}</th>\r\n <th>{t('help.propDescription', 'Description')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {props.map((prop) => (\r\n <tr key={prop.name}>\r\n <td>\r\n <code>{prop.name}</code>\r\n {prop.required && (\r\n <span className=\"nice-help__required\" title={t('help.required', 'Required')}>\r\n *\r\n </span>\r\n )}\r\n </td>\r\n <td>\r\n <code className=\"nice-help__type\">{prop.type}</code>\r\n </td>\r\n <td>{prop.default !== undefined ? <code>{String(prop.default)}</code> : '—'}</td>\r\n <td>{prop.description}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\ninterface TipsListProps {\r\n tips: string[];\r\n}\r\n\r\nconst TipsList: React.FC<TipsListProps> = ({ tips }) => {\r\n const { t } = useNiceTranslation();\r\n\r\n if (!tips || tips.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"nice-help__tips\">\r\n <h4 className=\"nice-help__section-title\">{t('help.tips', 'Tips')}</h4>\r\n <ul>\r\n {tips.map((tip, idx) => (\r\n <li key={idx}>\r\n <span className=\"nice-help__tip-icon\">💡</span>\r\n {tip}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n};\r\n\r\ninterface ExamplesListProps {\r\n examples: Array<{ title: string; code: string; language?: string }>;\r\n}\r\n\r\nconst ExamplesList: React.FC<ExamplesListProps> = ({ examples }) => {\r\n const { t } = useNiceTranslation();\r\n const [selectedExample, setSelectedExample] = useState(0);\r\n\r\n if (!examples || examples.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"nice-help__examples\">\r\n <h4 className=\"nice-help__section-title\">{t('help.examples', 'Examples')}</h4>\r\n {examples.length > 1 && (\r\n <div className=\"nice-help__example-tabs\">\r\n {examples.map((ex, idx) => (\r\n <button\r\n key={idx}\r\n className={`nice-help__example-tab ${selectedExample === idx ? 'nice-help__example-tab--active' : ''}`}\r\n onClick={() => setSelectedExample(idx)}\r\n >\r\n {ex.title}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n <pre className=\"nice-help__code\">\r\n <code className={`language-${examples[selectedExample]?.language || 'tsx'}`}>\r\n {examples[selectedExample]?.code}\r\n </code>\r\n </pre>\r\n </div>\r\n );\r\n};\r\n\r\n// ─── Main Component ────────────────────────────────────────\r\n\r\nexport const NiceInlineHelp: React.FC<NiceInlineHelpProps> = ({\r\n componentName,\r\n content: overrideContent,\r\n children,\r\n position: overridePosition,\r\n defaultExpanded: overrideExpanded,\r\n disabled = false,\r\n className,\r\n icon,\r\n title,\r\n showProps = true,\r\n showExamples = false,\r\n showTips = true,\r\n compact = false,\r\n}) => {\r\n const { t } = useNiceTranslation();\r\n const {\r\n content: loadedContent,\r\n loading,\r\n enabled,\r\n loadContent,\r\n position: configPosition,\r\n defaultExpanded: configExpanded,\r\n showHelpIcon,\r\n } = useComponentHelp(componentName);\r\n\r\n const content = overrideContent || loadedContent;\r\n const position = overridePosition || configPosition;\r\n const isExpanded = overrideExpanded ?? configExpanded;\r\n\r\n const [expanded, setExpanded] = useState(isExpanded);\r\n\r\n // Load content on mount if enabled\r\n useEffect(() => {\r\n if (enabled && !overrideContent && !loadedContent) {\r\n loadContent();\r\n }\r\n }, [enabled, overrideContent, loadedContent, loadContent]);\r\n\r\n // Don't render if disabled or globally disabled\r\n if (disabled || !enabled) {\r\n return <>{children}</>;\r\n }\r\n\r\n // Tooltip mode\r\n if (position === 'tooltip') {\r\n return (\r\n <div className={`nice-help-tooltip-wrapper ${className || ''}`}>\r\n {children}\r\n {showHelpIcon && content && (\r\n <button\r\n className=\"nice-help__trigger\"\r\n onClick={() => setExpanded(!expanded)}\r\n aria-label={t('help.toggle', 'Toggle help')}\r\n aria-expanded={expanded}\r\n >\r\n {icon || (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\" />\r\n </svg>\r\n )}\r\n </button>\r\n )}\r\n {expanded && content && (\r\n <div className=\"nice-help__tooltip\">\r\n <div className=\"nice-help__tooltip-content\">\r\n <h3 className=\"nice-help__title\">{title || content.name}</h3>\r\n <p className=\"nice-help__description\">{content.description}</p>\r\n {showTips && content.tips && <TipsList tips={content.tips} />}\r\n {showProps && content.props && <PropsTable props={content.props} compact />}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // Inline/Panel mode\r\n return (\r\n <div\r\n className={`nice-help ${position === 'bottom' ? 'nice-help--bottom' : ''} ${className || ''}`}\r\n >\r\n {position === 'top' && content && (\r\n <HelpPanel\r\n content={content}\r\n expanded={expanded}\r\n onToggle={() => setExpanded(!expanded)}\r\n loading={loading}\r\n title={title}\r\n showProps={showProps}\r\n showExamples={showExamples}\r\n showTips={showTips}\r\n compact={compact}\r\n />\r\n )}\r\n {children}\r\n {position === 'bottom' && content && (\r\n <HelpPanel\r\n content={content}\r\n expanded={expanded}\r\n onToggle={() => setExpanded(!expanded)}\r\n loading={loading}\r\n title={title}\r\n showProps={showProps}\r\n showExamples={showExamples}\r\n showTips={showTips}\r\n compact={compact}\r\n />\r\n )}\r\n {position === 'inline' && content && expanded && (\r\n <div className=\"nice-help__inline\">\r\n <p className=\"nice-help__description\">{content.description}</p>\r\n {showTips && content.tips && <TipsList tips={content.tips} />}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nNiceInlineHelp.displayName = 'NiceInlineHelp';\r\n\r\n// ─── Help Panel ────────────────────────────────────────────\r\n\r\ninterface HelpPanelProps {\r\n content: HelpContent;\r\n expanded: boolean;\r\n onToggle: () => void;\r\n loading?: boolean;\r\n title?: string;\r\n showProps?: boolean;\r\n showExamples?: boolean;\r\n showTips?: boolean;\r\n compact?: boolean;\r\n}\r\n\r\nconst HelpPanel: React.FC<HelpPanelProps> = ({\r\n content,\r\n expanded,\r\n onToggle,\r\n loading,\r\n title,\r\n showProps,\r\n showExamples,\r\n showTips,\r\n compact,\r\n}) => {\r\n const { t } = useNiceTranslation();\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"nice-help__panel nice-help__panel--loading\">\r\n <div className=\"nice-spinner nice-spinner--sm\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`nice-help__panel ${expanded ? 'nice-help__panel--expanded' : ''}`}>\r\n <button className=\"nice-help__panel-header\" onClick={onToggle} aria-expanded={expanded}>\r\n <span className=\"nice-help__panel-icon\">{expanded ? '▾' : '▸'}</span>\r\n <span className=\"nice-help__panel-title\">\r\n {title || t('help.about', 'About')} {content.name}\r\n </span>\r\n {content.status && (\r\n <span className={`nice-help__status nice-help__status--${content.status}`}>\r\n {content.status}\r\n </span>\r\n )}\r\n </button>\r\n {expanded && (\r\n <div className=\"nice-help__panel-content\">\r\n <p className=\"nice-help__description\">{content.description}</p>\r\n {showTips && content.tips && <TipsList tips={content.tips} />}\r\n {showProps && content.props && <PropsTable props={content.props} compact={compact} />}\r\n {showExamples && content.examples && <ExamplesList examples={content.examples} />}\r\n {content.seeAlso && content.seeAlso.length > 0 && (\r\n <div className=\"nice-help__see-also\">\r\n <h4 className=\"nice-help__section-title\">{t('help.seeAlso', 'See Also')}</h4>\r\n <ul>\r\n {content.seeAlso.map((ref, idx) => (\r\n <li key={idx}>\r\n <code>{ref}</code>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// ─── Quick Help (Lightweight) ──────────────────────────────\r\n\r\nexport interface NiceQuickHelpProps {\r\n /** Help text to display */\r\n text: string;\r\n /** Help position */\r\n position?: 'top' | 'right' | 'bottom' | 'left';\r\n /** Custom className */\r\n className?: string;\r\n /** Trigger element */\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * Lightweight inline help that shows on hover/focus\r\n */\r\nexport const NiceQuickHelp: React.FC<NiceQuickHelpProps> = ({\r\n text,\r\n position = 'top',\r\n className,\r\n children,\r\n}) => {\r\n const [show, setShow] = useState(false);\r\n\r\n return (\r\n <span\r\n className={`nice-quick-help nice-quick-help--${position} ${className || ''}`}\r\n onMouseEnter={() => setShow(true)}\r\n onMouseLeave={() => setShow(false)}\r\n onFocus={() => setShow(true)}\r\n onBlur={() => setShow(false)}\r\n >\r\n {children}\r\n {show && (\r\n <span className=\"nice-quick-help__popup\" role=\"tooltip\">\r\n {text}\r\n </span>\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\nNiceQuickHelp.displayName = 'NiceQuickHelp';\r\n\r\n// ─── Help Icon Button ──────────────────────────────────────\r\n\r\nexport interface NiceHelpIconProps {\r\n /** Help content to show */\r\n content: string | HelpContent;\r\n /** Button size */\r\n size?: 'sm' | 'md' | 'lg';\r\n /** Custom className */\r\n className?: string;\r\n /** Callback when help is opened */\r\n onOpen?: () => void;\r\n}\r\n\r\n/**\r\n * Help icon that shows help content on click\r\n */\r\nexport const NiceHelpIcon: React.FC<NiceHelpIconProps> = ({\r\n content,\r\n size = 'sm',\r\n className,\r\n onOpen,\r\n}) => {\r\n const { t } = useNiceTranslation();\r\n const [show, setShow] = useState(false);\r\n\r\n const handleClick = useCallback(() => {\r\n setShow(!show);\r\n if (!show && onOpen) {\r\n onOpen();\r\n }\r\n }, [show, onOpen]);\r\n\r\n const helpText = typeof content === 'string' ? content : content.description;\r\n const helpTitle = typeof content === 'string' ? undefined : content.name;\r\n\r\n return (\r\n <span className={`nice-help-icon nice-help-icon--${size} ${className || ''}`}>\r\n <button\r\n className=\"nice-help-icon__btn\"\r\n onClick={handleClick}\r\n aria-label={t('help.showHelp', 'Show help')}\r\n aria-expanded={show}\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\" />\r\n </svg>\r\n </button>\r\n {show && (\r\n <div className=\"nice-help-icon__popup\">\r\n {helpTitle && <strong>{helpTitle}</strong>}\r\n <p>{helpText}</p>\r\n <button className=\"nice-help-icon__close\" onClick={() => setShow(false)}>\r\n ×\r\n </button>\r\n </div>\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\nNiceHelpIcon.displayName = 'NiceHelpIcon';\r\n\r\nexport default NiceInlineHelp;\r\n","/**\r\n * @file NiceUserPreferences.tsx\r\n * @description User preferences system for storing and managing per-control customizations\r\n *\r\n * Features:\r\n * - Per-control preferences storage\r\n * - Grid column customization\r\n * - Custom colors and styles\r\n * - Layout preferences\r\n * - Import/Export\r\n * - Backend sync support\r\n *\r\n * @version 1.0.0\r\n * @since 2026-03\r\n * @license MIT\r\n */\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useCallback,\r\n useEffect,\r\n useState,\r\n useRef,\r\n useMemo,\r\n} from 'react';\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 1. TYPES\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Grid column preferences\r\n */\r\nexport interface GridColumnPreference {\r\n /** Column ID */\r\n id: string;\r\n /** Visible */\r\n visible?: boolean;\r\n /** Width */\r\n width?: number;\r\n /** Order/index */\r\n order?: number;\r\n /** Pinned position */\r\n pinned?: 'left' | 'right' | null;\r\n /** Sort direction */\r\n sort?: 'asc' | 'desc' | null;\r\n /** Sort order for multi-sort */\r\n sortIndex?: number;\r\n /** Custom header */\r\n customHeader?: string;\r\n /** Custom cell background */\r\n cellBackground?: string;\r\n /** Custom cell text color */\r\n cellColor?: string;\r\n}\r\n\r\n/**\r\n * Grid preferences\r\n */\r\nexport interface GridPreferences {\r\n /** Column configs */\r\n columns?: GridColumnPreference[];\r\n /** Page size */\r\n pageSize?: number;\r\n /** Row height */\r\n rowHeight?: number;\r\n /** Filter state */\r\n filters?: Record<string, any>;\r\n /** Grouping columns */\r\n groupBy?: string[];\r\n /** Expanded groups */\r\n expandedGroups?: string[];\r\n /** Selected rows */\r\n selectedRows?: (string | number)[];\r\n /** Custom row colors */\r\n rowColors?: Record<string | number, string>;\r\n}\r\n\r\n/**\r\n * Chart preferences\r\n */\r\nexport interface ChartPreferences {\r\n /** Chart type override */\r\n chartType?: string;\r\n /** Custom colors */\r\n colors?: string[];\r\n /** Show/hide legend */\r\n showLegend?: boolean;\r\n /** Legend position */\r\n legendPosition?: 'top' | 'bottom' | 'left' | 'right';\r\n /** Show data labels */\r\n showDataLabels?: boolean;\r\n /** Custom title */\r\n customTitle?: string;\r\n /** Zoom state */\r\n zoomState?: { min: number; max: number };\r\n}\r\n\r\n/**\r\n * Form preferences\r\n */\r\nexport interface FormPreferences {\r\n /** Field order */\r\n fieldOrder?: string[];\r\n /** Hidden fields */\r\n hiddenFields?: string[];\r\n /** Column layout */\r\n columns?: number;\r\n /** Collapsed sections */\r\n collapsedSections?: string[];\r\n /** Default values */\r\n defaultValues?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Layout preferences\r\n */\r\nexport interface LayoutPreferences {\r\n /** Sidebar collapsed */\r\n sidebarCollapsed?: boolean;\r\n /** Sidebar width */\r\n sidebarWidth?: number;\r\n /** Panel sizes */\r\n panelSizes?: Record<string, number>;\r\n /** Tab order */\r\n tabOrder?: string[];\r\n /** Active tab */\r\n activeTab?: string;\r\n /** Splitter positions */\r\n splitterPositions?: Record<string, number>;\r\n}\r\n\r\n/**\r\n * Display preferences\r\n */\r\nexport interface DisplayPreferences {\r\n /** Date format */\r\n dateFormat?: string;\r\n /** Time format */\r\n timeFormat?: string;\r\n /** Number format */\r\n numberFormat?: string;\r\n /** Currency */\r\n currency?: string;\r\n /** Locale */\r\n locale?: string;\r\n /** Font size scale */\r\n fontScale?: number;\r\n /** High contrast mode */\r\n highContrast?: boolean;\r\n /** Reduced motion */\r\n reducedMotion?: boolean;\r\n}\r\n\r\n/**\r\n * Control-specific preferences\r\n */\r\nexport interface ControlPreferences {\r\n /** Grid preferences */\r\n grid?: GridPreferences;\r\n /** Chart preferences */\r\n chart?: ChartPreferences;\r\n /** Form preferences */\r\n form?: FormPreferences;\r\n /** Layout preferences */\r\n layout?: LayoutPreferences;\r\n /** Display preferences */\r\n display?: DisplayPreferences;\r\n /** Custom data */\r\n custom?: Record<string, any>;\r\n /** Last modified timestamp */\r\n lastModified?: number;\r\n}\r\n\r\n/**\r\n * User preferences store\r\n */\r\nexport interface UserPreferencesStore {\r\n /** Version for migrations */\r\n version: number;\r\n /** Global preferences */\r\n global: {\r\n display?: DisplayPreferences;\r\n layout?: LayoutPreferences;\r\n custom?: Record<string, any>;\r\n };\r\n /** Per-control preferences keyed by control ID */\r\n controls: Record<string, ControlPreferences>;\r\n /** Last sync timestamp */\r\n lastSync?: number;\r\n}\r\n\r\n/**\r\n * Storage adapter interface\r\n */\r\nexport interface PreferencesStorageAdapter {\r\n /** Load preferences */\r\n load(): Promise<UserPreferencesStore | null>;\r\n /** Save preferences */\r\n save(preferences: UserPreferencesStore): Promise<void>;\r\n /** Clear preferences */\r\n clear(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Sync adapter interface for backend sync\r\n */\r\nexport interface PreferencesSyncAdapter {\r\n /** Fetch preferences from backend */\r\n fetch(): Promise<UserPreferencesStore | null>;\r\n /** Push preferences to backend */\r\n push(preferences: UserPreferencesStore): Promise<void>;\r\n /** Get last server timestamp */\r\n getServerTimestamp(): Promise<number>;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 2. STORAGE ADAPTERS\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\n/**\r\n * LocalStorage adapter\r\n */\r\nexport class LocalStorageAdapter implements PreferencesStorageAdapter {\r\n constructor(private key: string = 'ntd-user-preferences') {}\r\n\r\n async load(): Promise<UserPreferencesStore | null> {\r\n try {\r\n const stored = localStorage.getItem(this.key);\r\n return stored ? JSON.parse(stored) : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n async save(preferences: UserPreferencesStore): Promise<void> {\r\n localStorage.setItem(this.key, JSON.stringify(preferences));\r\n }\r\n\r\n async clear(): Promise<void> {\r\n localStorage.removeItem(this.key);\r\n }\r\n}\r\n\r\n/**\r\n * IndexedDB adapter for larger datasets\r\n */\r\nexport class IndexedDBAdapter implements PreferencesStorageAdapter {\r\n private dbName: string;\r\n private storeName: string;\r\n private db: IDBDatabase | null = null;\r\n\r\n constructor(dbName: string = 'ntd-preferences', storeName: string = 'preferences') {\r\n this.dbName = dbName;\r\n this.storeName = storeName;\r\n }\r\n\r\n private async getDB(): Promise<IDBDatabase> {\r\n if (this.db) {\r\n return this.db;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.dbName, 1);\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve(this.db);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(this.storeName)) {\r\n db.createObjectStore(this.storeName, { keyPath: 'id' });\r\n }\r\n };\r\n });\r\n }\r\n\r\n async load(): Promise<UserPreferencesStore | null> {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction(this.storeName, 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.get('user-preferences');\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve(request.result?.data || null);\r\n });\r\n }\r\n\r\n async save(preferences: UserPreferencesStore): Promise<void> {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction(this.storeName, 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.put({ id: 'user-preferences', data: preferences });\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve();\r\n });\r\n }\r\n\r\n async clear(): Promise<void> {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction(this.storeName, 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.delete('user-preferences');\r\n\r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * REST API sync adapter\r\n */\r\nexport class RestAPISyncAdapter implements PreferencesSyncAdapter {\r\n constructor(\r\n private baseUrl: string,\r\n private getAuthHeaders?: () => Record<string, string>,\r\n ) {}\r\n\r\n private getHeaders(): Record<string, string> {\r\n return {\r\n 'Content-Type': 'application/json',\r\n ...(this.getAuthHeaders?.() || {}),\r\n };\r\n }\r\n\r\n async fetch(): Promise<UserPreferencesStore | null> {\r\n const response = await fetch(`${this.baseUrl}/preferences`, {\r\n method: 'GET',\r\n headers: this.getHeaders(),\r\n });\r\n\r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n return null;\r\n }\r\n throw new Error(`Failed to fetch preferences: ${response.statusText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async push(preferences: UserPreferencesStore): Promise<void> {\r\n const response = await fetch(`${this.baseUrl}/preferences`, {\r\n method: 'PUT',\r\n headers: this.getHeaders(),\r\n body: JSON.stringify(preferences),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to save preferences: ${response.statusText}`);\r\n }\r\n }\r\n\r\n async getServerTimestamp(): Promise<number> {\r\n const response = await fetch(`${this.baseUrl}/preferences/timestamp`, {\r\n method: 'GET',\r\n headers: this.getHeaders(),\r\n });\r\n\r\n if (!response.ok) {\r\n return 0;\r\n }\r\n const data = await response.json();\r\n return data.timestamp || 0;\r\n }\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 3. CONTEXT & PROVIDER\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\ninterface UserPreferencesContextValue {\r\n /** Current preferences store */\r\n preferences: UserPreferencesStore;\r\n /** Is loading */\r\n isLoading: boolean;\r\n /** Is syncing */\r\n isSyncing: boolean;\r\n /** Last error */\r\n error: Error | null;\r\n\r\n // Control preferences\r\n getControlPreferences<T extends keyof ControlPreferences>(\r\n controlId: string,\r\n type: T,\r\n ): ControlPreferences[T] | undefined;\r\n setControlPreferences<T extends keyof ControlPreferences>(\r\n controlId: string,\r\n type: T,\r\n prefs: ControlPreferences[T],\r\n ): void;\r\n updateControlPreferences<T extends keyof ControlPreferences>(\r\n controlId: string,\r\n type: T,\r\n updates: Partial<NonNullable<ControlPreferences[T]>>,\r\n ): void;\r\n clearControlPreferences(controlId: string, type?: keyof ControlPreferences): void;\r\n\r\n // Global preferences\r\n getGlobalPreferences<T extends 'display' | 'layout' | 'custom'>(\r\n type: T,\r\n ): UserPreferencesStore['global'][T];\r\n setGlobalPreferences<T extends 'display' | 'layout' | 'custom'>(\r\n type: T,\r\n prefs: UserPreferencesStore['global'][T],\r\n ): void;\r\n\r\n // Sync\r\n sync(): Promise<void>;\r\n exportPreferences(): string;\r\n importPreferences(json: string): void;\r\n resetAllPreferences(): void;\r\n}\r\n\r\nconst UserPreferencesContext = createContext<UserPreferencesContextValue | null>(null);\r\n\r\n/**\r\n * Hook to access user preferences\r\n */\r\nexport function useUserPreferences(): UserPreferencesContextValue {\r\n const ctx = useContext(UserPreferencesContext);\r\n if (!ctx) {\r\n throw new Error('useUserPreferences must be used within NiceUserPreferencesProvider');\r\n }\r\n return ctx;\r\n}\r\n\r\n/**\r\n * Hook for specific control preferences\r\n */\r\nexport function useControlPreferences<T extends keyof ControlPreferences>(\r\n controlId: string,\r\n type: T,\r\n): [\r\n ControlPreferences[T] | undefined,\r\n (prefs: ControlPreferences[T]) => void,\r\n (updates: Partial<NonNullable<ControlPreferences[T]>>) => void,\r\n] {\r\n const { getControlPreferences, setControlPreferences, updateControlPreferences } =\r\n useUserPreferences();\r\n\r\n const prefs = getControlPreferences(controlId, type);\r\n const set = useCallback(\r\n (p: ControlPreferences[T]) => setControlPreferences(controlId, type, p),\r\n [controlId, type, setControlPreferences],\r\n );\r\n const update = useCallback(\r\n (u: Partial<NonNullable<ControlPreferences[T]>>) =>\r\n updateControlPreferences(controlId, type, u),\r\n [controlId, type, updateControlPreferences],\r\n );\r\n\r\n return [prefs, set, update];\r\n}\r\n\r\n/**\r\n * Hook for grid-specific preferences (convenience)\r\n */\r\nexport function useGridPreferences(gridId: string) {\r\n return useControlPreferences(gridId, 'grid');\r\n}\r\n\r\n/**\r\n * Hook for chart-specific preferences (convenience)\r\n */\r\nexport function useChartPreferences(chartId: string) {\r\n return useControlPreferences(chartId, 'chart');\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 4. PROVIDER COMPONENT\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface NiceUserPreferencesProviderProps {\r\n /** Storage adapter */\r\n storage?: PreferencesStorageAdapter;\r\n /** Sync adapter for backend sync */\r\n syncAdapter?: PreferencesSyncAdapter;\r\n /** Auto-sync interval in ms (0 = disabled) */\r\n autoSyncInterval?: number;\r\n /** Debounce save delay in ms */\r\n saveDebounce?: number;\r\n /** Children */\r\n children: React.ReactNode;\r\n}\r\n\r\nconst EMPTY_STORE: UserPreferencesStore = {\r\n version: 1,\r\n global: {},\r\n controls: {},\r\n};\r\n\r\nexport function NiceUserPreferencesProvider({\r\n storage = new LocalStorageAdapter(),\r\n syncAdapter,\r\n autoSyncInterval = 0,\r\n saveDebounce = 500,\r\n children,\r\n}: NiceUserPreferencesProviderProps): JSX.Element {\r\n const [preferences, setPreferences] = useState<UserPreferencesStore>(EMPTY_STORE);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [isSyncing, setIsSyncing] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const saveTimeoutRef = useRef<ReturnType<typeof setTimeout>>();\r\n const syncIntervalRef = useRef<ReturnType<typeof setInterval>>();\r\n\r\n // Load preferences on mount\r\n useEffect(() => {\r\n let mounted = true;\r\n\r\n const load = async () => {\r\n try {\r\n const stored = await storage.load();\r\n if (mounted && stored) {\r\n setPreferences(stored);\r\n }\r\n } catch (err) {\r\n if (mounted) {\r\n setError(err instanceof Error ? err : new Error('Failed to load preferences'));\r\n }\r\n } finally {\r\n if (mounted) {\r\n setIsLoading(false);\r\n }\r\n }\r\n };\r\n\r\n load();\r\n\r\n return () => {\r\n mounted = false;\r\n };\r\n }, [storage]);\r\n\r\n // Debounced save\r\n const debouncedSave = useCallback(\r\n (prefs: UserPreferencesStore) => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current);\r\n }\r\n\r\n saveTimeoutRef.current = setTimeout(async () => {\r\n try {\r\n await storage.save(prefs);\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error('Failed to save preferences'));\r\n }\r\n }, saveDebounce);\r\n },\r\n [storage, saveDebounce],\r\n );\r\n\r\n // Save when preferences change\r\n useEffect(() => {\r\n if (!isLoading) {\r\n debouncedSave(preferences);\r\n }\r\n }, [preferences, isLoading, debouncedSave]);\r\n\r\n // Auto-sync\r\n useEffect(() => {\r\n if (syncAdapter && autoSyncInterval > 0) {\r\n syncIntervalRef.current = setInterval(() => {\r\n sync();\r\n }, autoSyncInterval);\r\n\r\n return () => {\r\n if (syncIntervalRef.current) {\r\n clearInterval(syncIntervalRef.current);\r\n }\r\n };\r\n }\r\n }, [syncAdapter, autoSyncInterval]);\r\n\r\n // Cleanup\r\n useEffect(() => {\r\n return () => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current);\r\n }\r\n if (syncIntervalRef.current) {\r\n clearInterval(syncIntervalRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n // Control preferences methods\r\n const getControlPreferences = useCallback(\r\n <T extends keyof ControlPreferences>(\r\n controlId: string,\r\n type: T,\r\n ): ControlPreferences[T] | undefined => {\r\n return preferences.controls[controlId]?.[type];\r\n },\r\n [preferences],\r\n );\r\n\r\n const setControlPreferences = useCallback(\r\n <T extends keyof ControlPreferences>(\r\n controlId: string,\r\n type: T,\r\n prefs: ControlPreferences[T],\r\n ) => {\r\n setPreferences((prev) => ({\r\n ...prev,\r\n controls: {\r\n ...prev.controls,\r\n [controlId]: {\r\n ...prev.controls[controlId],\r\n [type]: prefs,\r\n lastModified: Date.now(),\r\n },\r\n },\r\n }));\r\n },\r\n [],\r\n );\r\n\r\n const updateControlPreferences = useCallback(\r\n <T extends keyof ControlPreferences>(\r\n controlId: string,\r\n type: T,\r\n updates: Partial<NonNullable<ControlPreferences[T]>>,\r\n ) => {\r\n setPreferences((prev) => {\r\n const existingPrefs = prev.controls[controlId]?.[type];\r\n const merged =\r\n typeof existingPrefs === 'object' && existingPrefs !== null\r\n ? { ...existingPrefs, ...updates }\r\n : updates;\r\n\r\n return {\r\n ...prev,\r\n controls: {\r\n ...prev.controls,\r\n [controlId]: {\r\n ...prev.controls[controlId],\r\n [type]: merged as ControlPreferences[T],\r\n lastModified: Date.now(),\r\n },\r\n },\r\n };\r\n });\r\n },\r\n [],\r\n );\r\n\r\n const clearControlPreferences = useCallback(\r\n (controlId: string, type?: keyof ControlPreferences) => {\r\n setPreferences((prev) => {\r\n if (type) {\r\n const { [type]: _, ...rest } = prev.controls[controlId] || {};\r\n return {\r\n ...prev,\r\n controls: {\r\n ...prev.controls,\r\n [controlId]: rest,\r\n },\r\n };\r\n }\r\n\r\n const { [controlId]: _, ...rest } = prev.controls;\r\n return {\r\n ...prev,\r\n controls: rest,\r\n };\r\n });\r\n },\r\n [],\r\n );\r\n\r\n // Global preferences methods\r\n const getGlobalPreferences = useCallback(\r\n <T extends 'display' | 'layout' | 'custom'>(type: T): UserPreferencesStore['global'][T] => {\r\n return preferences.global[type];\r\n },\r\n [preferences],\r\n );\r\n\r\n const setGlobalPreferences = useCallback(\r\n <T extends 'display' | 'layout' | 'custom'>(\r\n type: T,\r\n prefs: UserPreferencesStore['global'][T],\r\n ) => {\r\n setPreferences((prev) => ({\r\n ...prev,\r\n global: {\r\n ...prev.global,\r\n [type]: prefs,\r\n },\r\n }));\r\n },\r\n [],\r\n );\r\n\r\n // Sync\r\n const sync = useCallback(async () => {\r\n if (!syncAdapter) {\r\n return;\r\n }\r\n\r\n setIsSyncing(true);\r\n setError(null);\r\n\r\n try {\r\n const serverTimestamp = await syncAdapter.getServerTimestamp();\r\n const localTimestamp = preferences.lastSync || 0;\r\n\r\n if (serverTimestamp > localTimestamp) {\r\n // Server is newer, fetch\r\n const serverPrefs = await syncAdapter.fetch();\r\n if (serverPrefs) {\r\n setPreferences({\r\n ...serverPrefs,\r\n lastSync: Date.now(),\r\n });\r\n await storage.save(serverPrefs);\r\n }\r\n } else {\r\n // Local is newer, push\r\n const toSync = { ...preferences, lastSync: Date.now() };\r\n await syncAdapter.push(toSync);\r\n setPreferences(toSync);\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error('Sync failed'));\r\n } finally {\r\n setIsSyncing(false);\r\n }\r\n }, [syncAdapter, preferences, storage]);\r\n\r\n // Export/Import\r\n const exportPreferences = useCallback((): string => {\r\n return JSON.stringify(preferences, null, 2);\r\n }, [preferences]);\r\n\r\n const importPreferences = useCallback((json: string) => {\r\n try {\r\n const imported = JSON.parse(json) as UserPreferencesStore;\r\n if (typeof imported.version !== 'number' || !imported.controls) {\r\n throw new Error('Invalid preferences format');\r\n }\r\n setPreferences(imported);\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error('Import failed'));\r\n }\r\n }, []);\r\n\r\n const resetAllPreferences = useCallback(() => {\r\n setPreferences(EMPTY_STORE);\r\n storage.clear();\r\n }, [storage]);\r\n\r\n const value = useMemo<UserPreferencesContextValue>(\r\n () => ({\r\n preferences,\r\n isLoading,\r\n isSyncing,\r\n error,\r\n getControlPreferences,\r\n setControlPreferences,\r\n updateControlPreferences,\r\n clearControlPreferences,\r\n getGlobalPreferences,\r\n setGlobalPreferences,\r\n sync,\r\n exportPreferences,\r\n importPreferences,\r\n resetAllPreferences,\r\n }),\r\n [\r\n preferences,\r\n isLoading,\r\n isSyncing,\r\n error,\r\n getControlPreferences,\r\n setControlPreferences,\r\n updateControlPreferences,\r\n clearControlPreferences,\r\n getGlobalPreferences,\r\n setGlobalPreferences,\r\n sync,\r\n exportPreferences,\r\n importPreferences,\r\n resetAllPreferences,\r\n ],\r\n );\r\n\r\n return (\r\n <UserPreferencesContext.Provider value={value}>{children}</UserPreferencesContext.Provider>\r\n );\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 5. PREFERENCES PANEL COMPONENT\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface NicePreferencesPanelProps {\r\n /** Show global preferences section */\r\n showGlobal?: boolean;\r\n /** Show control preferences section */\r\n showControls?: boolean;\r\n /** Show export/import buttons */\r\n showExportImport?: boolean;\r\n /** Show sync button */\r\n showSync?: boolean;\r\n /** Custom class */\r\n className?: string;\r\n /** Style */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * UI panel for managing user preferences\r\n */\r\nexport function NicePreferencesPanel({\r\n showGlobal = true,\r\n showControls = true,\r\n showExportImport = true,\r\n showSync = true,\r\n className,\r\n style,\r\n}: NicePreferencesPanelProps): JSX.Element {\r\n const {\r\n preferences,\r\n isLoading,\r\n isSyncing,\r\n error,\r\n sync,\r\n exportPreferences,\r\n importPreferences,\r\n resetAllPreferences,\r\n setGlobalPreferences,\r\n clearControlPreferences,\r\n } = useUserPreferences();\r\n\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const handleExport = () => {\r\n const json = exportPreferences();\r\n const blob = new Blob([json], { type: 'application/json' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = 'nice2dev-preferences.json';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n };\r\n\r\n const handleImport = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0];\r\n if (!file) {\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n importPreferences(reader.result as string);\r\n };\r\n reader.readAsText(file);\r\n };\r\n\r\n if (isLoading) {\r\n return (\r\n <div className={className} style={style}>\r\n Loading preferences...\r\n </div>\r\n );\r\n }\r\n\r\n const controlIds = Object.keys(preferences.controls);\r\n\r\n return (\r\n <div\r\n className={`ntd-preferences-panel ${className || ''}`}\r\n style={{\r\n fontFamily: 'system-ui, sans-serif',\r\n fontSize: '14px',\r\n padding: '16px',\r\n ...style,\r\n }}\r\n >\r\n {error && (\r\n <div\r\n style={{\r\n padding: '12px',\r\n marginBottom: '16px',\r\n background: 'var(--danger-bg, #fef2f2)',\r\n border: '1px solid #fecaca',\r\n borderRadius: '6px',\r\n color: 'var(--color-error, #dc2626)',\r\n }}\r\n >\r\n {error.message}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n <div style={{ display: 'flex', gap: '8px', marginBottom: '20px', flexWrap: 'wrap' }}>\r\n {showSync && (\r\n <button\r\n onClick={sync}\r\n disabled={isSyncing}\r\n style={{\r\n padding: '8px 16px',\r\n border: '1px solid var(--border-color, #e5e7eb)',\r\n borderRadius: '6px',\r\n background: 'var(--bg-primary, #fff)',\r\n cursor: isSyncing ? 'wait' : 'pointer',\r\n }}\r\n >\r\n {isSyncing ? 'Syncing...' : 'Sync'}\r\n </button>\r\n )}\r\n\r\n {showExportImport && (\r\n <>\r\n <button\r\n onClick={handleExport}\r\n style={{\r\n padding: '8px 16px',\r\n border: '1px solid var(--border-color, #e5e7eb)',\r\n borderRadius: '6px',\r\n background: 'var(--bg-primary, #fff)',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Export\r\n </button>\r\n <button\r\n onClick={() => fileInputRef.current?.click()}\r\n style={{\r\n padding: '8px 16px',\r\n border: '1px solid var(--border-color, #e5e7eb)',\r\n borderRadius: '6px',\r\n background: 'var(--bg-primary, #fff)',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Import\r\n </button>\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\".json\"\r\n onChange={handleImport}\r\n style={{ display: 'none' }}\r\n />\r\n </>\r\n )}\r\n\r\n <button\r\n onClick={resetAllPreferences}\r\n style={{\r\n padding: '8px 16px',\r\n border: '1px solid #dc2626',\r\n borderRadius: '6px',\r\n background: 'var(--danger-bg, #fef2f2)',\r\n color: 'var(--color-error, #dc2626)',\r\n cursor: 'pointer',\r\n marginLeft: 'auto',\r\n }}\r\n >\r\n Reset All\r\n </button>\r\n </div>\r\n\r\n {/* Global Preferences */}\r\n {showGlobal && (\r\n <div style={{ marginBottom: '24px' }}>\r\n <h3 style={{ margin: '0 0 12px', fontSize: '16px', fontWeight: 600 }}>\r\n Global Preferences\r\n </h3>\r\n\r\n <div style={{ display: 'grid', gap: '12px' }}>\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={preferences.global.display?.reducedMotion || false}\r\n onChange={(e) =>\r\n setGlobalPreferences('display', {\r\n ...preferences.global.display,\r\n reducedMotion: e.target.checked,\r\n })\r\n }\r\n />\r\n Reduced motion\r\n </label>\r\n\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={preferences.global.display?.highContrast || false}\r\n onChange={(e) =>\r\n setGlobalPreferences('display', {\r\n ...preferences.global.display,\r\n highContrast: e.target.checked,\r\n })\r\n }\r\n />\r\n High contrast\r\n </label>\r\n\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\r\n Font scale:\r\n <input\r\n type=\"range\"\r\n min=\"0.8\"\r\n max=\"1.5\"\r\n step=\"0.1\"\r\n value={preferences.global.display?.fontScale || 1}\r\n onChange={(e) =>\r\n setGlobalPreferences('display', {\r\n ...preferences.global.display,\r\n fontScale: parseFloat(e.target.value),\r\n })\r\n }\r\n style={{ flex: 1 }}\r\n />\r\n <span>{((preferences.global.display?.fontScale || 1) * 100).toFixed(0)}%</span>\r\n </label>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Control Preferences */}\r\n {showControls && controlIds.length > 0 && (\r\n <div>\r\n <h3 style={{ margin: '0 0 12px', fontSize: '16px', fontWeight: 600 }}>\r\n Control Preferences ({controlIds.length})\r\n </h3>\r\n\r\n <div style={{ display: 'grid', gap: '8px' }}>\r\n {controlIds.map((id) => {\r\n const ctrl = preferences.controls[id];\r\n const types = Object.keys(ctrl).filter((k) => k !== 'lastModified');\r\n\r\n return (\r\n <div\r\n key={id}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '10px 12px',\r\n background: 'var(--bg-secondary, #f9fafb)',\r\n borderRadius: '6px',\r\n }}\r\n >\r\n <div>\r\n <div style={{ fontWeight: 500 }}>{id}</div>\r\n <div style={{ fontSize: '12px', color: 'var(--text-muted, #6b7280)' }}>\r\n {types.join(', ')}\r\n </div>\r\n </div>\r\n <button\r\n onClick={() => clearControlPreferences(id)}\r\n style={{\r\n padding: '4px 8px',\r\n border: 'none',\r\n borderRadius: '4px',\r\n background: 'var(--border-color, #e5e7eb)',\r\n cursor: 'pointer',\r\n fontSize: '12px',\r\n }}\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showControls && controlIds.length === 0 && (\r\n <div style={{ color: 'var(--text-muted, #6b7280)', fontStyle: 'italic' }}>\r\n No control preferences saved yet.\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","/**\r\n * @fileoverview Traceless™ — Zero-Trace Privacy Architecture\r\n * @module @nice2dev/ui/core/traceless\r\n *\r\n * Traceless™ is OmniVerk's flagship privacy feature that allows complete control\r\n * over client-side storage (cookies, localStorage, sessionStorage).\r\n *\r\n * \"Żadnych śladów. Żadnych cookies. Żadnego localStorage. Żadnego bannera. Traceless.\"\r\n *\r\n * @example\r\n * ```tsx\r\n * import { TracelessProvider, useTracelessPolicy, StorageAdapter } from '@nice2dev/ui';\r\n *\r\n * // In your app root:\r\n * <TracelessProvider>\r\n * <App />\r\n * </TracelessProvider>\r\n *\r\n * // In components:\r\n * const { mode, canUseCookies, canUseLocalStorage } = useTracelessPolicy();\r\n * const storage = useStorageAdapter();\r\n * storage.set('key', 'value'); // Automatically respects policy\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// TYPES & ENUMS\r\n// ============================================================================\r\n\r\n/**\r\n * Privacy storage modes from most private to most permissive.\r\n *\r\n * | Mode | Cookies | localStorage | sessionStorage | Consent Banner |\r\n * |------------|---------|--------------|----------------|----------------|\r\n * | traceless | ❌ | ❌ | ❌ | ❌ Never |\r\n * | ephemeral | ❌ | ❌ | ✅ | ❌ Never |\r\n * | private | 1 auth | ❌ | ✅ | ❌ Exempt |\r\n * | balanced | ❌ | ✅ | ✅ | ⚠️ Maybe |\r\n * | full | ✅ | ✅ | ✅ | ✅ Required |\r\n * | custom | Config | Config | Config | Config |\r\n */\r\nexport type TracelessMode = 'traceless' | 'ephemeral' | 'private' | 'balanced' | 'full' | 'custom';\r\n\r\n/**\r\n * Per-control storage mode configuration.\r\n */\r\nexport type ControlStorageMode = 'traceless' | 'ephemeral' | 'persistent' | 'auto';\r\n\r\n/**\r\n * Main policy interface for Traceless system.\r\n * Three independent flags for granular control.\r\n */\r\nexport interface ITracelessPolicy {\r\n /** Whether cookies are allowed (any cookies) */\r\n cookiesAllowed: boolean;\r\n /** Whether localStorage is allowed */\r\n localStorageAllowed: boolean;\r\n /** Whether sessionStorage is allowed */\r\n sessionStorageAllowed: boolean;\r\n /** Whether only strictly necessary auth cookie is allowed (httpOnly) */\r\n strictAuthCookieOnly: boolean;\r\n /** The effective mode derived from flags */\r\n effectiveMode: TracelessMode;\r\n /** Source of the policy (instance, tenant, group, user) */\r\n source: TracelessPolicySource;\r\n /** Whether consent banner should be shown */\r\n requiresConsentBanner: boolean;\r\n /** Timestamp when policy was resolved */\r\n resolvedAt: number;\r\n /** Policy version for cache invalidation */\r\n version: string;\r\n}\r\n\r\n/**\r\n * Source hierarchy for policy resolution.\r\n * Lower sources cannot exceed permissions of higher sources.\r\n */\r\nexport type TracelessPolicySource =\r\n | 'instance'\r\n | 'tenant'\r\n | 'group'\r\n | 'user'\r\n | 'control'\r\n | 'default';\r\n\r\n/**\r\n * Instance-level ceiling configuration.\r\n * Sets the maximum permissions any tenant/user can have.\r\n */\r\nexport interface TracelessInstanceCeiling {\r\n /** Maximum cookie permission for all tenants */\r\n maxCookies: boolean;\r\n /** Maximum localStorage permission for all tenants */\r\n maxLocalStorage: boolean;\r\n /** Maximum sessionStorage permission for all tenants */\r\n maxSessionStorage: boolean;\r\n /** Instance-wide default mode */\r\n defaultMode: TracelessMode;\r\n /** Allow tenants to override? */\r\n allowTenantOverride: boolean;\r\n /** Instance ID for audit */\r\n instanceId: string;\r\n}\r\n\r\n/**\r\n * Tenant-level policy configuration.\r\n */\r\nexport interface TracelessTenantPolicy {\r\n tenantId: string;\r\n /** Policy mode (cannot exceed instance ceiling) */\r\n mode: TracelessMode;\r\n /** Custom overrides */\r\n customPolicy?: Partial<ITracelessPolicy>;\r\n /** Allow user groups to override? */\r\n allowGroupOverride: boolean;\r\n /** Allow individual users to override? */\r\n allowUserOverride: boolean;\r\n /** Last updated timestamp */\r\n updatedAt: number;\r\n /** Updated by user ID */\r\n updatedBy?: string;\r\n}\r\n\r\n/**\r\n * User group policy.\r\n */\r\nexport interface TracelessGroupPolicy {\r\n groupId: string;\r\n tenantId: string;\r\n /** Policy mode (cannot exceed tenant policy) */\r\n mode: TracelessMode;\r\n /** Allow users in this group to self-lockdown? */\r\n allowUserLockdown: boolean;\r\n}\r\n\r\n/**\r\n * User self-lockdown configuration.\r\n * Users can only INCREASE privacy, never decrease it.\r\n */\r\nexport interface TracelessUserPreference {\r\n userId: string;\r\n /** User's preferred mode (must be >= group mode in privacy) */\r\n preferredMode: TracelessMode;\r\n /** Explicit overrides (can only restrict, not permit) */\r\n restrictCookies?: boolean;\r\n restrictLocalStorage?: boolean;\r\n restrictSessionStorage?: boolean;\r\n /** When user set this preference */\r\n setAt: number;\r\n}\r\n\r\n/**\r\n * Module storage requirements declaration.\r\n */\r\nexport interface ModuleStorageRequirement {\r\n moduleId: string;\r\n moduleName: string;\r\n /** Minimum required for full functionality */\r\n minSessionStorage: boolean;\r\n minLocalStorage: boolean;\r\n minCookies: boolean;\r\n /** Features that degrade without storage */\r\n degradedFeatures: DegradedFeature[];\r\n}\r\n\r\n/**\r\n * Feature degradation info for UX warnings.\r\n */\r\nexport interface DegradedFeature {\r\n featureId: string;\r\n featureName: string;\r\n /** What's affected */\r\n degradationType: 'disabled' | 'limited' | 'no-persistence' | 'reset-on-refresh';\r\n /** User-friendly message */\r\n userMessage: string;\r\n /** Locale key for i18n */\r\n messageKey: string;\r\n}\r\n\r\n/**\r\n * Audit entry for policy changes.\r\n */\r\nexport interface TracelessAuditEntry {\r\n id: string;\r\n timestamp: number;\r\n action: 'policy_changed' | 'user_lockdown' | 'admin_override' | 'api_access';\r\n actorId: string;\r\n actorType: 'system' | 'admin' | 'user';\r\n previousMode?: TracelessMode;\r\n newMode?: TracelessMode;\r\n previousPolicy?: Partial<ITracelessPolicy>;\r\n newPolicy?: Partial<ITracelessPolicy>;\r\n ipAddress?: string;\r\n userAgent?: string;\r\n reason?: string;\r\n source: TracelessPolicySource;\r\n tenantId?: string;\r\n groupId?: string;\r\n userId?: string;\r\n}\r\n\r\n// ============================================================================\r\n// DEFAULT POLICIES & PRESETS\r\n// ============================================================================\r\n\r\n/**\r\n * Default policy - most private out of the box (traceless).\r\n */\r\nexport const DEFAULT_TRACELESS_POLICY: ITracelessPolicy = {\r\n cookiesAllowed: false,\r\n localStorageAllowed: false,\r\n sessionStorageAllowed: false,\r\n strictAuthCookieOnly: false,\r\n effectiveMode: 'traceless',\r\n source: 'default',\r\n requiresConsentBanner: false,\r\n resolvedAt: Date.now(),\r\n version: '1.0.0',\r\n};\r\n\r\n/**\r\n * Policy presets for each mode.\r\n */\r\nexport const TRACELESS_MODE_PRESETS: Record<\r\n TracelessMode,\r\n Omit<ITracelessPolicy, 'source' | 'resolvedAt' | 'version'>\r\n> = {\r\n traceless: {\r\n cookiesAllowed: false,\r\n localStorageAllowed: false,\r\n sessionStorageAllowed: false,\r\n strictAuthCookieOnly: false,\r\n effectiveMode: 'traceless',\r\n requiresConsentBanner: false,\r\n },\r\n ephemeral: {\r\n cookiesAllowed: false,\r\n localStorageAllowed: false,\r\n sessionStorageAllowed: true,\r\n strictAuthCookieOnly: false,\r\n effectiveMode: 'ephemeral',\r\n requiresConsentBanner: false,\r\n },\r\n private: {\r\n cookiesAllowed: false,\r\n localStorageAllowed: false,\r\n sessionStorageAllowed: true,\r\n strictAuthCookieOnly: true,\r\n effectiveMode: 'private',\r\n requiresConsentBanner: false,\r\n },\r\n balanced: {\r\n cookiesAllowed: false,\r\n localStorageAllowed: true,\r\n sessionStorageAllowed: true,\r\n strictAuthCookieOnly: false,\r\n effectiveMode: 'balanced',\r\n requiresConsentBanner: true, // Some jurisdictions treat localStorage as \"similar tech\"\r\n },\r\n full: {\r\n cookiesAllowed: true,\r\n localStorageAllowed: true,\r\n sessionStorageAllowed: true,\r\n strictAuthCookieOnly: false,\r\n effectiveMode: 'full',\r\n requiresConsentBanner: true,\r\n },\r\n custom: {\r\n cookiesAllowed: false,\r\n localStorageAllowed: false,\r\n sessionStorageAllowed: false,\r\n strictAuthCookieOnly: false,\r\n effectiveMode: 'custom',\r\n requiresConsentBanner: false,\r\n },\r\n};\r\n\r\n/**\r\n * Privacy level ordering (lower index = more private).\r\n */\r\nexport const PRIVACY_LEVEL_ORDER: TracelessMode[] = [\r\n 'traceless',\r\n 'ephemeral',\r\n 'private',\r\n 'balanced',\r\n 'full',\r\n 'custom',\r\n];\r\n\r\n// ============================================================================\r\n// POLICY RESOLUTION\r\n// ============================================================================\r\n\r\n/**\r\n * Compares two modes and returns the more private one.\r\n */\r\nexport function getMorePrivateMode(a: TracelessMode, b: TracelessMode): TracelessMode {\r\n const indexA = PRIVACY_LEVEL_ORDER.indexOf(a);\r\n const indexB = PRIVACY_LEVEL_ORDER.indexOf(b);\r\n // Lower index = more private\r\n return indexA <= indexB ? a : b;\r\n}\r\n\r\n/**\r\n * Checks if mode A is at least as private as mode B.\r\n */\r\nexport function isAtLeastAsPrivate(a: TracelessMode, b: TracelessMode): boolean {\r\n const indexA = PRIVACY_LEVEL_ORDER.indexOf(a);\r\n const indexB = PRIVACY_LEVEL_ORDER.indexOf(b);\r\n return indexA <= indexB;\r\n}\r\n\r\n/**\r\n * Resolves effective policy from hierarchy.\r\n * Instance ceiling → Tenant policy → Group policy → User preference\r\n */\r\nexport function resolveTracelessPolicy(\r\n instanceCeiling: TracelessInstanceCeiling,\r\n tenantPolicy?: TracelessTenantPolicy,\r\n groupPolicy?: TracelessGroupPolicy,\r\n userPreference?: TracelessUserPreference,\r\n): ITracelessPolicy {\r\n // Start with instance ceiling converted to policy\r\n let effectiveMode = instanceCeiling.defaultMode;\r\n let source: TracelessPolicySource = 'instance';\r\n\r\n // Apply tenant policy if allowed and more private\r\n if (tenantPolicy && instanceCeiling.allowTenantOverride) {\r\n if (isAtLeastAsPrivate(tenantPolicy.mode, effectiveMode)) {\r\n effectiveMode = tenantPolicy.mode;\r\n source = 'tenant';\r\n }\r\n }\r\n\r\n // Apply group policy if allowed and more private\r\n if (groupPolicy && tenantPolicy?.allowGroupOverride) {\r\n if (isAtLeastAsPrivate(groupPolicy.mode, effectiveMode)) {\r\n effectiveMode = groupPolicy.mode;\r\n source = 'group';\r\n }\r\n }\r\n\r\n // Apply user lockdown if allowed (only more private)\r\n if (userPreference && (tenantPolicy?.allowUserOverride || groupPolicy?.allowUserLockdown)) {\r\n if (isAtLeastAsPrivate(userPreference.preferredMode, effectiveMode)) {\r\n effectiveMode = userPreference.preferredMode;\r\n source = 'user';\r\n }\r\n }\r\n\r\n // Build final policy from preset\r\n const preset = TRACELESS_MODE_PRESETS[effectiveMode];\r\n\r\n // Apply instance ceiling restrictions\r\n const policy: ITracelessPolicy = {\r\n ...preset,\r\n cookiesAllowed: preset.cookiesAllowed && instanceCeiling.maxCookies,\r\n localStorageAllowed: preset.localStorageAllowed && instanceCeiling.maxLocalStorage,\r\n sessionStorageAllowed: preset.sessionStorageAllowed && instanceCeiling.maxSessionStorage,\r\n source,\r\n resolvedAt: Date.now(),\r\n version: '1.0.0',\r\n };\r\n\r\n // Apply user restrictions (can only restrict further)\r\n if (userPreference) {\r\n if (userPreference.restrictCookies) {\r\n policy.cookiesAllowed = false;\r\n }\r\n if (userPreference.restrictLocalStorage) {\r\n policy.localStorageAllowed = false;\r\n }\r\n if (userPreference.restrictSessionStorage) {\r\n policy.sessionStorageAllowed = false;\r\n }\r\n }\r\n\r\n // Recalculate effective mode based on actual flags\r\n policy.effectiveMode = deriveMode(policy);\r\n policy.requiresConsentBanner = shouldShowConsentBanner(policy);\r\n\r\n return policy;\r\n}\r\n\r\n/**\r\n * Derives the effective mode from policy flags.\r\n */\r\nexport function deriveMode(\r\n policy: Pick<\r\n ITracelessPolicy,\r\n 'cookiesAllowed' | 'localStorageAllowed' | 'sessionStorageAllowed' | 'strictAuthCookieOnly'\r\n >,\r\n): TracelessMode {\r\n const { cookiesAllowed, localStorageAllowed, sessionStorageAllowed, strictAuthCookieOnly } =\r\n policy;\r\n\r\n if (!cookiesAllowed && !localStorageAllowed && !sessionStorageAllowed) {\r\n return 'traceless';\r\n }\r\n if (!cookiesAllowed && !localStorageAllowed && sessionStorageAllowed && !strictAuthCookieOnly) {\r\n return 'ephemeral';\r\n }\r\n if (!cookiesAllowed && !localStorageAllowed && sessionStorageAllowed && strictAuthCookieOnly) {\r\n return 'private';\r\n }\r\n if (!cookiesAllowed && localStorageAllowed && sessionStorageAllowed) {\r\n return 'balanced';\r\n }\r\n if (cookiesAllowed && localStorageAllowed && sessionStorageAllowed) {\r\n return 'full';\r\n }\r\n return 'custom';\r\n}\r\n\r\n/**\r\n * Determines if consent banner should be shown.\r\n */\r\nexport function shouldShowConsentBanner(policy: ITracelessPolicy): boolean {\r\n // No cookies and no localStorage = no banner needed (strictly necessary only)\r\n if (!policy.cookiesAllowed && !policy.localStorageAllowed) {\r\n return false;\r\n }\r\n // Full mode always requires banner\r\n if (policy.effectiveMode === 'full') {\r\n return true;\r\n }\r\n // Balanced mode may require banner depending on jurisdiction\r\n if (policy.effectiveMode === 'balanced') {\r\n return true; // Conservative approach\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// STORAGE ADAPTER\r\n// ============================================================================\r\n\r\n/**\r\n * In-memory storage fallback for traceless mode.\r\n */\r\nconst memoryStorage = new Map<string, string>();\r\n\r\n/**\r\n * Storage backend type.\r\n */\r\nexport type StorageBackendType = 'memory' | 'session' | 'local';\r\n\r\n/**\r\n * Unified storage adapter that respects Traceless policy.\r\n * Gracefully degrades based on what's available.\r\n */\r\nexport class StorageAdapter {\r\n private policy: ITracelessPolicy;\r\n private namespace: string;\r\n private defaultBackend: StorageBackendType;\r\n\r\n constructor(\r\n policy: ITracelessPolicy,\r\n namespace: string = 'nice2dev',\r\n defaultBackend: StorageBackendType = 'local',\r\n ) {\r\n this.policy = policy;\r\n this.namespace = namespace;\r\n this.defaultBackend = defaultBackend;\r\n }\r\n\r\n /**\r\n * Gets the appropriate storage backend based on policy.\r\n */\r\n private getBackend(preferredBackend?: StorageBackendType): Storage | Map<string, string> {\r\n const backend = preferredBackend || this.defaultBackend;\r\n\r\n // Try to use preferred backend if policy allows\r\n if (backend === 'local' && this.policy.localStorageAllowed) {\r\n try {\r\n if (typeof localStorage !== 'undefined') {\r\n return localStorage;\r\n }\r\n } catch {\r\n // localStorage not available\r\n }\r\n }\r\n\r\n if ((backend === 'session' || backend === 'local') && this.policy.sessionStorageAllowed) {\r\n try {\r\n if (typeof sessionStorage !== 'undefined') {\r\n return sessionStorage;\r\n }\r\n } catch {\r\n // sessionStorage not available\r\n }\r\n }\r\n\r\n // Fallback to memory\r\n return memoryStorage;\r\n }\r\n\r\n /**\r\n * Gets the prefixed key.\r\n */\r\n private getKey(key: string): string {\r\n return `${this.namespace}:${key}`;\r\n }\r\n\r\n /**\r\n * Gets a value from storage.\r\n */\r\n get<T = string>(key: string, preferredBackend?: StorageBackendType): T | null {\r\n const backend = this.getBackend(preferredBackend);\r\n const fullKey = this.getKey(key);\r\n\r\n try {\r\n const value = backend instanceof Map ? backend.get(fullKey) : backend.getItem(fullKey);\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n try {\r\n return JSON.parse(value) as T;\r\n } catch {\r\n return value as unknown as T;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Sets a value in storage.\r\n * Silently no-ops if storage is not available (graceful degradation).\r\n */\r\n set(key: string, value: unknown, preferredBackend?: StorageBackendType): boolean {\r\n const backend = this.getBackend(preferredBackend);\r\n const fullKey = this.getKey(key);\r\n\r\n try {\r\n const serialized = typeof value === 'string' ? value : JSON.stringify(value);\r\n if (backend instanceof Map) {\r\n backend.set(fullKey, serialized);\r\n } else {\r\n backend.setItem(fullKey, serialized);\r\n }\r\n return true;\r\n } catch {\r\n // Graceful degradation - silent no-op\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Removes a value from storage.\r\n */\r\n remove(key: string, preferredBackend?: StorageBackendType): boolean {\r\n const backend = this.getBackend(preferredBackend);\r\n const fullKey = this.getKey(key);\r\n\r\n try {\r\n if (backend instanceof Map) {\r\n return backend.delete(fullKey);\r\n } else {\r\n backend.removeItem(fullKey);\r\n return true;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Clears all namespaced values from storage.\r\n */\r\n clear(preferredBackend?: StorageBackendType): void {\r\n const backend = this.getBackend(preferredBackend);\r\n const prefix = `${this.namespace}:`;\r\n\r\n try {\r\n if (backend instanceof Map) {\r\n for (const key of backend.keys()) {\r\n if (key.startsWith(prefix)) {\r\n backend.delete(key);\r\n }\r\n }\r\n } else {\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < backend.length; i++) {\r\n const key = backend.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n keysToRemove.push(key);\r\n }\r\n }\r\n keysToRemove.forEach((key) => backend.removeItem(key));\r\n }\r\n } catch {\r\n // Silent failure\r\n }\r\n }\r\n\r\n /**\r\n * Gets all keys in the namespace.\r\n */\r\n keys(preferredBackend?: StorageBackendType): string[] {\r\n const backend = this.getBackend(preferredBackend);\r\n const prefix = `${this.namespace}:`;\r\n const result: string[] = [];\r\n\r\n try {\r\n if (backend instanceof Map) {\r\n for (const key of backend.keys()) {\r\n if (key.startsWith(prefix)) {\r\n result.push(key.slice(prefix.length));\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < backend.length; i++) {\r\n const key = backend.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n result.push(key.slice(prefix.length));\r\n }\r\n }\r\n }\r\n } catch {\r\n // Silent failure\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks if a key exists.\r\n */\r\n has(key: string, preferredBackend?: StorageBackendType): boolean {\r\n return this.get(key, preferredBackend) !== null;\r\n }\r\n\r\n /**\r\n * Gets info about current storage capabilities.\r\n */\r\n getCapabilities(): StorageCapabilities {\r\n return {\r\n canUseCookies: this.policy.cookiesAllowed,\r\n canUseLocalStorage: this.policy.localStorageAllowed,\r\n canUseSessionStorage: this.policy.sessionStorageAllowed,\r\n canPersist: this.policy.localStorageAllowed,\r\n effectiveMode: this.policy.effectiveMode,\r\n actualBackend: this.getActualBackendType(),\r\n };\r\n }\r\n\r\n /**\r\n * Gets the actual backend type being used.\r\n */\r\n private getActualBackendType(): StorageBackendType {\r\n const backend = this.getBackend();\r\n if (backend instanceof Map) {\r\n return 'memory';\r\n }\r\n if (backend === sessionStorage) {\r\n return 'session';\r\n }\r\n return 'local';\r\n }\r\n\r\n /**\r\n * Updates the policy (e.g., after user changes preferences).\r\n */\r\n updatePolicy(policy: ITracelessPolicy): void {\r\n this.policy = policy;\r\n }\r\n}\r\n\r\n/**\r\n * Storage capabilities info.\r\n */\r\nexport interface StorageCapabilities {\r\n canUseCookies: boolean;\r\n canUseLocalStorage: boolean;\r\n canUseSessionStorage: boolean;\r\n canPersist: boolean;\r\n effectiveMode: TracelessMode;\r\n actualBackend: StorageBackendType;\r\n}\r\n\r\n// ============================================================================\r\n// CONTROL-LEVEL PROPS\r\n// ============================================================================\r\n\r\n/**\r\n * Props for traceless-aware controls.\r\n */\r\nexport interface TracelessControlProps {\r\n /**\r\n * Whether this control can use cookies.\r\n * Can only restrict (false), not permit (true) if policy forbids.\r\n * @default false\r\n */\r\n cookies?: boolean;\r\n\r\n /**\r\n * Whether this control can use localStorage.\r\n * Can only restrict (false), not permit (true) if policy forbids.\r\n * @default false\r\n */\r\n localStorage?: boolean;\r\n\r\n /**\r\n * Storage mode shorthand.\r\n * - 'traceless': All storage off\r\n * - 'ephemeral': sessionStorage only\r\n * - 'persistent': localStorage OK\r\n * - 'auto': Respect global policy (default)\r\n * @default 'auto'\r\n */\r\n storageMode?: ControlStorageMode;\r\n}\r\n\r\n/**\r\n * Resolves control-level storage permissions.\r\n */\r\nexport function resolveControlStoragePermissions(\r\n globalPolicy: ITracelessPolicy,\r\n controlProps: TracelessControlProps,\r\n): ITracelessPolicy {\r\n const { cookies, localStorage, storageMode } = controlProps;\r\n\r\n // Start with global policy\r\n const resolved = { ...globalPolicy };\r\n\r\n // Apply storageMode shorthand\r\n if (storageMode && storageMode !== 'auto') {\r\n switch (storageMode) {\r\n case 'traceless':\r\n resolved.cookiesAllowed = false;\r\n resolved.localStorageAllowed = false;\r\n resolved.sessionStorageAllowed = false;\r\n break;\r\n case 'ephemeral':\r\n resolved.cookiesAllowed = false;\r\n resolved.localStorageAllowed = false;\r\n // Keep sessionStorageAllowed from global if true\r\n break;\r\n case 'persistent':\r\n // Keep all from global\r\n break;\r\n }\r\n }\r\n\r\n // Apply explicit props (can only restrict, not permit)\r\n if (cookies === false) {\r\n resolved.cookiesAllowed = false;\r\n }\r\n if (localStorage === false) {\r\n resolved.localStorageAllowed = false;\r\n }\r\n\r\n // Recalculate mode\r\n resolved.effectiveMode = deriveMode(resolved);\r\n resolved.source = 'control';\r\n\r\n return resolved;\r\n}\r\n\r\n// ============================================================================\r\n// COMPLIANCE & AUDIT\r\n// ============================================================================\r\n\r\n/**\r\n * Generates a compliance report for the current traceless configuration.\r\n */\r\nexport function generateTracelessComplianceReport(\r\n policy: ITracelessPolicy,\r\n instanceId: string,\r\n tenantId?: string,\r\n): TracelessComplianceReport {\r\n const now = new Date();\r\n\r\n return {\r\n generatedAt: now.toISOString(),\r\n instanceId,\r\n tenantId,\r\n effectiveMode: policy.effectiveMode,\r\n cookies: {\r\n count: 0, // In traceless, always 0\r\n allowed: policy.cookiesAllowed,\r\n strictAuthOnly: policy.strictAuthCookieOnly,\r\n thirdParty: false,\r\n tracking: false,\r\n },\r\n localStorage: {\r\n bytesUsed: 0,\r\n allowed: policy.localStorageAllowed,\r\n keysCount: 0,\r\n },\r\n sessionStorage: {\r\n bytesUsed: 0,\r\n allowed: policy.sessionStorageAllowed,\r\n keysCount: 0,\r\n },\r\n consentBanner: {\r\n required: policy.requiresConsentBanner,\r\n shown: policy.requiresConsentBanner,\r\n },\r\n compliance: {\r\n ePrivacyCompliant: !policy.cookiesAllowed || policy.requiresConsentBanner,\r\n gdprCompliant: true,\r\n pecrCompliant: !policy.cookiesAllowed || policy.requiresConsentBanner,\r\n },\r\n statement: generateComplianceStatement(policy),\r\n };\r\n}\r\n\r\n/**\r\n * Compliance report structure.\r\n */\r\nexport interface TracelessComplianceReport {\r\n generatedAt: string;\r\n instanceId: string;\r\n tenantId?: string;\r\n effectiveMode: TracelessMode;\r\n cookies: {\r\n count: number;\r\n allowed: boolean;\r\n strictAuthOnly: boolean;\r\n thirdParty: boolean;\r\n tracking: boolean;\r\n };\r\n localStorage: {\r\n bytesUsed: number;\r\n allowed: boolean;\r\n keysCount: number;\r\n };\r\n sessionStorage: {\r\n bytesUsed: number;\r\n allowed: boolean;\r\n keysCount: number;\r\n };\r\n consentBanner: {\r\n required: boolean;\r\n shown: boolean;\r\n };\r\n compliance: {\r\n ePrivacyCompliant: boolean;\r\n gdprCompliant: boolean;\r\n pecrCompliant: boolean;\r\n };\r\n statement: string;\r\n}\r\n\r\n/**\r\n * Generates human-readable compliance statement.\r\n */\r\nfunction generateComplianceStatement(policy: ITracelessPolicy): string {\r\n if (policy.effectiveMode === 'traceless') {\r\n return (\r\n `This OmniVerk instance operates in Traceless™ mode. ` +\r\n `No cookies are set (0), no data is saved to localStorage (0), and no sessionStorage is used (0). ` +\r\n `No cookie consent banner is required under ePrivacy Directive Art. 5(3) as no similar technologies are employed.`\r\n );\r\n }\r\n\r\n if (policy.effectiveMode === 'ephemeral') {\r\n return (\r\n `This OmniVerk instance operates in Ephemeral mode. ` +\r\n `No cookies are set, no localStorage is used. ` +\r\n `sessionStorage is used for session-only data that is automatically cleared when the browser tab is closed. ` +\r\n `No cookie consent banner is required.`\r\n );\r\n }\r\n\r\n if (policy.effectiveMode === 'private') {\r\n return (\r\n `This OmniVerk instance operates in Private mode. ` +\r\n `One strictly necessary httpOnly authentication cookie may be set. ` +\r\n `sessionStorage is used for session preferences. ` +\r\n `No consent banner is required as only strictly necessary technologies are used.`\r\n );\r\n }\r\n\r\n if (policy.effectiveMode === 'balanced') {\r\n return (\r\n `This OmniVerk instance operates in Balanced mode. ` +\r\n `localStorage is used for user preferences. sessionStorage is used for session data. ` +\r\n `No cookies are set. Depending on jurisdiction, a consent banner may be shown.`\r\n );\r\n }\r\n\r\n return (\r\n `This OmniVerk instance operates in Full mode. ` +\r\n `Cookies, localStorage, and sessionStorage are enabled. ` +\r\n `A consent banner is displayed to users before any non-essential storage is used.`\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// UI HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Badge display info for TracelessBadge component.\r\n */\r\nexport interface TracelessBadgeInfo {\r\n mode: TracelessMode;\r\n icon: string;\r\n color: string;\r\n label: string;\r\n tooltip: string;\r\n cssClass: string;\r\n}\r\n\r\n/**\r\n * Gets badge display info for the current mode.\r\n */\r\nexport function getTracelessBadgeInfo(policy: ITracelessPolicy): TracelessBadgeInfo {\r\n const { effectiveMode } = policy;\r\n\r\n switch (effectiveMode) {\r\n case 'traceless':\r\n return {\r\n mode: 'traceless',\r\n icon: '🟢',\r\n color: '#10b981', // green-500\r\n label: 'Traceless™',\r\n tooltip:\r\n 'Your data is not stored on this device. Zero cookies, zero localStorage, zero traces.',\r\n cssClass: 'nice-traceless-badge--traceless',\r\n };\r\n case 'ephemeral':\r\n return {\r\n mode: 'ephemeral',\r\n icon: '🔵',\r\n color: '#3b82f6', // blue-500\r\n label: 'Ephemeral',\r\n tooltip: 'Session-only storage. Data is cleared when you close this tab.',\r\n cssClass: 'nice-traceless-badge--ephemeral',\r\n };\r\n case 'private':\r\n return {\r\n mode: 'private',\r\n icon: '🟡',\r\n color: '#eab308', // yellow-500\r\n label: 'Private',\r\n tooltip: 'Minimal storage with one secure authentication cookie.',\r\n cssClass: 'nice-traceless-badge--private',\r\n };\r\n case 'balanced':\r\n return {\r\n mode: 'balanced',\r\n icon: '🟠',\r\n color: '#f97316', // orange-500\r\n label: 'Balanced',\r\n tooltip: 'Preferences are saved locally. No tracking cookies.',\r\n cssClass: 'nice-traceless-badge--balanced',\r\n };\r\n case 'full':\r\n return {\r\n mode: 'full',\r\n icon: '🔴',\r\n color: '#ef4444', // red-500\r\n label: 'Full',\r\n tooltip: 'All storage enabled including analytics. You control what is stored via consent.',\r\n cssClass: 'nice-traceless-badge--full',\r\n };\r\n case 'custom':\r\n default:\r\n return {\r\n mode: 'custom',\r\n icon: '⚪',\r\n color: '#6b7280', // gray-500\r\n label: 'Custom',\r\n tooltip: 'Custom storage configuration.',\r\n cssClass: 'nice-traceless-badge--custom',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Graceful degradation information for components.\r\n */\r\nexport interface GracefulDegradationInfo {\r\n /** Whether persistence is available */\r\n canPersist: boolean;\r\n /** Whether session storage is available */\r\n canSession: boolean;\r\n /** Warning message to show (if any) */\r\n warningMessage?: string;\r\n /** Locale key for warning */\r\n warningKey?: string;\r\n}\r\n\r\n/**\r\n * Gets graceful degradation info for a specific use case.\r\n */\r\nexport function getGracefulDegradationInfo(\r\n policy: ITracelessPolicy,\r\n useCase: 'preferences' | 'draft' | 'history' | 'auth' | 'grid-state',\r\n): GracefulDegradationInfo {\r\n const canPersist = policy.localStorageAllowed;\r\n const canSession = policy.sessionStorageAllowed;\r\n\r\n const messages: Record<string, { message: string; key: string }> = {\r\n preferences: {\r\n message: 'Your preferences will reset when you close this tab.',\r\n key: 'traceless.warning.preferences',\r\n },\r\n draft: {\r\n message: 'Unsaved draft will be lost if you close or refresh this page.',\r\n key: 'traceless.warning.draft',\r\n },\r\n history: {\r\n message: 'Search history is not saved in this privacy mode.',\r\n key: 'traceless.warning.history',\r\n },\r\n auth: {\r\n message: 'You will need to log in again each time you visit.',\r\n key: 'traceless.warning.auth',\r\n },\r\n 'grid-state': {\r\n message: 'Table settings (sorting, filtering, columns) will reset on page refresh.',\r\n key: 'traceless.warning.gridState',\r\n },\r\n };\r\n\r\n const entry = messages[useCase];\r\n\r\n if (!canPersist && !canSession) {\r\n return {\r\n canPersist: false,\r\n canSession: false,\r\n warningMessage: entry.message,\r\n warningKey: entry.key,\r\n };\r\n }\r\n\r\n if (!canPersist && canSession) {\r\n return {\r\n canPersist: false,\r\n canSession: true,\r\n warningMessage: useCase !== 'auth' ? entry.message : undefined,\r\n warningKey: useCase !== 'auth' ? entry.key : undefined,\r\n };\r\n }\r\n\r\n return {\r\n canPersist: true,\r\n canSession: true,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// COOKIE UTILITIES FOR BACKEND INTEGRATION\r\n// ============================================================================\r\n\r\n/**\r\n * HTTP header name for storage policy.\r\n */\r\nexport const TRACELESS_POLICY_HEADER = 'X-OmniVerk-Storage-Policy';\r\n\r\n/**\r\n * Parses policy from HTTP header.\r\n */\r\nexport function parsePolicyFromHeader(headerValue: string): TracelessMode | null {\r\n const normalized = headerValue.toLowerCase().trim();\r\n if (PRIVACY_LEVEL_ORDER.includes(normalized as TracelessMode)) {\r\n return normalized as TracelessMode;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Creates policy header value.\r\n */\r\nexport function createPolicyHeader(policy: ITracelessPolicy): string {\r\n return policy.effectiveMode;\r\n}\r\n\r\n// ============================================================================\r\n// FACTORY FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Creates a new StorageAdapter with the given policy.\r\n */\r\nexport function createStorageAdapter(policy: ITracelessPolicy, namespace?: string): StorageAdapter {\r\n return new StorageAdapter(policy, namespace);\r\n}\r\n\r\n/**\r\n * Creates the most restrictive instance ceiling (for healthcare, etc.).\r\n */\r\nexport function createRestrictiveInstanceCeiling(instanceId: string): TracelessInstanceCeiling {\r\n return {\r\n maxCookies: false,\r\n maxLocalStorage: false,\r\n maxSessionStorage: true, // Allow session for usability\r\n defaultMode: 'ephemeral',\r\n allowTenantOverride: false,\r\n instanceId,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a permissive instance ceiling (for general SaaS).\r\n */\r\nexport function createPermissiveInstanceCeiling(instanceId: string): TracelessInstanceCeiling {\r\n return {\r\n maxCookies: true,\r\n maxLocalStorage: true,\r\n maxSessionStorage: true,\r\n defaultMode: 'balanced',\r\n allowTenantOverride: true,\r\n instanceId,\r\n };\r\n}\r\n\r\n/**\r\n * Clears all client-side storage (for traceless mode enforcement).\r\n * WARNING: This clears ALL storage, not just app data.\r\n */\r\nexport function clearAllClientStorage(): void {\r\n // Clear cookies\r\n if (typeof document !== 'undefined') {\r\n const cookies = document.cookie.split(';');\r\n for (const cookie of cookies) {\r\n const name = cookie.split('=')[0].trim();\r\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\r\n }\r\n }\r\n\r\n // Clear localStorage\r\n try {\r\n if (typeof localStorage !== 'undefined') {\r\n localStorage.clear();\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n\r\n // Clear sessionStorage\r\n try {\r\n if (typeof sessionStorage !== 'undefined') {\r\n sessionStorage.clear();\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n\r\n // Clear memory storage\r\n memoryStorage.clear();\r\n}\r\n\r\n/**\r\n * Audit scanner: checks if any storage is being used against policy.\r\n * Returns violations found.\r\n */\r\nexport function auditStorageCompliance(policy: ITracelessPolicy): StorageAuditResult {\r\n const violations: StorageViolation[] = [];\r\n\r\n // Check cookies\r\n if (!policy.cookiesAllowed && typeof document !== 'undefined') {\r\n const cookies = document.cookie;\r\n if (cookies && cookies.length > 0) {\r\n violations.push({\r\n type: 'cookie',\r\n severity: 'high',\r\n message: `Cookies found but not allowed: ${cookies.split(';').length} cookie(s)`,\r\n data: cookies,\r\n });\r\n }\r\n }\r\n\r\n // Check localStorage\r\n if (!policy.localStorageAllowed) {\r\n try {\r\n if (typeof localStorage !== 'undefined' && localStorage.length > 0) {\r\n violations.push({\r\n type: 'localStorage',\r\n severity: 'high',\r\n message: `localStorage has ${localStorage.length} item(s) but not allowed`,\r\n });\r\n }\r\n } catch {\r\n // localStorage not accessible\r\n }\r\n }\r\n\r\n // Check sessionStorage\r\n if (!policy.sessionStorageAllowed) {\r\n try {\r\n if (typeof sessionStorage !== 'undefined' && sessionStorage.length > 0) {\r\n violations.push({\r\n type: 'sessionStorage',\r\n severity: 'medium',\r\n message: `sessionStorage has ${sessionStorage.length} item(s) but not allowed`,\r\n });\r\n }\r\n } catch {\r\n // sessionStorage not accessible\r\n }\r\n }\r\n\r\n return {\r\n compliant: violations.length === 0,\r\n violations,\r\n auditedAt: Date.now(),\r\n policy: policy.effectiveMode,\r\n };\r\n}\r\n\r\n/**\r\n * Storage audit result.\r\n */\r\nexport interface StorageAuditResult {\r\n compliant: boolean;\r\n violations: StorageViolation[];\r\n auditedAt: number;\r\n policy: TracelessMode;\r\n}\r\n\r\n/**\r\n * Storage violation entry.\r\n */\r\nexport interface StorageViolation {\r\n type: 'cookie' | 'localStorage' | 'sessionStorage';\r\n severity: 'low' | 'medium' | 'high';\r\n message: string;\r\n data?: string;\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport default {\r\n DEFAULT_TRACELESS_POLICY,\r\n TRACELESS_MODE_PRESETS,\r\n PRIVACY_LEVEL_ORDER,\r\n TRACELESS_POLICY_HEADER,\r\n getMorePrivateMode,\r\n isAtLeastAsPrivate,\r\n resolveTracelessPolicy,\r\n deriveMode,\r\n shouldShowConsentBanner,\r\n StorageAdapter,\r\n resolveControlStoragePermissions,\r\n generateTracelessComplianceReport,\r\n getTracelessBadgeInfo,\r\n getGracefulDegradationInfo,\r\n parsePolicyFromHeader,\r\n createPolicyHeader,\r\n createStorageAdapter,\r\n createRestrictiveInstanceCeiling,\r\n createPermissiveInstanceCeiling,\r\n clearAllClientStorage,\r\n auditStorageCompliance,\r\n};\r\n","import React, { createContext, useContext, useCallback, useRef, useState, useEffect } from 'react';\r\n\r\n// ============================================================\r\n// Types\r\n// ============================================================\r\n\r\n/** Supported AI providers */\r\nexport type AIProvider = 'openai' | 'anthropic' | 'azure-openai' | 'local' | 'custom';\r\n\r\n/** AI request message */\r\nexport interface AIMessage {\r\n role: 'system' | 'user' | 'assistant';\r\n content: string;\r\n}\r\n\r\n/** AI completion options */\r\nexport interface AICompletionOptions {\r\n /** Model to use (e.g., 'gpt-4', 'claude-3') */\r\n model?: string;\r\n /** Temperature (0-2, lower = more deterministic) */\r\n temperature?: number;\r\n /** Max tokens to generate */\r\n maxTokens?: number;\r\n /** Stop sequences */\r\n stop?: string[];\r\n /** Enable streaming */\r\n stream?: boolean;\r\n /** Tool/function definitions for function calling */\r\n tools?: AIToolDefinition[];\r\n /** System prompt override */\r\n systemPrompt?: string;\r\n}\r\n\r\n/** AI tool/function definition */\r\nexport interface AIToolDefinition {\r\n name: string;\r\n description: string;\r\n parameters: Record<string, unknown>;\r\n}\r\n\r\n/** AI tool call result */\r\nexport interface AIToolCall {\r\n id: string;\r\n name: string;\r\n arguments: Record<string, unknown>;\r\n}\r\n\r\n/** AI completion response */\r\nexport interface AICompletionResponse {\r\n content: string;\r\n finishReason: 'stop' | 'length' | 'tool_calls' | 'content_filter';\r\n toolCalls?: AIToolCall[];\r\n usage?: {\r\n promptTokens: number;\r\n completionTokens: number;\r\n totalTokens: number;\r\n };\r\n}\r\n\r\n/** Streaming chunk */\r\nexport interface AIStreamChunk {\r\n content: string;\r\n done: boolean;\r\n toolCalls?: AIToolCall[];\r\n}\r\n\r\n/** AI provider configuration */\r\nexport interface AIProviderConfig {\r\n /** Provider type */\r\n provider: AIProvider;\r\n /** API key (for hosted providers) */\r\n apiKey?: string;\r\n /** API endpoint URL */\r\n endpoint?: string;\r\n /** Default model */\r\n defaultModel?: string;\r\n /** Organization ID (for OpenAI) */\r\n organizationId?: string;\r\n /** Custom headers */\r\n headers?: Record<string, string>;\r\n /** Custom request handler for 'custom' provider */\r\n customHandler?: (\r\n messages: AIMessage[],\r\n options: AICompletionOptions,\r\n ) => Promise<AICompletionResponse>;\r\n /** Custom streaming handler */\r\n customStreamHandler?: (\r\n messages: AIMessage[],\r\n options: AICompletionOptions,\r\n onChunk: (chunk: AIStreamChunk) => void,\r\n ) => Promise<void>;\r\n}\r\n\r\n/** AI context value */\r\nexport interface NiceAIContextValue {\r\n /** Check if AI is configured */\r\n isConfigured: boolean;\r\n /** Current provider */\r\n provider: AIProvider | null;\r\n /** Default model */\r\n defaultModel: string | null;\r\n /** Complete a prompt (non-streaming) */\r\n complete: (messages: AIMessage[], options?: AICompletionOptions) => Promise<AICompletionResponse>;\r\n /** Stream a completion */\r\n stream: (\r\n messages: AIMessage[],\r\n onChunk: (chunk: AIStreamChunk) => void,\r\n options?: AICompletionOptions,\r\n ) => Promise<void>;\r\n /** Cancel ongoing requests */\r\n cancel: () => void;\r\n /** Check if a request is in progress */\r\n isLoading: boolean;\r\n /** Last error */\r\n error: Error | null;\r\n}\r\n\r\n/** AI provider props */\r\nexport interface NiceAIProviderProps {\r\n /** AI configuration */\r\n config: AIProviderConfig;\r\n /** Children */\r\n children: React.ReactNode;\r\n}\r\n\r\n// ============================================================\r\n// Context\r\n// ============================================================\r\n\r\nconst NiceAIContext = createContext<NiceAIContextValue | null>(null);\r\n\r\n// ============================================================\r\n// Provider Implementation\r\n// ============================================================\r\n\r\nexport const NiceAIProvider: React.FC<NiceAIProviderProps> = ({ config, children }) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n\r\n // Cancel on unmount\r\n useEffect(() => {\r\n return () => {\r\n abortControllerRef.current?.abort();\r\n };\r\n }, []);\r\n\r\n const cancel = useCallback(() => {\r\n abortControllerRef.current?.abort();\r\n abortControllerRef.current = null;\r\n setIsLoading(false);\r\n }, []);\r\n\r\n // Parse SSE stream\r\n const parseSSEStream = async (\r\n reader: ReadableStreamDefaultReader<Uint8Array>,\r\n onChunk: (chunk: AIStreamChunk) => void,\r\n provider: AIProvider,\r\n ) => {\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) {\r\n break;\r\n }\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6).trim();\r\n if (data === '[DONE]') {\r\n onChunk({ content: '', done: true });\r\n return;\r\n }\r\n\r\n try {\r\n const json = JSON.parse(data);\r\n let content = '';\r\n let done = false;\r\n\r\n if (provider === 'openai' || provider === 'azure-openai') {\r\n content = json.choices?.[0]?.delta?.content || '';\r\n done = json.choices?.[0]?.finish_reason === 'stop';\r\n } else if (provider === 'anthropic') {\r\n if (json.type === 'content_block_delta') {\r\n content = json.delta?.text || '';\r\n } else if (json.type === 'message_stop') {\r\n done = true;\r\n }\r\n }\r\n\r\n if (content || done) {\r\n onChunk({ content, done });\r\n }\r\n } catch {\r\n // Skip invalid JSON\r\n }\r\n }\r\n }\r\n }\r\n\r\n onChunk({ content: '', done: true });\r\n };\r\n\r\n // Build request for OpenAI/Azure\r\n const buildOpenAIRequest = (messages: AIMessage[], options: AICompletionOptions) => ({\r\n model: options.model || config.defaultModel || 'gpt-4',\r\n messages: options.systemPrompt\r\n ? [{ role: 'system' as const, content: options.systemPrompt }, ...messages]\r\n : messages,\r\n temperature: options.temperature ?? 0.7,\r\n max_tokens: options.maxTokens,\r\n stop: options.stop,\r\n stream: options.stream ?? false,\r\n tools: options.tools?.map((t) => ({\r\n type: 'function',\r\n function: {\r\n name: t.name,\r\n description: t.description,\r\n parameters: t.parameters,\r\n },\r\n })),\r\n });\r\n\r\n // Build request for Anthropic\r\n const buildAnthropicRequest = (messages: AIMessage[], options: AICompletionOptions) => {\r\n const systemMessage =\r\n options.systemPrompt || messages.find((m) => m.role === 'system')?.content;\r\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\r\n\r\n return {\r\n model: options.model || config.defaultModel || 'claude-3-opus-20240229',\r\n max_tokens: options.maxTokens || 4096,\r\n system: systemMessage,\r\n messages: nonSystemMessages.map((m) => ({\r\n role: m.role === 'assistant' ? 'assistant' : 'user',\r\n content: m.content,\r\n })),\r\n temperature: options.temperature ?? 0.7,\r\n stop_sequences: options.stop,\r\n stream: options.stream ?? false,\r\n };\r\n };\r\n\r\n // Complete (non-streaming)\r\n const complete = useCallback(\r\n async (\r\n messages: AIMessage[],\r\n options: AICompletionOptions = {},\r\n ): Promise<AICompletionResponse> => {\r\n if (config.provider === 'custom' && config.customHandler) {\r\n return config.customHandler(messages, options);\r\n }\r\n\r\n setIsLoading(true);\r\n setError(null);\r\n abortControllerRef.current = new AbortController();\r\n\r\n try {\r\n let url: string;\r\n let headers: Record<string, string>;\r\n let body: unknown;\r\n\r\n if (config.provider === 'openai') {\r\n url = config.endpoint || 'https://api.openai.com/v1/chat/completions';\r\n headers = {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${config.apiKey}`,\r\n ...(config.organizationId && { 'OpenAI-Organization': config.organizationId }),\r\n ...config.headers,\r\n };\r\n body = buildOpenAIRequest(messages, { ...options, stream: false });\r\n } else if (config.provider === 'azure-openai') {\r\n url = config.endpoint || '';\r\n headers = {\r\n 'Content-Type': 'application/json',\r\n 'api-key': config.apiKey || '',\r\n ...config.headers,\r\n };\r\n body = buildOpenAIRequest(messages, { ...options, stream: false });\r\n } else if (config.provider === 'anthropic') {\r\n url = config.endpoint || 'https://api.anthropic.com/v1/messages';\r\n headers = {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': config.apiKey || '',\r\n 'anthropic-version': '2023-06-01',\r\n ...config.headers,\r\n };\r\n body = buildAnthropicRequest(messages, { ...options, stream: false });\r\n } else {\r\n throw new Error(`Unsupported provider: ${config.provider}`);\r\n }\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body),\r\n signal: abortControllerRef.current.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n throw new Error(`AI request failed: ${response.status} ${errorText}`);\r\n }\r\n\r\n const json = await response.json();\r\n let result: AICompletionResponse;\r\n\r\n if (config.provider === 'openai' || config.provider === 'azure-openai') {\r\n const choice = json.choices?.[0];\r\n result = {\r\n content: choice?.message?.content || '',\r\n finishReason: choice?.finish_reason || 'stop',\r\n toolCalls: choice?.message?.tool_calls?.map(\r\n (tc: { id: string; function: { name: string; arguments: string } }) => ({\r\n id: tc.id,\r\n name: tc.function.name,\r\n arguments: JSON.parse(tc.function.arguments),\r\n }),\r\n ),\r\n usage: json.usage && {\r\n promptTokens: json.usage.prompt_tokens,\r\n completionTokens: json.usage.completion_tokens,\r\n totalTokens: json.usage.total_tokens,\r\n },\r\n };\r\n } else if (config.provider === 'anthropic') {\r\n result = {\r\n content: json.content?.[0]?.text || '',\r\n finishReason: json.stop_reason || 'stop',\r\n usage: json.usage && {\r\n promptTokens: json.usage.input_tokens,\r\n completionTokens: json.usage.output_tokens,\r\n totalTokens: json.usage.input_tokens + json.usage.output_tokens,\r\n },\r\n };\r\n } else {\r\n result = { content: '', finishReason: 'stop' };\r\n }\r\n\r\n return result;\r\n } catch (err) {\r\n if ((err as Error).name === 'AbortError') {\r\n throw new Error('Request cancelled');\r\n }\r\n setError(err as Error);\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [config],\r\n );\r\n\r\n // Stream\r\n const stream = useCallback(\r\n async (\r\n messages: AIMessage[],\r\n onChunk: (chunk: AIStreamChunk) => void,\r\n options: AICompletionOptions = {},\r\n ): Promise<void> => {\r\n if (config.provider === 'custom' && config.customStreamHandler) {\r\n return config.customStreamHandler(messages, options, onChunk);\r\n }\r\n\r\n setIsLoading(true);\r\n setError(null);\r\n abortControllerRef.current = new AbortController();\r\n\r\n try {\r\n let url: string;\r\n let headers: Record<string, string>;\r\n let body: unknown;\r\n\r\n if (config.provider === 'openai') {\r\n url = config.endpoint || 'https://api.openai.com/v1/chat/completions';\r\n headers = {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${config.apiKey}`,\r\n ...(config.organizationId && { 'OpenAI-Organization': config.organizationId }),\r\n ...config.headers,\r\n };\r\n body = buildOpenAIRequest(messages, { ...options, stream: true });\r\n } else if (config.provider === 'azure-openai') {\r\n url = config.endpoint || '';\r\n headers = {\r\n 'Content-Type': 'application/json',\r\n 'api-key': config.apiKey || '',\r\n ...config.headers,\r\n };\r\n body = buildOpenAIRequest(messages, { ...options, stream: true });\r\n } else if (config.provider === 'anthropic') {\r\n url = config.endpoint || 'https://api.anthropic.com/v1/messages';\r\n headers = {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': config.apiKey || '',\r\n 'anthropic-version': '2023-06-01',\r\n ...config.headers,\r\n };\r\n body = buildAnthropicRequest(messages, { ...options, stream: true });\r\n } else {\r\n throw new Error(`Unsupported provider: ${config.provider}`);\r\n }\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body),\r\n signal: abortControllerRef.current.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n throw new Error(`AI request failed: ${response.status} ${errorText}`);\r\n }\r\n\r\n if (!response.body) {\r\n throw new Error('Response body is null');\r\n }\r\n\r\n const reader = response.body.getReader();\r\n await parseSSEStream(reader, onChunk, config.provider);\r\n } catch (err) {\r\n if ((err as Error).name === 'AbortError') {\r\n onChunk({ content: '', done: true });\r\n return;\r\n }\r\n setError(err as Error);\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [config],\r\n );\r\n\r\n const value: NiceAIContextValue = {\r\n isConfigured: !!config.apiKey || config.provider === 'custom' || config.provider === 'local',\r\n provider: config.provider,\r\n defaultModel: config.defaultModel || null,\r\n complete,\r\n stream,\r\n cancel,\r\n isLoading,\r\n error,\r\n };\r\n\r\n return <NiceAIContext.Provider value={value}>{children}</NiceAIContext.Provider>;\r\n};\r\n\r\n// ============================================================\r\n// Hook\r\n// ============================================================\r\n\r\nexport function useNiceAI(): NiceAIContextValue {\r\n const context = useContext(NiceAIContext);\r\n if (!context) {\r\n throw new Error('useNiceAI must be used within a NiceAIProvider');\r\n }\r\n return context;\r\n}\r\n\r\n// ============================================================\r\n// AI Completion Hook (stateful wrapper)\r\n// ============================================================\r\n\r\nexport interface UseAICompletionOptions {\r\n /** Initial system prompt */\r\n systemPrompt?: string;\r\n /** Model to use */\r\n model?: string;\r\n /** Temperature */\r\n temperature?: number;\r\n /** Enable streaming by default */\r\n streaming?: boolean;\r\n}\r\n\r\nexport interface UseAICompletionResult {\r\n /** Generated response */\r\n response: string;\r\n /** Is request in progress */\r\n isLoading: boolean;\r\n /** Error if any */\r\n error: Error | null;\r\n /** Send a message */\r\n send: (message: string) => Promise<string>;\r\n /** Send with streaming */\r\n sendStreaming: (message: string, onChunk?: (content: string) => void) => Promise<string>;\r\n /** Clear response */\r\n clear: () => void;\r\n /** Cancel ongoing request */\r\n cancel: () => void;\r\n /** Conversation history */\r\n history: AIMessage[];\r\n /** Clear history */\r\n clearHistory: () => void;\r\n}\r\n\r\nexport function useAICompletion(options: UseAICompletionOptions = {}): UseAICompletionResult {\r\n const ai = useNiceAI();\r\n const [response, setResponse] = useState('');\r\n const [history, setHistory] = useState<AIMessage[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const send = useCallback(\r\n async (message: string): Promise<string> => {\r\n setIsLoading(true);\r\n setError(null);\r\n setResponse('');\r\n\r\n const messages: AIMessage[] = [...history, { role: 'user', content: message }];\r\n\r\n try {\r\n const result = await ai.complete(messages, {\r\n systemPrompt: options.systemPrompt,\r\n model: options.model,\r\n temperature: options.temperature,\r\n });\r\n\r\n setHistory([...messages, { role: 'assistant', content: result.content }]);\r\n setResponse(result.content);\r\n return result.content;\r\n } catch (err) {\r\n setError(err as Error);\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai, history, options],\r\n );\r\n\r\n const sendStreaming = useCallback(\r\n async (message: string, onChunk?: (content: string) => void): Promise<string> => {\r\n setIsLoading(true);\r\n setError(null);\r\n setResponse('');\r\n\r\n const messages: AIMessage[] = [...history, { role: 'user', content: message }];\r\n\r\n try {\r\n let fullResponse = '';\r\n await ai.stream(\r\n messages,\r\n (chunk) => {\r\n if (!chunk.done) {\r\n fullResponse += chunk.content;\r\n setResponse(fullResponse);\r\n onChunk?.(chunk.content);\r\n }\r\n },\r\n {\r\n systemPrompt: options.systemPrompt,\r\n model: options.model,\r\n temperature: options.temperature,\r\n },\r\n );\r\n\r\n setHistory([...messages, { role: 'assistant', content: fullResponse }]);\r\n return fullResponse;\r\n } catch (err) {\r\n setError(err as Error);\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai, history, options],\r\n );\r\n\r\n const clear = useCallback(() => {\r\n setResponse('');\r\n setError(null);\r\n }, []);\r\n\r\n const clearHistory = useCallback(() => {\r\n setHistory([]);\r\n setResponse('');\r\n setError(null);\r\n }, []);\r\n\r\n const cancel = useCallback(() => {\r\n ai.cancel();\r\n setIsLoading(false);\r\n }, [ai]);\r\n\r\n return {\r\n response,\r\n isLoading,\r\n error,\r\n send,\r\n sendStreaming,\r\n clear,\r\n cancel,\r\n history,\r\n clearHistory,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// Specialized AI Hooks\r\n// ============================================================\r\n\r\n/** Code completion options */\r\nexport interface UseCodeCompletionOptions {\r\n /** Programming language */\r\n language?: string;\r\n /** Model to use */\r\n model?: string;\r\n}\r\n\r\n/** Code completion hook for inline code suggestions */\r\nexport function useCodeCompletion(options: UseCodeCompletionOptions = {}) {\r\n const ai = useNiceAI();\r\n const [suggestion, setSuggestion] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const complete = useCallback(\r\n async (prefix: string, suffix: string = ''): Promise<string> => {\r\n setIsLoading(true);\r\n setSuggestion('');\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Complete the following ${options.language || ''} code. Return ONLY the completion text, no explanation.\r\n\r\nCode before cursor:\r\n\\`\\`\\`\r\n${prefix}\r\n\\`\\`\\`\r\n\r\nCode after cursor:\r\n\\`\\`\\`\r\n${suffix}\r\n\\`\\`\\`\r\n\r\nCompletion:`,\r\n },\r\n ],\r\n {\r\n model: options.model,\r\n temperature: 0.2,\r\n maxTokens: 200,\r\n },\r\n );\r\n\r\n const completion = result.content.trim();\r\n setSuggestion(completion);\r\n return completion;\r\n } catch {\r\n return '';\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai, options],\r\n );\r\n\r\n const explain = useCallback(\r\n async (code: string): Promise<string> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Explain the following ${options.language || ''} code concisely:\\n\\n\\`\\`\\`\\n${code}\\n\\`\\`\\``,\r\n },\r\n ],\r\n {\r\n model: options.model,\r\n temperature: 0.3,\r\n },\r\n );\r\n\r\n return result.content;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai, options],\r\n );\r\n\r\n const refactor = useCallback(\r\n async (code: string, instruction: string): Promise<string> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Refactor the following ${options.language || ''} code according to the instruction. Return ONLY the refactored code.\r\n\r\nCode:\r\n\\`\\`\\`\r\n${code}\r\n\\`\\`\\`\r\n\r\nInstruction: ${instruction}\r\n\r\nRefactored code:`,\r\n },\r\n ],\r\n {\r\n model: options.model,\r\n temperature: 0.2,\r\n },\r\n );\r\n\r\n // Extract code from markdown if present\r\n const match = result.content.match(/```[\\w]*\\n?([\\s\\S]*?)```/);\r\n return match ? match[1].trim() : result.content.trim();\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai, options],\r\n );\r\n\r\n const generateFromComment = useCallback(\r\n async (comment: string): Promise<string> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Generate ${options.language || ''} code from this comment/description. Return ONLY the code.\r\n\r\nDescription: ${comment}\r\n\r\nCode:`,\r\n },\r\n ],\r\n {\r\n model: options.model,\r\n temperature: 0.3,\r\n },\r\n );\r\n\r\n const match = result.content.match(/```[\\w]*\\n?([\\s\\S]*?)```/);\r\n return match ? match[1].trim() : result.content.trim();\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai, options],\r\n );\r\n\r\n return {\r\n suggestion,\r\n isLoading,\r\n complete,\r\n explain,\r\n refactor,\r\n generateFromComment,\r\n };\r\n}\r\n\r\n/** Natural language filter hook for DataGrid */\r\nexport function useNaturalLanguageFilter() {\r\n const ai = useNiceAI();\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const parseFilter = useCallback(\r\n async (\r\n query: string,\r\n columns: { field: string; type: string; label?: string }[],\r\n ): Promise<{ field: string; operator: string; value: unknown }[]> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Convert this natural language query to filter conditions. Available columns: ${JSON.stringify(columns)}\r\n\r\nQuery: \"${query}\"\r\n\r\nReturn a JSON array of filter objects with: field, operator (eq, ne, gt, gte, lt, lte, contains, startsWith, endsWith), value.\r\nOnly return the JSON array, no explanation.`,\r\n },\r\n ],\r\n {\r\n temperature: 0.1,\r\n maxTokens: 500,\r\n },\r\n );\r\n\r\n try {\r\n const filters = JSON.parse(result.content);\r\n return Array.isArray(filters) ? filters : [];\r\n } catch {\r\n return [];\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai],\r\n );\r\n\r\n return { parseFilter, isLoading };\r\n}\r\n\r\n/** Chart type suggestion hook */\r\nexport function useChartSuggestion() {\r\n const ai = useNiceAI();\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const suggestChartType = useCallback(\r\n async (\r\n data: unknown[],\r\n description?: string,\r\n ): Promise<{ type: string; reason: string; config: Record<string, unknown> }> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const sampleData = data.slice(0, 5);\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Analyze this data and suggest the best chart type. Data sample: ${JSON.stringify(sampleData)}\r\n${description ? `Context: ${description}` : ''}\r\n\r\nReturn JSON with: type (line, bar, pie, scatter, area, donut), reason (brief explanation), config (suggested chart configuration like xField, yField, etc.)\r\nOnly return JSON.`,\r\n },\r\n ],\r\n {\r\n temperature: 0.2,\r\n maxTokens: 500,\r\n },\r\n );\r\n\r\n try {\r\n return JSON.parse(result.content);\r\n } catch {\r\n return { type: 'bar', reason: 'Default chart type', config: {} };\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai],\r\n );\r\n\r\n const generateInsights = useCallback(\r\n async (data: unknown[], chartType: string): Promise<string[]> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Analyze this ${chartType} chart data and provide 3-5 key insights. Data: ${JSON.stringify(data.slice(0, 20))}\r\n\r\nReturn a JSON array of insight strings.`,\r\n },\r\n ],\r\n {\r\n temperature: 0.3,\r\n maxTokens: 500,\r\n },\r\n );\r\n\r\n try {\r\n return JSON.parse(result.content);\r\n } catch {\r\n return [];\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai],\r\n );\r\n\r\n return { suggestChartType, generateInsights, isLoading };\r\n}\r\n\r\n/** Form generation hook */\r\nexport function useFormGeneration() {\r\n const ai = useNiceAI();\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const generateForm = useCallback(\r\n async (\r\n description: string,\r\n ): Promise<\r\n { label: string; field: string; type: string; required?: boolean; options?: string[] }[]\r\n > => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Generate a form definition from this description: \"${description}\"\r\n\r\nReturn a JSON array of field objects with: label, field (camelCase), type (text, number, email, date, select, checkbox, textarea), required (boolean), options (for select type).\r\nOnly return JSON.`,\r\n },\r\n ],\r\n {\r\n temperature: 0.3,\r\n maxTokens: 1000,\r\n },\r\n );\r\n\r\n try {\r\n return JSON.parse(result.content);\r\n } catch {\r\n return [];\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai],\r\n );\r\n\r\n return { generateForm, isLoading };\r\n}\r\n\r\n/** Text improvement hook for HtmlEditor */\r\nexport function useTextImprovement() {\r\n const ai = useNiceAI();\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const improveText = useCallback(\r\n async (\r\n text: string,\r\n style?: 'professional' | 'casual' | 'formal' | 'concise',\r\n ): Promise<string> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Improve this text to be more ${style || 'professional'}. Keep the same meaning. Return only the improved text.\r\n\r\nText: ${text}\r\n\r\nImproved:`,\r\n },\r\n ],\r\n {\r\n temperature: 0.4,\r\n },\r\n );\r\n\r\n return result.content.trim();\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai],\r\n );\r\n\r\n const translate = useCallback(\r\n async (text: string, targetLanguage: string): Promise<string> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Translate this text to ${targetLanguage}. Return only the translation.\r\n\r\nText: ${text}\r\n\r\nTranslation:`,\r\n },\r\n ],\r\n {\r\n temperature: 0.2,\r\n },\r\n );\r\n\r\n return result.content.trim();\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai],\r\n );\r\n\r\n const generateHtml = useCallback(\r\n async (prompt: string): Promise<string> => {\r\n setIsLoading(true);\r\n\r\n try {\r\n const result = await ai.complete(\r\n [\r\n {\r\n role: 'user',\r\n content: `Generate clean semantic HTML from this prompt. Use proper tags (h1-h6, p, ul, ol, table, etc.). Return only HTML.\r\n\r\nPrompt: ${prompt}\r\n\r\nHTML:`,\r\n },\r\n ],\r\n {\r\n temperature: 0.3,\r\n },\r\n );\r\n\r\n // Extract HTML from markdown code block if present\r\n const match = result.content.match(/```html?\\n?([\\s\\S]*?)```/);\r\n return match ? match[1].trim() : result.content.trim();\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [ai],\r\n );\r\n\r\n return { improveText, translate, generateHtml, isLoading };\r\n}\r\n\r\nexport default NiceAIProvider;\r\n","/**\r\n * NiceDataSource — Universal data-binding abstraction.\r\n *\r\n * Protocol-agnostic interface for fetching, querying and mutating data.\r\n * Works with REST, OData v4, GraphQL, static arrays, or any custom backend.\r\n *\r\n * Usage:\r\n * const src = createRestDataSource({ url: '/api/employees', keyField: 'id' });\r\n * <NiceDataGrid dataSource={src} columns={[...]} />\r\n */\r\n\r\n// Filter types (inlined here as the canonical source; NiceFilterBuilder consumes these)\r\nexport type NiceFilterOperator =\r\n | '='\r\n | '<>'\r\n | '<'\r\n | '<='\r\n | '>'\r\n | '>='\r\n | 'contains'\r\n | 'notcontains'\r\n | 'startswith'\r\n | 'endswith'\r\n | 'between'\r\n | 'isblank'\r\n | 'isnotblank'\r\n | (string & {});\r\n\r\nexport type NiceFilterCondition = {\r\n type: 'condition';\r\n field: string;\r\n operator: NiceFilterOperator;\r\n value: unknown;\r\n};\r\n\r\nexport type NiceFilterGroup = {\r\n type: 'group';\r\n logic: 'and' | 'or';\r\n items: (NiceFilterCondition | NiceFilterGroup)[];\r\n};\r\n\r\n/* ================================================================\r\n CORE TYPES\r\n ================================================================ */\r\n\r\n/** Sort direction for data source queries. */\r\nexport type NiceSortDirection = 'asc' | 'desc';\r\n\r\n/** A single sort expression: field name + direction. */\r\nexport interface NiceSortExpression {\r\n field: string;\r\n direction: NiceSortDirection;\r\n}\r\n\r\n/** Parameters sent to `load()`. All optional — adapters use what they support. */\r\nexport interface NiceLoadOptions {\r\n filter?: NiceFilterGroup;\r\n sort?: NiceSortExpression[];\r\n skip?: number;\r\n take?: number;\r\n search?: string;\r\n searchFields?: string[];\r\n select?: string[];\r\n expand?: string[];\r\n group?: { field: string; direction?: NiceSortDirection }[];\r\n /** Arbitrary parameters forwarded to the adapter (e.g. custom query strings). */\r\n customParams?: Record<string, unknown>;\r\n}\r\n\r\n/** Result returned by {@link NiceDataSource.load}. */\r\nexport interface NiceLoadResult<T> {\r\n data: T[];\r\n totalCount: number;\r\n summary?: Record<string, unknown>;\r\n}\r\n\r\n/* ================================================================\r\n EVENT SYSTEM\r\n ================================================================ */\r\n\r\n/** Events emitted by all NiceDataSource implementations. */\r\nexport type NiceDataSourceEventMap = {\r\n changed: [];\r\n loading: [boolean];\r\n error: [Error | null];\r\n loaded: [NiceLoadResult<unknown>];\r\n};\r\n\r\ntype Listener<Args extends unknown[]> = (...args: Args) => void;\r\n\r\nclass NiceEventEmitter {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal Set must accept any Listener<Args> from typed NiceDataSourceEventMap; widening to unknown breaks contravariant assignment from per-event handlers\r\n private _listeners = new Map<string, Set<Listener<any>>>();\r\n\r\n on<K extends keyof NiceDataSourceEventMap>(\r\n event: K,\r\n handler: Listener<NiceDataSourceEventMap[K]>,\r\n ): () => void {\r\n if (!this._listeners.has(event)) {\r\n this._listeners.set(event, new Set());\r\n }\r\n this._listeners.get(event)!.add(handler);\r\n return () => {\r\n this._listeners.get(event)?.delete(handler);\r\n };\r\n }\r\n\r\n protected emit<K extends keyof NiceDataSourceEventMap>(\r\n event: K,\r\n ...args: NiceDataSourceEventMap[K]\r\n ): void {\r\n this._listeners.get(event)?.forEach((fn) => {\r\n try {\r\n fn(...args);\r\n } catch {\r\n /* listener error must not break the source */\r\n }\r\n });\r\n }\r\n}\r\n\r\n/* ================================================================\r\n NiceDataSource — INTERFACE\r\n ================================================================ */\r\n\r\n/**\r\n * Universal data source interface for Nice2Dev UI data components.\r\n * All data-bound components (NiceDataGrid, NiceList, NiceForm, etc.) accept a `NiceDataSource`.\r\n * Create one via `createArrayDataSource`, `createRestDataSource`, `createODataDataSource`,\r\n * `createGraphQLDataSource`, or `createCustomDataSource`.\r\n */\r\nexport interface NiceDataSource<T = any> {\r\n /** Field name used as unique row key. */\r\n readonly keyField: string;\r\n\r\n /** True when insert/update/remove are available. */\r\n readonly writable: boolean;\r\n\r\n /* ── Read ─────────────────────────────────── */\r\n load(options?: NiceLoadOptions): Promise<NiceLoadResult<T>>;\r\n byKey(key: unknown): Promise<T | undefined>;\r\n\r\n /* ── Write (optional) ─────────────────────── */\r\n insert?(item: Partial<T>): Promise<T>;\r\n update?(key: unknown, changes: Partial<T>): Promise<T>;\r\n remove?(key: unknown): Promise<void>;\r\n\r\n /* ── Events ───────────────────────────────── */\r\n on<K extends keyof NiceDataSourceEventMap>(\r\n event: K,\r\n handler: Listener<NiceDataSourceEventMap[K]>,\r\n ): () => void;\r\n}\r\n\r\n/* ================================================================\r\n HELPERS — filter / sort / paginate in-memory\r\n ================================================================ */\r\n\r\nfunction matchesCondition(row: Record<string, unknown>, cond: NiceFilterCondition): boolean {\r\n const val = row[cond.field];\r\n const target = cond.value;\r\n switch (cond.operator) {\r\n case '=':\r\n return val == target; // eslint-disable-line eqeqeq\r\n case '<>':\r\n return val != target; // eslint-disable-line eqeqeq\r\n case '<':\r\n return (val as number) < (target as number);\r\n case '<=':\r\n return (val as number) <= (target as number);\r\n case '>':\r\n return (val as number) > (target as number);\r\n case '>=':\r\n return (val as number) >= (target as number);\r\n case 'contains':\r\n return String(val ?? '')\r\n .toLowerCase()\r\n .includes(String(target ?? '').toLowerCase());\r\n case 'notcontains':\r\n return !String(val ?? '')\r\n .toLowerCase()\r\n .includes(String(target ?? '').toLowerCase());\r\n case 'startswith':\r\n return String(val ?? '')\r\n .toLowerCase()\r\n .startsWith(String(target ?? '').toLowerCase());\r\n case 'endswith':\r\n return String(val ?? '')\r\n .toLowerCase()\r\n .endsWith(String(target ?? '').toLowerCase());\r\n case 'isblank':\r\n return val == null || val === '';\r\n case 'isnotblank':\r\n return val != null && val !== '';\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nfunction matchesFilter(row: Record<string, unknown>, group: NiceFilterGroup): boolean {\r\n if (group.items.length === 0) {\r\n return true;\r\n }\r\n const test = (item: NiceFilterCondition | NiceFilterGroup): boolean =>\r\n item.type === 'condition' ? matchesCondition(row, item) : matchesFilter(row, item);\r\n return group.logic === 'and' ? group.items.every(test) : group.items.some(test);\r\n}\r\n\r\nfunction applyClientOps<T extends Record<string, unknown>>(\r\n data: T[],\r\n options: NiceLoadOptions,\r\n): NiceLoadResult<T> {\r\n let result = [...data];\r\n\r\n // Filter\r\n if (options.filter) {\r\n result = result.filter((r) => matchesFilter(r, options.filter!));\r\n }\r\n\r\n // Text search\r\n if (options.search) {\r\n const q = options.search.toLowerCase();\r\n const fields = options.searchFields;\r\n result = result.filter((r) => {\r\n const vals = fields ? fields.map((f) => r[f]) : Object.values(r);\r\n return vals.some((v) =>\r\n String(v ?? '')\r\n .toLowerCase()\r\n .includes(q),\r\n );\r\n });\r\n }\r\n\r\n const totalCount = result.length;\r\n\r\n // Sort\r\n if (options.sort?.length) {\r\n result.sort((a, b) => {\r\n for (const s of options.sort!) {\r\n const av = a[s.field] ?? '';\r\n const bv = b[s.field] ?? '';\r\n const cmp =\r\n typeof av === 'number' && typeof bv === 'number'\r\n ? av - bv\r\n : String(av).localeCompare(String(bv));\r\n if (cmp !== 0) {\r\n return s.direction === 'desc' ? -cmp : cmp;\r\n }\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n // Paginate\r\n if (options.skip != null || options.take != null) {\r\n const skip = options.skip ?? 0;\r\n const take = options.take ?? result.length;\r\n result = result.slice(skip, skip + take);\r\n }\r\n\r\n return { data: result, totalCount };\r\n}\r\n\r\n/* ================================================================\r\n ADAPTER: Array (in-memory)\r\n ================================================================ */\r\n\r\n/** Configuration for {@link createArrayDataSource}. */\r\nexport interface NiceArrayDataSourceConfig<T = any> {\r\n keyField?: string;\r\n data: T[];\r\n}\r\n\r\n/**\r\n * Creates an in-memory data source backed by a plain array.\r\n * Supports sort, filter, paginate, search, and full CRUD — all client-side.\r\n */\r\nexport function createArrayDataSource<T extends Record<string, any> = any>(\r\n config: NiceArrayDataSourceConfig<T>,\r\n): NiceDataSource<T> {\r\n const keyField = config.keyField ?? 'id';\r\n let store = [...config.data];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bypassing private 'emit' visibility on NiceEventEmitter; double cast through any required by structural type narrowing\r\n const emitter = new (NiceEventEmitter as any as {\r\n new (): NiceEventEmitter & { emit: NiceEventEmitter['emit'] };\r\n })();\r\n\r\n const source: NiceDataSource<T> = {\r\n keyField,\r\n writable: true,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emitter.emit('loading', true);\r\n try {\r\n const result = applyClientOps(store, options);\r\n emitter.emit('loaded', result as NiceLoadResult<unknown>);\r\n emitter.emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n emitter.emit('error', e instanceof Error ? e : new Error(String(e)));\r\n emitter.emit('loading', false);\r\n throw e;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n return store.find((r) => (r as Record<string, unknown>)[keyField] === key);\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n const row = { ...item } as T;\r\n store = [...store, row];\r\n emitter.emit('changed');\r\n return row;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const idx = store.findIndex((r) => (r as Record<string, unknown>)[keyField] === key);\r\n if (idx === -1) {\r\n throw new Error(`Record not found: ${key}`);\r\n }\r\n const updated = { ...store[idx], ...changes } as T;\r\n store = store.map((r, i) => (i === idx ? updated : r));\r\n emitter.emit('changed');\r\n return updated;\r\n },\r\n\r\n async remove(key: unknown) {\r\n store = store.filter((r) => (r as Record<string, unknown>)[keyField] !== key);\r\n emitter.emit('changed');\r\n },\r\n\r\n on: emitter.on.bind(emitter),\r\n };\r\n\r\n return source;\r\n}\r\n\r\n/* ================================================================\r\n ADAPTER: REST API\r\n ================================================================ */\r\n\r\n/** Configuration for {@link createRestDataSource}. */\r\nexport interface NiceRestConfig<T = any> {\r\n /** Base URL, e.g. `/api/employees` */\r\n url: string;\r\n keyField?: string;\r\n\r\n /* ── Endpoint customization ────────────── */\r\n /** GET URL for loading. Default: `url`. */\r\n loadUrl?: string;\r\n /** POST URL. Default: `url`. */\r\n insertUrl?: string;\r\n /** PUT/PATCH URL builder. Default: `url/:key`. */\r\n updateUrl?: string | ((key: unknown) => string);\r\n /** DELETE URL builder. Default: `url/:key`. */\r\n deleteUrl?: string | ((key: unknown) => string);\r\n /** GET URL for single record. Default: `url/:key`. */\r\n byKeyUrl?: string | ((key: unknown) => string);\r\n\r\n /* ── HTTP settings ─────────────────────── */\r\n headers?:\r\n | Record<string, string>\r\n | (() => Record<string, string> | Promise<Record<string, string>>);\r\n fetchOptions?: RequestInit;\r\n /** 'PUT' (default) or 'PATCH'. */\r\n updateMethod?: 'PUT' | 'PATCH';\r\n\r\n /* ── Query-string mapping ──────────────── */\r\n /** Map NiceLoadOptions → query-string params. If omitted, default mapping is used. */\r\n mapLoadParams?: (options: NiceLoadOptions) => Record<string, string>;\r\n\r\n /* ── Response mapping ──────────────────── */\r\n /** Extract NiceLoadResult from fetch response JSON. */\r\n extractLoadResult?: (json: unknown) => NiceLoadResult<T>;\r\n /** Extract single item from response JSON. */\r\n extractItem?: (json: unknown) => T;\r\n\r\n /* ── Request body mapping ──────────────── */\r\n prepareInsertBody?: (item: Partial<T>) => unknown;\r\n prepareUpdateBody?: (key: unknown, changes: Partial<T>) => unknown;\r\n\r\n onError?: (error: Error, operation: string) => void;\r\n}\r\n\r\nasync function resolveHeaders(cfg: NiceRestConfig): Promise<Record<string, string>> {\r\n const base: Record<string, string> = { 'Content-Type': 'application/json' };\r\n if (!cfg.headers) {\r\n return base;\r\n }\r\n const h = typeof cfg.headers === 'function' ? await cfg.headers() : cfg.headers;\r\n return { ...base, ...h };\r\n}\r\n\r\nfunction resolveKeyUrl(\r\n pattern: string | ((key: unknown) => string) | undefined,\r\n base: string,\r\n key: unknown,\r\n): string {\r\n if (typeof pattern === 'function') {\r\n return pattern(key);\r\n }\r\n if (pattern) {\r\n return pattern;\r\n }\r\n return `${base}/${encodeURIComponent(String(key))}`;\r\n}\r\n\r\nfunction defaultLoadParams(options: NiceLoadOptions): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n if (options.skip != null) {\r\n params['skip'] = String(options.skip);\r\n }\r\n if (options.take != null) {\r\n params['take'] = String(options.take);\r\n }\r\n if (options.search) {\r\n params['search'] = options.search;\r\n }\r\n if (options.sort?.length) {\r\n params['sort'] = options.sort.map((s) => `${s.field} ${s.direction}`).join(',');\r\n }\r\n if (options.filter) {\r\n params['filter'] = JSON.stringify(options.filter);\r\n }\r\n if (options.select?.length) {\r\n params['select'] = options.select.join(',');\r\n }\r\n if (options.expand?.length) {\r\n params['expand'] = options.expand.join(',');\r\n }\r\n return params;\r\n}\r\n\r\nfunction defaultExtractLoadResult<T>(json: unknown): NiceLoadResult<T> {\r\n if (Array.isArray(json)) {\r\n return { data: json, totalCount: json.length };\r\n }\r\n const obj = json as Record<string, unknown>;\r\n const data = (obj['data'] ?? obj['items'] ?? obj['value'] ?? obj['results'] ?? []) as T[];\r\n const totalCount = (obj['totalCount'] ??\r\n obj['total'] ??\r\n obj['count'] ??\r\n obj['@odata.count'] ??\r\n data.length) as number;\r\n return { data, totalCount };\r\n}\r\n\r\n/**\r\n * Creates a data source that communicates with a REST API.\r\n * Supports customizable URL patterns, headers, request/response mapping,\r\n * and optional auth header factories.\r\n */\r\nexport function createRestDataSource<T extends Record<string, any> = any>(\r\n config: NiceRestConfig<T>,\r\n): NiceDataSource<T> {\r\n const keyField = config.keyField ?? 'id';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bypassing private 'emit' visibility on NiceEventEmitter; double cast through any required by structural type narrowing\r\n const emitter = new (NiceEventEmitter as any as {\r\n new (): NiceEventEmitter & { emit: NiceEventEmitter['emit'] };\r\n })();\r\n\r\n async function doFetch(url: string, init?: RequestInit): Promise<unknown> {\r\n const headers = await resolveHeaders(config);\r\n const resp = await fetch(url, {\r\n ...config.fetchOptions,\r\n ...init,\r\n headers: { ...headers, ...init?.headers },\r\n });\r\n if (!resp.ok) {\r\n const text = await resp.text().catch(() => resp.statusText);\r\n throw new Error(`HTTP ${resp.status}: ${text}`);\r\n }\r\n const ct = resp.headers.get('content-type') ?? '';\r\n return ct.includes('json') ? resp.json() : resp.text();\r\n }\r\n\r\n const source: NiceDataSource<T> = {\r\n keyField,\r\n writable: true,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emitter.emit('loading', true);\r\n try {\r\n const base = config.loadUrl ?? config.url;\r\n const params = config.mapLoadParams\r\n ? config.mapLoadParams(options)\r\n : defaultLoadParams(options);\r\n const qs = new URLSearchParams(params).toString();\r\n const url = qs ? `${base}?${qs}` : base;\r\n const json = await doFetch(url);\r\n const result = config.extractLoadResult\r\n ? config.extractLoadResult(json)\r\n : defaultExtractLoadResult<T>(json);\r\n emitter.emit('loaded', result as NiceLoadResult<unknown>);\r\n emitter.emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n const err = e instanceof Error ? e : new Error(String(e));\r\n emitter.emit('error', err);\r\n emitter.emit('loading', false);\r\n config.onError?.(err, 'load');\r\n throw err;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n const url = resolveKeyUrl(config.byKeyUrl, config.url, key);\r\n const json = await doFetch(url);\r\n return config.extractItem ? config.extractItem(json) : (json as T);\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n const url = config.insertUrl ?? config.url;\r\n const body = config.prepareInsertBody ? config.prepareInsertBody(item) : item;\r\n const json = await doFetch(url, { method: 'POST', body: JSON.stringify(body) });\r\n const result = config.extractItem ? config.extractItem(json) : (json as T);\r\n emitter.emit('changed');\r\n return result;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const url = resolveKeyUrl(config.updateUrl, config.url, key);\r\n const body = config.prepareUpdateBody ? config.prepareUpdateBody(key, changes) : changes;\r\n const json = await doFetch(url, {\r\n method: config.updateMethod ?? 'PUT',\r\n body: JSON.stringify(body),\r\n });\r\n const result = config.extractItem ? config.extractItem(json) : (json as T);\r\n emitter.emit('changed');\r\n return result;\r\n },\r\n\r\n async remove(key: unknown) {\r\n const url = resolveKeyUrl(config.deleteUrl, config.url, key);\r\n await doFetch(url, { method: 'DELETE' });\r\n emitter.emit('changed');\r\n },\r\n\r\n on: emitter.on.bind(emitter),\r\n };\r\n\r\n return source;\r\n}\r\n\r\n/* ================================================================\r\n ADAPTER: OData v4\r\n ================================================================ */\r\n\r\n/** Configuration for {@link createODataDataSource}. */\r\nexport interface NiceODataConfig<T = any> {\r\n /** OData entity set URL, e.g. `/odata/Employees`. */\r\n url: string;\r\n keyField?: string;\r\n version?: 3 | 4;\r\n headers?:\r\n | Record<string, string>\r\n | (() => Record<string, string> | Promise<Record<string, string>>);\r\n fetchOptions?: RequestInit;\r\n onError?: (error: Error, operation: string) => void;\r\n}\r\n\r\nfunction conditionToOData(c: NiceFilterCondition, version: number): string {\r\n const f = c.field;\r\n const v =\r\n typeof c.value === 'string' ? `'${c.value.replace(/'/g, \"''\")}'` : String(c.value ?? 'null');\r\n switch (c.operator) {\r\n case '=':\r\n return `${f} eq ${v}`;\r\n case '<>':\r\n return `${f} ne ${v}`;\r\n case '<':\r\n return `${f} lt ${v}`;\r\n case '<=':\r\n return `${f} le ${v}`;\r\n case '>':\r\n return `${f} gt ${v}`;\r\n case '>=':\r\n return `${f} ge ${v}`;\r\n case 'contains':\r\n return version >= 4 ? `contains(${f},${v})` : `substringof(${v},${f})`;\r\n case 'notcontains':\r\n return version >= 4 ? `not contains(${f},${v})` : `not substringof(${v},${f})`;\r\n case 'startswith':\r\n return `startswith(${f},${v})`;\r\n case 'endswith':\r\n return `endswith(${f},${v})`;\r\n case 'isblank':\r\n return `${f} eq null`;\r\n case 'isnotblank':\r\n return `${f} ne null`;\r\n default:\r\n return 'true';\r\n }\r\n}\r\n\r\nfunction filterToOData(group: NiceFilterGroup, version: number): string {\r\n if (group.items.length === 0) {\r\n return '';\r\n }\r\n const parts = group.items.map((item) =>\r\n item.type === 'condition'\r\n ? conditionToOData(item, version)\r\n : `(${filterToOData(item, version)})`,\r\n );\r\n return parts.join(group.logic === 'and' ? ' and ' : ' or ');\r\n}\r\n\r\nexport function createODataDataSource<T extends Record<string, any> = any>(\r\n config: NiceODataConfig<T>,\r\n): NiceDataSource<T> {\r\n const version = config.version ?? 4;\r\n\r\n const restCfg: NiceRestConfig<T> = {\r\n url: config.url,\r\n keyField: config.keyField,\r\n headers: config.headers,\r\n fetchOptions: config.fetchOptions,\r\n onError: config.onError,\r\n updateMethod: 'PATCH',\r\n\r\n mapLoadParams(options) {\r\n const params: Record<string, string> = {};\r\n if (version >= 4) {\r\n params['$count'] = 'true';\r\n }\r\n if (options.skip != null) {\r\n params['$skip'] = String(options.skip);\r\n }\r\n if (options.take != null) {\r\n params['$top'] = String(options.take);\r\n }\r\n if (options.sort?.length) {\r\n params['$orderby'] = options.sort.map((s) => `${s.field} ${s.direction}`).join(',');\r\n }\r\n if (options.filter) {\r\n const odata = filterToOData(options.filter, version);\r\n if (odata) {\r\n params['$filter'] = odata;\r\n }\r\n }\r\n if (options.search) {\r\n params['$search'] = `\"${options.search}\"`;\r\n }\r\n if (options.select?.length) {\r\n params['$select'] = options.select.join(',');\r\n }\r\n if (options.expand?.length) {\r\n params['$expand'] = options.expand.join(',');\r\n }\r\n return params;\r\n },\r\n\r\n extractLoadResult(json) {\r\n const obj = json as Record<string, unknown>;\r\n const data = (obj['value'] ?? obj['d']?.['results' as keyof (typeof obj)['d']] ?? []) as T[];\r\n const totalCount = (obj['@odata.count'] ??\r\n obj['d']?.['__count' as keyof (typeof obj)['d']] ??\r\n data.length) as number;\r\n return { data, totalCount };\r\n },\r\n\r\n byKeyUrl: (key) => {\r\n const k = typeof key === 'number' ? key : `'${String(key).replace(/'/g, \"''\")}'`;\r\n return `${config.url}(${k})`;\r\n },\r\n };\r\n\r\n return createRestDataSource(restCfg);\r\n}\r\n\r\n/* ================================================================\r\n ADAPTER: GraphQL\r\n ================================================================ */\r\n\r\n/** Configuration for {@link createGraphQLDataSource}. */\r\nexport interface NiceGraphQLConfig<T = any> {\r\n /** GraphQL endpoint URL. */\r\n url: string;\r\n keyField?: string;\r\n\r\n /** Named queries / mutations. */\r\n queries: {\r\n /** Query returning list + totalCount. */\r\n load: string;\r\n /** Query returning single item by key. */\r\n byKey?: string;\r\n /** Mutation for insert. */\r\n insert?: string;\r\n /** Mutation for update. */\r\n update?: string;\r\n /** Mutation for delete. */\r\n remove?: string;\r\n };\r\n\r\n /** Map NiceLoadOptions → GraphQL variables. Default: pass skip/take/sort/filter/search directly. */\r\n mapVariables?: (options: NiceLoadOptions) => Record<string, unknown>;\r\n /** Extract NiceLoadResult from query response data. */\r\n extractLoadResult?: (data: unknown) => NiceLoadResult<T>;\r\n /** Extract single item from query/mutation response data. */\r\n extractItem?: (data: unknown) => T;\r\n\r\n headers?:\r\n | Record<string, string>\r\n | (() => Record<string, string> | Promise<Record<string, string>>);\r\n onError?: (error: Error, operation: string) => void;\r\n}\r\n\r\nexport function createGraphQLDataSource<T extends Record<string, any> = any>(\r\n config: NiceGraphQLConfig<T>,\r\n): NiceDataSource<T> {\r\n const keyField = config.keyField ?? 'id';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bypassing private 'emit' visibility on NiceEventEmitter; double cast through any required by structural type narrowing\r\n const emitter = new (NiceEventEmitter as any as {\r\n new (): NiceEventEmitter & { emit: NiceEventEmitter['emit'] };\r\n })();\r\n\r\n async function gql(query: string, variables?: Record<string, unknown>): Promise<unknown> {\r\n const base: Record<string, string> = { 'Content-Type': 'application/json' };\r\n const extra = config.headers\r\n ? typeof config.headers === 'function'\r\n ? await config.headers()\r\n : config.headers\r\n : {};\r\n const resp = await fetch(config.url, {\r\n method: 'POST',\r\n headers: { ...base, ...extra },\r\n body: JSON.stringify({ query, variables }),\r\n });\r\n if (!resp.ok) {\r\n const text = await resp.text().catch(() => resp.statusText);\r\n throw new Error(`GraphQL HTTP ${resp.status}: ${text}`);\r\n }\r\n const json = (await resp.json()) as { data?: unknown; errors?: { message: string }[] };\r\n if (json.errors?.length) {\r\n throw new Error(json.errors.map((e) => e.message).join('; '));\r\n }\r\n return json.data;\r\n }\r\n\r\n function defaultMapVariables(options: NiceLoadOptions): Record<string, unknown> {\r\n const vars: Record<string, unknown> = {};\r\n if (options.skip != null) {\r\n vars['skip'] = options.skip;\r\n }\r\n if (options.take != null) {\r\n vars['take'] = options.take;\r\n }\r\n if (options.search) {\r\n vars['search'] = options.search;\r\n }\r\n if (options.sort?.length) {\r\n vars['sort'] = options.sort;\r\n }\r\n if (options.filter) {\r\n vars['filter'] = options.filter;\r\n }\r\n return vars;\r\n }\r\n\r\n function defaultExtractLoad(data: unknown): NiceLoadResult<T> {\r\n if (!data || typeof data !== 'object') {\r\n return { data: [], totalCount: 0 };\r\n }\r\n const root = Object.values(data as Record<string, unknown>)[0] as\r\n | Record<string, unknown>\r\n | undefined;\r\n if (!root) {\r\n return { data: [], totalCount: 0 };\r\n }\r\n if (Array.isArray(root)) {\r\n return { data: root as T[], totalCount: root.length };\r\n }\r\n const items = (root['items'] ?? root['nodes'] ?? root['edges'] ?? root['data'] ?? []) as T[];\r\n const total = (root['totalCount'] ?? root['total'] ?? root['count'] ?? items.length) as number;\r\n return { data: items, totalCount: total };\r\n }\r\n\r\n function defaultExtractItem(data: unknown): T {\r\n if (!data || typeof data !== 'object') {\r\n return data as T;\r\n }\r\n return Object.values(data as Record<string, unknown>)[0] as T;\r\n }\r\n\r\n const source: NiceDataSource<T> = {\r\n keyField,\r\n writable: !!(config.queries.insert || config.queries.update || config.queries.remove),\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emitter.emit('loading', true);\r\n try {\r\n const vars = config.mapVariables\r\n ? config.mapVariables(options)\r\n : defaultMapVariables(options);\r\n const data = await gql(config.queries.load, vars);\r\n const result = config.extractLoadResult\r\n ? config.extractLoadResult(data)\r\n : defaultExtractLoad(data);\r\n emitter.emit('loaded', result as NiceLoadResult<unknown>);\r\n emitter.emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n const err = e instanceof Error ? e : new Error(String(e));\r\n emitter.emit('error', err);\r\n emitter.emit('loading', false);\r\n config.onError?.(err, 'load');\r\n throw err;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n if (!config.queries.byKey) {\r\n throw new Error('byKey query not configured');\r\n }\r\n const data = await gql(config.queries.byKey, { [keyField]: key });\r\n return config.extractItem ? config.extractItem(data) : defaultExtractItem(data);\r\n },\r\n\r\n insert: config.queries.insert\r\n ? async (item: Partial<T>) => {\r\n const data = await gql(config.queries.insert!, { input: item });\r\n const result = config.extractItem ? config.extractItem(data) : defaultExtractItem(data);\r\n emitter.emit('changed');\r\n return result;\r\n }\r\n : undefined,\r\n\r\n update: config.queries.update\r\n ? async (key: unknown, changes: Partial<T>) => {\r\n const data = await gql(config.queries.update!, { [keyField]: key, input: changes });\r\n const result = config.extractItem ? config.extractItem(data) : defaultExtractItem(data);\r\n emitter.emit('changed');\r\n return result;\r\n }\r\n : undefined,\r\n\r\n remove: config.queries.remove\r\n ? async (key: unknown) => {\r\n await gql(config.queries.remove!, { [keyField]: key });\r\n emitter.emit('changed');\r\n }\r\n : undefined,\r\n\r\n on: emitter.on.bind(emitter),\r\n };\r\n\r\n return source;\r\n}\r\n\r\n/* ================================================================\r\n ADAPTER: Custom (user-implemented handlers)\r\n ================================================================ */\r\n\r\n/**\r\n * Handler functions for a fully custom data source.\r\n * Provide your own `load`, `byKey`, `insert`, `update`, `remove` implementations.\r\n */\r\nexport interface NiceCustomDataSourceHandlers<T = any> {\r\n keyField?: string;\r\n load: (options: NiceLoadOptions) => Promise<NiceLoadResult<T>>;\r\n byKey?: (key: unknown) => Promise<T | undefined>;\r\n insert?: (item: Partial<T>) => Promise<T>;\r\n update?: (key: unknown, changes: Partial<T>) => Promise<T>;\r\n remove?: (key: unknown) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Creates a data source from user-supplied handler functions.\r\n * Use this when none of the built-in adapters (Array, REST, OData, GraphQL) fits your backend.\r\n */\r\nexport function createCustomDataSource<T extends Record<string, any> = any>(\r\n handlers: NiceCustomDataSourceHandlers<T>,\r\n): NiceDataSource<T> {\r\n const keyField = handlers.keyField ?? 'id';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bypassing private 'emit' visibility on NiceEventEmitter; double cast through any required by structural type narrowing\r\n const emitter = new (NiceEventEmitter as any as {\r\n new (): NiceEventEmitter & { emit: NiceEventEmitter['emit'] };\r\n })();\r\n\r\n const source: NiceDataSource<T> = {\r\n keyField,\r\n writable: !!(handlers.insert || handlers.update || handlers.remove),\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emitter.emit('loading', true);\r\n try {\r\n const result = await handlers.load(options);\r\n emitter.emit('loaded', result as NiceLoadResult<unknown>);\r\n emitter.emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n const err = e instanceof Error ? e : new Error(String(e));\r\n emitter.emit('error', err);\r\n emitter.emit('loading', false);\r\n throw err;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n if (!handlers.byKey) {\r\n throw new Error('byKey handler not configured');\r\n }\r\n return handlers.byKey(key);\r\n },\r\n\r\n insert: handlers.insert\r\n ? async (item: Partial<T>) => {\r\n const result = await handlers.insert!(item);\r\n emitter.emit('changed');\r\n return result;\r\n }\r\n : undefined,\r\n\r\n update: handlers.update\r\n ? async (key: unknown, changes: Partial<T>) => {\r\n const result = await handlers.update!(key, changes);\r\n emitter.emit('changed');\r\n return result;\r\n }\r\n : undefined,\r\n\r\n remove: handlers.remove\r\n ? async (key: unknown) => {\r\n await handlers.remove!(key);\r\n emitter.emit('changed');\r\n }\r\n : undefined,\r\n\r\n on: emitter.on.bind(emitter),\r\n };\r\n\r\n return source;\r\n}\r\n","/**\r\n * NiceDataSource — Advanced Features\r\n * Sprint 5: Server-Side Processing, Caching, Real-Time, Offline\r\n */\r\n\r\nimport type {\r\n NiceDataSource,\r\n NiceLoadOptions,\r\n NiceLoadResult,\r\n NiceSortExpression,\r\n} from './datasource';\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// REQUEST CACHE & DEDUPLICATION\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceCacheConfig {\r\n /** Time-to-live in milliseconds (default 60000 = 1 min) */\r\n ttl?: number;\r\n /** Maximum cache entries (default 100) */\r\n maxSize?: number;\r\n /** Whether to cache load results (default true) */\r\n cacheLoads?: boolean;\r\n /** Whether to cache byKey results (default true) */\r\n cacheByKey?: boolean;\r\n /** Custom cache key generator */\r\n generateKey?: (options: NiceLoadOptions) => string;\r\n}\r\n\r\ninterface CacheEntry<T> {\r\n data: T;\r\n timestamp: number;\r\n expiresAt: number;\r\n}\r\n\r\n/**\r\n * Creates an LRU cache with TTL support.\r\n */\r\nexport class NiceDataCache<T = unknown> {\r\n private cache = new Map<string, CacheEntry<T>>();\r\n private readonly ttl: number;\r\n private readonly maxSize: number;\r\n\r\n constructor(config: NiceCacheConfig = {}) {\r\n this.ttl = config.ttl ?? 60000;\r\n this.maxSize = config.maxSize ?? 100;\r\n }\r\n\r\n get(key: string): T | undefined {\r\n const entry = this.cache.get(key);\r\n if (!entry) {\r\n return undefined;\r\n }\r\n\r\n if (Date.now() > entry.expiresAt) {\r\n this.cache.delete(key);\r\n return undefined;\r\n }\r\n\r\n // Move to end for LRU\r\n this.cache.delete(key);\r\n this.cache.set(key, entry);\r\n return entry.data;\r\n }\r\n\r\n set(key: string, data: T, ttl?: number): void {\r\n // Evict oldest if at capacity\r\n if (this.cache.size >= this.maxSize) {\r\n const oldest = this.cache.keys().next().value;\r\n if (oldest) {\r\n this.cache.delete(oldest);\r\n }\r\n }\r\n\r\n this.cache.set(key, {\r\n data,\r\n timestamp: Date.now(),\r\n expiresAt: Date.now() + (ttl ?? this.ttl),\r\n });\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.get(key) !== undefined;\r\n }\r\n\r\n invalidate(key: string): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n invalidateAll(): void {\r\n this.cache.clear();\r\n }\r\n\r\n invalidateMatching(pattern: RegExp): void {\r\n for (const key of this.cache.keys()) {\r\n if (pattern.test(key)) {\r\n this.cache.delete(key);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Request deduplication — prevents duplicate concurrent requests.\r\n */\r\nexport class NiceRequestDeduplicator {\r\n private pending = new Map<string, Promise<unknown>>();\r\n\r\n async dedupe<T>(key: string, fetcher: () => Promise<T>): Promise<T> {\r\n const existing = this.pending.get(key);\r\n if (existing) {\r\n return existing as Promise<T>;\r\n }\r\n\r\n const promise = fetcher().finally(() => {\r\n this.pending.delete(key);\r\n });\r\n\r\n this.pending.set(key, promise);\r\n return promise;\r\n }\r\n\r\n hasPending(key: string): boolean {\r\n return this.pending.has(key);\r\n }\r\n\r\n cancelAll(): void {\r\n this.pending.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Wraps a data source with caching and request deduplication.\r\n */\r\nexport function withCaching<T>(\r\n source: NiceDataSource<T>,\r\n config: NiceCacheConfig = {},\r\n): NiceDataSource<T> & { cache: NiceDataCache; invalidateCache(): void } {\r\n const cache = new NiceDataCache<NiceLoadResult<T>>(config);\r\n const byKeyCache = new NiceDataCache<T>(config);\r\n const deduplicator = new NiceRequestDeduplicator();\r\n\r\n const generateKey = config.generateKey ?? ((opts: NiceLoadOptions) => JSON.stringify(opts));\r\n const cacheLoads = config.cacheLoads !== false;\r\n const cacheByKey = config.cacheByKey !== false;\r\n\r\n return {\r\n ...source,\r\n cache,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n const cacheKey = `load:${generateKey(options)}`;\r\n\r\n if (cacheLoads) {\r\n const cached = cache.get(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n }\r\n\r\n return deduplicator.dedupe(cacheKey, async () => {\r\n const result = await source.load(options);\r\n if (cacheLoads) {\r\n cache.set(cacheKey, result);\r\n }\r\n return result;\r\n });\r\n },\r\n\r\n async byKey(key: unknown) {\r\n const cacheKey = `byKey:${String(key)}`;\r\n\r\n if (cacheByKey) {\r\n const cached = byKeyCache.get(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n }\r\n\r\n return deduplicator.dedupe(cacheKey, async () => {\r\n const result = await source.byKey(key);\r\n if (cacheByKey && result) {\r\n byKeyCache.set(cacheKey, result);\r\n }\r\n return result;\r\n });\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n const result = await source.insert!(item);\r\n cache.invalidateAll(); // Invalidate load cache\r\n return result;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const result = await source.update!(key, changes);\r\n cache.invalidateAll();\r\n byKeyCache.invalidate(`byKey:${String(key)}`);\r\n return result;\r\n },\r\n\r\n async remove(key: unknown) {\r\n await source.remove!(key);\r\n cache.invalidateAll();\r\n byKeyCache.invalidate(`byKey:${String(key)}`);\r\n },\r\n\r\n invalidateCache() {\r\n cache.invalidateAll();\r\n byKeyCache.invalidateAll();\r\n },\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// CURSOR-BASED PAGINATION\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceCursorPaginationConfig<T> {\r\n /** Field to use for cursor (usually primary key or timestamp) */\r\n cursorField: string;\r\n /** Page size */\r\n pageSize?: number;\r\n /** Sort direction for cursor (default 'asc') */\r\n direction?: 'asc' | 'desc';\r\n}\r\n\r\nexport interface NiceCursorPage<T> {\r\n data: T[];\r\n nextCursor: string | null;\r\n prevCursor: string | null;\r\n hasMore: boolean;\r\n}\r\n\r\nexport interface NiceCursorLoadOptions extends Omit<NiceLoadOptions, 'skip' | 'take'> {\r\n cursor?: string;\r\n pageSize?: number;\r\n direction?: 'forward' | 'backward';\r\n}\r\n\r\n/**\r\n * Creates a cursor-based paginated wrapper around a data source.\r\n */\r\nexport function withCursorPagination<T extends Record<string, any>>(\r\n source: NiceDataSource<T>,\r\n config: NiceCursorPaginationConfig<T>,\r\n): {\r\n loadPage(options?: NiceCursorLoadOptions): Promise<NiceCursorPage<T>>;\r\n loadAll(options?: Omit<NiceCursorLoadOptions, 'cursor'>): AsyncGenerator<T[], void, unknown>;\r\n} {\r\n const { cursorField, pageSize = 20, direction = 'asc' } = config;\r\n\r\n return {\r\n async loadPage(options: NiceCursorLoadOptions = {}) {\r\n const take = options.pageSize ?? pageSize;\r\n const loadDirection = options.direction ?? 'forward';\r\n\r\n // Build filter for cursor\r\n const cursorFilter = options.cursor\r\n ? {\r\n type: 'condition' as const,\r\n field: cursorField,\r\n\r\n operator: (loadDirection === 'forward'\r\n ? direction === 'asc'\r\n ? '>'\r\n : '<'\r\n : direction === 'asc'\r\n ? '<'\r\n : '>') as any,\r\n value: decodeCursor(options.cursor),\r\n }\r\n : null;\r\n\r\n const filter = cursorFilter\r\n ? {\r\n type: 'group' as const,\r\n logic: 'and' as const,\r\n items: [...(options.filter?.items ?? []), cursorFilter],\r\n }\r\n : options.filter;\r\n\r\n const sort: NiceSortExpression[] = [\r\n {\r\n field: cursorField,\r\n direction: loadDirection === 'forward' ? direction : direction === 'asc' ? 'desc' : 'asc',\r\n },\r\n ...(options.sort ?? []),\r\n ];\r\n\r\n const result = await source.load({\r\n ...options,\r\n filter,\r\n sort,\r\n take: take + 1, // Fetch one extra to detect if there's more\r\n });\r\n\r\n const hasMore = result.data.length > take;\r\n const data = hasMore ? result.data.slice(0, take) : result.data;\r\n\r\n // Reverse if backward\r\n if (loadDirection === 'backward') {\r\n data.reverse();\r\n }\r\n\r\n const lastItem = data[data.length - 1];\r\n const firstItem = data[0];\r\n\r\n return {\r\n data,\r\n nextCursor: hasMore && lastItem ? encodeCursor(lastItem[cursorField]) : null,\r\n prevCursor: firstItem && options.cursor ? encodeCursor(firstItem[cursorField]) : null,\r\n hasMore,\r\n };\r\n },\r\n\r\n async *loadAll(options: Omit<NiceCursorLoadOptions, 'cursor'> = {}) {\r\n let cursor: string | null = null;\r\n\r\n do {\r\n const page = await source.load({\r\n ...options,\r\n ...(cursor ? { cursor } : {}),\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- spread of NiceCursorLoadOptions union (cursor optional)\r\n } as any);\r\n\r\n if (page.data.length === 0) {\r\n break;\r\n }\r\n\r\n yield page.data;\r\n\r\n const lastItem = page.data[page.data.length - 1] as T;\r\n cursor = lastItem ? encodeCursor(lastItem[cursorField]) : null;\r\n } while (cursor);\r\n },\r\n };\r\n}\r\n\r\nfunction encodeCursor(value: unknown): string {\r\n return btoa(JSON.stringify(value));\r\n}\r\n\r\nfunction decodeCursor(cursor: string): unknown {\r\n try {\r\n return JSON.parse(atob(cursor));\r\n } catch {\r\n return cursor;\r\n }\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// INFINITE SCROLL\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceInfiniteScrollState<T> {\r\n items: T[];\r\n isLoading: boolean;\r\n hasMore: boolean;\r\n error: Error | null;\r\n page: number;\r\n totalCount: number;\r\n}\r\n\r\nexport interface NiceInfiniteScrollConfig {\r\n /** Items per page (default 50) */\r\n pageSize?: number;\r\n /** Threshold in pixels to trigger load (default 200) */\r\n threshold?: number;\r\n /** Initial page (default 0) */\r\n initialPage?: number;\r\n}\r\n\r\n/**\r\n * Creates an infinite scroll controller for a data source.\r\n */\r\nexport function createInfiniteScroll<T>(\r\n source: NiceDataSource<T>,\r\n config: NiceInfiniteScrollConfig = {},\r\n) {\r\n const { pageSize = 50, threshold = 200, initialPage = 0 } = config;\r\n\r\n let state: NiceInfiniteScrollState<T> = {\r\n items: [],\r\n isLoading: false,\r\n hasMore: true,\r\n error: null,\r\n page: initialPage,\r\n totalCount: 0,\r\n };\r\n\r\n const listeners = new Set<(state: NiceInfiniteScrollState<T>) => void>();\r\n\r\n function notify() {\r\n listeners.forEach((fn) => fn(state));\r\n }\r\n\r\n function setState(partial: Partial<NiceInfiniteScrollState<T>>) {\r\n state = { ...state, ...partial };\r\n notify();\r\n }\r\n\r\n let loadOptions: NiceLoadOptions = {};\r\n\r\n async function loadMore() {\r\n if (state.isLoading || !state.hasMore) {\r\n return;\r\n }\r\n\r\n setState({ isLoading: true, error: null });\r\n\r\n try {\r\n const result = await source.load({\r\n ...loadOptions,\r\n skip: state.page * pageSize,\r\n take: pageSize,\r\n });\r\n\r\n const newItems = [...state.items, ...result.data];\r\n const hasMore = newItems.length < result.totalCount;\r\n\r\n setState({\r\n items: newItems,\r\n page: state.page + 1,\r\n totalCount: result.totalCount,\r\n hasMore,\r\n isLoading: false,\r\n });\r\n } catch (e) {\r\n setState({\r\n error: e instanceof Error ? e : new Error(String(e)),\r\n isLoading: false,\r\n });\r\n }\r\n }\r\n\r\n function reset(options: NiceLoadOptions = {}) {\r\n loadOptions = options;\r\n state = {\r\n items: [],\r\n isLoading: false,\r\n hasMore: true,\r\n error: null,\r\n page: 0,\r\n totalCount: 0,\r\n };\r\n notify();\r\n }\r\n\r\n function handleScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n if (!target) {\r\n return;\r\n }\r\n\r\n const scrollBottom = target.scrollHeight - target.scrollTop - target.clientHeight;\r\n if (scrollBottom < threshold) {\r\n loadMore();\r\n }\r\n }\r\n\r\n return {\r\n get state() {\r\n return state;\r\n },\r\n loadMore,\r\n reset,\r\n handleScroll,\r\n subscribe(listener: (state: NiceInfiniteScrollState<T>) => void) {\r\n listeners.add(listener);\r\n return () => listeners.delete(listener);\r\n },\r\n setOptions(options: NiceLoadOptions) {\r\n loadOptions = options;\r\n },\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// WEBSOCKET REAL-TIME DATA SOURCE\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport type NiceWebSocketMessageType = 'insert' | 'update' | 'remove' | 'refresh' | 'sync';\r\n\r\nexport interface NiceWebSocketMessage<T = unknown> {\r\n type: NiceWebSocketMessageType;\r\n key?: unknown;\r\n data?: T;\r\n changes?: Partial<T>;\r\n}\r\n\r\nexport interface NiceWebSocketConfig<T> {\r\n /** WebSocket URL */\r\n url: string;\r\n /** Base data source for initial load and writes */\r\n baseSource: NiceDataSource<T>;\r\n /** Key field name */\r\n keyField?: string;\r\n /** Parse incoming message */\r\n parseMessage?: (event: MessageEvent) => NiceWebSocketMessage<T> | null;\r\n /** Serialize outgoing message */\r\n serializeMessage?: (msg: NiceWebSocketMessage<T>) => string;\r\n /** Reconnect delay in ms (default 3000) */\r\n reconnectDelay?: number;\r\n /** Max reconnect attempts (default 10) */\r\n maxReconnects?: number;\r\n /** Heartbeat interval in ms (default 30000) */\r\n heartbeatInterval?: number;\r\n}\r\n\r\nexport interface NiceWebSocketDataSource<T> extends NiceDataSource<T> {\r\n connect(): void;\r\n disconnect(): void;\r\n isConnected(): boolean;\r\n sendMessage(msg: NiceWebSocketMessage<T>): void;\r\n}\r\n\r\n/**\r\n * Creates a real-time data source using WebSocket.\r\n * Syncs changes from server and broadcasts local writes.\r\n */\r\nexport function createWebSocketDataSource<T extends Record<string, any>>(\r\n config: NiceWebSocketConfig<T>,\r\n): NiceWebSocketDataSource<T> {\r\n const {\r\n url,\r\n baseSource,\r\n keyField = baseSource.keyField,\r\n reconnectDelay = 3000,\r\n maxReconnects = 10,\r\n heartbeatInterval = 30000,\r\n } = config;\r\n\r\n let ws: WebSocket | null = null;\r\n let reconnectAttempts = 0;\r\n let heartbeatTimer: number | null = null;\r\n let localData: T[] = [];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n function parseMessage(event: MessageEvent): NiceWebSocketMessage<T> | null {\r\n if (config.parseMessage) {\r\n return config.parseMessage(event);\r\n }\r\n try {\r\n return JSON.parse(event.data);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function serializeMessage(msg: NiceWebSocketMessage<T>): string {\r\n if (config.serializeMessage) {\r\n return config.serializeMessage(msg);\r\n }\r\n return JSON.stringify(msg);\r\n }\r\n\r\n function applyMessage(msg: NiceWebSocketMessage<T>) {\r\n switch (msg.type) {\r\n case 'insert':\r\n if (msg.data) {\r\n localData = [...localData, msg.data as T];\r\n emit('changed');\r\n }\r\n break;\r\n case 'update':\r\n if (msg.key && msg.changes) {\r\n localData = localData.map((item) =>\r\n (item as Record<string, unknown>)[keyField] === msg.key\r\n ? { ...item, ...msg.changes }\r\n : item,\r\n );\r\n emit('changed');\r\n }\r\n break;\r\n case 'remove':\r\n if (msg.key) {\r\n localData = localData.filter(\r\n (item) => (item as Record<string, unknown>)[keyField] !== msg.key,\r\n );\r\n emit('changed');\r\n }\r\n break;\r\n case 'refresh':\r\n case 'sync':\r\n // Full refresh — reload from base source\r\n source.load().catch(() => {});\r\n break;\r\n }\r\n }\r\n\r\n function connect() {\r\n if (ws?.readyState === WebSocket.OPEN) {\r\n return;\r\n }\r\n\r\n ws = new WebSocket(url);\r\n\r\n ws.onopen = () => {\r\n reconnectAttempts = 0;\r\n emit('connected');\r\n startHeartbeat();\r\n };\r\n\r\n ws.onmessage = (event) => {\r\n const msg = parseMessage(event);\r\n if (msg) {\r\n applyMessage(msg);\r\n emit('message', msg);\r\n }\r\n };\r\n\r\n ws.onerror = (event) => {\r\n emit('error', new Error('WebSocket error'));\r\n };\r\n\r\n ws.onclose = () => {\r\n stopHeartbeat();\r\n emit('disconnected');\r\n\r\n if (reconnectAttempts < maxReconnects) {\r\n reconnectAttempts++;\r\n setTimeout(connect, reconnectDelay * Math.min(reconnectAttempts, 5));\r\n }\r\n };\r\n }\r\n\r\n function disconnect() {\r\n stopHeartbeat();\r\n if (ws) {\r\n ws.close();\r\n ws = null;\r\n }\r\n }\r\n\r\n function startHeartbeat() {\r\n stopHeartbeat();\r\n heartbeatTimer = window.setInterval(() => {\r\n if (ws?.readyState === WebSocket.OPEN) {\r\n ws.send(JSON.stringify({ type: 'ping' }));\r\n }\r\n }, heartbeatInterval);\r\n }\r\n\r\n function stopHeartbeat() {\r\n if (heartbeatTimer) {\r\n clearInterval(heartbeatTimer);\r\n heartbeatTimer = null;\r\n }\r\n }\r\n\r\n function sendMessage(msg: NiceWebSocketMessage<T>) {\r\n if (ws?.readyState === WebSocket.OPEN) {\r\n ws.send(serializeMessage(msg));\r\n }\r\n }\r\n\r\n const source: NiceWebSocketDataSource<T> = {\r\n keyField,\r\n writable: baseSource.writable,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emit('loading', true);\r\n try {\r\n const result = await baseSource.load(options);\r\n localData = result.data;\r\n emit('loaded', result);\r\n emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n emit('error', e);\r\n emit('loading', false);\r\n throw e;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n // Check local first\r\n const local = localData.find((item) => (item as Record<string, unknown>)[keyField] === key);\r\n if (local) {\r\n return local;\r\n }\r\n return baseSource.byKey(key);\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n const result = await baseSource.insert!(item);\r\n sendMessage({ type: 'insert', data: result });\r\n return result;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const result = await baseSource.update!(key, changes);\r\n sendMessage({ type: 'update', key, changes });\r\n return result;\r\n },\r\n\r\n async remove(key: unknown) {\r\n await baseSource.remove!(key);\r\n sendMessage({ type: 'remove', key });\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n return () => listeners.get(event)?.delete(handler);\r\n },\r\n\r\n connect,\r\n disconnect,\r\n isConnected: () => ws?.readyState === WebSocket.OPEN,\r\n sendMessage,\r\n };\r\n\r\n return source;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// SIGNALR REAL-TIME DATA SOURCE\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceSignalRConfig<T> {\r\n /** SignalR hub connection (from @microsoft/signalr) */\r\n connection: {\r\n /* eslint-disable @typescript-eslint/no-explicit-any -- mirrors @microsoft/signalr HubConnection signatures (untyped event payloads) */\r\n on(methodName: string, callback: (...args: any[]) => void): void;\r\n off(methodName: string, callback: (...args: any[]) => void): void;\r\n invoke(methodName: string, ...args: any[]): Promise<any>;\r\n /* eslint-enable @typescript-eslint/no-explicit-any */\r\n start(): Promise<void>;\r\n stop(): Promise<void>;\r\n state: string | number;\r\n };\r\n /** Base data source for initial load and writes */\r\n baseSource: NiceDataSource<T>;\r\n /** Hub method names */\r\n methods?: {\r\n onInsert?: string;\r\n onUpdate?: string;\r\n onRemove?: string;\r\n onRefresh?: string;\r\n insert?: string;\r\n update?: string;\r\n remove?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Creates a real-time data source using SignalR.\r\n */\r\nexport function createSignalRDataSource<T extends Record<string, any>>(\r\n config: NiceSignalRConfig<T>,\r\n): NiceDataSource<T> & { connect(): Promise<void>; disconnect(): Promise<void> } {\r\n const { connection, baseSource } = config;\r\n const methods = {\r\n onInsert: 'OnInsert',\r\n onUpdate: 'OnUpdate',\r\n onRemove: 'OnRemove',\r\n onRefresh: 'OnRefresh',\r\n insert: 'Insert',\r\n update: 'Update',\r\n remove: 'Remove',\r\n ...config.methods,\r\n };\r\n\r\n const keyField = baseSource.keyField;\r\n let localData: T[] = [];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n // Set up listeners\r\n const handleInsert = (data: T) => {\r\n localData = [...localData, data];\r\n emit('changed');\r\n };\r\n\r\n const handleUpdate = (key: unknown, changes: Partial<T>) => {\r\n localData = localData.map((item) =>\r\n (item as Record<string, unknown>)[keyField] === key ? { ...item, ...changes } : item,\r\n );\r\n emit('changed');\r\n };\r\n\r\n const handleRemove = (key: unknown) => {\r\n localData = localData.filter((item) => (item as Record<string, unknown>)[keyField] !== key);\r\n emit('changed');\r\n };\r\n\r\n return {\r\n keyField,\r\n writable: baseSource.writable,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emit('loading', true);\r\n try {\r\n const result = await baseSource.load(options);\r\n localData = result.data;\r\n emit('loaded', result);\r\n emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n emit('error', e);\r\n emit('loading', false);\r\n throw e;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n const local = localData.find((item) => (item as Record<string, unknown>)[keyField] === key);\r\n if (local) {\r\n return local;\r\n }\r\n return baseSource.byKey(key);\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n const result = await connection.invoke(methods.insert, item);\r\n return result as T;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const result = await connection.invoke(methods.update, key, changes);\r\n return result as T;\r\n },\r\n\r\n async remove(key: unknown) {\r\n await connection.invoke(methods.remove, key);\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n return () => listeners.get(event)?.delete(handler);\r\n },\r\n\r\n async connect() {\r\n connection.on(methods.onInsert, handleInsert);\r\n connection.on(methods.onUpdate, handleUpdate);\r\n connection.on(methods.onRemove, handleRemove);\r\n connection.on(methods.onRefresh, () => this.load());\r\n await connection.start();\r\n },\r\n\r\n async disconnect() {\r\n connection.off(methods.onInsert, handleInsert);\r\n connection.off(methods.onUpdate, handleUpdate);\r\n connection.off(methods.onRemove, handleRemove);\r\n connection.off(methods.onRefresh, () => {});\r\n await connection.stop();\r\n },\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// OPTIMISTIC UPDATES\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceOptimisticConfig<T> {\r\n /** Called when optimistic update is applied */\r\n onOptimisticApply?: (item: T, action: 'insert' | 'update' | 'remove') => void;\r\n /** Called when update is confirmed */\r\n onConfirm?: (item: T, action: 'insert' | 'update' | 'remove') => void;\r\n /** Called when update fails and is rolled back */\r\n onRollback?: (item: T, action: 'insert' | 'update' | 'remove', error: Error) => void;\r\n /** Delay before applying optimistic update (default 0) */\r\n delay?: number;\r\n}\r\n\r\ninterface PendingOperation<T> {\r\n id: string;\r\n action: 'insert' | 'update' | 'remove';\r\n key?: unknown;\r\n item?: Partial<T>;\r\n originalItem?: T;\r\n}\r\n\r\n/**\r\n * Wraps a data source with optimistic update support.\r\n * Changes are applied immediately, then confirmed or rolled back.\r\n */\r\nexport function withOptimisticUpdates<T extends Record<string, any>>(\r\n source: NiceDataSource<T>,\r\n config: NiceOptimisticConfig<T> = {},\r\n): NiceDataSource<T> & {\r\n hasPendingChanges(): boolean;\r\n getPendingCount(): number;\r\n} {\r\n const keyField = source.keyField;\r\n let localData: T[] = [];\r\n const pending = new Map<string, PendingOperation<T>>();\r\n let opId = 0;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n function generateOpId(): string {\r\n return `op_${++opId}_${Date.now()}`;\r\n }\r\n\r\n return {\r\n keyField,\r\n writable: true,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n const result = await source.load(options);\r\n localData = result.data;\r\n return result;\r\n },\r\n\r\n async byKey(key: unknown) {\r\n return (\r\n localData.find((item) => (item as Record<string, unknown>)[keyField] === key) ??\r\n source.byKey(key)\r\n );\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n const id = generateOpId();\r\n const tempItem = { ...item } as T;\r\n\r\n // Apply optimistically\r\n localData = [...localData, tempItem];\r\n pending.set(id, { id, action: 'insert', item: tempItem });\r\n config.onOptimisticApply?.(tempItem, 'insert');\r\n emit('changed');\r\n\r\n try {\r\n const result = await source.insert!(item);\r\n // Replace temp with real item\r\n localData = localData.map((i) => (i === tempItem ? result : i));\r\n pending.delete(id);\r\n config.onConfirm?.(result, 'insert');\r\n emit('changed');\r\n return result;\r\n } catch (e) {\r\n // Rollback\r\n localData = localData.filter((i) => i !== tempItem);\r\n pending.delete(id);\r\n config.onRollback?.(tempItem, 'insert', e instanceof Error ? e : new Error(String(e)));\r\n emit('changed');\r\n throw e;\r\n }\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const id = generateOpId();\r\n const idx = localData.findIndex(\r\n (item) => (item as Record<string, unknown>)[keyField] === key,\r\n );\r\n\r\n if (idx === -1) {\r\n return source.update!(key, changes);\r\n }\r\n\r\n const original = localData[idx];\r\n const updated = { ...original, ...changes } as T;\r\n\r\n // Apply optimistically\r\n localData = localData.map((item, i) => (i === idx ? updated : item));\r\n pending.set(id, { id, action: 'update', key, originalItem: original });\r\n config.onOptimisticApply?.(updated, 'update');\r\n emit('changed');\r\n\r\n try {\r\n const result = await source.update!(key, changes);\r\n localData = localData.map((item, i) => (i === idx ? result : item));\r\n pending.delete(id);\r\n config.onConfirm?.(result, 'update');\r\n emit('changed');\r\n return result;\r\n } catch (e) {\r\n // Rollback\r\n localData = localData.map((item, i) => (i === idx ? original : item));\r\n pending.delete(id);\r\n config.onRollback?.(original, 'update', e instanceof Error ? e : new Error(String(e)));\r\n emit('changed');\r\n throw e;\r\n }\r\n },\r\n\r\n async remove(key: unknown) {\r\n const id = generateOpId();\r\n const item = localData.find((i) => (i as Record<string, unknown>)[keyField] === key);\r\n\r\n if (!item) {\r\n return source.remove!(key);\r\n }\r\n\r\n // Apply optimistically\r\n localData = localData.filter((i) => i !== item);\r\n pending.set(id, { id, action: 'remove', key, originalItem: item });\r\n config.onOptimisticApply?.(item, 'remove');\r\n emit('changed');\r\n\r\n try {\r\n await source.remove!(key);\r\n pending.delete(id);\r\n config.onConfirm?.(item, 'remove');\r\n } catch (e) {\r\n // Rollback\r\n localData = [...localData, item];\r\n pending.delete(id);\r\n config.onRollback?.(item, 'remove', e instanceof Error ? e : new Error(String(e)));\r\n emit('changed');\r\n throw e;\r\n }\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n return () => listeners.get(event)?.delete(handler);\r\n },\r\n\r\n hasPendingChanges: () => pending.size > 0,\r\n getPendingCount: () => pending.size,\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// DIFF DETECTION FOR LIVE DATA\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceDataDiff<T> {\r\n inserted: T[];\r\n updated: Array<{ key: unknown; changes: Partial<T>; oldItem: T; newItem: T }>;\r\n removed: T[];\r\n unchanged: T[];\r\n}\r\n\r\n/**\r\n * Calculates the difference between two data arrays.\r\n */\r\nexport function calculateDataDiff<T extends Record<string, any>>(\r\n oldData: T[],\r\n newData: T[],\r\n keyField: string,\r\n): NiceDataDiff<T> {\r\n const oldMap = new Map(oldData.map((item) => [item[keyField], item]));\r\n const newMap = new Map(newData.map((item) => [item[keyField], item]));\r\n\r\n const inserted: T[] = [];\r\n const updated: NiceDataDiff<T>['updated'] = [];\r\n const removed: T[] = [];\r\n const unchanged: T[] = [];\r\n\r\n // Find inserted and updated\r\n for (const [key, newItem] of newMap) {\r\n const oldItem = oldMap.get(key);\r\n if (!oldItem) {\r\n inserted.push(newItem);\r\n } else if (!deepEqual(oldItem, newItem)) {\r\n const changes: Partial<T> = {};\r\n for (const k of Object.keys(newItem)) {\r\n if (oldItem[k] !== newItem[k]) {\r\n changes[k as keyof T] = newItem[k];\r\n }\r\n }\r\n updated.push({ key, changes, oldItem, newItem });\r\n } else {\r\n unchanged.push(newItem);\r\n }\r\n }\r\n\r\n // Find removed\r\n for (const [key, oldItem] of oldMap) {\r\n if (!newMap.has(key)) {\r\n removed.push(oldItem);\r\n }\r\n }\r\n\r\n return { inserted, updated, removed, unchanged };\r\n}\r\n\r\nfunction deepEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n if (typeof a !== typeof b) {\r\n return false;\r\n }\r\n if (a === null || b === null) {\r\n return a === b;\r\n }\r\n if (typeof a !== 'object') {\r\n return a === b;\r\n }\r\n\r\n const aObj = a as Record<string, unknown>;\r\n const bObj = b as Record<string, unknown>;\r\n const keys = new Set([...Object.keys(aObj), ...Object.keys(bObj)]);\r\n\r\n for (const key of keys) {\r\n if (!deepEqual(aObj[key], bObj[key])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// POLLING DATA SOURCE\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NicePollingConfig {\r\n /** Polling interval in ms (default 5000) */\r\n interval?: number;\r\n /** Whether to start polling immediately (default false) */\r\n autoStart?: boolean;\r\n /** Pause polling when tab is hidden (default true) */\r\n pauseWhenHidden?: boolean;\r\n /** Callback when data changes */\r\n onDataChange?: <T>(diff: NiceDataDiff<T>) => void;\r\n}\r\n\r\n/**\r\n * Wraps a data source with automatic polling for updates.\r\n */\r\nexport function withPolling<T extends Record<string, any>>(\r\n source: NiceDataSource<T>,\r\n config: NicePollingConfig = {},\r\n): NiceDataSource<T> & {\r\n startPolling(): void;\r\n stopPolling(): void;\r\n isPolling(): boolean;\r\n setInterval(ms: number): void;\r\n} {\r\n const { interval = 5000, autoStart = false, pauseWhenHidden = true, onDataChange } = config;\r\n\r\n let pollInterval = interval;\r\n let timer: number | null = null;\r\n let lastData: T[] = [];\r\n let currentOptions: NiceLoadOptions = {};\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n async function poll() {\r\n if (pauseWhenHidden && document.hidden) {\r\n return;\r\n }\r\n\r\n try {\r\n const result = await source.load(currentOptions);\r\n const diff = calculateDataDiff(lastData, result.data, source.keyField);\r\n\r\n if (diff.inserted.length || diff.updated.length || diff.removed.length) {\r\n lastData = result.data;\r\n emit('changed');\r\n onDataChange?.(diff);\r\n }\r\n } catch {\r\n // Silently ignore polling errors\r\n }\r\n }\r\n\r\n function startPolling() {\r\n if (timer) {\r\n return;\r\n }\r\n timer = window.setInterval(poll, pollInterval);\r\n }\r\n\r\n function stopPolling() {\r\n if (timer) {\r\n clearInterval(timer);\r\n timer = null;\r\n }\r\n }\r\n\r\n // Pause when tab hidden\r\n if (pauseWhenHidden) {\r\n document.addEventListener('visibilitychange', () => {\r\n if (document.hidden) {\r\n // Don't stop, just skip polls\r\n } else if (timer) {\r\n poll(); // Immediate poll when tab becomes visible\r\n }\r\n });\r\n }\r\n\r\n const wrapped: NiceDataSource<T> & {\r\n startPolling(): void;\r\n stopPolling(): void;\r\n isPolling(): boolean;\r\n setInterval(ms: number): void;\r\n } = {\r\n ...source,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n currentOptions = options;\r\n const result = await source.load(options);\r\n lastData = result.data;\r\n return result;\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n\r\n // Also subscribe to base\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- forwarding event name through to underlying source.on (typed string union narrower than `string`)\r\n const unsub = source.on(event as any, handler);\r\n return () => {\r\n listeners.get(event)?.delete(handler);\r\n unsub();\r\n };\r\n },\r\n\r\n startPolling,\r\n stopPolling,\r\n isPolling: () => timer !== null,\r\n setInterval(ms: number) {\r\n pollInterval = ms;\r\n if (timer) {\r\n stopPolling();\r\n startPolling();\r\n }\r\n },\r\n };\r\n\r\n if (autoStart) {\r\n startPolling();\r\n }\r\n\r\n return wrapped;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// SERVER-SENT EVENTS (SSE) DATA SOURCE\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport type NiceSSEMessageType = 'insert' | 'update' | 'remove' | 'refresh' | 'snapshot';\r\n\r\nexport interface NiceSSEMessage<T = unknown> {\r\n type: NiceSSEMessageType;\r\n key?: unknown;\r\n data?: T;\r\n changes?: Partial<T>;\r\n}\r\n\r\nexport interface NiceSSEConfig<T> {\r\n /** SSE endpoint URL. */\r\n url: string;\r\n /** Base data source for initial load (SSE is read-only for pushes). */\r\n baseSource: NiceDataSource<T>;\r\n /** Key field name. */\r\n keyField?: string;\r\n /** Parse incoming SSE event into a message. Defaults to JSON.parse(event.data). */\r\n parseEvent?: (event: MessageEvent) => NiceSSEMessage<T> | null;\r\n /** Custom headers (requires polyfill like eventsource-polyfill for non-standard headers). */\r\n headers?: Record<string, string>;\r\n /** Reconnect delay in ms (EventSource handles this natively; used for manual fallback). @default 3000 */\r\n reconnectDelay?: number;\r\n /** Max reconnect attempts before giving up. @default 10 */\r\n maxReconnects?: number;\r\n /** Whether to include credentials (cookies). @default false */\r\n withCredentials?: boolean;\r\n}\r\n\r\nexport interface NiceSSEDataSource<T> extends NiceDataSource<T> {\r\n /** Start listening to SSE events. */\r\n connect(): void;\r\n /** Close the SSE connection. */\r\n disconnect(): void;\r\n /** Whether the EventSource is currently connected. */\r\n isConnected(): boolean;\r\n}\r\n\r\n/**\r\n * Creates a read-only real-time data source using Server-Sent Events (SSE).\r\n * Lighter alternative to WebSocket — ideal for server→client unidirectional streaming.\r\n *\r\n * The SSE endpoint should send JSON messages with { type, key?, data?, changes? }.\r\n * Writes (insert/update/remove) are delegated to the base data source.\r\n */\r\nexport function createSSEDataSource<T extends Record<string, any>>(\r\n config: NiceSSEConfig<T>,\r\n): NiceSSEDataSource<T> {\r\n const {\r\n url,\r\n baseSource,\r\n keyField = baseSource.keyField,\r\n reconnectDelay = 3000,\r\n maxReconnects = 10,\r\n withCredentials = false,\r\n } = config;\r\n\r\n let eventSource: EventSource | null = null;\r\n let reconnectAttempts = 0;\r\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n let localData: T[] = [];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n function parseEvent(event: MessageEvent): NiceSSEMessage<T> | null {\r\n if (config.parseEvent) {\r\n return config.parseEvent(event);\r\n }\r\n try {\r\n return JSON.parse(event.data);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function applyMessage(msg: NiceSSEMessage<T>) {\r\n switch (msg.type) {\r\n case 'insert':\r\n if (msg.data) {\r\n localData = [...localData, msg.data as T];\r\n emit('changed');\r\n }\r\n break;\r\n case 'update':\r\n if (msg.key && msg.changes) {\r\n localData = localData.map((item) =>\r\n (item as Record<string, unknown>)[keyField] === msg.key\r\n ? { ...item, ...msg.changes }\r\n : item,\r\n );\r\n emit('changed');\r\n }\r\n break;\r\n case 'remove':\r\n if (msg.key) {\r\n localData = localData.filter(\r\n (item) => (item as Record<string, unknown>)[keyField] !== msg.key,\r\n );\r\n emit('changed');\r\n }\r\n break;\r\n case 'snapshot':\r\n if (Array.isArray(msg.data)) {\r\n localData = msg.data as T[];\r\n emit('changed');\r\n }\r\n break;\r\n case 'refresh':\r\n source.load().catch(() => {});\r\n break;\r\n }\r\n }\r\n\r\n function connect() {\r\n if (eventSource?.readyState === EventSource.OPEN) {\r\n return;\r\n }\r\n\r\n disconnect(); // clean up previous\r\n eventSource = new EventSource(url, { withCredentials });\r\n\r\n eventSource.onopen = () => {\r\n reconnectAttempts = 0;\r\n emit('connected');\r\n };\r\n\r\n eventSource.onmessage = (event) => {\r\n const msg = parseEvent(event);\r\n if (msg) {\r\n applyMessage(msg);\r\n emit('message', msg);\r\n }\r\n };\r\n\r\n eventSource.onerror = () => {\r\n emit('error', new Error('SSE connection error'));\r\n\r\n // EventSource auto-reconnects, but if it closes permanently:\r\n if (eventSource?.readyState === EventSource.CLOSED) {\r\n emit('disconnected');\r\n eventSource = null;\r\n\r\n if (reconnectAttempts < maxReconnects) {\r\n reconnectAttempts++;\r\n const delay = reconnectDelay * Math.min(reconnectAttempts, 5);\r\n reconnectTimer = setTimeout(connect, delay);\r\n }\r\n }\r\n };\r\n }\r\n\r\n function disconnect() {\r\n if (reconnectTimer) {\r\n clearTimeout(reconnectTimer);\r\n reconnectTimer = null;\r\n }\r\n if (eventSource) {\r\n eventSource.close();\r\n eventSource = null;\r\n }\r\n }\r\n\r\n const source: NiceSSEDataSource<T> = {\r\n keyField,\r\n writable: baseSource.writable,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emit('loading', true);\r\n try {\r\n const result = await baseSource.load(options);\r\n localData = result.data;\r\n emit('loaded', result);\r\n emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n emit('error', e);\r\n emit('loading', false);\r\n throw e;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n const local = localData.find((item) => (item as Record<string, unknown>)[keyField] === key);\r\n if (local) {\r\n return local;\r\n }\r\n return baseSource.byKey(key);\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n return baseSource.insert!(item);\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n return baseSource.update!(key, changes);\r\n },\r\n\r\n async remove(key: unknown) {\r\n return baseSource.remove!(key);\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n return () => listeners.get(event)?.delete(handler);\r\n },\r\n\r\n connect,\r\n disconnect,\r\n isConnected: () => eventSource?.readyState === EventSource.OPEN,\r\n };\r\n\r\n return source;\r\n}\r\n","/**\r\n * NiceDataAggregation — Data transformation utilities\r\n * Sprint 5.4: Aggregation, Pivot, Calculated Columns\r\n */\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// AGGREGATION FUNCTIONS\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport type AggregateFunction =\r\n | 'sum'\r\n | 'avg'\r\n | 'min'\r\n | 'max'\r\n | 'count'\r\n | 'first'\r\n | 'last'\r\n | 'distinct';\r\n\r\nexport interface AggregateSpec {\r\n field: string;\r\n fn: AggregateFunction;\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * Applies aggregate functions to a dataset.\r\n */\r\nexport function aggregate<T extends Record<string, any>>(\r\n data: T[],\r\n specs: AggregateSpec[],\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n\r\n for (const spec of specs) {\r\n const values = data.map((item) => item[spec.field]).filter((v) => v != null);\r\n const key = spec.alias ?? `${spec.fn}_${spec.field}`;\r\n\r\n switch (spec.fn) {\r\n case 'sum':\r\n result[key] = values.reduce((a, b) => Number(a) + Number(b), 0);\r\n break;\r\n case 'avg':\r\n result[key] = values.length\r\n ? values.reduce((a, b) => Number(a) + Number(b), 0) / values.length\r\n : 0;\r\n break;\r\n case 'min':\r\n result[key] = values.length ? Math.min(...values.map(Number)) : null;\r\n break;\r\n case 'max':\r\n result[key] = values.length ? Math.max(...values.map(Number)) : null;\r\n break;\r\n case 'count':\r\n result[key] = values.length;\r\n break;\r\n case 'first':\r\n result[key] = values[0] ?? null;\r\n break;\r\n case 'last':\r\n result[key] = values[values.length - 1] ?? null;\r\n break;\r\n case 'distinct':\r\n result[key] = [...new Set(values)];\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// GROUP BY\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface GroupByOptions<T> {\r\n /** Fields to group by */\r\n groupBy: string[];\r\n /** Aggregate functions to apply */\r\n aggregates?: AggregateSpec[];\r\n /** Whether to include items in each group */\r\n includeItems?: boolean;\r\n /** Sort groups by field and direction */\r\n sortGroups?: { field: string; direction: 'asc' | 'desc' }[];\r\n}\r\n\r\nexport interface GroupedResult<T> {\r\n /** Group key values */\r\n key: Record<string, unknown>;\r\n /** Number of items in group */\r\n count: number;\r\n /** Aggregate results */\r\n aggregates: Record<string, unknown>;\r\n /** Items in group (if includeItems is true) */\r\n items?: T[];\r\n /** Nested groups (for multi-level grouping) */\r\n groups?: GroupedResult<T>[];\r\n}\r\n\r\n/**\r\n * Groups data by specified fields with optional aggregation.\r\n */\r\nexport function groupBy<T extends Record<string, any>>(\r\n data: T[],\r\n options: GroupByOptions<T>,\r\n): GroupedResult<T>[] {\r\n const { groupBy: fields, aggregates = [], includeItems = false, sortGroups } = options;\r\n\r\n if (fields.length === 0) {\r\n return [\r\n {\r\n key: {},\r\n count: data.length,\r\n aggregates: aggregate(data, aggregates),\r\n items: includeItems ? data : undefined,\r\n },\r\n ];\r\n }\r\n\r\n // Build groups map\r\n const groupsMap = new Map<string, { key: Record<string, unknown>; items: T[] }>();\r\n\r\n for (const item of data) {\r\n const keyValues: Record<string, unknown> = {};\r\n for (const field of fields) {\r\n keyValues[field] = item[field];\r\n }\r\n const keyStr = JSON.stringify(keyValues);\r\n\r\n if (!groupsMap.has(keyStr)) {\r\n groupsMap.set(keyStr, { key: keyValues, items: [] });\r\n }\r\n groupsMap.get(keyStr)!.items.push(item);\r\n }\r\n\r\n // Convert to result array\r\n const results: GroupedResult<T>[] = [];\r\n for (const [, group] of groupsMap) {\r\n results.push({\r\n key: group.key,\r\n count: group.items.length,\r\n aggregates: aggregate(group.items, aggregates),\r\n items: includeItems ? group.items : undefined,\r\n });\r\n }\r\n\r\n // Sort groups\r\n if (sortGroups?.length) {\r\n results.sort((a, b) => {\r\n for (const sort of sortGroups) {\r\n const aVal = a.key[sort.field] ?? a.aggregates[sort.field];\r\n const bVal = b.key[sort.field] ?? b.aggregates[sort.field];\r\n const cmp =\r\n typeof aVal === 'number' && typeof bVal === 'number'\r\n ? aVal - bVal\r\n : String(aVal ?? '').localeCompare(String(bVal ?? ''));\r\n if (cmp !== 0) {\r\n return sort.direction === 'desc' ? -cmp : cmp;\r\n }\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Creates hierarchical groups (groups within groups).\r\n */\r\nexport function groupByHierarchical<T extends Record<string, any>>(\r\n data: T[],\r\n groupFields: string[],\r\n aggregates: AggregateSpec[] = [],\r\n): GroupedResult<T>[] {\r\n if (groupFields.length === 0) {\r\n return [\r\n {\r\n key: {},\r\n count: data.length,\r\n aggregates: aggregate(data, aggregates),\r\n items: data,\r\n },\r\n ];\r\n }\r\n\r\n const [firstField, ...restFields] = groupFields;\r\n const groups = groupBy(data, { groupBy: [firstField], aggregates, includeItems: true });\r\n\r\n if (restFields.length > 0) {\r\n for (const group of groups) {\r\n group.groups = groupByHierarchical(group.items!, restFields, aggregates);\r\n delete group.items;\r\n }\r\n }\r\n\r\n return groups;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// PIVOT TABLE TRANSFORMATION\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface PivotConfig {\r\n /** Row fields */\r\n rows: string[];\r\n /** Column field (will become column headers) */\r\n columns: string;\r\n /** Value field to aggregate */\r\n values: string;\r\n /** Aggregate function (default 'sum') */\r\n aggregateFunction?: AggregateFunction;\r\n /** Include row totals */\r\n rowTotals?: boolean;\r\n /** Include column totals */\r\n columnTotals?: boolean;\r\n /** Include grand total */\r\n grandTotal?: boolean;\r\n}\r\n\r\nexport interface PivotResult {\r\n /** Column headers (unique values from column field) */\r\n columnHeaders: string[];\r\n /** Row data with pivot values */\r\n rows: Array<{\r\n rowKey: Record<string, unknown>;\r\n values: Record<string, number | null>;\r\n rowTotal?: number;\r\n }>;\r\n /** Column totals */\r\n columnTotals?: Record<string, number>;\r\n /** Grand total */\r\n grandTotal?: number;\r\n}\r\n\r\n/**\r\n * Transforms data into a pivot table format.\r\n */\r\nexport function pivot<T extends Record<string, any>>(data: T[], config: PivotConfig): PivotResult {\r\n const {\r\n rows: rowFields,\r\n columns: columnField,\r\n values: valueField,\r\n aggregateFunction = 'sum',\r\n rowTotals = true,\r\n columnTotals = true,\r\n grandTotal = true,\r\n } = config;\r\n\r\n // Get unique column headers\r\n const columnHeaders = [...new Set(data.map((item) => String(item[columnField])))].sort();\r\n\r\n // Build row groups\r\n const rowGroups = groupBy(data, { groupBy: rowFields, includeItems: true });\r\n\r\n // Build pivot rows\r\n const pivotRows: PivotResult['rows'] = [];\r\n\r\n for (const group of rowGroups) {\r\n const row: PivotResult['rows'][0] = {\r\n rowKey: group.key,\r\n values: {},\r\n };\r\n\r\n // Calculate value for each column\r\n for (const colHeader of columnHeaders) {\r\n const colItems = group.items!.filter((item) => String(item[columnField]) === colHeader);\r\n const aggResult = aggregate(colItems, [{ field: valueField, fn: aggregateFunction }]);\r\n row.values[colHeader] = (aggResult[`${aggregateFunction}_${valueField}`] as number) ?? null;\r\n }\r\n\r\n // Row total\r\n if (rowTotals) {\r\n const rowAgg = aggregate(group.items!, [{ field: valueField, fn: aggregateFunction }]);\r\n row.rowTotal = rowAgg[`${aggregateFunction}_${valueField}`] as number;\r\n }\r\n\r\n pivotRows.push(row);\r\n }\r\n\r\n // Column totals\r\n let colTotals: Record<string, number> | undefined;\r\n if (columnTotals) {\r\n colTotals = {};\r\n for (const colHeader of columnHeaders) {\r\n const colItems = data.filter((item) => String(item[columnField]) === colHeader);\r\n const aggResult = aggregate(colItems, [{ field: valueField, fn: aggregateFunction }]);\r\n colTotals[colHeader] = aggResult[`${aggregateFunction}_${valueField}`] as number;\r\n }\r\n }\r\n\r\n // Grand total\r\n let grand: number | undefined;\r\n if (grandTotal) {\r\n const aggResult = aggregate(data, [{ field: valueField, fn: aggregateFunction }]);\r\n grand = aggResult[`${aggregateFunction}_${valueField}`] as number;\r\n }\r\n\r\n return {\r\n columnHeaders,\r\n rows: pivotRows,\r\n columnTotals: colTotals,\r\n grandTotal: grand,\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// CALCULATED COLUMNS\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface CalculatedColumn<T> {\r\n /** Name for the new column */\r\n name: string;\r\n /** Formula function */\r\n formula: (item: T, index: number, allItems: T[]) => unknown;\r\n}\r\n\r\n/**\r\n * Adds calculated columns to data.\r\n */\r\nexport function withCalculatedColumns<T extends Record<string, any>>(\r\n data: T[],\r\n columns: CalculatedColumn<T>[],\r\n): Array<T & Record<string, unknown>> {\r\n return data.map((item, index) => {\r\n const result = { ...item };\r\n for (const col of columns) {\r\n (result as Record<string, unknown>)[col.name] = col.formula(item, index, data);\r\n }\r\n return result as T & Record<string, unknown>;\r\n });\r\n}\r\n\r\n/**\r\n * Pre-built formula helpers for common calculations.\r\n */\r\nexport const ColumnFormulas = {\r\n /** Running sum of a field */\r\n runningSum:\r\n <T>(field: keyof T) =>\r\n (item: T, index: number, all: T[]) =>\r\n all.slice(0, index + 1).reduce((sum, i) => sum + Number(i[field] ?? 0), 0),\r\n\r\n /** Running average of a field */\r\n runningAvg:\r\n <T>(field: keyof T) =>\r\n (item: T, index: number, all: T[]) => {\r\n const slice = all.slice(0, index + 1);\r\n return slice.reduce((sum, i) => sum + Number(i[field] ?? 0), 0) / slice.length;\r\n },\r\n\r\n /** Percentage of total */\r\n percentOfTotal:\r\n <T>(field: keyof T) =>\r\n (item: T, _: number, all: T[]) => {\r\n const total = all.reduce((sum, i) => sum + Number(i[field] ?? 0), 0);\r\n return total ? (Number(item[field] ?? 0) / total) * 100 : 0;\r\n },\r\n\r\n /** Rank by field value */\r\n rank:\r\n <T>(field: keyof T, direction: 'asc' | 'desc' = 'desc') =>\r\n (item: T, _: number, all: T[]) => {\r\n const sorted = [...all].sort((a, b) => {\r\n const diff = Number(a[field] ?? 0) - Number(b[field] ?? 0);\r\n return direction === 'desc' ? -diff : diff;\r\n });\r\n return sorted.findIndex((i) => i === item) + 1;\r\n },\r\n\r\n /** Difference from previous row */\r\n diffFromPrevious:\r\n <T>(field: keyof T) =>\r\n (item: T, index: number, all: T[]) => {\r\n if (index === 0) {\r\n return null;\r\n }\r\n return Number(item[field] ?? 0) - Number(all[index - 1][field] ?? 0);\r\n },\r\n\r\n /** Percentage change from previous row */\r\n percentChange:\r\n <T>(field: keyof T) =>\r\n (item: T, index: number, all: T[]) => {\r\n if (index === 0) {\r\n return null;\r\n }\r\n const prev = Number(all[index - 1][field] ?? 0);\r\n if (prev === 0) {\r\n return null;\r\n }\r\n return ((Number(item[field] ?? 0) - prev) / prev) * 100;\r\n },\r\n\r\n /** Moving average */\r\n movingAverage:\r\n <T>(field: keyof T, window: number) =>\r\n (item: T, index: number, all: T[]) => {\r\n const start = Math.max(0, index - window + 1);\r\n const slice = all.slice(start, index + 1);\r\n return slice.reduce((sum, i) => sum + Number(i[field] ?? 0), 0) / slice.length;\r\n },\r\n\r\n /** Conditional value */\r\n conditional:\r\n <T, R>(condition: (item: T) => boolean, trueValue: R, falseValue: R) =>\r\n (item: T) =>\r\n condition(item) ? trueValue : falseValue,\r\n\r\n /** Concatenate fields */\r\n concat:\r\n <T>(...fields: (keyof T)[]) =>\r\n (item: T) =>\r\n fields.map((f) => item[f] ?? '').join(' '),\r\n\r\n /** Parse date and format */\r\n formatDate:\r\n <T>(field: keyof T, format: 'short' | 'medium' | 'long' = 'medium') =>\r\n (item: T) => {\r\n const dateValue = item[field];\r\n if (!dateValue) {\r\n return '';\r\n }\r\n const date = new Date(dateValue as string | number);\r\n return date.toLocaleDateString(undefined, {\r\n dateStyle: format,\r\n });\r\n },\r\n};\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// DATA VALIDATION PIPELINE\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\r\n\r\nexport interface ValidationRule<T> {\r\n /** Rule name */\r\n name: string;\r\n /** Validation function */\r\n validate: (item: T, index: number, all: T[]) => boolean;\r\n /** Error message */\r\n message: string | ((item: T) => string);\r\n /** Severity level */\r\n severity?: ValidationSeverity;\r\n /** Fields this rule applies to */\r\n fields?: string[];\r\n}\r\n\r\nexport interface ValidationError {\r\n /** Item index */\r\n index: number;\r\n /** Rule name */\r\n rule: string;\r\n /** Error message */\r\n message: string;\r\n /** Severity */\r\n severity: ValidationSeverity;\r\n /** Affected fields */\r\n fields: string[];\r\n /** The invalid item */\r\n item: unknown;\r\n}\r\n\r\nexport interface ValidationResult {\r\n /** Whether all items are valid */\r\n isValid: boolean;\r\n /** Total error count */\r\n errorCount: number;\r\n /** Total warning count */\r\n warningCount: number;\r\n /** All validation errors */\r\n errors: ValidationError[];\r\n /** Errors grouped by index */\r\n byIndex: Map<number, ValidationError[]>;\r\n /** Errors grouped by field */\r\n byField: Map<string, ValidationError[]>;\r\n}\r\n\r\n/**\r\n * Validates data against a set of rules.\r\n */\r\nexport function validateData<T>(data: T[], rules: ValidationRule<T>[]): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const byIndex = new Map<number, ValidationError[]>();\r\n const byField = new Map<string, ValidationError[]>();\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const item = data[i];\r\n\r\n for (const rule of rules) {\r\n if (!rule.validate(item, i, data)) {\r\n const message = typeof rule.message === 'function' ? rule.message(item) : rule.message;\r\n const error: ValidationError = {\r\n index: i,\r\n rule: rule.name,\r\n message,\r\n severity: rule.severity ?? 'error',\r\n fields: rule.fields ?? [],\r\n item,\r\n };\r\n\r\n errors.push(error);\r\n\r\n // Group by index\r\n if (!byIndex.has(i)) {\r\n byIndex.set(i, []);\r\n }\r\n byIndex.get(i)!.push(error);\r\n\r\n // Group by field\r\n for (const field of error.fields) {\r\n if (!byField.has(field)) {\r\n byField.set(field, []);\r\n }\r\n byField.get(field)!.push(error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const errorCount = errors.filter((e) => e.severity === 'error').length;\r\n const warningCount = errors.filter((e) => e.severity === 'warning').length;\r\n\r\n return {\r\n isValid: errorCount === 0,\r\n errorCount,\r\n warningCount,\r\n errors,\r\n byIndex,\r\n byField,\r\n };\r\n}\r\n\r\n/**\r\n * Pre-built validation rules.\r\n */\r\nexport const ValidationRules = {\r\n required: <T>(field: keyof T): ValidationRule<T> => ({\r\n name: `required_${String(field)}`,\r\n validate: (item) => item[field] != null && item[field] !== '',\r\n message: `${String(field)} is required`,\r\n fields: [String(field)],\r\n }),\r\n\r\n minLength: <T>(field: keyof T, min: number): ValidationRule<T> => ({\r\n name: `minLength_${String(field)}`,\r\n validate: (item) => String(item[field] ?? '').length >= min,\r\n message: `${String(field)} must be at least ${min} characters`,\r\n fields: [String(field)],\r\n }),\r\n\r\n maxLength: <T>(field: keyof T, max: number): ValidationRule<T> => ({\r\n name: `maxLength_${String(field)}`,\r\n validate: (item) => String(item[field] ?? '').length <= max,\r\n message: `${String(field)} must be at most ${max} characters`,\r\n fields: [String(field)],\r\n }),\r\n\r\n min: <T>(field: keyof T, min: number): ValidationRule<T> => ({\r\n name: `min_${String(field)}`,\r\n validate: (item) => Number(item[field]) >= min,\r\n message: `${String(field)} must be at least ${min}`,\r\n fields: [String(field)],\r\n }),\r\n\r\n max: <T>(field: keyof T, max: number): ValidationRule<T> => ({\r\n name: `max_${String(field)}`,\r\n validate: (item) => Number(item[field]) <= max,\r\n message: `${String(field)} must be at most ${max}`,\r\n fields: [String(field)],\r\n }),\r\n\r\n email: <T>(field: keyof T): ValidationRule<T> => ({\r\n name: `email_${String(field)}`,\r\n validate: (item) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(item[field] ?? '')),\r\n message: `${String(field)} must be a valid email`,\r\n fields: [String(field)],\r\n }),\r\n\r\n pattern: <T>(field: keyof T, regex: RegExp, message?: string): ValidationRule<T> => ({\r\n name: `pattern_${String(field)}`,\r\n validate: (item) => regex.test(String(item[field] ?? '')),\r\n message: message ?? `${String(field)} has invalid format`,\r\n fields: [String(field)],\r\n }),\r\n\r\n unique: <T>(field: keyof T): ValidationRule<T> => ({\r\n name: `unique_${String(field)}`,\r\n validate: (item, index, all) => {\r\n const value = item[field];\r\n return all.findIndex((i) => i[field] === value) === index;\r\n },\r\n message: `${String(field)} must be unique`,\r\n fields: [String(field)],\r\n }),\r\n\r\n custom: <T>(\r\n name: string,\r\n validate: (item: T) => boolean,\r\n message: string,\r\n fields?: string[],\r\n ): ValidationRule<T> => ({\r\n name,\r\n validate,\r\n message,\r\n fields,\r\n }),\r\n};\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// BATCH OPERATIONS\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface BatchOperationResult<T> {\r\n succeeded: number;\r\n failed: number;\r\n errors: Array<{ index: number; item: T; error: Error }>;\r\n}\r\n\r\n/**\r\n * Performs batch operations on data.\r\n */\r\nexport const BatchOperations = {\r\n /**\r\n * Updates multiple items matching a condition.\r\n */\r\n async updateWhere<T extends Record<string, any>>(\r\n items: T[],\r\n condition: (item: T) => boolean,\r\n changes: Partial<T> | ((item: T) => Partial<T>),\r\n ): Promise<T[]> {\r\n return items.map((item) => {\r\n if (!condition(item)) {\r\n return item;\r\n }\r\n const itemChanges = typeof changes === 'function' ? changes(item) : changes;\r\n return { ...item, ...itemChanges };\r\n });\r\n },\r\n\r\n /**\r\n * Removes items matching a condition.\r\n */\r\n async removeWhere<T>(\r\n items: T[],\r\n condition: (item: T) => boolean,\r\n ): Promise<{ remaining: T[]; removed: T[] }> {\r\n const remaining: T[] = [];\r\n const removed: T[] = [];\r\n\r\n for (const item of items) {\r\n if (condition(item)) {\r\n removed.push(item);\r\n } else {\r\n remaining.push(item);\r\n }\r\n }\r\n\r\n return { remaining, removed };\r\n },\r\n\r\n /**\r\n * Applies a transformation to all items.\r\n */\r\n async transform<T, R>(\r\n items: T[],\r\n transformer: (item: T, index: number) => R | Promise<R>,\r\n options: { parallel?: boolean; batchSize?: number } = {},\r\n ): Promise<BatchOperationResult<T> & { results: R[] }> {\r\n const { parallel = false, batchSize = 10 } = options;\r\n const results: R[] = [];\r\n const errors: BatchOperationResult<T>['errors'] = [];\r\n let succeeded = 0;\r\n\r\n if (parallel) {\r\n // Process in batches\r\n for (let i = 0; i < items.length; i += batchSize) {\r\n const batch = items.slice(i, i + batchSize);\r\n const batchResults = await Promise.allSettled(\r\n batch.map((item, idx) => transformer(item, i + idx)),\r\n );\r\n\r\n for (let j = 0; j < batchResults.length; j++) {\r\n const result = batchResults[j];\r\n if (result.status === 'fulfilled') {\r\n results.push(result.value);\r\n succeeded++;\r\n } else {\r\n errors.push({\r\n index: i + j,\r\n item: batch[j],\r\n error: result.reason,\r\n });\r\n }\r\n }\r\n }\r\n } else {\r\n // Process sequentially\r\n for (let i = 0; i < items.length; i++) {\r\n try {\r\n const result = await transformer(items[i], i);\r\n results.push(result);\r\n succeeded++;\r\n } catch (e) {\r\n errors.push({\r\n index: i,\r\n item: items[i],\r\n error: e instanceof Error ? e : new Error(String(e)),\r\n });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n succeeded,\r\n failed: errors.length,\r\n errors,\r\n results,\r\n };\r\n },\r\n\r\n /**\r\n * Deduplicates items by a key field.\r\n */\r\n deduplicate<T>(items: T[], keyField: keyof T): T[] {\r\n const seen = new Set<unknown>();\r\n return items.filter((item) => {\r\n const key = item[keyField];\r\n if (seen.has(key)) {\r\n return false;\r\n }\r\n seen.add(key);\r\n return true;\r\n });\r\n },\r\n\r\n /**\r\n * Merges two arrays, updating existing items and adding new ones.\r\n */\r\n merge<T extends Record<string, any>>(\r\n existing: T[],\r\n incoming: T[],\r\n keyField: keyof T,\r\n options: { updateExisting?: boolean; addNew?: boolean } = {},\r\n ): T[] {\r\n const { updateExisting = true, addNew = true } = options;\r\n const existingMap = new Map(existing.map((item) => [item[keyField], item]));\r\n const result: T[] = [...existing];\r\n\r\n for (const item of incoming) {\r\n const key = item[keyField];\r\n const existingItem = existingMap.get(key);\r\n\r\n if (existingItem) {\r\n if (updateExisting) {\r\n const idx = result.indexOf(existingItem);\r\n result[idx] = { ...existingItem, ...item };\r\n }\r\n } else if (addNew) {\r\n result.push(item);\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n};\r\n","/**\r\n * React hooks for NiceDataSource binding.\r\n *\r\n * useNiceDataSource — list/grid binding (sort, page, filter, search, CRUD)\r\n * useNiceRecord — single-record binding (edit form, detail view)\r\n * useNiceField — single-field two-way binding (input, label, etc.)\r\n * useNiceLookupSource — options binding for Select/Autocomplete/TagBox\r\n */\r\n\r\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\r\n\r\nimport type {\r\n NiceFilterGroup,\r\n NiceDataSource,\r\n NiceLoadOptions,\r\n NiceSortExpression,\r\n NiceSortDirection,\r\n} from './datasource';\r\nimport type { NiceOption } from './types';\r\n\r\n/* ================================================================\r\n useNiceDataSource — bind a list/grid to a data source\r\n ================================================================ */\r\n\r\nexport interface UseNiceDataSourceOptions {\r\n /** Auto-load on mount & when query changes. Default: true. */\r\n autoLoad?: boolean;\r\n defaultPageSize?: number;\r\n defaultSort?: NiceSortExpression[];\r\n defaultFilter?: NiceFilterGroup;\r\n defaultSearch?: string;\r\n /** Additional load options merged into every request. */\r\n loadOptions?: Partial<NiceLoadOptions>;\r\n}\r\n\r\nexport interface NiceDataSourceState<T> {\r\n /* ── Data ─────────────────────────────── */\r\n data: T[];\r\n totalCount: number;\r\n loading: boolean;\r\n error: string | null;\r\n\r\n /* ── Query state ──────────────────────── */\r\n page: number;\r\n pageSize: number;\r\n sort: NiceSortExpression[];\r\n filter: NiceFilterGroup | undefined;\r\n search: string;\r\n\r\n /* ── Query actions ────────────────────── */\r\n setPage: (page: number) => void;\r\n setPageSize: (size: number) => void;\r\n setSort: (sort: NiceSortExpression[]) => void;\r\n setSortField: (field: string, direction: NiceSortDirection) => void;\r\n setFilter: (filter: NiceFilterGroup | undefined) => void;\r\n setSearch: (search: string) => void;\r\n\r\n /* ── Data actions ─────────────────────── */\r\n reload: () => void;\r\n insert: (item: Partial<T>) => Promise<void>;\r\n update: (key: unknown, changes: Partial<T>) => Promise<void>;\r\n remove: (key: unknown) => Promise<void>;\r\n}\r\n\r\nexport function useNiceDataSource<T = any>(\r\n source: NiceDataSource<T> | null | undefined,\r\n options?: UseNiceDataSourceOptions,\r\n): NiceDataSourceState<T> {\r\n const autoLoad = options?.autoLoad ?? true;\r\n const defPageSize = options?.defaultPageSize ?? 20;\r\n\r\n const [data, setData] = useState<T[]>([]);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [page, setPage] = useState(1);\r\n const [pageSize, setPageSize] = useState(defPageSize);\r\n const [sort, setSort] = useState<NiceSortExpression[]>(options?.defaultSort ?? []);\r\n const [filter, setFilter] = useState<NiceFilterGroup | undefined>(options?.defaultFilter);\r\n const [search, setSearch] = useState(options?.defaultSearch ?? '');\r\n\r\n const loadCounter = useRef(0);\r\n const extraOpts = options?.loadOptions;\r\n\r\n const doLoad = useCallback(async () => {\r\n if (!source) {\r\n return;\r\n }\r\n const id = ++loadCounter.current;\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const result = await source.load({\r\n skip: (page - 1) * pageSize,\r\n take: pageSize,\r\n sort: sort.length ? sort : undefined,\r\n filter,\r\n search: search || undefined,\r\n ...extraOpts,\r\n });\r\n if (id !== loadCounter.current) {\r\n return;\r\n } // stale\r\n setData(result.data);\r\n setTotalCount(result.totalCount);\r\n } catch (e) {\r\n if (id !== loadCounter.current) {\r\n return;\r\n }\r\n setError(e instanceof Error ? e.message : String(e));\r\n } finally {\r\n if (id === loadCounter.current) {\r\n setLoading(false);\r\n }\r\n }\r\n }, [source, page, pageSize, sort, filter, search, extraOpts]);\r\n\r\n // Auto-load when query changes\r\n useEffect(() => {\r\n if (autoLoad) {\r\n doLoad();\r\n }\r\n }, [doLoad, autoLoad]);\r\n\r\n // Subscribe to 'changed' events for cross-component reactivity\r\n useEffect(() => {\r\n if (!source) {\r\n return;\r\n }\r\n return source.on('changed', () => {\r\n doLoad();\r\n });\r\n }, [source, doLoad]);\r\n\r\n const setSortField = useCallback((field: string, direction: NiceSortDirection) => {\r\n setSort([{ field, direction }]);\r\n setPage(1);\r\n }, []);\r\n\r\n const handleSetFilter = useCallback((f: NiceFilterGroup | undefined) => {\r\n setFilter(f);\r\n setPage(1);\r\n }, []);\r\n\r\n const handleSetSearch = useCallback((s: string) => {\r\n setSearch(s);\r\n setPage(1);\r\n }, []);\r\n\r\n const handleSetPageSize = useCallback((s: number) => {\r\n setPageSize(s);\r\n setPage(1);\r\n }, []);\r\n\r\n const insert = useCallback(\r\n async (item: Partial<T>) => {\r\n if (!source?.insert) {\r\n throw new Error('DataSource is not writable');\r\n }\r\n await source.insert(item);\r\n // 'changed' event will trigger reload\r\n },\r\n [source],\r\n );\r\n\r\n const update = useCallback(\r\n async (key: unknown, changes: Partial<T>) => {\r\n if (!source?.update) {\r\n throw new Error('DataSource is not writable');\r\n }\r\n await source.update(key, changes);\r\n },\r\n [source],\r\n );\r\n\r\n const remove = useCallback(\r\n async (key: unknown) => {\r\n if (!source?.remove) {\r\n throw new Error('DataSource is not writable');\r\n }\r\n await source.remove(key);\r\n },\r\n [source],\r\n );\r\n\r\n return {\r\n data,\r\n totalCount,\r\n loading,\r\n error,\r\n page,\r\n pageSize,\r\n sort,\r\n filter,\r\n search,\r\n setPage,\r\n setPageSize: handleSetPageSize,\r\n setSort,\r\n setSortField,\r\n setFilter: handleSetFilter,\r\n setSearch: handleSetSearch,\r\n reload: doLoad,\r\n insert,\r\n update,\r\n remove,\r\n };\r\n}\r\n\r\n/* ================================================================\r\n useNiceRecord — bind a single record for editing (forms, detail)\r\n ================================================================ */\r\n\r\nexport interface NiceRecordState<T> {\r\n /** Original loaded data. */\r\n data: T | undefined;\r\n /** Data with local changes applied. */\r\n editData: Record<string, unknown>;\r\n loading: boolean;\r\n error: string | null;\r\n /** Pending local changes not yet saved. */\r\n changes: Partial<T>;\r\n isDirty: boolean;\r\n\r\n /** Set a single field value locally (does NOT save). */\r\n set: (field: string, value: unknown) => void;\r\n /** Set multiple fields locally. */\r\n setMany: (changes: Partial<T>) => void;\r\n /** Persist local changes to the data source. */\r\n save: () => Promise<void>;\r\n /** Reload from server, discarding local changes. */\r\n reload: () => void;\r\n /** Discard local changes without reloading. */\r\n reset: () => void;\r\n}\r\n\r\nexport function useNiceRecord<T = any>(\r\n source: NiceDataSource<T> | null | undefined,\r\n key: unknown,\r\n): NiceRecordState<T> {\r\n const [data, setData] = useState<T | undefined>(undefined);\r\n const [changes, setChanges] = useState<Partial<T>>({});\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const loadId = useRef(0);\r\n\r\n const doLoad = useCallback(async () => {\r\n if (!source || key == null) {\r\n setData(undefined);\r\n return;\r\n }\r\n const id = ++loadId.current;\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const record = await source.byKey(key);\r\n if (id !== loadId.current) {\r\n return;\r\n }\r\n setData(record);\r\n setChanges({});\r\n } catch (e) {\r\n if (id !== loadId.current) {\r\n return;\r\n }\r\n setError(e instanceof Error ? e.message : String(e));\r\n } finally {\r\n if (id === loadId.current) {\r\n setLoading(false);\r\n }\r\n }\r\n }, [source, key]);\r\n\r\n useEffect(() => {\r\n doLoad();\r\n }, [doLoad]);\r\n\r\n // React to external changes\r\n useEffect(() => {\r\n if (!source) {\r\n return;\r\n }\r\n return source.on('changed', () => {\r\n doLoad();\r\n });\r\n }, [source, doLoad]);\r\n\r\n const editData = useMemo(\r\n () => ({ ...((data as Record<string, unknown>) ?? {}), ...changes }),\r\n [data, changes],\r\n );\r\n\r\n const isDirty = Object.keys(changes).length > 0;\r\n\r\n const set = useCallback((field: string, value: unknown) => {\r\n setChanges((prev) => ({ ...prev, [field]: value }));\r\n }, []);\r\n\r\n const setMany = useCallback((ch: Partial<T>) => {\r\n setChanges((prev) => ({ ...prev, ...ch }));\r\n }, []);\r\n\r\n const save = useCallback(async () => {\r\n if (!source?.update) {\r\n throw new Error('DataSource is not writable');\r\n }\r\n if (!isDirty) {\r\n return;\r\n }\r\n await source.update(key, changes);\r\n // 'changed' event reloads\r\n }, [source, key, changes, isDirty]);\r\n\r\n const reset = useCallback(() => {\r\n setChanges({});\r\n }, []);\r\n\r\n return {\r\n data,\r\n editData,\r\n loading,\r\n error,\r\n changes,\r\n isDirty,\r\n set,\r\n setMany,\r\n save,\r\n reload: doLoad,\r\n reset,\r\n };\r\n}\r\n\r\n/* ================================================================\r\n useNiceField — two-way bind a SINGLE field (for editors)\r\n ================================================================ */\r\n\r\nexport interface NiceFieldState {\r\n value: unknown;\r\n setValue: (v: unknown) => void;\r\n loading: boolean;\r\n error: string | null;\r\n isDirty: boolean;\r\n /** Save just this field. */\r\n save: () => Promise<void>;\r\n}\r\n\r\nexport function useNiceField<T = any>(\r\n source: NiceDataSource<T> | null | undefined,\r\n key: unknown,\r\n field: string,\r\n): NiceFieldState {\r\n const record = useNiceRecord(source, key);\r\n\r\n const value = record.editData[field];\r\n const setValue = useCallback(\r\n (v: unknown) => {\r\n record.set(field, v);\r\n },\r\n [record, field],\r\n );\r\n\r\n const save = useCallback(async () => {\r\n if (!source?.update) {\r\n throw new Error('DataSource is not writable');\r\n }\r\n const fieldChanges = { [field]: record.editData[field] } as Partial<T>;\r\n await source.update(key, fieldChanges);\r\n }, [source, key, field, record.editData]);\r\n\r\n return {\r\n value,\r\n setValue,\r\n loading: record.loading,\r\n error: record.error,\r\n isDirty: field in record.changes,\r\n save,\r\n };\r\n}\r\n\r\n/* ================================================================\r\n useNiceLookupSource — bind a data source as Select/Autocomplete options\r\n ================================================================ */\r\n\r\nexport interface UseNiceLookupSourceOptions {\r\n iconField?: string;\r\n descriptionField?: string;\r\n groupField?: string;\r\n /** Field(s) searched when user types. If omitted, server-side search is used. */\r\n searchFields?: string[];\r\n autoLoad?: boolean;\r\n /** Max items to load. Default: 200. */\r\n take?: number;\r\n}\r\n\r\nexport interface NiceLookupSourceState {\r\n options: NiceOption[];\r\n loading: boolean;\r\n error: string | null;\r\n search: (query: string) => void;\r\n reload: () => void;\r\n}\r\n\r\nexport function useNiceLookupSource<T = any>(\r\n source: NiceDataSource<T> | null | undefined,\r\n valueField: string,\r\n labelField: string,\r\n opts?: UseNiceLookupSourceOptions,\r\n): NiceLookupSourceState {\r\n const autoLoad = opts?.autoLoad ?? true;\r\n const take = opts?.take ?? 200;\r\n\r\n const [rawData, setRawData] = useState<T[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const loadId = useRef(0);\r\n\r\n const doLoad = useCallback(\r\n async (searchQuery?: string) => {\r\n if (!source) {\r\n return;\r\n }\r\n const id = ++loadId.current;\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const result = await source.load({\r\n take,\r\n search: searchQuery || undefined,\r\n searchFields: opts?.searchFields,\r\n });\r\n if (id !== loadId.current) {\r\n return;\r\n }\r\n setRawData(result.data);\r\n } catch (e) {\r\n if (id !== loadId.current) {\r\n return;\r\n }\r\n setError(e instanceof Error ? e.message : String(e));\r\n } finally {\r\n if (id === loadId.current) {\r\n setLoading(false);\r\n }\r\n }\r\n },\r\n [source, take, opts?.searchFields],\r\n );\r\n\r\n useEffect(() => {\r\n if (autoLoad) {\r\n doLoad();\r\n }\r\n }, [doLoad, autoLoad]);\r\n\r\n const options: NiceOption[] = useMemo(() => {\r\n return rawData.map((item) => {\r\n const rec = item as Record<string, unknown>;\r\n const opt: NiceOption = {\r\n value: String(rec[valueField] ?? ''),\r\n label: String(rec[labelField] ?? ''),\r\n };\r\n if (opts?.iconField && rec[opts.iconField] != null) {\r\n opt.icon = rec[opts.iconField] as React.ReactNode;\r\n }\r\n if (opts?.descriptionField && rec[opts.descriptionField] != null) {\r\n opt.description = String(rec[opts.descriptionField]);\r\n }\r\n if (opts?.groupField && rec[opts.groupField] != null) {\r\n opt.group = String(rec[opts.groupField]);\r\n }\r\n return opt;\r\n });\r\n }, [rawData, valueField, labelField, opts?.iconField, opts?.descriptionField, opts?.groupField]);\r\n\r\n const search = useCallback(\r\n (query: string) => {\r\n doLoad(query);\r\n },\r\n [doLoad],\r\n );\r\n\r\n return { options, loading, error, search, reload: () => doLoad() };\r\n}\r\n","/**\r\n * NiceOfflineStorage — IndexedDB-based offline storage\r\n * Sprint 5: Offline Support & Cross-tab Sync\r\n */\r\n\r\nimport type {\r\n NiceDataSource,\r\n NiceLoadOptions,\r\n NiceLoadResult,\r\n NiceSortExpression,\r\n NiceFilterGroup,\r\n NiceFilterCondition,\r\n} from './datasource';\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// INDEXEDDB ADAPTER\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceIndexedDBConfig {\r\n /** Database name */\r\n dbName: string;\r\n /** Store/table name */\r\n storeName: string;\r\n /** Key field (default 'id') */\r\n keyField?: string;\r\n /** Database version (default 1) */\r\n version?: number;\r\n /** Additional indexes to create */\r\n indexes?: Array<{\r\n name: string;\r\n keyPath: string | string[];\r\n unique?: boolean;\r\n }>;\r\n}\r\n\r\n/**\r\n * Creates a data source backed by IndexedDB for offline storage.\r\n */\r\nexport function createIndexedDBDataSource<T extends Record<string, any>>(\r\n config: NiceIndexedDBConfig,\r\n): NiceDataSource<T> & {\r\n clear(): Promise<void>;\r\n count(): Promise<number>;\r\n getAll(): Promise<T[]>;\r\n bulkInsert(items: T[]): Promise<void>;\r\n bulkDelete(keys: unknown[]): Promise<void>;\r\n exportData(): Promise<T[]>;\r\n importData(items: T[]): Promise<void>;\r\n} {\r\n const { dbName, storeName, keyField = 'id', version = 1, indexes = [] } = config;\r\n\r\n let db: IDBDatabase | null = null;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n async function getDB(): Promise<IDBDatabase> {\r\n if (db) {\r\n return db;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(dbName, version);\r\n\r\n request.onerror = () => reject(request.error);\r\n\r\n request.onsuccess = () => {\r\n db = request.result;\r\n resolve(db);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n const database = (event.target as IDBOpenDBRequest).result;\r\n\r\n if (!database.objectStoreNames.contains(storeName)) {\r\n const store = database.createObjectStore(storeName, { keyPath: keyField });\r\n\r\n // Create indexes\r\n for (const idx of indexes) {\r\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique ?? false });\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n async function withStore<R>(\r\n mode: IDBTransactionMode,\r\n callback: (store: IDBObjectStore) => IDBRequest<R>,\r\n ): Promise<R> {\r\n const database = await getDB();\r\n return new Promise((resolve, reject) => {\r\n const tx = database.transaction(storeName, mode);\r\n const store = tx.objectStore(storeName);\r\n const request = callback(store);\r\n\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n async function withStoreCursor(\r\n mode: IDBTransactionMode,\r\n options: NiceLoadOptions,\r\n callback: (cursor: IDBCursorWithValue | null, store: IDBObjectStore) => void,\r\n ): Promise<T[]> {\r\n const database = await getDB();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = database.transaction(storeName, mode);\r\n const store = tx.objectStore(storeName);\r\n const results: T[] = [];\r\n\r\n // Determine if we can use an index for sorting\r\n let source: IDBObjectStore | IDBIndex = store;\r\n let direction: IDBCursorDirection = 'next';\r\n\r\n if (options.sort?.length) {\r\n const sortField = options.sort[0].field;\r\n const sortDir = options.sort[0].direction;\r\n\r\n // Check if we have an index for this field\r\n if (store.indexNames.contains(sortField)) {\r\n source = store.index(sortField);\r\n }\r\n direction = sortDir === 'desc' ? 'prev' : 'next';\r\n }\r\n\r\n const request = source.openCursor(null, direction);\r\n let skipped = 0;\r\n let taken = 0;\r\n const skip = options.skip ?? 0;\r\n const take = options.take ?? Infinity;\r\n\r\n request.onsuccess = () => {\r\n const cursor = request.result;\r\n\r\n if (!cursor || taken >= take) {\r\n resolve(results);\r\n return;\r\n }\r\n\r\n const item = cursor.value as T;\r\n\r\n // Apply filter\r\n if (options.filter && !matchesFilter(item, options.filter)) {\r\n cursor.continue();\r\n return;\r\n }\r\n\r\n // Apply search\r\n if (options.search && !matchesSearch(item, options.search, options.searchFields)) {\r\n cursor.continue();\r\n return;\r\n }\r\n\r\n // Skip\r\n if (skipped < skip) {\r\n skipped++;\r\n cursor.continue();\r\n return;\r\n }\r\n\r\n results.push(item);\r\n taken++;\r\n cursor.continue();\r\n };\r\n\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n function matchesFilter(item: Record<string, unknown>, filter: NiceFilterGroup): boolean {\r\n if (!filter.items.length) {\r\n return true;\r\n }\r\n\r\n const test = (cond: NiceFilterGroup | NiceFilterCondition): boolean => {\r\n if (cond.type === 'group') {\r\n return matchesFilter(item, cond);\r\n }\r\n\r\n const val = item[cond.field];\r\n const target = cond.value;\r\n\r\n switch (cond.operator) {\r\n case '=':\r\n return val == target;\r\n case '<>':\r\n return val != target;\r\n case '<':\r\n return (val as number) < (target as number);\r\n case '<=':\r\n return (val as number) <= (target as number);\r\n case '>':\r\n return (val as number) > (target as number);\r\n case '>=':\r\n return (val as number) >= (target as number);\r\n case 'contains':\r\n return String(val ?? '')\r\n .toLowerCase()\r\n .includes(String(target ?? '').toLowerCase());\r\n case 'notcontains':\r\n return !String(val ?? '')\r\n .toLowerCase()\r\n .includes(String(target ?? '').toLowerCase());\r\n case 'startswith':\r\n return String(val ?? '')\r\n .toLowerCase()\r\n .startsWith(String(target ?? '').toLowerCase());\r\n case 'endswith':\r\n return String(val ?? '')\r\n .toLowerCase()\r\n .endsWith(String(target ?? '').toLowerCase());\r\n case 'isblank':\r\n return val == null || val === '';\r\n case 'isnotblank':\r\n return val != null && val !== '';\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n if (filter.logic === 'and') {\r\n return filter.items.every(test);\r\n }\r\n return filter.items.some(test);\r\n }\r\n\r\n function matchesSearch(\r\n item: Record<string, unknown>,\r\n search: string,\r\n fields?: string[],\r\n ): boolean {\r\n const q = search.toLowerCase();\r\n const vals = fields ? fields.map((f) => item[f]) : Object.values(item);\r\n return vals.some((v) =>\r\n String(v ?? '')\r\n .toLowerCase()\r\n .includes(q),\r\n );\r\n }\r\n\r\n return {\r\n keyField,\r\n writable: true,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n emit('loading', true);\r\n try {\r\n const data = await withStoreCursor('readonly', options, () => {});\r\n\r\n // If no cursor-based sorting was possible, sort in memory\r\n if (options.sort?.length) {\r\n data.sort((a, b) => {\r\n for (const s of options.sort!) {\r\n const av = a[s.field] ?? '';\r\n const bv = b[s.field] ?? '';\r\n const cmp =\r\n typeof av === 'number' && typeof bv === 'number'\r\n ? av - bv\r\n : String(av).localeCompare(String(bv));\r\n if (cmp !== 0) {\r\n return s.direction === 'desc' ? -cmp : cmp;\r\n }\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n const count = await this.count();\r\n const result: NiceLoadResult<T> = { data, totalCount: count };\r\n\r\n emit('loaded', result);\r\n emit('loading', false);\r\n return result;\r\n } catch (e) {\r\n emit('error', e);\r\n emit('loading', false);\r\n throw e;\r\n }\r\n },\r\n\r\n async byKey(key: unknown) {\r\n return withStore('readonly', (store) => store.get(key as IDBValidKey)) as Promise<\r\n T | undefined\r\n >;\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n const result = await withStore('readwrite', (store) => store.add(item));\r\n emit('changed');\r\n return item as T;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const existing = await this.byKey(key);\r\n if (!existing) {\r\n throw new Error(`Record not found: ${key}`);\r\n }\r\n\r\n const updated = { ...existing, ...changes };\r\n await withStore('readwrite', (store) => store.put(updated));\r\n emit('changed');\r\n return updated;\r\n },\r\n\r\n async remove(key: unknown) {\r\n await withStore('readwrite', (store) => store.delete(key as IDBValidKey));\r\n emit('changed');\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n return () => listeners.get(event)?.delete(handler);\r\n },\r\n\r\n async clear() {\r\n await withStore('readwrite', (store) => store.clear());\r\n emit('changed');\r\n },\r\n\r\n async count() {\r\n return withStore('readonly', (store) => store.count());\r\n },\r\n\r\n async getAll() {\r\n return withStore('readonly', (store) => store.getAll()) as Promise<T[]>;\r\n },\r\n\r\n async bulkInsert(items: T[]) {\r\n const database = await getDB();\r\n return new Promise((resolve, reject) => {\r\n const tx = database.transaction(storeName, 'readwrite');\r\n const store = tx.objectStore(storeName);\r\n\r\n for (const item of items) {\r\n store.put(item);\r\n }\r\n\r\n tx.oncomplete = () => {\r\n emit('changed');\r\n resolve();\r\n };\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n },\r\n\r\n async bulkDelete(keys: unknown[]) {\r\n const database = await getDB();\r\n return new Promise((resolve, reject) => {\r\n const tx = database.transaction(storeName, 'readwrite');\r\n const store = tx.objectStore(storeName);\r\n\r\n for (const key of keys) {\r\n store.delete(key as IDBValidKey);\r\n }\r\n\r\n tx.oncomplete = () => {\r\n emit('changed');\r\n resolve();\r\n };\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n },\r\n\r\n async exportData() {\r\n return this.getAll();\r\n },\r\n\r\n async importData(items: T[]) {\r\n await this.clear();\r\n await this.bulkInsert(items);\r\n },\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// OFFLINE-FIRST DATA SOURCE\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceOfflineFirstConfig<T> {\r\n /** Remote data source */\r\n remoteSource: NiceDataSource<T>;\r\n /** IndexedDB configuration */\r\n offlineConfig: NiceIndexedDBConfig;\r\n /** Sync strategy */\r\n syncStrategy?: 'remote-first' | 'local-first' | 'merge';\r\n /** Conflict resolution */\r\n onConflict?: (local: T, remote: T) => T;\r\n /** Called when sync completes */\r\n onSync?: (result: { added: number; updated: number; removed: number }) => void;\r\n /** Auto-sync interval in ms (0 to disable) */\r\n autoSyncInterval?: number;\r\n}\r\n\r\nexport interface NicePendingChange<T> {\r\n id: string;\r\n action: 'insert' | 'update' | 'remove';\r\n key?: unknown;\r\n data?: Partial<T>;\r\n timestamp: number;\r\n retries: number;\r\n}\r\n\r\n/**\r\n * Creates an offline-first data source that syncs with a remote source.\r\n * Works offline and syncs changes when back online.\r\n */\r\nexport function createOfflineFirstDataSource<T extends Record<string, any>>(\r\n config: NiceOfflineFirstConfig<T>,\r\n): NiceDataSource<T> & {\r\n sync(): Promise<void>;\r\n isOnline(): boolean;\r\n getPendingChanges(): Promise<NicePendingChange<T>[]>;\r\n clearPendingChanges(): Promise<void>;\r\n} {\r\n const {\r\n remoteSource,\r\n offlineConfig,\r\n syncStrategy = 'remote-first',\r\n onConflict,\r\n onSync,\r\n autoSyncInterval = 0,\r\n } = config;\r\n\r\n const keyField = offlineConfig.keyField ?? remoteSource.keyField;\r\n const localSource = createIndexedDBDataSource<T>({ ...offlineConfig, keyField });\r\n\r\n // Pending changes store\r\n const pendingStore = createIndexedDBDataSource<NicePendingChange<T>>({\r\n dbName: offlineConfig.dbName,\r\n storeName: `${offlineConfig.storeName}_pending`,\r\n keyField: 'id',\r\n });\r\n\r\n let isOnline = navigator.onLine;\r\n let syncTimer: number | null = null;\r\n let pendingId = 0;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n // Track online status\r\n window.addEventListener('online', () => {\r\n isOnline = true;\r\n emit('online');\r\n sync();\r\n });\r\n\r\n window.addEventListener('offline', () => {\r\n isOnline = false;\r\n emit('offline');\r\n });\r\n\r\n async function addPendingChange(\r\n action: 'insert' | 'update' | 'remove',\r\n key?: unknown,\r\n data?: Partial<T>,\r\n ): Promise<void> {\r\n const change: NicePendingChange<T> = {\r\n id: `pending_${++pendingId}_${Date.now()}`,\r\n action,\r\n key,\r\n data,\r\n timestamp: Date.now(),\r\n retries: 0,\r\n };\r\n await pendingStore.insert!(change);\r\n }\r\n\r\n async function sync(): Promise<void> {\r\n if (!isOnline) {\r\n return;\r\n }\r\n\r\n emit('syncing', true);\r\n\r\n try {\r\n let added = 0,\r\n updated = 0,\r\n removed = 0;\r\n\r\n // Process pending changes\r\n const pending = await pendingStore.load();\r\n\r\n for (const change of pending.data) {\r\n try {\r\n switch (change.action) {\r\n case 'insert':\r\n await remoteSource.insert!(change.data as Partial<T>);\r\n added++;\r\n break;\r\n case 'update':\r\n await remoteSource.update!(change.key, change.data as Partial<T>);\r\n updated++;\r\n break;\r\n case 'remove':\r\n await remoteSource.remove!(change.key);\r\n removed++;\r\n break;\r\n }\r\n await pendingStore.remove!(change.id);\r\n } catch (e) {\r\n // Increment retry count\r\n if (change.retries < 3) {\r\n await pendingStore.update!(change.id, { retries: change.retries + 1 });\r\n }\r\n }\r\n }\r\n\r\n // Sync from remote\r\n if (syncStrategy !== 'local-first') {\r\n const remoteResult = await remoteSource.load();\r\n\r\n if (syncStrategy === 'remote-first') {\r\n await localSource.importData(remoteResult.data);\r\n } else if (syncStrategy === 'merge' && onConflict) {\r\n const localResult = await localSource.load();\r\n const localMap = new Map(localResult.data.map((item) => [item[keyField], item]));\r\n\r\n const merged: T[] = [];\r\n for (const remoteItem of remoteResult.data) {\r\n const localItem = localMap.get(remoteItem[keyField]);\r\n if (localItem) {\r\n merged.push(onConflict(localItem, remoteItem));\r\n } else {\r\n merged.push(remoteItem);\r\n }\r\n }\r\n\r\n await localSource.importData(merged);\r\n }\r\n }\r\n\r\n emit('synced', { added, updated, removed });\r\n onSync?.({ added, updated, removed });\r\n } catch (e) {\r\n emit('syncError', e);\r\n } finally {\r\n emit('syncing', false);\r\n }\r\n }\r\n\r\n // Auto-sync\r\n if (autoSyncInterval > 0) {\r\n syncTimer = window.setInterval(sync, autoSyncInterval);\r\n }\r\n\r\n return {\r\n keyField,\r\n writable: true,\r\n\r\n async load(options: NiceLoadOptions = {}) {\r\n // Try remote first if online\r\n if (isOnline && syncStrategy === 'remote-first') {\r\n try {\r\n const result = await remoteSource.load(options);\r\n // Update local cache\r\n await localSource.bulkInsert(result.data);\r\n return result;\r\n } catch {\r\n // Fall back to local\r\n }\r\n }\r\n\r\n return localSource.load(options);\r\n },\r\n\r\n async byKey(key: unknown) {\r\n if (isOnline) {\r\n try {\r\n const result = await remoteSource.byKey(key);\r\n if (result) {\r\n await localSource.update!(key, result).catch(() => localSource.insert!(result));\r\n }\r\n return result;\r\n } catch {\r\n // Fall back to local\r\n }\r\n }\r\n\r\n return localSource.byKey(key);\r\n },\r\n\r\n async insert(item: Partial<T>) {\r\n // Always write locally first\r\n const localResult = await localSource.insert!(item);\r\n\r\n if (isOnline) {\r\n try {\r\n return await remoteSource.insert!(item);\r\n } catch {\r\n await addPendingChange('insert', undefined, item);\r\n }\r\n } else {\r\n await addPendingChange('insert', undefined, item);\r\n }\r\n\r\n emit('changed');\r\n return localResult;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const localResult = await localSource.update!(key, changes);\r\n\r\n if (isOnline) {\r\n try {\r\n return await remoteSource.update!(key, changes);\r\n } catch {\r\n await addPendingChange('update', key, changes);\r\n }\r\n } else {\r\n await addPendingChange('update', key, changes);\r\n }\r\n\r\n emit('changed');\r\n return localResult;\r\n },\r\n\r\n async remove(key: unknown) {\r\n await localSource.remove!(key);\r\n\r\n if (isOnline) {\r\n try {\r\n await remoteSource.remove!(key);\r\n } catch {\r\n await addPendingChange('remove', key);\r\n }\r\n } else {\r\n await addPendingChange('remove', key);\r\n }\r\n\r\n emit('changed');\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n return () => listeners.get(event)?.delete(handler);\r\n },\r\n\r\n sync,\r\n isOnline: () => isOnline,\r\n\r\n async getPendingChanges() {\r\n const result = await pendingStore.load();\r\n return result.data;\r\n },\r\n\r\n async clearPendingChanges() {\r\n await pendingStore.clear();\r\n },\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// CROSS-TAB STATE SYNCHRONIZATION\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceCrossTabSyncConfig<T> {\r\n /** Channel name for BroadcastChannel */\r\n channelName: string;\r\n /** Data source to sync */\r\n source: NiceDataSource<T>;\r\n}\r\n\r\nexport type CrossTabMessage<T> =\r\n | { type: 'insert'; data: T }\r\n | { type: 'update'; key: unknown; changes: Partial<T> }\r\n | { type: 'remove'; key: unknown }\r\n | { type: 'refresh' }\r\n | { type: 'request-sync' }\r\n | { type: 'sync-data'; data: T[] };\r\n\r\n/**\r\n * Wraps a data source with cross-tab synchronization using BroadcastChannel.\r\n */\r\nexport function withCrossTabSync<T extends Record<string, any>>(\r\n config: NiceCrossTabSyncConfig<T>,\r\n): NiceDataSource<T> & {\r\n broadcast(msg: CrossTabMessage<T>): void;\r\n requestSync(): void;\r\n} {\r\n const { channelName, source } = config;\r\n const channel = new BroadcastChannel(channelName);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- internal emitter satisfies generic Listener<T> from typed NiceDataSourceEventMap; widening to unknown breaks variance with consumers\r\n type Listener = (...args: any[]) => void;\r\n const listeners = new Map<string, Set<Listener>>();\r\n\r\n function emit(event: string, ...args: any[]) {\r\n listeners.get(event)?.forEach((fn) => fn(...args));\r\n }\r\n\r\n // Handle incoming messages\r\n channel.onmessage = (event) => {\r\n const msg = event.data as CrossTabMessage<T>;\r\n\r\n switch (msg.type) {\r\n case 'insert':\r\n case 'update':\r\n case 'remove':\r\n emit('changed');\r\n emit('crossTabChange', msg);\r\n break;\r\n case 'refresh':\r\n emit('refresh');\r\n break;\r\n case 'request-sync':\r\n // Another tab is requesting current data\r\n source.load().then((result) => {\r\n channel.postMessage({ type: 'sync-data', data: result.data });\r\n });\r\n break;\r\n }\r\n };\r\n\r\n function broadcast(msg: CrossTabMessage<T>): void {\r\n channel.postMessage(msg);\r\n }\r\n\r\n return {\r\n ...source,\r\n\r\n async insert(item: Partial<T>) {\r\n const result = await source.insert!(item);\r\n broadcast({ type: 'insert', data: result });\r\n return result;\r\n },\r\n\r\n async update(key: unknown, changes: Partial<T>) {\r\n const result = await source.update!(key, changes);\r\n broadcast({ type: 'update', key, changes });\r\n return result;\r\n },\r\n\r\n async remove(key: unknown) {\r\n await source.remove!(key);\r\n broadcast({ type: 'remove', key });\r\n },\r\n\r\n on(event: string, handler: Listener) {\r\n if (!listeners.has(event)) {\r\n listeners.set(event, new Set());\r\n }\r\n listeners.get(event)!.add(handler);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- forwarding event name to underlying source.on (typed string union narrower than `string`)\r\n const unsub = source.on(event as any, handler);\r\n return () => {\r\n listeners.get(event)?.delete(handler);\r\n unsub();\r\n };\r\n },\r\n\r\n broadcast,\r\n\r\n requestSync() {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- broadcast message envelope is a discriminated union; this minimal payload is the request variant\r\n broadcast({ type: 'request-sync' } as any);\r\n },\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// URL STATE MANAGEMENT\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceURLStateConfig {\r\n /** Prefix for URL params (default '') */\r\n prefix?: string;\r\n /** Which state to persist */\r\n persist?: {\r\n filter?: boolean;\r\n sort?: boolean;\r\n page?: boolean;\r\n search?: boolean;\r\n };\r\n /** Use hash instead of query string */\r\n useHash?: boolean;\r\n}\r\n\r\nexport interface NiceURLState {\r\n filter?: NiceFilterGroup;\r\n sort?: NiceSortExpression[];\r\n skip?: number;\r\n take?: number;\r\n search?: string;\r\n}\r\n\r\n/**\r\n * Manages data source state in URL for bookmarkable/shareable views.\r\n */\r\nexport function createURLStateManager(config: NiceURLStateConfig = {}) {\r\n const {\r\n prefix = '',\r\n persist = { filter: true, sort: true, page: true, search: true },\r\n useHash = false,\r\n } = config;\r\n\r\n function getParams(): URLSearchParams {\r\n if (useHash) {\r\n return new URLSearchParams(window.location.hash.slice(1));\r\n }\r\n return new URLSearchParams(window.location.search);\r\n }\r\n\r\n function setParams(params: URLSearchParams): void {\r\n if (useHash) {\r\n window.location.hash = params.toString();\r\n } else {\r\n const url = new URL(window.location.href);\r\n url.search = params.toString();\r\n window.history.replaceState({}, '', url.toString());\r\n }\r\n }\r\n\r\n function key(name: string): string {\r\n return prefix ? `${prefix}_${name}` : name;\r\n }\r\n\r\n return {\r\n /**\r\n * Read current state from URL.\r\n */\r\n read(): NiceURLState {\r\n const params = getParams();\r\n const state: NiceURLState = {};\r\n\r\n if (persist.filter) {\r\n const filterStr = params.get(key('filter'));\r\n if (filterStr) {\r\n try {\r\n state.filter = JSON.parse(filterStr);\r\n } catch {}\r\n }\r\n }\r\n\r\n if (persist.sort) {\r\n const sortStr = params.get(key('sort'));\r\n if (sortStr) {\r\n try {\r\n state.sort = JSON.parse(sortStr);\r\n } catch {}\r\n }\r\n }\r\n\r\n if (persist.page) {\r\n const skip = params.get(key('skip'));\r\n const take = params.get(key('take'));\r\n if (skip) {\r\n state.skip = parseInt(skip, 10);\r\n }\r\n if (take) {\r\n state.take = parseInt(take, 10);\r\n }\r\n }\r\n\r\n if (persist.search) {\r\n const search = params.get(key('search'));\r\n if (search) {\r\n state.search = search;\r\n }\r\n }\r\n\r\n return state;\r\n },\r\n\r\n /**\r\n * Write state to URL.\r\n */\r\n write(state: NiceURLState): void {\r\n const params = getParams();\r\n\r\n if (persist.filter) {\r\n if (state.filter && state.filter.items.length > 0) {\r\n params.set(key('filter'), JSON.stringify(state.filter));\r\n } else {\r\n params.delete(key('filter'));\r\n }\r\n }\r\n\r\n if (persist.sort) {\r\n if (state.sort && state.sort.length > 0) {\r\n params.set(key('sort'), JSON.stringify(state.sort));\r\n } else {\r\n params.delete(key('sort'));\r\n }\r\n }\r\n\r\n if (persist.page) {\r\n if (state.skip) {\r\n params.set(key('skip'), String(state.skip));\r\n } else {\r\n params.delete(key('skip'));\r\n }\r\n if (state.take) {\r\n params.set(key('take'), String(state.take));\r\n } else {\r\n params.delete(key('take'));\r\n }\r\n }\r\n\r\n if (persist.search) {\r\n if (state.search) {\r\n params.set(key('search'), state.search);\r\n } else {\r\n params.delete(key('search'));\r\n }\r\n }\r\n\r\n setParams(params);\r\n },\r\n\r\n /**\r\n * Clear all state from URL.\r\n */\r\n clear(): void {\r\n const params = getParams();\r\n params.delete(key('filter'));\r\n params.delete(key('sort'));\r\n params.delete(key('skip'));\r\n params.delete(key('take'));\r\n params.delete(key('search'));\r\n setParams(params);\r\n },\r\n\r\n /**\r\n * Create load options from URL state.\r\n */\r\n toLoadOptions(): NiceLoadOptions {\r\n const state = this.read();\r\n return {\r\n filter: state.filter,\r\n sort: state.sort,\r\n skip: state.skip,\r\n take: state.take,\r\n search: state.search,\r\n };\r\n },\r\n };\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// STATE EXPORT/IMPORT\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceStateSnapshot {\r\n version: string;\r\n timestamp: number;\r\n data: unknown[];\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Utilities for exporting and importing data source state.\r\n */\r\nexport const NiceStateIO = {\r\n /**\r\n * Export data to JSON string.\r\n */\r\n async exportToJSON<T>(\r\n source: NiceDataSource<T>,\r\n metadata?: Record<string, unknown>,\r\n ): Promise<string> {\r\n const result = await source.load();\r\n const snapshot: NiceStateSnapshot = {\r\n version: '1.0',\r\n timestamp: Date.now(),\r\n data: result.data,\r\n metadata,\r\n };\r\n return JSON.stringify(snapshot, null, 2);\r\n },\r\n\r\n /**\r\n * Import data from JSON string.\r\n */\r\n async importFromJSON<T>(\r\n source: NiceDataSource<T> & { bulkInsert?(items: T[]): Promise<void> },\r\n json: string,\r\n options: { replace?: boolean; validate?: (item: T) => boolean } = {},\r\n ): Promise<{ imported: number; skipped: number }> {\r\n const snapshot: NiceStateSnapshot = JSON.parse(json);\r\n const items = snapshot.data as T[];\r\n\r\n let imported = 0;\r\n let skipped = 0;\r\n\r\n if (options.replace && 'clear' in source) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- structural check above guarantees `clear` exists on this source variant\r\n await (source as any).clear();\r\n }\r\n\r\n for (const item of items) {\r\n if (options.validate && !options.validate(item)) {\r\n skipped++;\r\n continue;\r\n }\r\n\r\n try {\r\n await source.insert!(item);\r\n imported++;\r\n } catch {\r\n skipped++;\r\n }\r\n }\r\n\r\n return { imported, skipped };\r\n },\r\n\r\n /**\r\n * Download data as JSON file.\r\n */\r\n async downloadAsJSON<T>(\r\n source: NiceDataSource<T>,\r\n filename: string = 'export.json',\r\n ): Promise<void> {\r\n const json = await this.exportToJSON(source);\r\n const blob = new Blob([json], { type: 'application/json' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.click();\r\n\r\n URL.revokeObjectURL(url);\r\n },\r\n\r\n /**\r\n * Import from file input.\r\n */\r\n async importFromFile<T>(\r\n source: NiceDataSource<T>,\r\n file: File,\r\n options?: { replace?: boolean; validate?: (item: T) => boolean },\r\n ): Promise<{ imported: number; skipped: number }> {\r\n const json = await file.text();\r\n return this.importFromJSON(source, json, options);\r\n },\r\n};\r\n\r\n// ════════════════════════════════════════════════════════════════\r\n// USER PREFERENCES STORAGE\r\n// ════════════════════════════════════════════════════════════════\r\n\r\nexport interface NiceUserPreferences {\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Manages user preferences with localStorage backend.\r\n */\r\nexport function createUserPreferencesStore(storageKey: string = 'nice_user_prefs') {\r\n let cache: NiceUserPreferences | null = null;\r\n\r\n function load(): NiceUserPreferences {\r\n if (cache) {\r\n return cache;\r\n }\r\n\r\n try {\r\n const stored = localStorage.getItem(storageKey);\r\n cache = stored ? JSON.parse(stored) : {};\r\n } catch {\r\n cache = {};\r\n }\r\n\r\n return cache!;\r\n }\r\n\r\n function save(prefs: NiceUserPreferences): void {\r\n cache = prefs;\r\n localStorage.setItem(storageKey, JSON.stringify(prefs));\r\n }\r\n\r\n return {\r\n get<T>(key: string, defaultValue?: T): T | undefined {\r\n const prefs = load();\r\n return (prefs[key] as T) ?? defaultValue;\r\n },\r\n\r\n set<T>(key: string, value: T): void {\r\n const prefs = load();\r\n prefs[key] = value;\r\n save(prefs);\r\n },\r\n\r\n remove(key: string): void {\r\n const prefs = load();\r\n delete prefs[key];\r\n save(prefs);\r\n },\r\n\r\n getAll(): NiceUserPreferences {\r\n return { ...load() };\r\n },\r\n\r\n setAll(prefs: NiceUserPreferences): void {\r\n save(prefs);\r\n },\r\n\r\n clear(): void {\r\n cache = {};\r\n localStorage.removeItem(storageKey);\r\n },\r\n\r\n /**\r\n * Merge with existing preferences.\r\n */\r\n merge(prefs: Partial<NiceUserPreferences>): void {\r\n save({ ...load(), ...prefs });\r\n },\r\n };\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Theme System (serializable, storable, creatable)\r\n// ============================================================\r\n\r\nimport { createContext, useContext } from 'react';\r\n\r\n// ── Theme type ──────────────────────────────────────────────\r\n\r\n/** Brand / semantic color palette. */\r\nexport interface NiceThemeColors {\r\n primary: string;\r\n primaryHover?: string;\r\n success: string;\r\n warning?: string;\r\n error: string;\r\n info?: string;\r\n /** Accent / secondary brand color */\r\n accent?: string;\r\n accentHover?: string;\r\n /** Alias for `accent`. */\r\n secondary?: string;\r\n /** Link colors */\r\n link?: string;\r\n linkHover?: string;\r\n /** Focus ring color */\r\n focus?: string;\r\n /** Overlay / backdrop color (e.g. 'rgba(0,0,0,0.5)') */\r\n overlay?: string;\r\n /** Surface variant for panels / cards */\r\n surface?: string;\r\n surfaceHover?: string;\r\n /** Disabled state color */\r\n disabled?: string;\r\n disabledText?: string;\r\n}\r\n\r\n/** Surface background colours. */\r\nexport interface NiceThemeBackgrounds {\r\n primary: string;\r\n secondary: string;\r\n tertiary: string;\r\n hover: string;\r\n /** Elevated surface (modals, popovers) */\r\n elevated?: string;\r\n /** Inset surface (wells, code blocks) */\r\n inset?: string;\r\n /** Canvas / root-level body background */\r\n canvas?: string;\r\n}\r\n\r\n/** Extended background image / pattern options. */\r\nexport interface NiceThemeBackgroundImage {\r\n /** Background type */\r\n type?: 'none' | 'solid' | 'gradient' | 'image' | 'pattern';\r\n /** CSS gradient string (e.g. 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)') */\r\n gradient?: string;\r\n /** Image URL */\r\n imageUrl?: string;\r\n /** CSS background-size */\r\n imageSize?: 'cover' | 'contain' | 'auto' | string;\r\n /** CSS background-position */\r\n imagePosition?: string;\r\n /** CSS background-attachment */\r\n imageAttachment?: 'scroll' | 'fixed' | 'local';\r\n /** CSS background-repeat */\r\n imageRepeat?: 'repeat' | 'no-repeat' | 'repeat-x' | 'repeat-y';\r\n /** Named SVG pattern (dots, grid, diagonal, cross-hatch, waves, hexagons, triangles, circles, zigzag, noise) */\r\n pattern?: string;\r\n /** Pattern / overlay opacity (0-1) */\r\n opacity?: number;\r\n /** CSS background-blend-mode */\r\n blendMode?: string;\r\n}\r\n\r\n/** Text colour levels. */\r\nexport interface NiceThemeText {\r\n primary: string;\r\n secondary: string;\r\n muted: string;\r\n /** Inverse text for dark-on-light / light-on-dark */\r\n inverse?: string;\r\n /** Text on primary-colored backgrounds */\r\n onPrimary?: string;\r\n /** Text on accent-colored backgrounds */\r\n onAccent?: string;\r\n}\r\n\r\n/** Border colour and radius presets. */\r\nexport interface NiceThemeBorders {\r\n color: string;\r\n radiusSm: string;\r\n radiusMd: string;\r\n radiusLg: string;\r\n radiusXl: string;\r\n radiusFull: string;\r\n /** Border width for inputs, cards etc. */\r\n width?: string;\r\n /** Focus border color */\r\n focusColor?: string;\r\n /** Divider / separator color */\r\n divider?: string;\r\n}\r\n\r\n/** Elevation shadow presets. */\r\nexport interface NiceThemeShadows {\r\n sm: string;\r\n md: string;\r\n lg: string;\r\n xl: string;\r\n /** Inner / inset shadow */\r\n inner?: string;\r\n /** Colored glow shadow using primary color */\r\n glow?: string;\r\n}\r\n\r\n/** Spacing scale values. */\r\nexport interface NiceThemeSpacing {\r\n space1?: string;\r\n space2?: string;\r\n space3?: string;\r\n space4?: string;\r\n space5?: string;\r\n space6?: string;\r\n space8?: string;\r\n /** Extra spacing levels */\r\n space10?: string;\r\n space12?: string;\r\n space16?: string;\r\n /** Convenience t-shirt aliases. */\r\n xs?: string | number;\r\n sm?: string | number;\r\n md?: string | number;\r\n lg?: string | number;\r\n xl?: string | number;\r\n}\r\n\r\n/** Typography settings: font family, sizes, weights, line height. */\r\nexport interface NiceThemeTypography {\r\n fontFamily: string;\r\n fontSizeXs: string;\r\n fontSizeSm: string;\r\n fontSizeMd: string;\r\n fontSizeLg: string;\r\n fontSizeXl: string;\r\n fontWeightNormal: number;\r\n fontWeightMedium: number;\r\n fontWeightSemibold: number;\r\n fontWeightBold: number;\r\n lineHeight: number;\r\n /** Secondary / heading font family */\r\n headingFontFamily?: string;\r\n /** Monospace font family */\r\n monoFontFamily?: string;\r\n /** Font size for 2xl headings */\r\n fontSize2xl?: string;\r\n /** Font size for 3xl headings */\r\n fontSize3xl?: string;\r\n /** Letter spacing */\r\n letterSpacing?: string;\r\n /** Heading letter spacing (often tighter) */\r\n headingLetterSpacing?: string;\r\n}\r\n\r\n/** CSS transition duration presets. */\r\nexport interface NiceThemeTransitions {\r\n fast: string;\r\n normal: string;\r\n slow: string;\r\n}\r\n\r\n/** Dark mode preference. */\r\nexport type NiceThemeDarkMode = 'light' | 'dark' | 'auto';\r\n\r\n/**\r\n * Complete theme definition — a JSON-serializable object that controls all visual styling\r\n * via CSS custom properties. Can be created, stored, and loaded at runtime.\r\n */\r\nexport interface NiceTheme {\r\n name: string;\r\n colors: NiceThemeColors;\r\n backgrounds: NiceThemeBackgrounds;\r\n text: NiceThemeText;\r\n borders: NiceThemeBorders;\r\n shadows: NiceThemeShadows;\r\n spacing: NiceThemeSpacing;\r\n typography: NiceThemeTypography;\r\n /** Convenience alias for {@link typography} (accepts a free-form font map). */\r\n fonts?: Record<string, string> | NiceThemeTypography;\r\n transitions: NiceThemeTransitions;\r\n /** Extended background image / pattern options */\r\n backgroundImage?: NiceThemeBackgroundImage;\r\n /** Dark mode preference for this theme */\r\n darkMode?: NiceThemeDarkMode;\r\n /** Paired dark companion theme name (for auto switching) */\r\n darkThemeName?: string;\r\n /**\r\n * Display style the theme was designed around. When set, a\r\n * NiceThemeProvider that receives this theme but no explicit\r\n * `displayStyle` prop will fall back to this value instead of 'default'.\r\n */\r\n recommendedDisplayStyle?: import('./displayStyle').NiceDisplayStyle;\r\n}\r\n\r\n// ── CSS variable mapping ────────────────────────────────────\r\n\r\nconst THEME_TO_CSS: Record<string, string> = {\r\n // Colors\r\n 'colors.primary': '--color-primary',\r\n 'colors.primaryHover': '--color-primary-hover',\r\n 'colors.success': '--color-success',\r\n 'colors.warning': '--color-warning',\r\n 'colors.error': '--color-error',\r\n 'colors.info': '--color-info',\r\n 'colors.accent': '--color-accent',\r\n 'colors.accentHover': '--color-accent-hover',\r\n 'colors.link': '--color-link',\r\n 'colors.linkHover': '--color-link-hover',\r\n 'colors.focus': '--color-focus',\r\n 'colors.overlay': '--color-overlay',\r\n 'colors.surface': '--color-surface',\r\n 'colors.surfaceHover': '--color-surface-hover',\r\n 'colors.disabled': '--color-disabled',\r\n 'colors.disabledText': '--color-disabled-text',\r\n // Backgrounds\r\n 'backgrounds.primary': '--bg-primary',\r\n 'backgrounds.secondary': '--bg-secondary',\r\n 'backgrounds.tertiary': '--bg-tertiary',\r\n 'backgrounds.hover': '--hover-bg',\r\n 'backgrounds.elevated': '--bg-elevated',\r\n 'backgrounds.inset': '--bg-inset',\r\n 'backgrounds.canvas': '--bg-canvas',\r\n // Text\r\n 'text.primary': '--text-primary',\r\n 'text.secondary': '--text-secondary',\r\n 'text.muted': '--text-muted',\r\n 'text.inverse': '--text-inverse',\r\n 'text.onPrimary': '--text-on-primary',\r\n 'text.onAccent': '--text-on-accent',\r\n // Borders\r\n 'borders.color': '--border-color',\r\n 'borders.radiusSm': '--nice-radius-sm',\r\n 'borders.radiusMd': '--nice-radius-md',\r\n 'borders.radiusLg': '--nice-radius-lg',\r\n 'borders.radiusXl': '--nice-radius-xl',\r\n 'borders.radiusFull': '--nice-radius-full',\r\n 'borders.width': '--border-width',\r\n 'borders.focusColor': '--border-focus-color',\r\n 'borders.divider': '--border-divider',\r\n // Shadows\r\n 'shadows.sm': '--shadow-sm',\r\n 'shadows.md': '--shadow-md',\r\n 'shadows.lg': '--shadow-lg',\r\n 'shadows.xl': '--shadow-xl',\r\n 'shadows.inner': '--shadow-inner',\r\n 'shadows.glow': '--shadow-glow',\r\n // Spacing\r\n 'spacing.space1': '--nice-space-1',\r\n 'spacing.space2': '--nice-space-2',\r\n 'spacing.space3': '--nice-space-3',\r\n 'spacing.space4': '--nice-space-4',\r\n 'spacing.space5': '--nice-space-5',\r\n 'spacing.space6': '--nice-space-6',\r\n 'spacing.space8': '--nice-space-8',\r\n 'spacing.space10': '--nice-space-10',\r\n 'spacing.space12': '--nice-space-12',\r\n 'spacing.space16': '--nice-space-16',\r\n // Typography\r\n 'typography.fontFamily': '--nice-font-family',\r\n 'typography.fontSizeXs': '--nice-font-size-xs',\r\n 'typography.fontSizeSm': '--nice-font-size-sm',\r\n 'typography.fontSizeMd': '--nice-font-size-md',\r\n 'typography.fontSizeLg': '--nice-font-size-lg',\r\n 'typography.fontSizeXl': '--nice-font-size-xl',\r\n 'typography.fontSize2xl': '--nice-font-size-2xl',\r\n 'typography.fontSize3xl': '--nice-font-size-3xl',\r\n 'typography.fontWeightNormal': '--nice-font-weight-normal',\r\n 'typography.fontWeightMedium': '--nice-font-weight-medium',\r\n 'typography.fontWeightSemibold': '--nice-font-weight-semibold',\r\n 'typography.fontWeightBold': '--nice-font-weight-bold',\r\n 'typography.lineHeight': '--nice-line-height',\r\n 'typography.headingFontFamily': '--nice-heading-font-family',\r\n 'typography.monoFontFamily': '--nice-mono-font-family',\r\n 'typography.letterSpacing': '--nice-letter-spacing',\r\n 'typography.headingLetterSpacing': '--nice-heading-letter-spacing',\r\n // Transitions\r\n 'transitions.fast': '--nice-transition-fast',\r\n 'transitions.normal': '--nice-transition',\r\n 'transitions.slow': '--nice-transition-slow',\r\n};\r\n\r\n// ── Theme → CSS variables ───────────────────────────────────\r\n\r\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\r\n return path.split('.').reduce<unknown>((acc, key) => {\r\n if (acc && typeof acc === 'object') {\r\n return (acc as Record<string, unknown>)[key];\r\n }\r\n return undefined;\r\n }, obj);\r\n}\r\n\r\n/** Converts a {@link NiceTheme} to a flat `Record<string, string>` of CSS custom properties. */\r\nexport function themeToCssVars(theme: NiceTheme): Record<string, string> {\r\n const vars: Record<string, string> = {};\r\n for (const [path, cssVar] of Object.entries(THEME_TO_CSS)) {\r\n const val = getNestedValue(theme as unknown as Record<string, unknown>, path);\r\n if (val !== undefined) {\r\n vars[cssVar] = String(val);\r\n }\r\n }\r\n return vars;\r\n}\r\n\r\n/** Applies a theme to the DOM by setting CSS custom properties on the target element (defaults to `:root`). */\r\nexport function applyTheme(theme: NiceTheme, element?: HTMLElement): void {\r\n const target = element ?? document.documentElement;\r\n const vars = themeToCssVars(theme);\r\n for (const [prop, value] of Object.entries(vars)) {\r\n target.style.setProperty(prop, value);\r\n }\r\n // Apply background image / pattern CSS vars\r\n applyBackgroundImage(theme.backgroundImage, target);\r\n // Set dark mode data attribute\r\n if (theme.darkMode) {\r\n target.dataset.ntdColorScheme = theme.darkMode;\r\n }\r\n}\r\n\r\n// ── SVG pattern library ─────────────────────────────────────\r\n\r\nconst SVG_PATTERNS: Record<string, string> = {\r\n dots: `<svg width=\"20\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"2\" cy=\"2\" r=\"1\" fill=\"currentColor\" opacity=\"0.15\"/></svg>`,\r\n grid: `<svg width=\"20\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M20 0H0v20\" fill=\"none\" stroke=\"currentColor\" stroke-opacity=\"0.08\"/></svg>`,\r\n diagonal: `<svg width=\"10\" height=\"10\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 10L10 0\" stroke=\"currentColor\" stroke-opacity=\"0.08\"/></svg>`,\r\n 'cross-hatch': `<svg width=\"10\" height=\"10\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 10L10 0M-1 1L1 -1M9 11L11 9\" stroke=\"currentColor\" stroke-opacity=\"0.06\"/></svg>`,\r\n waves: `<svg width=\"40\" height=\"12\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6c5 0 5-6 10-6s5 6 10 6 5-6 10-6 5 6 10 6\" fill=\"none\" stroke=\"currentColor\" stroke-opacity=\"0.08\"/></svg>`,\r\n hexagons: `<svg width=\"28\" height=\"49\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 0l14 8.5v16L14 33 0 24.5v-16z\" fill=\"none\" stroke=\"currentColor\" stroke-opacity=\"0.06\"/></svg>`,\r\n triangles: `<svg width=\"20\" height=\"17\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 17L10 0l10 17z\" fill=\"none\" stroke=\"currentColor\" stroke-opacity=\"0.06\"/></svg>`,\r\n circles: `<svg width=\"20\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"10\" cy=\"10\" r=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-opacity=\"0.06\"/></svg>`,\r\n zigzag: `<svg width=\"20\" height=\"12\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6l5-6 5 6 5-6 5 6\" fill=\"none\" stroke=\"currentColor\" stroke-opacity=\"0.08\"/></svg>`,\r\n noise: `<svg viewBox=\"0 0 200 200\" xmlns=\"http://www.w3.org/2000/svg\"><filter id=\"n\"><feTurbulence type=\"fractalNoise\" baseFrequency=\".9\" numOctaves=\"3\" stitchTiles=\"stitch\"/></filter><rect width=\"100%\" height=\"100%\" filter=\"url(#n)\"/></svg>`,\r\n};\r\n\r\n/** Applies background image / pattern properties as CSS vars. */\r\nfunction applyBackgroundImage(bg: NiceThemeBackgroundImage | undefined, target: HTMLElement): void {\r\n // Clear previous\r\n target.style.removeProperty('--ntd-bg-image');\r\n target.style.removeProperty('--ntd-bg-image-size');\r\n target.style.removeProperty('--ntd-bg-image-position');\r\n target.style.removeProperty('--ntd-bg-image-attachment');\r\n target.style.removeProperty('--ntd-bg-image-repeat');\r\n target.style.removeProperty('--ntd-bg-image-opacity');\r\n target.style.removeProperty('--ntd-bg-image-blend');\r\n\r\n if (!bg || bg.type === 'none') {\r\n return;\r\n }\r\n\r\n if (bg.type === 'gradient' && bg.gradient) {\r\n target.style.setProperty('--ntd-bg-image', bg.gradient);\r\n } else if (bg.type === 'image' && bg.imageUrl) {\r\n target.style.setProperty('--ntd-bg-image', `url(\"${bg.imageUrl}\")`);\r\n if (bg.imageSize) {\r\n target.style.setProperty('--ntd-bg-image-size', bg.imageSize);\r\n }\r\n if (bg.imagePosition) {\r\n target.style.setProperty('--ntd-bg-image-position', bg.imagePosition);\r\n }\r\n if (bg.imageAttachment) {\r\n target.style.setProperty('--ntd-bg-image-attachment', bg.imageAttachment);\r\n }\r\n if (bg.imageRepeat) {\r\n target.style.setProperty('--ntd-bg-image-repeat', bg.imageRepeat);\r\n }\r\n } else if (bg.type === 'pattern' && bg.pattern) {\r\n const svg = SVG_PATTERNS[bg.pattern];\r\n if (svg) {\r\n const encoded = `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\")`;\r\n target.style.setProperty('--ntd-bg-image', encoded);\r\n target.style.setProperty('--ntd-bg-image-repeat', 'repeat');\r\n }\r\n }\r\n\r\n if (bg.opacity !== undefined) {\r\n target.style.setProperty('--ntd-bg-image-opacity', String(bg.opacity));\r\n }\r\n if (bg.blendMode) {\r\n target.style.setProperty('--ntd-bg-image-blend', bg.blendMode);\r\n }\r\n}\r\n\r\n/** Removes all theme CSS custom properties from the target element. */\r\nexport function removeTheme(element?: HTMLElement): void {\r\n const target = element ?? document.documentElement;\r\n for (const cssVar of Object.values(THEME_TO_CSS)) {\r\n target.style.removeProperty(cssVar);\r\n }\r\n // Also clean background image vars\r\n for (const prop of [\r\n '--ntd-bg-image',\r\n '--ntd-bg-image-size',\r\n '--ntd-bg-image-position',\r\n '--ntd-bg-image-attachment',\r\n '--ntd-bg-image-repeat',\r\n '--ntd-bg-image-opacity',\r\n '--ntd-bg-image-blend',\r\n ]) {\r\n target.style.removeProperty(prop);\r\n }\r\n delete target.dataset.ntdColorScheme;\r\n delete target.dataset.theme;\r\n target.classList.remove('nice-dark');\r\n}\r\n\r\n// ── Read current theme from DOM ─────────────────────────────\r\n\r\n/** Reads the currently computed theme values from the DOM. */\r\nexport function getComputedTheme(element?: HTMLElement): NiceTheme {\r\n const target = element ?? document.documentElement;\r\n const cs = getComputedStyle(target);\r\n const g = (v: string) => cs.getPropertyValue(v).trim();\r\n const n = (v: string) => parseFloat(cs.getPropertyValue(v)) || 0;\r\n const opt = (v: string) => {\r\n const r = g(v);\r\n return r || undefined;\r\n };\r\n\r\n return {\r\n name: 'Current',\r\n colors: {\r\n primary: g('--color-primary'),\r\n primaryHover: g('--color-primary-hover'),\r\n success: g('--color-success'),\r\n warning: g('--color-warning'),\r\n error: g('--color-error'),\r\n info: g('--color-info'),\r\n accent: opt('--color-accent'),\r\n accentHover: opt('--color-accent-hover'),\r\n link: opt('--color-link'),\r\n linkHover: opt('--color-link-hover'),\r\n focus: opt('--color-focus'),\r\n overlay: opt('--color-overlay'),\r\n surface: opt('--color-surface'),\r\n surfaceHover: opt('--color-surface-hover'),\r\n disabled: opt('--color-disabled'),\r\n disabledText: opt('--color-disabled-text'),\r\n },\r\n backgrounds: {\r\n primary: g('--bg-primary'),\r\n secondary: g('--bg-secondary'),\r\n tertiary: g('--bg-tertiary'),\r\n hover: g('--hover-bg'),\r\n elevated: opt('--bg-elevated'),\r\n inset: opt('--bg-inset'),\r\n canvas: opt('--bg-canvas'),\r\n },\r\n text: {\r\n primary: g('--text-primary'),\r\n secondary: g('--text-secondary'),\r\n muted: g('--text-muted'),\r\n inverse: opt('--text-inverse'),\r\n onPrimary: opt('--text-on-primary'),\r\n onAccent: opt('--text-on-accent'),\r\n },\r\n borders: {\r\n color: g('--border-color'),\r\n radiusSm: g('--nice-radius-sm'),\r\n radiusMd: g('--nice-radius-md'),\r\n radiusLg: g('--nice-radius-lg'),\r\n radiusXl: g('--nice-radius-xl'),\r\n radiusFull: g('--nice-radius-full'),\r\n width: opt('--border-width'),\r\n focusColor: opt('--border-focus-color'),\r\n divider: opt('--border-divider'),\r\n },\r\n shadows: {\r\n sm: g('--shadow-sm'),\r\n md: g('--shadow-md'),\r\n lg: g('--shadow-lg'),\r\n xl: g('--shadow-xl'),\r\n inner: opt('--shadow-inner'),\r\n glow: opt('--shadow-glow'),\r\n },\r\n spacing: {\r\n space1: g('--nice-space-1'),\r\n space2: g('--nice-space-2'),\r\n space3: g('--nice-space-3'),\r\n space4: g('--nice-space-4'),\r\n space5: g('--nice-space-5'),\r\n space6: g('--nice-space-6'),\r\n space8: g('--nice-space-8'),\r\n space10: opt('--nice-space-10'),\r\n space12: opt('--nice-space-12'),\r\n space16: opt('--nice-space-16'),\r\n },\r\n typography: {\r\n fontFamily: g('--nice-font-family'),\r\n fontSizeXs: g('--nice-font-size-xs'),\r\n fontSizeSm: g('--nice-font-size-sm'),\r\n fontSizeMd: g('--nice-font-size-md'),\r\n fontSizeLg: g('--nice-font-size-lg'),\r\n fontSizeXl: g('--nice-font-size-xl'),\r\n fontWeightNormal: n('--nice-font-weight-normal'),\r\n fontWeightMedium: n('--nice-font-weight-medium'),\r\n fontWeightSemibold: n('--nice-font-weight-semibold'),\r\n fontWeightBold: n('--nice-font-weight-bold'),\r\n lineHeight: n('--nice-line-height'),\r\n headingFontFamily: opt('--nice-heading-font-family'),\r\n monoFontFamily: opt('--nice-mono-font-family'),\r\n fontSize2xl: opt('--nice-font-size-2xl'),\r\n fontSize3xl: opt('--nice-font-size-3xl'),\r\n letterSpacing: opt('--nice-letter-spacing'),\r\n headingLetterSpacing: opt('--nice-heading-letter-spacing'),\r\n },\r\n transitions: {\r\n fast: g('--nice-transition-fast'),\r\n normal: g('--nice-transition'),\r\n slow: g('--nice-transition-slow'),\r\n },\r\n darkMode: (target.dataset.ntdColorScheme as NiceThemeDarkMode) ?? undefined,\r\n };\r\n}\r\n\r\n// ── Serialization ───────────────────────────────────────────\r\n\r\n/** Serializes a theme to a JSON string (pretty-printed). */\r\nexport function serializeTheme(theme: NiceTheme): string {\r\n return JSON.stringify(theme, null, 2);\r\n}\r\n\r\n/** Parses a JSON string back into a {@link NiceTheme}. Throws on invalid format. */\r\nexport function deserializeTheme(json: string): NiceTheme {\r\n const parsed = JSON.parse(json);\r\n if (\r\n !parsed ||\r\n typeof parsed !== 'object' ||\r\n !parsed.name ||\r\n !parsed.colors ||\r\n !parsed.backgrounds\r\n ) {\r\n throw new Error('Invalid theme format: missing required fields (name, colors, backgrounds)');\r\n }\r\n return parsed as NiceTheme;\r\n}\r\n\r\n// ── Context ─────────────────────────────────────────────────\r\n\r\nexport interface NiceThemeContextValue {\r\n theme: NiceTheme;\r\n setTheme: (theme: NiceTheme) => void;\r\n /**\r\n * DOM node that lives directly inside `document.body` but carries the same\r\n * CSS variables as the provider's scoped subtree. Use this as the portal\r\n * target for overlay-style components (modal, drawer, toast, popover) so the\r\n * portaled content (a) escapes ancestor containing blocks created by\r\n * `transform`, `filter`, `contain`, etc., AND (b) still inherits the active\r\n * theme variables. Falls back to `document.body` if the provider hasn't\r\n * mounted (SSR / pre-hydration).\r\n */\r\n portalTarget?: HTMLElement | null;\r\n}\r\n\r\nexport const NiceThemeContext = createContext<NiceThemeContextValue | null>(null);\r\n\r\nexport function useNiceTheme(): NiceThemeContextValue {\r\n const ctx = useContext(NiceThemeContext);\r\n if (!ctx) {\r\n throw new Error('useNiceTheme must be used within a NiceThemeProvider');\r\n }\r\n return ctx;\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Theme Gallery (100 preset themes)\r\n// ============================================================\r\n//\r\n// Organized by category: Neutral, Vibrant, Dark, Nature, Pastel,\r\n// Industry, Design-System, Retro, Seasonal, Cultural,\r\n// Accessibility, Modern UI.\r\n// ============================================================\r\n\r\nimport type {\r\n NiceTheme,\r\n NiceThemeColors,\r\n NiceThemeBackgrounds,\r\n NiceThemeText,\r\n NiceThemeShadows,\r\n NiceThemeSpacing,\r\n NiceThemeTypography,\r\n NiceThemeTransitions,\r\n NiceThemeBackgroundImage,\r\n NiceThemeDarkMode,\r\n} from './theme';\r\n\r\n// ── Shared building blocks ──────────────────────────────────\r\n\r\nconst SP: NiceThemeSpacing = {\r\n space1: '4px',\r\n space2: '8px',\r\n space3: '12px',\r\n space4: '16px',\r\n space5: '20px',\r\n space6: '24px',\r\n space8: '32px',\r\n};\r\n\r\nconst TY: NiceThemeTypography = {\r\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.125rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n};\r\n\r\nconst TR: NiceThemeTransitions = { fast: '120ms ease', normal: '200ms ease', slow: '300ms ease' };\r\n\r\nconst br = (c: string) => ({\r\n color: c,\r\n radiusSm: '4px',\r\n radiusMd: '6px',\r\n radiusLg: '8px',\r\n radiusXl: '12px',\r\n radiusFull: '9999px',\r\n});\r\n\r\nconst SL: NiceThemeShadows = {\r\n sm: '0 1px 2px rgba(0,0,0,0.05)',\r\n md: '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)',\r\n lg: '0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)',\r\n xl: '0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)',\r\n};\r\n\r\nconst SD: NiceThemeShadows = {\r\n sm: '0 1px 2px rgba(0,0,0,0.3)',\r\n md: '0 4px 6px -1px rgba(0,0,0,0.4)',\r\n lg: '0 10px 15px -3px rgba(0,0,0,0.4)',\r\n xl: '0 20px 25px -5px rgba(0,0,0,0.4)',\r\n};\r\n\r\n/** Create a light-mode theme with standard shadows, spacing, typography. */\r\nfunction lt(\r\n name: string,\r\n c: NiceThemeColors,\r\n bg: NiceThemeBackgrounds,\r\n tx: NiceThemeText,\r\n bc: string,\r\n): NiceTheme {\r\n return {\r\n name,\r\n darkMode: 'light' as NiceThemeDarkMode,\r\n colors: {\r\n ...c,\r\n surface: c.surface ?? bg.primary,\r\n surfaceHover: c.surfaceHover ?? bg.secondary,\r\n },\r\n backgrounds: {\r\n ...bg,\r\n elevated: bg.elevated ?? bg.primary,\r\n inset: bg.inset ?? bg.tertiary,\r\n canvas: bg.canvas ?? bg.primary,\r\n },\r\n text: { ...tx, inverse: tx.inverse ?? '#ffffff' },\r\n borders: br(bc),\r\n shadows: SL,\r\n spacing: SP,\r\n typography: TY,\r\n transitions: TR,\r\n };\r\n}\r\n\r\n/** Create a dark-mode theme with deeper shadows. */\r\nfunction dk(\r\n name: string,\r\n c: NiceThemeColors,\r\n bg: NiceThemeBackgrounds,\r\n tx: NiceThemeText,\r\n bc: string,\r\n): NiceTheme {\r\n return {\r\n name,\r\n darkMode: 'dark' as NiceThemeDarkMode,\r\n colors: {\r\n ...c,\r\n surface: c.surface ?? bg.secondary,\r\n surfaceHover: c.surfaceHover ?? bg.tertiary,\r\n },\r\n backgrounds: {\r\n ...bg,\r\n elevated: bg.elevated ?? bg.secondary,\r\n inset: bg.inset ?? bg.primary,\r\n canvas: bg.canvas ?? bg.primary,\r\n },\r\n text: { ...tx, inverse: tx.inverse ?? '#0f172a' },\r\n borders: br(bc),\r\n shadows: SD,\r\n spacing: SP,\r\n typography: TY,\r\n transitions: TR,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 1. NEUTRAL / GRAYSCALE (8)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeSlate = lt(\r\n 'Slate',\r\n {\r\n primary: '#64748b',\r\n primaryHover: '#475569',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#f8fafc', secondary: '#f1f5f9', tertiary: '#e2e8f0', hover: '#e2e8f0' },\r\n { primary: '#1e293b', secondary: '#475569', muted: '#94a3b8' },\r\n '#cbd5e1',\r\n);\r\n\r\nexport const themeZinc = lt(\r\n 'Zinc',\r\n {\r\n primary: '#71717a',\r\n primaryHover: '#52525b',\r\n success: '#22c55e',\r\n warning: '#eab308',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#fafafa', secondary: '#f4f4f5', tertiary: '#e4e4e7', hover: '#e4e4e7' },\r\n { primary: '#18181b', secondary: '#3f3f46', muted: '#a1a1aa' },\r\n '#d4d4d8',\r\n);\r\n\r\nexport const themeStone = lt(\r\n 'Stone',\r\n {\r\n primary: '#78716c',\r\n primaryHover: '#57534e',\r\n success: '#16a34a',\r\n warning: '#ca8a04',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fafaf9', secondary: '#f5f5f4', tertiary: '#e7e5e4', hover: '#e7e5e4' },\r\n { primary: '#1c1917', secondary: '#44403c', muted: '#a8a29e' },\r\n '#d6d3d1',\r\n);\r\n\r\nexport const themeCoolGray = lt(\r\n 'Cool Gray',\r\n {\r\n primary: '#6b7280',\r\n primaryHover: '#4b5563',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#3b82f6',\r\n },\r\n { primary: '#f9fafb', secondary: '#f3f4f6', tertiary: '#e5e7eb', hover: '#e5e7eb' },\r\n { primary: '#111827', secondary: '#374151', muted: '#9ca3af' },\r\n '#d1d5db',\r\n);\r\n\r\nexport const themeWarmGray = lt(\r\n 'Warm Gray',\r\n {\r\n primary: '#7c7568',\r\n primaryHover: '#5c564c',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#faf9f7', secondary: '#f5f4f0', tertiary: '#e8e6e1', hover: '#e8e6e1' },\r\n { primary: '#1f1d19', secondary: '#4a463d', muted: '#a09888' },\r\n '#d4d0c8',\r\n);\r\n\r\nexport const themeSilver = lt(\r\n 'Silver',\r\n {\r\n primary: '#94a3b8',\r\n primaryHover: '#64748b',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#38bdf8',\r\n },\r\n { primary: '#f8fafc', secondary: '#f1f5f9', tertiary: '#e2e8f0', hover: '#e2e8f0' },\r\n { primary: '#334155', secondary: '#64748b', muted: '#94a3b8' },\r\n '#cbd5e1',\r\n);\r\n\r\nexport const themeCharcoal = lt(\r\n 'Charcoal',\r\n {\r\n primary: '#374151',\r\n primaryHover: '#1f2937',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0284c7',\r\n },\r\n { primary: '#f9fafb', secondary: '#f3f4f6', tertiary: '#e5e7eb', hover: '#e5e7eb' },\r\n { primary: '#111827', secondary: '#374151', muted: '#6b7280' },\r\n '#d1d5db',\r\n);\r\n\r\nexport const themeIvory = lt(\r\n 'Ivory',\r\n {\r\n primary: '#92876d',\r\n primaryHover: '#7a6f55',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#fffef7', secondary: '#faf6eb', tertiary: '#f0ead6', hover: '#f0ead6' },\r\n { primary: '#2b2517', secondary: '#5c5340', muted: '#9c9280' },\r\n '#ddd8c4',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 2. VIBRANT / COLORFUL (14)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeRose = lt(\r\n 'Rose',\r\n {\r\n primary: '#e11d48',\r\n primaryHover: '#be123c',\r\n success: '#16a34a',\r\n warning: '#ea580c',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fff1f2', secondary: '#ffe4e6', tertiary: '#fecdd3', hover: '#ffe4e6' },\r\n { primary: '#4c0519', secondary: '#881337', muted: '#f43f5e' },\r\n '#fda4af',\r\n);\r\n\r\nexport const themeEmerald = lt(\r\n 'Emerald',\r\n {\r\n primary: '#059669',\r\n primaryHover: '#047857',\r\n success: '#16a34a',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#ecfdf5', secondary: '#d1fae5', tertiary: '#a7f3d0', hover: '#d1fae5' },\r\n { primary: '#064e3b', secondary: '#065f46', muted: '#34d399' },\r\n '#6ee7b7',\r\n);\r\n\r\nexport const themeAmber = lt(\r\n 'Amber',\r\n {\r\n primary: '#d97706',\r\n primaryHover: '#b45309',\r\n success: '#16a34a',\r\n warning: '#ca8a04',\r\n error: '#dc2626',\r\n info: '#0284c7',\r\n },\r\n { primary: '#fffbeb', secondary: '#fef3c7', tertiary: '#fde68a', hover: '#fef3c7' },\r\n { primary: '#451a03', secondary: '#78350f', muted: '#f59e0b' },\r\n '#fcd34d',\r\n);\r\n\r\nexport const themeViolet = lt(\r\n 'Violet',\r\n {\r\n primary: '#7c3aed',\r\n primaryHover: '#6d28d9',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#f5f3ff', secondary: '#ede9fe', tertiary: '#ddd6fe', hover: '#ede9fe' },\r\n { primary: '#2e1065', secondary: '#4c1d95', muted: '#a78bfa' },\r\n '#c4b5fd',\r\n);\r\n\r\nexport const themeTeal = lt(\r\n 'Teal',\r\n {\r\n primary: '#0d9488',\r\n primaryHover: '#0f766e',\r\n success: '#16a34a',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0284c7',\r\n },\r\n { primary: '#f0fdfa', secondary: '#ccfbf1', tertiary: '#99f6e4', hover: '#ccfbf1' },\r\n { primary: '#134e4a', secondary: '#115e59', muted: '#2dd4bf' },\r\n '#5eead4',\r\n);\r\n\r\nexport const themeIndigo = lt(\r\n 'Indigo',\r\n {\r\n primary: '#4f46e5',\r\n primaryHover: '#4338ca',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#eef2ff', secondary: '#e0e7ff', tertiary: '#c7d2fe', hover: '#e0e7ff' },\r\n { primary: '#1e1b4b', secondary: '#312e81', muted: '#818cf8' },\r\n '#a5b4fc',\r\n);\r\n\r\nexport const themeCyan = lt(\r\n 'Cyan',\r\n {\r\n primary: '#0891b2',\r\n primaryHover: '#0e7490',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#0284c7',\r\n },\r\n { primary: '#ecfeff', secondary: '#cffafe', tertiary: '#a5f3fc', hover: '#cffafe' },\r\n { primary: '#164e63', secondary: '#155e75', muted: '#22d3ee' },\r\n '#67e8f9',\r\n);\r\n\r\nexport const themeLime = lt(\r\n 'Lime',\r\n {\r\n primary: '#65a30d',\r\n primaryHover: '#4d7c0f',\r\n success: '#16a34a',\r\n warning: '#ca8a04',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#f7fee7', secondary: '#ecfccb', tertiary: '#d9f99d', hover: '#ecfccb' },\r\n { primary: '#1a2e05', secondary: '#365314', muted: '#84cc16' },\r\n '#bef264',\r\n);\r\n\r\nexport const themePink = lt(\r\n 'Pink',\r\n {\r\n primary: '#db2777',\r\n primaryHover: '#be185d',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#dc2626',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#fdf2f8', secondary: '#fce7f3', tertiary: '#fbcfe8', hover: '#fce7f3' },\r\n { primary: '#500724', secondary: '#831843', muted: '#f472b6' },\r\n '#f9a8d4',\r\n);\r\n\r\nexport const themeOrange = lt(\r\n 'Orange',\r\n {\r\n primary: '#ea580c',\r\n primaryHover: '#c2410c',\r\n success: '#16a34a',\r\n warning: '#ca8a04',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fff7ed', secondary: '#ffedd5', tertiary: '#fed7aa', hover: '#ffedd5' },\r\n { primary: '#431407', secondary: '#7c2d12', muted: '#fb923c' },\r\n '#fdba74',\r\n);\r\n\r\nexport const themeFuchsia = lt(\r\n 'Fuchsia',\r\n {\r\n primary: '#c026d3',\r\n primaryHover: '#a21caf',\r\n success: '#10b981',\r\n warning: '#eab308',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#fdf4ff', secondary: '#fae8ff', tertiary: '#f5d0fe', hover: '#fae8ff' },\r\n { primary: '#4a044e', secondary: '#701a75', muted: '#d946ef' },\r\n '#e879f9',\r\n);\r\n\r\nexport const themeSky = lt(\r\n 'Sky',\r\n {\r\n primary: '#0284c7',\r\n primaryHover: '#0369a1',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#f0f9ff', secondary: '#e0f2fe', tertiary: '#bae6fd', hover: '#e0f2fe' },\r\n { primary: '#0c4a6e', secondary: '#075985', muted: '#38bdf8' },\r\n '#7dd3fc',\r\n);\r\n\r\nexport const themeRuby = lt(\r\n 'Ruby',\r\n {\r\n primary: '#be123c',\r\n primaryHover: '#9f1239',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0284c7',\r\n },\r\n { primary: '#fff1f2', secondary: '#ffe4e6', tertiary: '#fecdd3', hover: '#ffe4e6' },\r\n { primary: '#4c0519', secondary: '#881337', muted: '#fb7185' },\r\n '#fda4af',\r\n);\r\n\r\nexport const themeCoral = lt(\r\n 'Coral',\r\n {\r\n primary: '#f97316',\r\n primaryHover: '#ea580c',\r\n success: '#10b981',\r\n warning: '#eab308',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#fff7ed', secondary: '#ffedd5', tertiary: '#fed7aa', hover: '#ffedd5' },\r\n { primary: '#431407', secondary: '#9a3412', muted: '#fb923c' },\r\n '#fdba74',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 3. DARK VARIANTS (10)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeMidnight = dk(\r\n 'Midnight',\r\n {\r\n primary: '#818cf8',\r\n primaryHover: '#6366f1',\r\n success: '#34d399',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#22d3ee',\r\n },\r\n { primary: '#020617', secondary: '#0f172a', tertiary: '#1e293b', hover: '#1e293b' },\r\n { primary: '#f1f5f9', secondary: '#94a3b8', muted: '#475569' },\r\n '#1e293b',\r\n);\r\n\r\nexport const themeObsidian = dk(\r\n 'Obsidian',\r\n {\r\n primary: '#a78bfa',\r\n primaryHover: '#8b5cf6',\r\n success: '#4ade80',\r\n warning: '#facc15',\r\n error: '#fb7185',\r\n info: '#38bdf8',\r\n },\r\n { primary: '#09090b', secondary: '#18181b', tertiary: '#27272a', hover: '#27272a' },\r\n { primary: '#fafafa', secondary: '#a1a1aa', muted: '#52525b' },\r\n '#3f3f46',\r\n);\r\n\r\nexport const themeEclipse = dk(\r\n 'Eclipse',\r\n {\r\n primary: '#c084fc',\r\n primaryHover: '#a855f7',\r\n success: '#34d399',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#0c0a1d', secondary: '#1a1533', tertiary: '#2a2248', hover: '#2a2248' },\r\n { primary: '#f5f3ff', secondary: '#a78bfa', muted: '#6d5eac' },\r\n '#3b3266',\r\n);\r\n\r\nexport const themeOnyx = dk(\r\n 'Onyx',\r\n {\r\n primary: '#60a5fa',\r\n primaryHover: '#3b82f6',\r\n success: '#4ade80',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#22d3ee',\r\n },\r\n { primary: '#000000', secondary: '#0a0a0a', tertiary: '#171717', hover: '#171717' },\r\n { primary: '#ffffff', secondary: '#a3a3a3', muted: '#525252' },\r\n '#262626',\r\n);\r\n\r\nexport const themeCarbon = dk(\r\n 'Carbon',\r\n {\r\n primary: '#38bdf8',\r\n primaryHover: '#0ea5e9',\r\n success: '#4ade80',\r\n warning: '#facc15',\r\n error: '#f87171',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#161616', secondary: '#262626', tertiary: '#393939', hover: '#393939' },\r\n { primary: '#f4f4f4', secondary: '#c6c6c6', muted: '#6f6f6f' },\r\n '#525252',\r\n);\r\n\r\nexport const themeCosmos = dk(\r\n 'Cosmos',\r\n {\r\n primary: '#6366f1',\r\n primaryHover: '#4f46e5',\r\n success: '#34d399',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#22d3ee',\r\n },\r\n { primary: '#030712', secondary: '#111827', tertiary: '#1f2937', hover: '#1f2937' },\r\n { primary: '#e5e7eb', secondary: '#9ca3af', muted: '#4b5563' },\r\n '#374151',\r\n);\r\n\r\nexport const themeNebula = dk(\r\n 'Nebula',\r\n {\r\n primary: '#e879f9',\r\n primaryHover: '#d946ef',\r\n success: '#4ade80',\r\n warning: '#fbbf24',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#0d0117', secondary: '#1a0533', tertiary: '#2d0a52', hover: '#2d0a52' },\r\n { primary: '#fae8ff', secondary: '#d8b4fe', muted: '#7c3aed' },\r\n '#581c87',\r\n);\r\n\r\nexport const themeAbyss = dk(\r\n 'Abyss',\r\n {\r\n primary: '#22d3ee',\r\n primaryHover: '#06b6d4',\r\n success: '#34d399',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#38bdf8',\r\n },\r\n { primary: '#001219', secondary: '#002a3a', tertiary: '#003e54', hover: '#003e54' },\r\n { primary: '#e0f2fe', secondary: '#7dd3fc', muted: '#0369a1' },\r\n '#075985',\r\n);\r\n\r\nexport const themeShadow = dk(\r\n 'Shadow',\r\n {\r\n primary: '#a3a3a3',\r\n primaryHover: '#737373',\r\n success: '#4ade80',\r\n warning: '#facc15',\r\n error: '#f87171',\r\n info: '#38bdf8',\r\n },\r\n { primary: '#171717', secondary: '#1f1f1f', tertiary: '#2a2a2a', hover: '#2a2a2a' },\r\n { primary: '#e5e5e5', secondary: '#a3a3a3', muted: '#525252' },\r\n '#404040',\r\n);\r\n\r\nexport const themeEmeraldDark = dk(\r\n 'Emerald Dark',\r\n {\r\n primary: '#34d399',\r\n primaryHover: '#10b981',\r\n success: '#4ade80',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#22d3ee',\r\n },\r\n { primary: '#022c22', secondary: '#064e3b', tertiary: '#065f46', hover: '#065f46' },\r\n { primary: '#ecfdf5', secondary: '#6ee7b7', muted: '#047857' },\r\n '#047857',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 4. NATURE (10)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeForest = lt(\r\n 'Forest',\r\n {\r\n primary: '#166534',\r\n primaryHover: '#14532d',\r\n success: '#22c55e',\r\n warning: '#ca8a04',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#f0fdf4', secondary: '#dcfce7', tertiary: '#bbf7d0', hover: '#dcfce7' },\r\n { primary: '#052e16', secondary: '#166534', muted: '#4ade80' },\r\n '#86efac',\r\n);\r\n\r\nexport const themeOcean = lt(\r\n 'Ocean',\r\n {\r\n primary: '#0369a1',\r\n primaryHover: '#075985',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0284c7',\r\n },\r\n { primary: '#f0f9ff', secondary: '#e0f2fe', tertiary: '#bae6fd', hover: '#e0f2fe' },\r\n { primary: '#0c4a6e', secondary: '#0369a1', muted: '#38bdf8' },\r\n '#7dd3fc',\r\n);\r\n\r\nexport const themeDesert = lt(\r\n 'Desert',\r\n {\r\n primary: '#b45309',\r\n primaryHover: '#92400e',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#fefce8', secondary: '#fef9c3', tertiary: '#fef08a', hover: '#fef9c3' },\r\n { primary: '#422006', secondary: '#713f12', muted: '#ca8a04' },\r\n '#fde047',\r\n);\r\n\r\nexport const themeSunset = lt(\r\n 'Sunset',\r\n {\r\n primary: '#ea580c',\r\n primaryHover: '#c2410c',\r\n success: '#16a34a',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fff7ed', secondary: '#ffedd5', tertiary: '#fed7aa', hover: '#ffedd5' },\r\n { primary: '#431407', secondary: '#9a3412', muted: '#f97316' },\r\n '#fdba74',\r\n);\r\n\r\nexport const themeAurora = lt(\r\n 'Aurora',\r\n {\r\n primary: '#0d9488',\r\n primaryHover: '#0f766e',\r\n success: '#22c55e',\r\n warning: '#eab308',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#f0fdfa', secondary: '#ccfbf1', tertiary: '#99f6e4', hover: '#ccfbf1' },\r\n { primary: '#134e4a', secondary: '#115e59', muted: '#2dd4bf' },\r\n '#5eead4',\r\n);\r\n\r\nexport const themeLavender = lt(\r\n 'Lavender',\r\n {\r\n primary: '#7e22ce',\r\n primaryHover: '#6b21a8',\r\n success: '#16a34a',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#faf5ff', secondary: '#f3e8ff', tertiary: '#e9d5ff', hover: '#f3e8ff' },\r\n { primary: '#3b0764', secondary: '#581c87', muted: '#a855f7' },\r\n '#d8b4fe',\r\n);\r\n\r\nexport const themeAutumn = lt(\r\n 'Autumn',\r\n {\r\n primary: '#c2410c',\r\n primaryHover: '#9a3412',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#fef2f2', secondary: '#fee2e2', tertiary: '#fecaca', hover: '#fee2e2' },\r\n { primary: '#450a0a', secondary: '#7f1d1d', muted: '#f87171' },\r\n '#fca5a5',\r\n);\r\n\r\nexport const themeSpring = lt(\r\n 'Spring',\r\n {\r\n primary: '#16a34a',\r\n primaryHover: '#15803d',\r\n success: '#22c55e',\r\n warning: '#eab308',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#f0fdf4', secondary: '#dcfce7', tertiary: '#bbf7d0', hover: '#dcfce7' },\r\n { primary: '#14532d', secondary: '#166534', muted: '#4ade80' },\r\n '#86efac',\r\n);\r\n\r\nexport const themeArctic = lt(\r\n 'Arctic',\r\n {\r\n primary: '#0ea5e9',\r\n primaryHover: '#0284c7',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#f0f9ff', secondary: '#e0f2fe', tertiary: '#bae6fd', hover: '#e0f2fe' },\r\n { primary: '#0c4a6e', secondary: '#0369a1', muted: '#7dd3fc' },\r\n '#bae6fd',\r\n);\r\n\r\nexport const themeTropical = lt(\r\n 'Tropical',\r\n {\r\n primary: '#0d9488',\r\n primaryHover: '#0f766e',\r\n success: '#16a34a',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#ecfdf5', secondary: '#d1fae5', tertiary: '#a7f3d0', hover: '#d1fae5' },\r\n { primary: '#064e3b', secondary: '#065f46', muted: '#6ee7b7' },\r\n '#a7f3d0',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 5. PASTEL (8)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themePastelRose = lt(\r\n 'Pastel Rose',\r\n {\r\n primary: '#f472b6',\r\n primaryHover: '#ec4899',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#fdf2f8', secondary: '#fce7f3', tertiary: '#fbcfe8', hover: '#fce7f3' },\r\n { primary: '#831843', secondary: '#9d174d', muted: '#f9a8d4' },\r\n '#f9a8d4',\r\n);\r\n\r\nexport const themePastelSky = lt(\r\n 'Pastel Sky',\r\n {\r\n primary: '#38bdf8',\r\n primaryHover: '#0ea5e9',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#f0f9ff', secondary: '#e0f2fe', tertiary: '#bae6fd', hover: '#e0f2fe' },\r\n { primary: '#075985', secondary: '#0369a1', muted: '#7dd3fc' },\r\n '#bae6fd',\r\n);\r\n\r\nexport const themePastelMint = lt(\r\n 'Pastel Mint',\r\n {\r\n primary: '#34d399',\r\n primaryHover: '#10b981',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#ecfdf5', secondary: '#d1fae5', tertiary: '#a7f3d0', hover: '#d1fae5' },\r\n { primary: '#065f46', secondary: '#047857', muted: '#6ee7b7' },\r\n '#a7f3d0',\r\n);\r\n\r\nexport const themePastelPeach = lt(\r\n 'Pastel Peach',\r\n {\r\n primary: '#fb923c',\r\n primaryHover: '#f97316',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#fff7ed', secondary: '#ffedd5', tertiary: '#fed7aa', hover: '#ffedd5' },\r\n { primary: '#7c2d12', secondary: '#9a3412', muted: '#fdba74' },\r\n '#fed7aa',\r\n);\r\n\r\nexport const themePastelLavender = lt(\r\n 'Pastel Lavender',\r\n {\r\n primary: '#a78bfa',\r\n primaryHover: '#8b5cf6',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#f5f3ff', secondary: '#ede9fe', tertiary: '#ddd6fe', hover: '#ede9fe' },\r\n { primary: '#4c1d95', secondary: '#5b21b6', muted: '#c4b5fd' },\r\n '#ddd6fe',\r\n);\r\n\r\nexport const themePastelLemon = lt(\r\n 'Pastel Lemon',\r\n {\r\n primary: '#facc15',\r\n primaryHover: '#eab308',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#fefce8', secondary: '#fef9c3', tertiary: '#fef08a', hover: '#fef9c3' },\r\n { primary: '#713f12', secondary: '#854d0e', muted: '#fde047' },\r\n '#fef08a',\r\n);\r\n\r\nexport const themePastelSage = lt(\r\n 'Pastel Sage',\r\n {\r\n primary: '#86efac',\r\n primaryHover: '#4ade80',\r\n success: '#22c55e',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#f0fdf4', secondary: '#dcfce7', tertiary: '#bbf7d0', hover: '#dcfce7' },\r\n { primary: '#166534', secondary: '#15803d', muted: '#86efac' },\r\n '#bbf7d0',\r\n);\r\n\r\nexport const themePastelCoral = lt(\r\n 'Pastel Coral',\r\n {\r\n primary: '#fb7185',\r\n primaryHover: '#f43f5e',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#ef4444',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#fff1f2', secondary: '#ffe4e6', tertiary: '#fecdd3', hover: '#ffe4e6' },\r\n { primary: '#881337', secondary: '#9f1239', muted: '#fda4af' },\r\n '#fecdd3',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 6. INDUSTRY / CORPORATE (8)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeBanking = lt(\r\n 'Banking',\r\n {\r\n primary: '#1e3a5f',\r\n primaryHover: '#152c4a',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#f8fafc', secondary: '#f1f5f9', tertiary: '#e2e8f0', hover: '#e2e8f0' },\r\n { primary: '#0f172a', secondary: '#334155', muted: '#94a3b8' },\r\n '#cbd5e1',\r\n);\r\n\r\nexport const themeHealthcare = lt(\r\n 'Healthcare',\r\n {\r\n primary: '#0891b2',\r\n primaryHover: '#0e7490',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0284c7',\r\n },\r\n { primary: '#f0fdfa', secondary: '#e0f7fa', tertiary: '#b2ebf2', hover: '#e0f7fa' },\r\n { primary: '#134e4a', secondary: '#1a6b6a', muted: '#80cbc4' },\r\n '#b2dfdb',\r\n);\r\n\r\nexport const themeLegal = lt(\r\n 'Legal',\r\n {\r\n primary: '#1e293b',\r\n primaryHover: '#0f172a',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0284c7',\r\n },\r\n { primary: '#fafaf9', secondary: '#f5f5f4', tertiary: '#e7e5e4', hover: '#e7e5e4' },\r\n { primary: '#0f172a', secondary: '#44403c', muted: '#a8a29e' },\r\n '#d6d3d1',\r\n);\r\n\r\nexport const themeTechStartup = lt(\r\n 'Tech Startup',\r\n {\r\n primary: '#7c3aed',\r\n primaryHover: '#6d28d9',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#faf5ff', secondary: '#f3e8ff', tertiary: '#e9d5ff', hover: '#f3e8ff' },\r\n { primary: '#1e1b4b', secondary: '#4c1d95', muted: '#a78bfa' },\r\n '#c4b5fd',\r\n);\r\n\r\nexport const themeEnterprise = lt(\r\n 'Enterprise',\r\n {\r\n primary: '#1e40af',\r\n primaryHover: '#1e3a8a',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#eff6ff', secondary: '#dbeafe', tertiary: '#bfdbfe', hover: '#dbeafe' },\r\n { primary: '#1e3a5f', secondary: '#1e40af', muted: '#60a5fa' },\r\n '#93c5fd',\r\n);\r\n\r\nexport const themeGovernment = lt(\r\n 'Government',\r\n {\r\n primary: '#1d4ed8',\r\n primaryHover: '#1e40af',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#f8fafc', secondary: '#f1f5f9', tertiary: '#e2e8f0', hover: '#e2e8f0' },\r\n { primary: '#0f172a', secondary: '#1e293b', muted: '#64748b' },\r\n '#cbd5e1',\r\n);\r\n\r\nexport const themeEducation = lt(\r\n 'Education',\r\n {\r\n primary: '#059669',\r\n primaryHover: '#047857',\r\n success: '#16a34a',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#0891b2',\r\n },\r\n { primary: '#f0fdf9', secondary: '#d1fae5', tertiary: '#a7f3d0', hover: '#d1fae5' },\r\n { primary: '#064e3b', secondary: '#065f46', muted: '#6ee7b7' },\r\n '#a7f3d0',\r\n);\r\n\r\nexport const themeRealEstate = lt(\r\n 'Real Estate',\r\n {\r\n primary: '#92400e',\r\n primaryHover: '#78350f',\r\n success: '#059669',\r\n warning: '#b45309',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fffbeb', secondary: '#fef3c7', tertiary: '#fde68a', hover: '#fef3c7' },\r\n { primary: '#422006', secondary: '#713f12', muted: '#d97706' },\r\n '#fcd34d',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 7. DESIGN SYSTEM INSPIRED (6)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeNord = lt(\r\n 'Nord',\r\n {\r\n primary: '#5e81ac',\r\n primaryHover: '#4c6b90',\r\n success: '#a3be8c',\r\n warning: '#ebcb8b',\r\n error: '#bf616a',\r\n info: '#88c0d0',\r\n },\r\n { primary: '#eceff4', secondary: '#e5e9f0', tertiary: '#d8dee9', hover: '#d8dee9' },\r\n { primary: '#2e3440', secondary: '#3b4252', muted: '#4c566a' },\r\n '#d8dee9',\r\n);\r\n\r\nexport const themeDracula = dk(\r\n 'Dracula',\r\n {\r\n primary: '#bd93f9',\r\n primaryHover: '#9d79d9',\r\n success: '#50fa7b',\r\n warning: '#f1fa8c',\r\n error: '#ff5555',\r\n info: '#8be9fd',\r\n },\r\n { primary: '#282a36', secondary: '#343746', tertiary: '#44475a', hover: '#44475a' },\r\n { primary: '#f8f8f2', secondary: '#c0c0c0', muted: '#6272a4' },\r\n '#44475a',\r\n);\r\n\r\nexport const themeSolarizedLight = lt(\r\n 'Solarized Light',\r\n {\r\n primary: '#268bd2',\r\n primaryHover: '#1a6da0',\r\n success: '#859900',\r\n warning: '#b58900',\r\n error: '#dc322f',\r\n info: '#2aa198',\r\n },\r\n { primary: '#fdf6e3', secondary: '#eee8d5', tertiary: '#e0dbc7', hover: '#eee8d5' },\r\n { primary: '#073642', secondary: '#586e75', muted: '#93a1a1' },\r\n '#eee8d5',\r\n);\r\n\r\nexport const themeSolarizedDark = dk(\r\n 'Solarized Dark',\r\n {\r\n primary: '#268bd2',\r\n primaryHover: '#3d98db',\r\n success: '#859900',\r\n warning: '#b58900',\r\n error: '#dc322f',\r\n info: '#2aa198',\r\n },\r\n { primary: '#002b36', secondary: '#073642', tertiary: '#0a4858', hover: '#073642' },\r\n { primary: '#eee8d5', secondary: '#93a1a1', muted: '#586e75' },\r\n '#073642',\r\n);\r\n\r\nexport const themeMonokai = dk(\r\n 'Monokai',\r\n {\r\n primary: '#66d9ef',\r\n primaryHover: '#45c0d6',\r\n success: '#a6e22e',\r\n warning: '#e6db74',\r\n error: '#f92672',\r\n info: '#66d9ef',\r\n },\r\n { primary: '#272822', secondary: '#34352e', tertiary: '#3e3d32', hover: '#3e3d32' },\r\n { primary: '#f8f8f2', secondary: '#cfcfc2', muted: '#75715e' },\r\n '#3e3d32',\r\n);\r\n\r\nexport const themeOneDark = dk(\r\n 'One Dark',\r\n {\r\n primary: '#61afef',\r\n primaryHover: '#4b9ee0',\r\n success: '#98c379',\r\n warning: '#e5c07b',\r\n error: '#e06c75',\r\n info: '#56b6c2',\r\n },\r\n { primary: '#282c34', secondary: '#2c313a', tertiary: '#353b45', hover: '#353b45' },\r\n { primary: '#abb2bf', secondary: '#828997', muted: '#545862' },\r\n '#3e4452',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 8. RETRO / CREATIVE (8)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeSynthwave = dk(\r\n 'Synthwave',\r\n {\r\n primary: '#ff7edb',\r\n primaryHover: '#e660c2',\r\n success: '#72f1b8',\r\n warning: '#fede5d',\r\n error: '#fe4450',\r\n info: '#36f9f6',\r\n },\r\n { primary: '#241b2f', secondary: '#2d2140', tertiary: '#362a50', hover: '#362a50' },\r\n { primary: '#f0e4fc', secondary: '#b4a0cc', muted: '#6c5c84' },\r\n '#4a3866',\r\n);\r\n\r\nexport const themeVaporwave = lt(\r\n 'Vaporwave',\r\n {\r\n primary: '#ff71ce',\r\n primaryHover: '#e655b5',\r\n success: '#78dcca',\r\n warning: '#ffb86c',\r\n error: '#ff5555',\r\n info: '#76e8fc',\r\n },\r\n { primary: '#fce4f7', secondary: '#e8d0f4', tertiary: '#d4bcf0', hover: '#e8d0f4' },\r\n { primary: '#4a1a4e', secondary: '#7b3f7d', muted: '#c080c0' },\r\n '#d8a8e8',\r\n);\r\n\r\nexport const themeTerminalGreen = dk(\r\n 'Terminal Green',\r\n {\r\n primary: '#00ff41',\r\n primaryHover: '#00cc34',\r\n success: '#00ff41',\r\n warning: '#ffff00',\r\n error: '#ff0000',\r\n info: '#00ffff',\r\n },\r\n { primary: '#0a0a0a', secondary: '#0d1a0d', tertiary: '#1a2e1a', hover: '#1a2e1a' },\r\n { primary: '#00ff41', secondary: '#00cc33', muted: '#008822' },\r\n '#003300',\r\n);\r\n\r\nexport const themeSepia = lt(\r\n 'Sepia',\r\n {\r\n primary: '#8b6914',\r\n primaryHover: '#704f10',\r\n success: '#6b8e23',\r\n warning: '#cd853f',\r\n error: '#b22222',\r\n info: '#5f9ea0',\r\n },\r\n { primary: '#faf0e6', secondary: '#f5e6d3', tertiary: '#eddcc7', hover: '#f5e6d3' },\r\n { primary: '#3e2723', secondary: '#5d4037', muted: '#a1887f' },\r\n '#d7ccc8',\r\n);\r\n\r\nexport const themeVintage = lt(\r\n 'Vintage',\r\n {\r\n primary: '#8d6e63',\r\n primaryHover: '#6d4c41',\r\n success: '#66bb6a',\r\n warning: '#ffb300',\r\n error: '#e53935',\r\n info: '#29b6f6',\r\n },\r\n { primary: '#efebe9', secondary: '#d7ccc8', tertiary: '#bcaaa4', hover: '#d7ccc8' },\r\n { primary: '#3e2723', secondary: '#5d4037', muted: '#a1887f' },\r\n '#bcaaa4',\r\n);\r\n\r\nexport const themeCyberpunk = dk(\r\n 'Cyberpunk',\r\n {\r\n primary: '#00f0ff',\r\n primaryHover: '#00c8d4',\r\n success: '#39ff14',\r\n warning: '#ffff00',\r\n error: '#ff003c',\r\n info: '#bf00ff',\r\n },\r\n { primary: '#0a0e17', secondary: '#131824', tertiary: '#1c2333', hover: '#1c2333' },\r\n { primary: '#e0fbfc', secondary: '#80d4dd', muted: '#3a6b72' },\r\n '#1c3a44',\r\n);\r\n\r\nexport const themeNeon = dk(\r\n 'Neon',\r\n {\r\n primary: '#ff00ff',\r\n primaryHover: '#cc00cc',\r\n success: '#00ff00',\r\n warning: '#ffff00',\r\n error: '#ff0000',\r\n info: '#00ffff',\r\n },\r\n { primary: '#0d0d0d', secondary: '#1a1a1a', tertiary: '#262626', hover: '#262626' },\r\n { primary: '#ffffff', secondary: '#cccccc', muted: '#666666' },\r\n '#333333',\r\n);\r\n\r\nexport const themeRetrowave = dk(\r\n 'Retrowave',\r\n {\r\n primary: '#f77fbe',\r\n primaryHover: '#e462a3',\r\n success: '#72f1b8',\r\n warning: '#ffe261',\r\n error: '#ff4444',\r\n info: '#79e8fb',\r\n },\r\n { primary: '#1b0a2e', secondary: '#261440', tertiary: '#321e52', hover: '#321e52' },\r\n { primary: '#ffe6f7', secondary: '#c9a0c9', muted: '#6b4c7a' },\r\n '#4a2d66',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 9. SEASONAL (8)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeChristmas = lt(\r\n 'Christmas',\r\n {\r\n primary: '#c41e3a',\r\n primaryHover: '#a01830',\r\n success: '#228b22',\r\n warning: '#ffd700',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fef2f2', secondary: '#fde8e8', tertiary: '#f8d0d0', hover: '#fde8e8' },\r\n { primary: '#3b0a0a', secondary: '#7f1d1d', muted: '#dc6868' },\r\n '#e8a0a0',\r\n);\r\n\r\nexport const themeHalloween = dk(\r\n 'Halloween',\r\n {\r\n primary: '#ff6600',\r\n primaryHover: '#e05500',\r\n success: '#4ade80',\r\n warning: '#fbbf24',\r\n error: '#ff0000',\r\n info: '#9333ea',\r\n },\r\n { primary: '#1a0a00', secondary: '#2d1500', tertiary: '#402000', hover: '#402000' },\r\n { primary: '#ffedd5', secondary: '#fdba74', muted: '#9a5c28' },\r\n '#5c3400',\r\n);\r\n\r\nexport const themeValentine = lt(\r\n 'Valentine',\r\n {\r\n primary: '#e11d48',\r\n primaryHover: '#be123c',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#dc2626',\r\n info: '#ec4899',\r\n },\r\n { primary: '#fff1f2', secondary: '#ffe4e6', tertiary: '#fecdd3', hover: '#ffe4e6' },\r\n { primary: '#4c0519', secondary: '#881337', muted: '#f9a8d4' },\r\n '#fda4af',\r\n);\r\n\r\nexport const themeEaster = lt(\r\n 'Easter',\r\n {\r\n primary: '#a78bfa',\r\n primaryHover: '#8b5cf6',\r\n success: '#4ade80',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#fef9ff', secondary: '#f3e8ff', tertiary: '#e8d5ff', hover: '#f3e8ff' },\r\n { primary: '#581c87', secondary: '#6d28d9', muted: '#c4b5fd' },\r\n '#ddd6fe',\r\n);\r\n\r\nexport const themeSummerBeach = lt(\r\n 'Summer Beach',\r\n {\r\n primary: '#0ea5e9',\r\n primaryHover: '#0284c7',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#fffbeb', secondary: '#fef3c7', tertiary: '#fde68a', hover: '#fef3c7' },\r\n { primary: '#0c4a6e', secondary: '#0369a1', muted: '#7dd3fc' },\r\n '#fcd34d',\r\n);\r\n\r\nexport const themeWinterFrost = lt(\r\n 'Winter Frost',\r\n {\r\n primary: '#3b82f6',\r\n primaryHover: '#2563eb',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#f0f9ff', secondary: '#e0f2fe', tertiary: '#bae6fd', hover: '#e0f2fe' },\r\n { primary: '#1e3a5f', secondary: '#1e40af', muted: '#93c5fd' },\r\n '#bfdbfe',\r\n);\r\n\r\nexport const themeCherryBlossom = lt(\r\n 'Cherry Blossom',\r\n {\r\n primary: '#ec4899',\r\n primaryHover: '#db2777',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n },\r\n { primary: '#fdf2f8', secondary: '#fce7f3', tertiary: '#fbcfe8', hover: '#fce7f3' },\r\n { primary: '#831843', secondary: '#9d174d', muted: '#f9a8d4' },\r\n '#fbcfe8',\r\n);\r\n\r\nexport const themeHarvest = lt(\r\n 'Harvest',\r\n {\r\n primary: '#b45309',\r\n primaryHover: '#92400e',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#fffbeb', secondary: '#fef3c7', tertiary: '#fde68a', hover: '#fef3c7' },\r\n { primary: '#451a03', secondary: '#78350f', muted: '#d97706' },\r\n '#fcd34d',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 10. REGIONAL / CULTURAL (8)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeJapaneseZen = lt(\r\n 'Japanese Zen',\r\n {\r\n primary: '#6b7280',\r\n primaryHover: '#4b5563',\r\n success: '#6b8e23',\r\n warning: '#d4a017',\r\n error: '#c0392b',\r\n info: '#5f9ea0',\r\n },\r\n { primary: '#faf9f6', secondary: '#f0ece3', tertiary: '#e6e0d4', hover: '#f0ece3' },\r\n { primary: '#2c2c2c', secondary: '#5c5c5c', muted: '#a0998a' },\r\n '#d5cec0',\r\n);\r\n\r\nexport const themeMoroccan = lt(\r\n 'Moroccan',\r\n {\r\n primary: '#c2410c',\r\n primaryHover: '#9a3412',\r\n success: '#15803d',\r\n warning: '#ca8a04',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#fffbf0', secondary: '#fef3e0', tertiary: '#fde6c4', hover: '#fef3e0' },\r\n { primary: '#3a1a00', secondary: '#7c2d12', muted: '#d97706' },\r\n '#f5d0a0',\r\n);\r\n\r\nexport const themeScandinavian = lt(\r\n 'Scandinavian',\r\n {\r\n primary: '#4b5563',\r\n primaryHover: '#374151',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#ffffff', secondary: '#f9fafb', tertiary: '#f3f4f6', hover: '#f3f4f6' },\r\n { primary: '#111827', secondary: '#374151', muted: '#9ca3af' },\r\n '#e5e7eb',\r\n);\r\n\r\nexport const themeMediterranean = lt(\r\n 'Mediterranean',\r\n {\r\n primary: '#1e40af',\r\n primaryHover: '#1e3a8a',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#eff6ff', secondary: '#dbeafe', tertiary: '#bfdbfe', hover: '#dbeafe' },\r\n { primary: '#1e3a5f', secondary: '#2563eb', muted: '#93c5fd' },\r\n '#bfdbfe',\r\n);\r\n\r\nexport const themeChineseNewYear = lt(\r\n 'Chinese New Year',\r\n {\r\n primary: '#dc2626',\r\n primaryHover: '#b91c1c',\r\n success: '#16a34a',\r\n warning: '#d4a017',\r\n error: '#ef4444',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fef2f2', secondary: '#fee2e2', tertiary: '#fecaca', hover: '#fee2e2' },\r\n { primary: '#450a0a', secondary: '#991b1b', muted: '#f87171' },\r\n '#fca5a5',\r\n);\r\n\r\nexport const themeIndianFestive = lt(\r\n 'Indian Festive',\r\n {\r\n primary: '#d97706',\r\n primaryHover: '#b45309',\r\n success: '#16a34a',\r\n warning: '#ca8a04',\r\n error: '#dc2626',\r\n info: '#7c3aed',\r\n },\r\n { primary: '#fffbeb', secondary: '#fef3c7', tertiary: '#fde68a', hover: '#fef3c7' },\r\n { primary: '#451a03', secondary: '#92400e', muted: '#f59e0b' },\r\n '#fcd34d',\r\n);\r\n\r\nexport const themeBrazilianCarnival = lt(\r\n 'Brazilian Carnival',\r\n {\r\n primary: '#16a34a',\r\n primaryHover: '#15803d',\r\n success: '#22c55e',\r\n warning: '#facc15',\r\n error: '#ef4444',\r\n info: '#0ea5e9',\r\n },\r\n { primary: '#f0fdf4', secondary: '#dcfce7', tertiary: '#bbf7d0', hover: '#dcfce7' },\r\n { primary: '#052e16', secondary: '#166534', muted: '#4ade80' },\r\n '#86efac',\r\n);\r\n\r\nexport const themeAfricanEarth = lt(\r\n 'African Earth',\r\n {\r\n primary: '#92400e',\r\n primaryHover: '#78350f',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#faf5f0', secondary: '#f0e6d6', tertiary: '#e6d5bb', hover: '#f0e6d6' },\r\n { primary: '#2b1a0e', secondary: '#5c3d1e', muted: '#a08060' },\r\n '#d4b896',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 11. ACCESSIBILITY (4)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeHighContrastDark = dk(\r\n 'High Contrast Dark',\r\n {\r\n primary: '#ffff00',\r\n primaryHover: '#cccc00',\r\n success: '#00ff00',\r\n warning: '#ff8c00',\r\n error: '#ff0000',\r\n info: '#00ffff',\r\n },\r\n { primary: '#000000', secondary: '#1a1a1a', tertiary: '#333333', hover: '#333333' },\r\n { primary: '#ffffff', secondary: '#ffffff', muted: '#cccccc' },\r\n '#ffffff',\r\n);\r\n\r\nexport const themeMonochrome = lt(\r\n 'Monochrome',\r\n {\r\n primary: '#404040',\r\n primaryHover: '#262626',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#fafafa', secondary: '#f0f0f0', tertiary: '#e0e0e0', hover: '#e0e0e0' },\r\n { primary: '#1a1a1a', secondary: '#404040', muted: '#808080' },\r\n '#c0c0c0',\r\n);\r\n\r\nexport const themeEnhancedContrast = lt(\r\n 'Enhanced Contrast',\r\n {\r\n primary: '#0050b3',\r\n primaryHover: '#003d8c',\r\n success: '#006400',\r\n warning: '#cc7000',\r\n error: '#cc0000',\r\n info: '#006680',\r\n },\r\n { primary: '#ffffff', secondary: '#f5f5f5', tertiary: '#ebebeb', hover: '#ebebeb' },\r\n { primary: '#000000', secondary: '#1a1a1a', muted: '#595959' },\r\n '#8c8c8c',\r\n);\r\n\r\nexport const themeLargeText: NiceTheme = {\r\n name: 'Large Text',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#2563eb',\r\n primaryHover: '#1d4ed8',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n surface: '#ffffff',\r\n surfaceHover: '#f8fafc',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#f8fafc',\r\n tertiary: '#f1f5f9',\r\n hover: '#f1f5f9',\r\n elevated: '#ffffff',\r\n inset: '#f1f5f9',\r\n canvas: '#ffffff',\r\n },\r\n text: { primary: '#0f172a', secondary: '#475569', muted: '#94a3b8', inverse: '#ffffff' },\r\n borders: br('#e2e8f0'),\r\n shadows: SL,\r\n spacing: {\r\n space1: '6px',\r\n space2: '12px',\r\n space3: '16px',\r\n space4: '20px',\r\n space5: '24px',\r\n space6: '32px',\r\n space8: '40px',\r\n },\r\n typography: {\r\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\r\n fontSizeXs: '0.875rem',\r\n fontSizeSm: '1rem',\r\n fontSizeMd: '1.125rem',\r\n fontSizeLg: '1.25rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.6,\r\n },\r\n transitions: TR,\r\n};\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// 12. MODERN UI (8)\r\n// ═══════════════════════════════════════════════════════════\r\n\r\nexport const themeGlassmorphism: NiceTheme = {\r\n name: 'Glassmorphism',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#6366f1',\r\n primaryHover: '#4f46e5',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n surface: 'rgba(255,255,255,0.7)',\r\n surfaceHover: 'rgba(255,255,255,0.5)',\r\n },\r\n backgrounds: {\r\n primary: 'rgba(255,255,255,0.7)',\r\n secondary: 'rgba(255,255,255,0.5)',\r\n tertiary: 'rgba(255,255,255,0.3)',\r\n hover: 'rgba(255,255,255,0.5)',\r\n elevated: 'rgba(255,255,255,0.8)',\r\n inset: 'rgba(255,255,255,0.3)',\r\n canvas: 'rgba(255,255,255,0.7)',\r\n },\r\n text: { primary: '#1e293b', secondary: '#475569', muted: '#94a3b8', inverse: '#ffffff' },\r\n borders: {\r\n color: 'rgba(255,255,255,0.3)',\r\n radiusSm: '8px',\r\n radiusMd: '12px',\r\n radiusLg: '16px',\r\n radiusXl: '24px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 2px 8px rgba(0,0,0,0.04)',\r\n md: '0 4px 16px rgba(0,0,0,0.08)',\r\n lg: '0 8px 32px rgba(0,0,0,0.12)',\r\n xl: '0 16px 48px rgba(0,0,0,0.16)',\r\n },\r\n spacing: SP,\r\n typography: TY,\r\n transitions: { fast: '150ms ease', normal: '250ms ease', slow: '350ms ease' },\r\n};\r\n\r\nexport const themeNeumorphismLight: NiceTheme = {\r\n name: 'Neumorphism Light',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#6366f1',\r\n primaryHover: '#4f46e5',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n surface: '#e0e5ec',\r\n surfaceHover: '#d5dae2',\r\n },\r\n backgrounds: {\r\n primary: '#e0e5ec',\r\n secondary: '#d5dae2',\r\n tertiary: '#ccd1d9',\r\n hover: '#d5dae2',\r\n elevated: '#e0e5ec',\r\n inset: '#ccd1d9',\r\n canvas: '#e0e5ec',\r\n },\r\n text: { primary: '#2d3748', secondary: '#4a5568', muted: '#718096', inverse: '#ffffff' },\r\n borders: {\r\n color: '#d0d5dd',\r\n radiusSm: '8px',\r\n radiusMd: '12px',\r\n radiusLg: '16px',\r\n radiusXl: '20px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '3px 3px 6px #b8bec7, -3px -3px 6px #ffffff',\r\n md: '5px 5px 10px #b8bec7, -5px -5px 10px #ffffff',\r\n lg: '8px 8px 16px #b8bec7, -8px -8px 16px #ffffff',\r\n xl: '12px 12px 24px #b8bec7, -12px -12px 24px #ffffff',\r\n },\r\n spacing: SP,\r\n typography: TY,\r\n transitions: TR,\r\n};\r\n\r\nexport const themeNeumorphismDark: NiceTheme = {\r\n name: 'Neumorphism Dark',\r\n darkMode: 'dark',\r\n colors: {\r\n primary: '#818cf8',\r\n primaryHover: '#6366f1',\r\n success: '#34d399',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#22d3ee',\r\n surface: '#283141',\r\n surfaceHover: '#232b3a',\r\n },\r\n backgrounds: {\r\n primary: '#2d3748',\r\n secondary: '#283141',\r\n tertiary: '#232b3a',\r\n hover: '#283141',\r\n elevated: '#283141',\r\n inset: '#2d3748',\r\n canvas: '#2d3748',\r\n },\r\n text: { primary: '#e2e8f0', secondary: '#a0aec0', muted: '#718096', inverse: '#0f172a' },\r\n borders: {\r\n color: '#3a4556',\r\n radiusSm: '8px',\r\n radiusMd: '12px',\r\n radiusLg: '16px',\r\n radiusXl: '20px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '3px 3px 6px #1a202c, -3px -3px 6px #404d64',\r\n md: '5px 5px 10px #1a202c, -5px -5px 10px #404d64',\r\n lg: '8px 8px 16px #1a202c, -8px -8px 16px #404d64',\r\n xl: '12px 12px 24px #1a202c, -12px -12px 24px #404d64',\r\n },\r\n spacing: SP,\r\n typography: TY,\r\n transitions: TR,\r\n};\r\n\r\nexport const themeMinimalist = lt(\r\n 'Minimalist',\r\n {\r\n primary: '#18181b',\r\n primaryHover: '#27272a',\r\n success: '#22c55e',\r\n warning: '#eab308',\r\n error: '#ef4444',\r\n info: '#3b82f6',\r\n },\r\n { primary: '#ffffff', secondary: '#fafafa', tertiary: '#f5f5f5', hover: '#f5f5f5' },\r\n { primary: '#0a0a0a', secondary: '#404040', muted: '#a3a3a3' },\r\n '#e5e5e5',\r\n);\r\n\r\nexport const themeWarmDark = dk(\r\n 'Warm Dark',\r\n {\r\n primary: '#f59e0b',\r\n primaryHover: '#d97706',\r\n success: '#10b981',\r\n warning: '#fbbf24',\r\n error: '#f87171',\r\n info: '#38bdf8',\r\n },\r\n { primary: '#1c1917', secondary: '#292524', tertiary: '#44403c', hover: '#44403c' },\r\n { primary: '#fafaf9', secondary: '#d6d3d1', muted: '#78716c' },\r\n '#57534e',\r\n);\r\n\r\nexport const themeSoftDark = dk(\r\n 'Soft Dark',\r\n {\r\n primary: '#a78bfa',\r\n primaryHover: '#8b5cf6',\r\n success: '#34d399',\r\n warning: '#fcd34d',\r\n error: '#fb7185',\r\n info: '#67e8f9',\r\n },\r\n { primary: '#1e1e2e', secondary: '#262637', tertiary: '#313147', hover: '#313147' },\r\n { primary: '#e8e8f0', secondary: '#a0a0b8', muted: '#5c5c74' },\r\n '#3e3e58',\r\n);\r\n\r\nexport const themeCoffee = lt(\r\n 'Coffee',\r\n {\r\n primary: '#6f4e37',\r\n primaryHover: '#5c3d28',\r\n success: '#4d7c0f',\r\n warning: '#a16207',\r\n error: '#b91c1c',\r\n info: '#0e7490',\r\n },\r\n { primary: '#faf6f1', secondary: '#f0e8dc', tertiary: '#e6d8c6', hover: '#f0e8dc' },\r\n { primary: '#2c1a0e', secondary: '#5c3d28', muted: '#a08868' },\r\n '#d4c4a8',\r\n);\r\n\r\nexport const themeWine = lt(\r\n 'Wine',\r\n {\r\n primary: '#7f1d1d',\r\n primaryHover: '#641717',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n },\r\n { primary: '#fef2f2', secondary: '#fde8e8', tertiary: '#f8d0d0', hover: '#fde8e8' },\r\n { primary: '#3b0a0a', secondary: '#7f1d1d', muted: '#dc6868' },\r\n '#e8a0a0',\r\n);\r\n\r\n// ═══════════════════════════════════════════════════════════\r\n// Combined gallery array\r\n// ═══════════════════════════════════════════════════════════\r\n\r\n/** All 100 gallery themes in a single array. */\r\nexport const NICE_THEME_GALLERY: NiceTheme[] = [\r\n // Neutral\r\n themeSlate,\r\n themeZinc,\r\n themeStone,\r\n themeCoolGray,\r\n themeWarmGray,\r\n themeSilver,\r\n themeCharcoal,\r\n themeIvory,\r\n // Vibrant\r\n themeRose,\r\n themeEmerald,\r\n themeAmber,\r\n themeViolet,\r\n themeTeal,\r\n themeIndigo,\r\n themeCyan,\r\n themeLime,\r\n themePink,\r\n themeOrange,\r\n themeFuchsia,\r\n themeSky,\r\n themeRuby,\r\n themeCoral,\r\n // Dark\r\n themeMidnight,\r\n themeObsidian,\r\n themeEclipse,\r\n themeOnyx,\r\n themeCarbon,\r\n themeCosmos,\r\n themeNebula,\r\n themeAbyss,\r\n themeShadow,\r\n themeEmeraldDark,\r\n // Nature\r\n themeForest,\r\n themeOcean,\r\n themeDesert,\r\n themeSunset,\r\n themeAurora,\r\n themeLavender,\r\n themeAutumn,\r\n themeSpring,\r\n themeArctic,\r\n themeTropical,\r\n // Pastel\r\n themePastelRose,\r\n themePastelSky,\r\n themePastelMint,\r\n themePastelPeach,\r\n themePastelLavender,\r\n themePastelLemon,\r\n themePastelSage,\r\n themePastelCoral,\r\n // Industry\r\n themeBanking,\r\n themeHealthcare,\r\n themeLegal,\r\n themeTechStartup,\r\n themeEnterprise,\r\n themeGovernment,\r\n themeEducation,\r\n themeRealEstate,\r\n // Design System\r\n themeNord,\r\n themeDracula,\r\n themeSolarizedLight,\r\n themeSolarizedDark,\r\n themeMonokai,\r\n themeOneDark,\r\n // Retro\r\n themeSynthwave,\r\n themeVaporwave,\r\n themeTerminalGreen,\r\n themeSepia,\r\n themeVintage,\r\n themeCyberpunk,\r\n themeNeon,\r\n themeRetrowave,\r\n // Seasonal\r\n themeChristmas,\r\n themeHalloween,\r\n themeValentine,\r\n themeEaster,\r\n themeSummerBeach,\r\n themeWinterFrost,\r\n themeCherryBlossom,\r\n themeHarvest,\r\n // Cultural\r\n themeJapaneseZen,\r\n themeMoroccan,\r\n themeScandinavian,\r\n themeMediterranean,\r\n themeChineseNewYear,\r\n themeIndianFestive,\r\n themeBrazilianCarnival,\r\n themeAfricanEarth,\r\n // Accessibility\r\n themeHighContrastDark,\r\n themeMonochrome,\r\n themeEnhancedContrast,\r\n themeLargeText,\r\n // Modern UI\r\n themeGlassmorphism,\r\n themeNeumorphismLight,\r\n themeNeumorphismDark,\r\n themeMinimalist,\r\n themeWarmDark,\r\n themeSoftDark,\r\n themeCoffee,\r\n themeWine,\r\n];\r\n","// ============================================================\r\n// Nice2Dev UI — Built-in Theme Presets\r\n// ============================================================\r\n\r\nimport type { NiceTheme } from './theme';\r\nimport { NICE_THEME_GALLERY } from './themeGallery';\r\n\r\nconst BASE_SPACING = {\r\n space1: '4px',\r\n space2: '8px',\r\n space3: '12px',\r\n space4: '16px',\r\n space5: '20px',\r\n space6: '24px',\r\n space8: '32px',\r\n};\r\n\r\nconst BASE_TYPOGRAPHY = {\r\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.125rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n};\r\n\r\nconst BASE_BORDERS_LIGHT = {\r\n color: '#e2e8f0',\r\n radiusSm: '4px',\r\n radiusMd: '6px',\r\n radiusLg: '8px',\r\n radiusXl: '12px',\r\n radiusFull: '9999px',\r\n};\r\n\r\nconst BASE_TRANSITIONS = { fast: '120ms ease', normal: '200ms ease', slow: '300ms ease' };\r\n\r\n// ── Light theme (default) ───────────────────────────────────\r\n\r\nexport const niceThemeLight: NiceTheme = {\r\n name: 'Light',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#3b82f6',\r\n primaryHover: '#2563eb',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n surface: '#ffffff',\r\n surfaceHover: '#f8fafc',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#f8fafc',\r\n tertiary: '#f1f5f9',\r\n hover: '#f1f5f9',\r\n elevated: '#ffffff',\r\n inset: '#f1f5f9',\r\n canvas: '#f8fafc',\r\n },\r\n text: { primary: '#0f172a', secondary: '#475569', muted: '#94a3b8', inverse: '#ffffff' },\r\n borders: BASE_BORDERS_LIGHT,\r\n shadows: {\r\n sm: '0 1px 2px rgba(0,0,0,0.05)',\r\n md: '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)',\r\n lg: '0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)',\r\n xl: '0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)',\r\n },\r\n spacing: BASE_SPACING,\r\n typography: BASE_TYPOGRAPHY,\r\n transitions: BASE_TRANSITIONS,\r\n};\r\n\r\n// ── Dark theme (Developer-focused: minimalist black with white text) ────────\r\n\r\nexport const niceThemeDark: NiceTheme = {\r\n name: 'Dark',\r\n darkMode: 'dark',\r\n colors: {\r\n primary: '#3b82f6',\r\n primaryHover: '#60a5fa',\r\n success: '#22c55e',\r\n warning: '#eab308',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n surface: '#141414',\r\n surfaceHover: '#1e1e1e',\r\n },\r\n backgrounds: {\r\n primary: '#0a0a0a',\r\n secondary: '#141414',\r\n tertiary: '#1e1e1e',\r\n hover: '#1a1a1a',\r\n elevated: '#141414',\r\n inset: '#0a0a0a',\r\n canvas: '#0a0a0a',\r\n },\r\n text: { primary: '#ffffff', secondary: '#a1a1a1', muted: '#6b6b6b', inverse: '#0f172a' },\r\n borders: { ...BASE_BORDERS_LIGHT, color: '#2a2a2a' },\r\n shadows: {\r\n sm: '0 1px 2px rgba(0,0,0,0.5)',\r\n md: '0 4px 6px -1px rgba(0,0,0,0.6)',\r\n lg: '0 10px 15px -3px rgba(0,0,0,0.6)',\r\n xl: '0 20px 25px -5px rgba(0,0,0,0.6)',\r\n },\r\n spacing: BASE_SPACING,\r\n typography: BASE_TYPOGRAPHY,\r\n transitions: BASE_TRANSITIONS,\r\n};\r\n\r\n// ── Blue corporate theme ────────────────────────────────────\r\n\r\nexport const niceThemeBlue: NiceTheme = {\r\n name: 'Blue',\r\n colors: {\r\n primary: '#1d4ed8',\r\n primaryHover: '#1e40af',\r\n success: '#059669',\r\n warning: '#d97706',\r\n error: '#dc2626',\r\n info: '#0891b2',\r\n surface: '#eff6ff',\r\n surfaceHover: '#dbeafe',\r\n },\r\n backgrounds: {\r\n primary: '#eff6ff',\r\n secondary: '#dbeafe',\r\n tertiary: '#bfdbfe',\r\n hover: '#dbeafe',\r\n elevated: '#ffffff',\r\n inset: '#dbeafe',\r\n canvas: '#eff6ff',\r\n },\r\n text: { primary: '#1e3a5f', secondary: '#3b628a', muted: '#7da0c4', inverse: '#ffffff' },\r\n borders: { ...BASE_BORDERS_LIGHT, color: '#93c5fd' },\r\n shadows: {\r\n sm: '0 1px 2px rgba(29,78,216,0.08)',\r\n md: '0 4px 6px -1px rgba(29,78,216,0.12)',\r\n lg: '0 10px 15px -3px rgba(29,78,216,0.15)',\r\n xl: '0 20px 25px -5px rgba(29,78,216,0.18)',\r\n },\r\n spacing: BASE_SPACING,\r\n typography: BASE_TYPOGRAPHY,\r\n transitions: BASE_TRANSITIONS,\r\n};\r\n\r\n// ── High contrast (accessibility) ───────────────────────────\r\n\r\nexport const niceThemeHighContrast: NiceTheme = {\r\n name: 'High Contrast',\r\n colors: {\r\n primary: '#0000ff',\r\n primaryHover: '#0000cc',\r\n success: '#008000',\r\n warning: '#ff8c00',\r\n error: '#ff0000',\r\n info: '#008b8b',\r\n surface: '#ffffff',\r\n surfaceHover: '#f0f0f0',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#f0f0f0',\r\n tertiary: '#e0e0e0',\r\n hover: '#e0e0e0',\r\n elevated: '#ffffff',\r\n inset: '#e0e0e0',\r\n canvas: '#ffffff',\r\n },\r\n text: { primary: '#000000', secondary: '#1a1a1a', muted: '#4d4d4d', inverse: '#ffffff' },\r\n borders: { ...BASE_BORDERS_LIGHT, color: '#000000' },\r\n shadows: {\r\n sm: '0 1px 2px rgba(0,0,0,0.15)',\r\n md: '0 4px 6px rgba(0,0,0,0.2)',\r\n lg: '0 10px 15px rgba(0,0,0,0.25)',\r\n xl: '0 20px 25px rgba(0,0,0,0.3)',\r\n },\r\n spacing: BASE_SPACING,\r\n typography: BASE_TYPOGRAPHY,\r\n transitions: BASE_TRANSITIONS,\r\n};\r\n\r\n// ── Material Design theme (Google Material 3 inspired) ──────\r\n\r\nexport const niceThemeMaterial: NiceTheme = {\r\n name: 'Material',\r\n colors: {\r\n primary: '#6750a4',\r\n primaryHover: '#4f378b',\r\n success: '#386a20',\r\n warning: '#7c5800',\r\n error: '#ba1a1a',\r\n info: '#00629e',\r\n surface: '#fffbfe',\r\n surfaceHover: '#f6edff',\r\n },\r\n backgrounds: {\r\n primary: '#fffbfe',\r\n secondary: '#f6edff',\r\n tertiary: '#ece6f0',\r\n hover: '#eaddff',\r\n elevated: '#ffffff',\r\n inset: '#ece6f0',\r\n canvas: '#fffbfe',\r\n },\r\n text: { primary: '#1c1b1f', secondary: '#49454f', muted: '#79747e', inverse: '#ffffff' },\r\n borders: {\r\n ...BASE_BORDERS_LIGHT,\r\n color: '#cac4d0',\r\n radiusSm: '8px',\r\n radiusMd: '12px',\r\n radiusLg: '16px',\r\n radiusXl: '28px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px rgba(0,0,0,0.3), 0 1px 3px rgba(0,0,0,0.15)',\r\n md: '0 1px 2px rgba(0,0,0,0.3), 0 2px 6px 2px rgba(0,0,0,0.15)',\r\n lg: '0 4px 8px 3px rgba(0,0,0,0.15), 0 1px 3px rgba(0,0,0,0.3)',\r\n xl: '0 6px 10px 4px rgba(0,0,0,0.15), 0 2px 3px rgba(0,0,0,0.3)',\r\n },\r\n spacing: BASE_SPACING,\r\n typography: {\r\n fontFamily: \"'Roboto', 'Noto Sans', system-ui, sans-serif\",\r\n fontSizeXs: '0.6875rem',\r\n fontSizeSm: '0.75rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n },\r\n transitions: {\r\n fast: '100ms cubic-bezier(0.2,0,0,1)',\r\n normal: '200ms cubic-bezier(0.2,0,0,1)',\r\n slow: '300ms cubic-bezier(0.2,0,0,1)',\r\n },\r\n};\r\n\r\n// ── Bootstrap theme (Bootstrap 5 inspired) ──────────────────\r\n\r\nexport const niceThemeBootstrap: NiceTheme = {\r\n name: 'Bootstrap',\r\n colors: {\r\n primary: '#0d6efd',\r\n primaryHover: '#0b5ed7',\r\n success: '#198754',\r\n warning: '#ffc107',\r\n error: '#dc3545',\r\n info: '#0dcaf0',\r\n surface: '#ffffff',\r\n surfaceHover: '#f8f9fa',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#f8f9fa',\r\n tertiary: '#e9ecef',\r\n hover: '#e9ecef',\r\n elevated: '#ffffff',\r\n inset: '#e9ecef',\r\n canvas: '#f8f9fa',\r\n },\r\n text: { primary: '#212529', secondary: '#6c757d', muted: '#adb5bd', inverse: '#ffffff' },\r\n borders: {\r\n color: '#dee2e6',\r\n radiusSm: '4px',\r\n radiusMd: '6px',\r\n radiusLg: '8px',\r\n radiusXl: '16px',\r\n radiusFull: '50rem',\r\n },\r\n shadows: {\r\n sm: '0 0.125rem 0.25rem rgba(0,0,0,0.075)',\r\n md: '0 0.5rem 1rem rgba(0,0,0,0.15)',\r\n lg: '0 1rem 3rem rgba(0,0,0,0.175)',\r\n xl: '0 1rem 3rem rgba(0,0,0,0.25)',\r\n },\r\n spacing: BASE_SPACING,\r\n typography: {\r\n fontFamily:\r\n \"system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', sans-serif\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.25rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n },\r\n transitions: BASE_TRANSITIONS,\r\n};\r\n\r\n// ── Fluent theme (Microsoft Fluent UI 2 inspired) ───────────\r\n\r\nexport const niceThemeFluent: NiceTheme = {\r\n name: 'Fluent',\r\n colors: {\r\n primary: '#0078d4',\r\n primaryHover: '#106ebe',\r\n success: '#107c10',\r\n warning: '#fce100',\r\n error: '#d13438',\r\n info: '#00b7c3',\r\n surface: '#ffffff',\r\n surfaceHover: '#faf9f8',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#faf9f8',\r\n tertiary: '#f3f2f1',\r\n hover: '#edebe9',\r\n elevated: '#ffffff',\r\n inset: '#f3f2f1',\r\n canvas: '#faf9f8',\r\n },\r\n text: { primary: '#323130', secondary: '#605e5c', muted: '#a19f9d', inverse: '#ffffff' },\r\n borders: {\r\n color: '#e1dfdd',\r\n radiusSm: '2px',\r\n radiusMd: '4px',\r\n radiusLg: '8px',\r\n radiusXl: '12px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1.6px 3.6px 0 rgba(0,0,0,0.132), 0 0.3px 0.9px 0 rgba(0,0,0,0.108)',\r\n md: '0 3.2px 7.2px 0 rgba(0,0,0,0.132), 0 0.6px 1.8px 0 rgba(0,0,0,0.108)',\r\n lg: '0 6.4px 14.4px 0 rgba(0,0,0,0.132), 0 1.2px 3.6px 0 rgba(0,0,0,0.108)',\r\n xl: '0 25.6px 57.6px 0 rgba(0,0,0,0.22), 0 4.8px 14.4px 0 rgba(0,0,0,0.18)',\r\n },\r\n spacing: BASE_SPACING,\r\n typography: {\r\n fontFamily:\r\n \"'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, sans-serif\",\r\n fontSizeXs: '10px',\r\n fontSizeSm: '12px',\r\n fontSizeMd: '14px',\r\n fontSizeLg: '16px',\r\n fontSizeXl: '20px',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.42857,\r\n },\r\n transitions: {\r\n fast: '100ms cubic-bezier(0.1,0.9,0.2,1)',\r\n normal: '200ms cubic-bezier(0.1,0.9,0.2,1)',\r\n slow: '300ms cubic-bezier(0.1,0.9,0.2,1)',\r\n },\r\n};\r\n\r\n// ── All presets ──────────────────────────────────────────────\r\n\r\nexport const NICE_THEME_PRESETS: NiceTheme[] = [\r\n niceThemeLight,\r\n niceThemeDark,\r\n niceThemeBlue,\r\n niceThemeHighContrast,\r\n niceThemeMaterial,\r\n niceThemeBootstrap,\r\n niceThemeFluent,\r\n ...NICE_THEME_GALLERY,\r\n];\r\n","// ============================================================\r\n// Nice2Dev UI — Curated Theme Packs\r\n// ============================================================\r\n//\r\n// A NiceThemePack bundles a NiceTheme (tokens) with a recommended\r\n// NiceDisplayStyle and optional variantConfig tweaks, so choosing\r\n// a pack gives you a fully coherent visual identity — not just\r\n// a different colour palette.\r\n//\r\n// Each pack is intentionally designed on a *different axis*:\r\n// radii, shadows, typography, density, background patterns,\r\n// transition curves — so themes actually feel different.\r\n//\r\n// Feed a pack into <NiceThemeProvider> like this:\r\n//\r\n// const pack = NICE_THEME_PACKS.obsidianEditorial;\r\n// <NiceThemeProvider\r\n// theme={pack.theme}\r\n// displayStyle={pack.displayStyle}\r\n// variantConfig={pack.variantConfig}\r\n// >\r\n// {children}\r\n// </NiceThemeProvider>\r\n//\r\n// Font CDN links needed for accurate rendering are exported as\r\n// `NICE_THEME_PACK_FONT_LINKS` — inject them once in <head>.\r\n// ============================================================\r\n\r\nimport type { NiceDisplayStyle } from './displayStyle';\r\nimport type { NiceTheme } from './theme';\r\nimport type { ThemeVariantConfig } from './themeVariants';\r\n\r\n// ── Types ────────────────────────────────────────────────────\r\n\r\nexport interface NiceThemePackMeta {\r\n /** Short slug id (camelCase). */\r\n id: string;\r\n /** Display name shown in pickers. */\r\n name: string;\r\n /** One-sentence tagline. */\r\n tagline: string;\r\n /** Tags for filtering (e.g. 'dark', 'editorial', 'retro'). */\r\n tags: string[];\r\n}\r\n\r\nexport interface NiceThemePack {\r\n meta: NiceThemePackMeta;\r\n theme: NiceTheme;\r\n displayStyle: NiceDisplayStyle;\r\n variantConfig?: Partial<ThemeVariantConfig>;\r\n}\r\n\r\n// ── Font stacks (exported so you can inject them in <head>) ──\r\n\r\nexport const NICE_THEME_PACK_FONT_LINKS: string[] = [\r\n // Obsidian Editorial, Newspaper Broadsheet — serif display + body\r\n 'https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700&family=Inter:wght@400;500;600&display=swap',\r\n // Terminal, Neon Arcade — monospace\r\n 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap',\r\n // Brutalist, Bauhaus — geometric display\r\n 'https://fonts.googleapis.com/css2?family=Archivo+Black&family=Archivo:wght@400;500;700&display=swap',\r\n // Synthwave, Vapor — retro stylised\r\n 'https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=Rajdhani:wght@400;500;700&display=swap',\r\n // Hygge — humanist\r\n 'https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;500;600;700&family=Work+Sans:wght@400;500;600&display=swap',\r\n // Candy Pop, Claymorphism — rounded friendly\r\n 'https://fonts.googleapis.com/css2?family=Quicksand:wght@400;500;600;700&family=Nunito:wght@400;600;700;800&display=swap',\r\n // Zen — ultralight clean\r\n 'https://fonts.googleapis.com/css2?family=Manrope:wght@200;300;400;600&display=swap',\r\n // Bank Vault — classical serif + small caps\r\n 'https://fonts.googleapis.com/css2?family=Libre+Caslon+Text:wght@400;700&family=DM+Sans:wght@400;500;700&display=swap',\r\n // Glass Aurora — modern geometric\r\n 'https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap',\r\n];\r\n\r\n// ── Shared tiny helpers ──────────────────────────────────────\r\n\r\nconst SP_TIGHT = {\r\n space1: '2px',\r\n space2: '4px',\r\n space3: '8px',\r\n space4: '12px',\r\n space5: '16px',\r\n space6: '20px',\r\n space8: '28px',\r\n};\r\nconst SP_NORMAL = {\r\n space1: '4px',\r\n space2: '8px',\r\n space3: '12px',\r\n space4: '16px',\r\n space5: '20px',\r\n space6: '24px',\r\n space8: '32px',\r\n};\r\nconst SP_AIRY = {\r\n space1: '6px',\r\n space2: '12px',\r\n space3: '16px',\r\n space4: '24px',\r\n space5: '32px',\r\n space6: '40px',\r\n space8: '56px',\r\n};\r\n\r\n// ============================================================\r\n// 1. OBSIDIAN EDITORIAL\r\n// Dark magazine. Fraunces serif headings, monospace captions,\r\n// razor borders, zero shadow, grain overlay.\r\n// ============================================================\r\n\r\nexport const obsidianEditorial: NiceThemePack = {\r\n meta: {\r\n id: 'obsidianEditorial',\r\n name: 'Obsidian Editorial',\r\n tagline: 'Dark-mode magazine — serif display, razor borders, grain.',\r\n tags: ['dark', 'editorial', 'serif'],\r\n },\r\n theme: {\r\n name: 'Obsidian Editorial',\r\n darkMode: 'dark',\r\n colors: {\r\n primary: '#e8dcc4',\r\n primaryHover: '#d4c29c',\r\n success: '#7fb069',\r\n warning: '#e6aa68',\r\n error: '#d65a5a',\r\n info: '#88aabb',\r\n accent: '#c98a5b',\r\n focus: '#e8dcc4',\r\n surface: '#1a1715',\r\n surfaceHover: '#221e1b',\r\n },\r\n backgrounds: {\r\n primary: '#0e0c0b',\r\n secondary: '#1a1715',\r\n tertiary: '#221e1b',\r\n hover: '#2a2522',\r\n elevated: '#1a1715',\r\n inset: '#0b0908',\r\n canvas: '#0e0c0b',\r\n },\r\n text: {\r\n primary: '#ede4d1',\r\n secondary: '#a39787',\r\n muted: '#6b6055',\r\n inverse: '#0e0c0b',\r\n },\r\n borders: {\r\n color: '#332d28',\r\n radiusSm: '0',\r\n radiusMd: '1px',\r\n radiusLg: '2px',\r\n radiusXl: '3px',\r\n radiusFull: '9999px',\r\n width: '1px',\r\n divider: '#28231f',\r\n },\r\n shadows: {\r\n sm: 'none',\r\n md: '0 1px 0 0 rgba(232,220,196,0.04)',\r\n lg: '0 2px 0 0 rgba(232,220,196,0.06)',\r\n xl: '0 4px 0 0 rgba(232,220,196,0.08)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'Inter', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Fraunces', 'Playfair Display', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', ui-monospace, monospace\",\r\n fontSizeXs: '0.6875rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.65,\r\n letterSpacing: '0.005em',\r\n headingLetterSpacing: '-0.02em',\r\n },\r\n transitions: {\r\n fast: '80ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '140ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '220ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n backgroundImage: { type: 'pattern', pattern: 'noise', opacity: 0.35, blendMode: 'overlay' },\r\n },\r\n displayStyle: 'editorial',\r\n variantConfig: { density: 'comfortable', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 2. NEON ARCADE\r\n// Pure black + phosphor green. JetBrains Mono everywhere,\r\n// zero radius, glow shadow, scan-line grid background.\r\n// ============================================================\r\n\r\nexport const neonArcade: NiceThemePack = {\r\n meta: {\r\n id: 'neonArcade',\r\n name: 'Neon Arcade',\r\n tagline: 'Phosphor-green terminal glow on absolute black.',\r\n tags: ['dark', 'retro', 'mono', 'terminal'],\r\n },\r\n theme: {\r\n name: 'Neon Arcade',\r\n darkMode: 'dark',\r\n colors: {\r\n primary: '#39ff14',\r\n primaryHover: '#50ff35',\r\n success: '#39ff14',\r\n warning: '#ffcc00',\r\n error: '#ff3355',\r\n info: '#00e5ff',\r\n accent: '#ff00aa',\r\n focus: '#39ff14',\r\n surface: '#060a06',\r\n surfaceHover: '#0b140b',\r\n },\r\n backgrounds: {\r\n primary: '#000000',\r\n secondary: '#060a06',\r\n tertiary: '#0b140b',\r\n hover: '#12241a',\r\n elevated: '#060a06',\r\n inset: '#000000',\r\n canvas: '#000000',\r\n },\r\n text: {\r\n primary: '#c8ffb8',\r\n secondary: '#7be368',\r\n muted: '#3e7a39',\r\n inverse: '#000000',\r\n },\r\n borders: {\r\n color: '#1d3a1d',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '0',\r\n width: '1px',\r\n divider: '#143014',\r\n focusColor: '#39ff14',\r\n },\r\n shadows: {\r\n sm: '0 0 4px rgba(57,255,20,0.3)',\r\n md: '0 0 10px rgba(57,255,20,0.35), 0 0 2px rgba(57,255,20,0.6)',\r\n lg: '0 0 22px rgba(57,255,20,0.4), 0 0 4px rgba(57,255,20,0.7)',\r\n xl: '0 0 40px rgba(57,255,20,0.5), 0 0 8px rgba(57,255,20,0.8)',\r\n glow: '0 0 30px #39ff14, 0 0 60px rgba(57,255,20,0.4)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'JetBrains Mono', 'Fira Code', ui-monospace, monospace\",\r\n headingFontFamily: \"'JetBrains Mono', monospace\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.25rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '0.08em',\r\n },\r\n transitions: {\r\n fast: '60ms steps(4, end)',\r\n normal: '120ms steps(6, end)',\r\n slow: '200ms steps(8, end)',\r\n },\r\n backgroundImage: { type: 'pattern', pattern: 'grid', opacity: 0.25 },\r\n },\r\n displayStyle: 'terminal',\r\n variantConfig: { radius: 'none', shadow: 'glow', density: 'compact', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 3. HYGGE SCANDINAVIAN\r\n// Warm cream, generous radii, serif display, super-soft shadow,\r\n// airy spacing, humanist body font.\r\n// ============================================================\r\n\r\nexport const hyggeScandinavian: NiceThemePack = {\r\n meta: {\r\n id: 'hyggeScandinavian',\r\n name: 'Hygge Scandinavian',\r\n tagline: 'Warm cream, generous breathing room, soft serif display.',\r\n tags: ['light', 'warm', 'serif', 'spacious'],\r\n },\r\n theme: {\r\n name: 'Hygge Scandinavian',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#8b6f47',\r\n primaryHover: '#6f5738',\r\n success: '#6b8e4e',\r\n warning: '#d49a3e',\r\n error: '#b84c4c',\r\n info: '#6a8aad',\r\n accent: '#c98754',\r\n focus: '#8b6f47',\r\n surface: '#fbf6ed',\r\n surfaceHover: '#f3ecdf',\r\n },\r\n backgrounds: {\r\n primary: '#fdf9f1',\r\n secondary: '#f5eee0',\r\n tertiary: '#ede3d0',\r\n hover: '#e8ddc8',\r\n elevated: '#ffffff',\r\n inset: '#f0e7d4',\r\n canvas: '#fdf9f1',\r\n },\r\n text: {\r\n primary: '#3a2f22',\r\n secondary: '#6a5845',\r\n muted: '#9c8c76',\r\n inverse: '#fdf9f1',\r\n },\r\n borders: {\r\n color: '#d9cbb0',\r\n radiusSm: '8px',\r\n radiusMd: '14px',\r\n radiusLg: '22px',\r\n radiusXl: '32px',\r\n radiusFull: '9999px',\r\n width: '1px',\r\n divider: '#e8ddc8',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px rgba(122,92,58,0.05)',\r\n md: '0 6px 16px -4px rgba(122,92,58,0.08)',\r\n lg: '0 16px 32px -10px rgba(122,92,58,0.10)',\r\n xl: '0 28px 56px -18px rgba(122,92,58,0.14)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'Work Sans', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Cormorant Garamond', Georgia, serif\",\r\n monoFontFamily: \"ui-monospace, 'SF Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.7,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.01em',\r\n },\r\n transitions: {\r\n fast: '160ms cubic-bezier(0.16,1,0.3,1)',\r\n normal: '260ms cubic-bezier(0.16,1,0.3,1)',\r\n slow: '400ms cubic-bezier(0.16,1,0.3,1)',\r\n },\r\n },\r\n displayStyle: 'scandinavian',\r\n variantConfig: { density: 'spacious', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 4. BRUTALIST RAW\r\n// Off-white paper + stark black. Hard offset drop-shadows\r\n// (solid colour, no blur). Zero radius. Archivo Black.\r\n// ============================================================\r\n\r\nexport const brutalistRaw: NiceThemePack = {\r\n meta: {\r\n id: 'brutalistRaw',\r\n name: 'Brutalist Raw',\r\n tagline: 'Paper + ink + hard shadows — zero blur, zero mercy.',\r\n tags: ['light', 'brutalist', 'experimental'],\r\n },\r\n theme: {\r\n name: 'Brutalist Raw',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#ff3b30',\r\n primaryHover: '#000000',\r\n success: '#00aa55',\r\n warning: '#ffcc00',\r\n error: '#ff0000',\r\n info: '#0066ff',\r\n accent: '#ffcc00',\r\n focus: '#ff3b30',\r\n surface: '#ffffff',\r\n surfaceHover: '#f5f3ee',\r\n },\r\n backgrounds: {\r\n primary: '#f5f3ee',\r\n secondary: '#ffffff',\r\n tertiary: '#e8e4d8',\r\n hover: '#e0dcd0',\r\n elevated: '#ffffff',\r\n inset: '#e8e4d8',\r\n canvas: '#f5f3ee',\r\n },\r\n text: {\r\n primary: '#000000',\r\n secondary: '#1a1a1a',\r\n muted: '#555555',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: '#000000',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '0',\r\n width: '2px',\r\n divider: '#000000',\r\n },\r\n shadows: {\r\n sm: '3px 3px 0 0 #000000',\r\n md: '6px 6px 0 0 #000000',\r\n lg: '10px 10px 0 0 #000000',\r\n xl: '14px 14px 0 0 #000000',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Archivo', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Archivo Black', 'Archivo', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.75rem',\r\n fontWeightNormal: 500,\r\n fontWeightMedium: 700,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 900,\r\n lineHeight: 1.4,\r\n letterSpacing: '-0.01em',\r\n headingLetterSpacing: '-0.04em',\r\n },\r\n transitions: {\r\n fast: '0ms linear',\r\n normal: '80ms cubic-bezier(0.2,0,0,1)',\r\n slow: '140ms cubic-bezier(0.2,0,0,1)',\r\n },\r\n },\r\n displayStyle: 'brutalist',\r\n variantConfig: { radius: 'none', shadow: 'lg', density: 'normal', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 5. GLASS AURORA\r\n// Frosted glass surfaces over aurora gradient.\r\n// Big radii, blurred soft shadows, light body.\r\n// ============================================================\r\n\r\nexport const glassAurora: NiceThemePack = {\r\n meta: {\r\n id: 'glassAurora',\r\n name: 'Glass Aurora',\r\n tagline: 'Frosted translucency floating over aurora light.',\r\n tags: ['light', 'glass', 'modern', 'gradient'],\r\n },\r\n theme: {\r\n name: 'Glass Aurora',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#5b5bff',\r\n primaryHover: '#4343e8',\r\n success: '#10b981',\r\n warning: '#f59e0b',\r\n error: '#ef4444',\r\n info: '#06b6d4',\r\n accent: '#ec4899',\r\n focus: '#5b5bff',\r\n surface: 'rgba(255,255,255,0.55)',\r\n surfaceHover: 'rgba(255,255,255,0.75)',\r\n },\r\n backgrounds: {\r\n primary: 'rgba(255,255,255,0.55)',\r\n secondary: 'rgba(255,255,255,0.35)',\r\n tertiary: 'rgba(255,255,255,0.22)',\r\n hover: 'rgba(255,255,255,0.7)',\r\n elevated: 'rgba(255,255,255,0.8)',\r\n inset: 'rgba(255,255,255,0.3)',\r\n canvas: '#e8d6ff',\r\n },\r\n text: {\r\n primary: '#1a1440',\r\n secondary: '#443c78',\r\n muted: '#8b83b8',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: 'rgba(255,255,255,0.6)',\r\n radiusSm: '10px',\r\n radiusMd: '16px',\r\n radiusLg: '24px',\r\n radiusXl: '36px',\r\n radiusFull: '9999px',\r\n width: '1px',\r\n divider: 'rgba(255,255,255,0.4)',\r\n },\r\n shadows: {\r\n sm: '0 2px 12px rgba(91,91,255,0.08)',\r\n md: '0 8px 32px rgba(91,91,255,0.12)',\r\n lg: '0 18px 56px rgba(236,72,153,0.18)',\r\n xl: '0 32px 80px rgba(91,91,255,0.22)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Outfit', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Outfit', sans-serif\",\r\n monoFontFamily: 'ui-monospace, monospace',\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.55,\r\n letterSpacing: '-0.005em',\r\n headingLetterSpacing: '-0.025em',\r\n },\r\n transitions: {\r\n fast: '140ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '240ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '400ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient:\r\n 'radial-gradient(at 12% 18%, #ffd6e8 0%, transparent 48%), ' +\r\n 'radial-gradient(at 88% 22%, #c8d8ff 0%, transparent 52%), ' +\r\n 'radial-gradient(at 42% 86%, #d8ffe8 0%, transparent 50%), ' +\r\n 'linear-gradient(180deg, #eee4ff 0%, #ffe8f2 100%)',\r\n },\r\n },\r\n displayStyle: 'glass',\r\n variantConfig: { density: 'normal', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 6. CANDY POP\r\n// Pastel pop — bubblegum pink / mint / lemon.\r\n// Pill everywhere, soft drop shadow, Quicksand rounded.\r\n// ============================================================\r\n\r\nexport const candyPop: NiceThemePack = {\r\n meta: {\r\n id: 'candyPop',\r\n name: 'Candy Pop',\r\n tagline: 'Bubblegum pastels, pill shapes, bouncy easing.',\r\n tags: ['light', 'playful', 'pastel', 'pill'],\r\n },\r\n theme: {\r\n name: 'Candy Pop',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#ff4fa3',\r\n primaryHover: '#ff2d8e',\r\n success: '#3dd68c',\r\n warning: '#ffd63d',\r\n error: '#ff5577',\r\n info: '#4ec8ff',\r\n accent: '#b85bff',\r\n focus: '#ff4fa3',\r\n surface: '#ffffff',\r\n surfaceHover: '#fff5fa',\r\n },\r\n backgrounds: {\r\n primary: '#fff5fa',\r\n secondary: '#ffeaf3',\r\n tertiary: '#ffd8e9',\r\n hover: '#ffc4dc',\r\n elevated: '#ffffff',\r\n inset: '#ffeaf3',\r\n canvas: '#fff8f5',\r\n },\r\n text: {\r\n primary: '#531645',\r\n secondary: '#8b3a70',\r\n muted: '#c678a8',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: '#ffc4dc',\r\n radiusSm: '9999px',\r\n radiusMd: '9999px',\r\n radiusLg: '9999px',\r\n radiusXl: '9999px',\r\n radiusFull: '9999px',\r\n width: '2px',\r\n divider: '#ffd8e9',\r\n },\r\n shadows: {\r\n sm: '0 2px 0 0 #ffc4dc',\r\n md: '0 4px 0 0 #ffa3c7',\r\n lg: '0 6px 16px rgba(255,79,163,0.2), 0 3px 0 0 #ff4fa3',\r\n xl: '0 12px 28px rgba(255,79,163,0.25)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Quicksand', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Nunito', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 500,\r\n fontWeightMedium: 600,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 800,\r\n lineHeight: 1.55,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.01em',\r\n },\r\n transitions: {\r\n fast: '140ms cubic-bezier(0.34,1.56,0.64,1)',\r\n normal: '240ms cubic-bezier(0.34,1.56,0.64,1)',\r\n slow: '380ms cubic-bezier(0.34,1.56,0.64,1)',\r\n },\r\n },\r\n displayStyle: 'pill',\r\n variantConfig: { radius: 'full', density: 'comfortable', animation: 'playful' },\r\n};\r\n\r\n// ============================================================\r\n// 7. NEWSPAPER BROADSHEET\r\n// Ivory paper, Fraunces serif, zero radius, hairline borders,\r\n// no shadows, narrow measure.\r\n// ============================================================\r\n\r\nexport const newspaperBroadsheet: NiceThemePack = {\r\n meta: {\r\n id: 'newspaperBroadsheet',\r\n name: 'Newspaper Broadsheet',\r\n tagline: 'Ivory paper, hairline rules, serif gravity.',\r\n tags: ['light', 'editorial', 'serif', 'print'],\r\n },\r\n theme: {\r\n name: 'Newspaper Broadsheet',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#1a1a1a',\r\n primaryHover: '#000000',\r\n success: '#2d5016',\r\n warning: '#8b6914',\r\n error: '#8b0000',\r\n info: '#1d3a5f',\r\n accent: '#8b0000',\r\n focus: '#1a1a1a',\r\n surface: '#fbf7ee',\r\n surfaceHover: '#f3ecdd',\r\n },\r\n backgrounds: {\r\n primary: '#fbf7ee',\r\n secondary: '#f5eedb',\r\n tertiary: '#ede4cc',\r\n hover: '#e8ddbe',\r\n elevated: '#fbf7ee',\r\n inset: '#f0e7d0',\r\n canvas: '#fbf7ee',\r\n },\r\n text: {\r\n primary: '#14110c',\r\n secondary: '#3d362a',\r\n muted: '#7a6f58',\r\n inverse: '#fbf7ee',\r\n },\r\n borders: {\r\n color: '#14110c',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '9999px',\r\n width: '1px',\r\n divider: '#14110c',\r\n },\r\n shadows: { sm: 'none', md: 'none', lg: 'none', xl: 'none' },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Fraunces', 'Source Serif Pro', Georgia, serif\",\r\n headingFontFamily: \"'Fraunces', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.65,\r\n letterSpacing: '0.01em',\r\n headingLetterSpacing: '-0.025em',\r\n },\r\n transitions: {\r\n fast: '0ms',\r\n normal: '100ms linear',\r\n slow: '180ms linear',\r\n },\r\n backgroundImage: { type: 'pattern', pattern: 'noise', opacity: 0.18, blendMode: 'multiply' },\r\n },\r\n displayStyle: 'editorial',\r\n variantConfig: { radius: 'none', shadow: 'none', density: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 8. SYNTHWAVE 84\r\n// Deep navy + magenta/cyan neon, Orbitron display,\r\n// strong glow shadow, chrome-style borders.\r\n// ============================================================\r\n\r\nexport const synthwave84: NiceThemePack = {\r\n meta: {\r\n id: 'synthwave84',\r\n name: 'Synthwave 84',\r\n tagline: 'Magenta & cyan pulse over deep navy — 1984 forever.',\r\n tags: ['dark', 'retro', 'neon', '80s'],\r\n },\r\n theme: {\r\n name: 'Synthwave 84',\r\n darkMode: 'dark',\r\n colors: {\r\n primary: '#ff3ca8',\r\n primaryHover: '#ff6bc1',\r\n success: '#72f1b8',\r\n warning: '#ffcc33',\r\n error: '#fe4450',\r\n info: '#36f9f6',\r\n accent: '#36f9f6',\r\n focus: '#ff3ca8',\r\n surface: '#2a1a4f',\r\n surfaceHover: '#332260',\r\n },\r\n backgrounds: {\r\n primary: '#1a0933',\r\n secondary: '#241443',\r\n tertiary: '#2d1a52',\r\n hover: '#382266',\r\n elevated: '#2a1a4f',\r\n inset: '#120626',\r\n canvas: '#0e0524',\r\n },\r\n text: {\r\n primary: '#f5e8ff',\r\n secondary: '#c9a7ff',\r\n muted: '#8063b0',\r\n inverse: '#0e0524',\r\n },\r\n borders: {\r\n color: '#553388',\r\n radiusSm: '2px',\r\n radiusMd: '4px',\r\n radiusLg: '6px',\r\n radiusXl: '8px',\r\n radiusFull: '9999px',\r\n width: '1px',\r\n divider: '#3d2270',\r\n focusColor: '#36f9f6',\r\n },\r\n shadows: {\r\n sm: '0 0 8px rgba(255,60,168,0.4)',\r\n md: '0 0 18px rgba(255,60,168,0.45), 0 2px 0 0 #36f9f6',\r\n lg: '0 0 36px rgba(255,60,168,0.55), 0 4px 0 0 #36f9f6',\r\n xl: '0 0 60px rgba(255,60,168,0.6), 0 6px 0 0 #36f9f6',\r\n glow: '0 0 28px #ff3ca8, 0 0 56px rgba(255,60,168,0.5)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Rajdhani', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Orbitron', 'Rajdhani', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 900,\r\n lineHeight: 1.5,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '0.08em',\r\n },\r\n transitions: {\r\n fast: '120ms cubic-bezier(0.23,1,0.32,1)',\r\n normal: '200ms cubic-bezier(0.23,1,0.32,1)',\r\n slow: '360ms cubic-bezier(0.23,1,0.32,1)',\r\n },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient:\r\n 'linear-gradient(180deg, #0e0524 0%, #1a0933 55%, #2d1a52 100%), ' +\r\n 'repeating-linear-gradient(0deg, rgba(54,249,246,0.04) 0 1px, transparent 1px 3px)',\r\n },\r\n },\r\n displayStyle: 'synthwave',\r\n variantConfig: { shadow: 'glow', animation: 'dramatic', density: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 9. ZEN MINIMAL\r\n// Near-white, ultralight Manrope, almost no colour, huge\r\n// spacing, hairline dividers.\r\n// ============================================================\r\n\r\nexport const zenMinimal: NiceThemePack = {\r\n meta: {\r\n id: 'zenMinimal',\r\n name: 'Zen Minimal',\r\n tagline: 'Whisper-light type, hairlines, oceans of whitespace.',\r\n tags: ['light', 'minimal', 'airy'],\r\n },\r\n theme: {\r\n name: 'Zen Minimal',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#0a0a0a',\r\n primaryHover: '#262626',\r\n success: '#16a34a',\r\n warning: '#ca8a04',\r\n error: '#dc2626',\r\n info: '#2563eb',\r\n accent: '#737373',\r\n focus: '#0a0a0a',\r\n surface: '#ffffff',\r\n surfaceHover: '#fafafa',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#fafafa',\r\n tertiary: '#f5f5f5',\r\n hover: '#f0f0f0',\r\n elevated: '#ffffff',\r\n inset: '#fafafa',\r\n canvas: '#ffffff',\r\n },\r\n text: {\r\n primary: '#171717',\r\n secondary: '#525252',\r\n muted: '#a3a3a3',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: '#ededed',\r\n radiusSm: '2px',\r\n radiusMd: '3px',\r\n radiusLg: '4px',\r\n radiusXl: '6px',\r\n radiusFull: '9999px',\r\n width: '1px',\r\n divider: '#f0f0f0',\r\n },\r\n shadows: {\r\n sm: 'none',\r\n md: '0 0 0 1px rgba(0,0,0,0.04)',\r\n lg: '0 1px 2px rgba(0,0,0,0.04), 0 0 0 1px rgba(0,0,0,0.05)',\r\n xl: '0 4px 8px rgba(0,0,0,0.04), 0 0 0 1px rgba(0,0,0,0.06)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'Manrope', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Manrope', sans-serif\",\r\n monoFontFamily: 'ui-monospace, monospace',\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.25rem',\r\n fontWeightNormal: 300,\r\n fontWeightMedium: 400,\r\n fontWeightSemibold: 500,\r\n fontWeightBold: 600,\r\n lineHeight: 1.6,\r\n letterSpacing: '-0.005em',\r\n headingLetterSpacing: '-0.03em',\r\n },\r\n transitions: {\r\n fast: '100ms ease',\r\n normal: '180ms ease',\r\n slow: '280ms ease',\r\n },\r\n },\r\n displayStyle: 'minimal',\r\n variantConfig: { density: 'spacious', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 10. CLAYMORPHISM\r\n// Pastel peach/lavender/mint, claymorphic double-sided shadow,\r\n// big radii, rounded Nunito.\r\n// ============================================================\r\n\r\nexport const claymorphism: NiceThemePack = {\r\n meta: {\r\n id: 'claymorphism',\r\n name: 'Claymorphism',\r\n tagline: 'Soft-clay 3D surfaces — pressable, friendly, tactile.',\r\n tags: ['light', 'playful', 'neumorphic', '3d'],\r\n },\r\n theme: {\r\n name: 'Claymorphism',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#8b7ef5',\r\n primaryHover: '#7469ec',\r\n success: '#6ed6a5',\r\n warning: '#ffc771',\r\n error: '#ff8b8b',\r\n info: '#7ec4f5',\r\n accent: '#ffb3d9',\r\n focus: '#8b7ef5',\r\n surface: '#f3efff',\r\n surfaceHover: '#ebe4ff',\r\n },\r\n backgrounds: {\r\n primary: '#f6f0ff',\r\n secondary: '#ede4ff',\r\n tertiary: '#dfd3fc',\r\n hover: '#d3c5fa',\r\n elevated: '#ffffff',\r\n inset: '#e5daff',\r\n canvas: '#f6f0ff',\r\n },\r\n text: {\r\n primary: '#2a1f5e',\r\n secondary: '#584a8e',\r\n muted: '#9388bd',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: 'rgba(139,126,245,0.15)',\r\n radiusSm: '14px',\r\n radiusMd: '22px',\r\n radiusLg: '32px',\r\n radiusXl: '48px',\r\n radiusFull: '9999px',\r\n width: '0px',\r\n divider: 'rgba(139,126,245,0.12)',\r\n },\r\n shadows: {\r\n sm:\r\n '-3px -3px 6px rgba(255,255,255,0.8), ' +\r\n '3px 3px 8px rgba(139,126,245,0.18), ' +\r\n 'inset 0 0 0 rgba(255,255,255,0)',\r\n md:\r\n '-5px -5px 12px rgba(255,255,255,0.9), ' +\r\n '6px 6px 18px rgba(139,126,245,0.22), ' +\r\n 'inset 1px 1px 1px rgba(255,255,255,0.6)',\r\n lg:\r\n '-8px -8px 20px rgba(255,255,255,0.95), ' +\r\n '10px 10px 32px rgba(139,126,245,0.28), ' +\r\n 'inset 2px 2px 2px rgba(255,255,255,0.7)',\r\n xl:\r\n '-14px -14px 32px rgba(255,255,255,1), ' +\r\n '16px 16px 48px rgba(139,126,245,0.34), ' +\r\n 'inset 3px 3px 4px rgba(255,255,255,0.8)',\r\n inner: 'inset 4px 4px 10px rgba(139,126,245,0.2), inset -4px -4px 10px rgba(255,255,255,0.9)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Nunito', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Nunito', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 500,\r\n fontWeightMedium: 600,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 800,\r\n lineHeight: 1.55,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.015em',\r\n },\r\n transitions: {\r\n fast: '160ms cubic-bezier(0.4,0,0.2,1.4)',\r\n normal: '260ms cubic-bezier(0.4,0,0.2,1.4)',\r\n slow: '400ms cubic-bezier(0.4,0,0.2,1.4)',\r\n },\r\n },\r\n displayStyle: 'neumorphic',\r\n variantConfig: { radius: '2xl', density: 'comfortable', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 11. BAUHAUS\r\n// Primary red/yellow/blue + cream. Zero radius, heavy borders,\r\n// Archivo Black display, grid pattern.\r\n// ============================================================\r\n\r\nexport const bauhaus: NiceThemePack = {\r\n meta: {\r\n id: 'bauhaus',\r\n name: 'Bauhaus',\r\n tagline: 'Primary palette, geometric rigour, grid as foundation.',\r\n tags: ['light', 'geometric', 'primary', 'design'],\r\n },\r\n theme: {\r\n name: 'Bauhaus',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#d62828',\r\n primaryHover: '#a81e1e',\r\n success: '#2a9d8f',\r\n warning: '#fcbf49',\r\n error: '#d62828',\r\n info: '#1d4e89',\r\n accent: '#fcbf49',\r\n focus: '#1d4e89',\r\n surface: '#faf5e8',\r\n surfaceHover: '#f2ead3',\r\n },\r\n backgrounds: {\r\n primary: '#faf5e8',\r\n secondary: '#f5ecd3',\r\n tertiary: '#ede0be',\r\n hover: '#e5d5a8',\r\n elevated: '#ffffff',\r\n inset: '#f0e3c0',\r\n canvas: '#faf5e8',\r\n },\r\n text: {\r\n primary: '#1a1a1a',\r\n secondary: '#3d3d3d',\r\n muted: '#7a7a7a',\r\n inverse: '#faf5e8',\r\n },\r\n borders: {\r\n color: '#1a1a1a',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '9999px',\r\n width: '3px',\r\n divider: '#1a1a1a',\r\n },\r\n shadows: {\r\n sm: '0 2px 0 0 #1a1a1a',\r\n md: '4px 4px 0 0 #1a1a1a',\r\n lg: '6px 6px 0 0 #1d4e89',\r\n xl: '8px 8px 0 0 #d62828',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Archivo', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Archivo Black', 'Archivo', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.75rem',\r\n fontWeightNormal: 500,\r\n fontWeightMedium: 700,\r\n fontWeightSemibold: 800,\r\n fontWeightBold: 900,\r\n lineHeight: 1.4,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.02em',\r\n },\r\n transitions: {\r\n fast: '60ms linear',\r\n normal: '120ms linear',\r\n slow: '200ms linear',\r\n },\r\n backgroundImage: { type: 'pattern', pattern: 'grid', opacity: 0.35 },\r\n },\r\n displayStyle: 'bauhaus',\r\n variantConfig: { radius: 'none', shadow: 'md', density: 'normal', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 12. BANK VAULT\r\n// Conservative navy + gold accents, Libre Caslon serif,\r\n// hairline small radii, compact density.\r\n// ============================================================\r\n\r\nexport const bankVault: NiceThemePack = {\r\n meta: {\r\n id: 'bankVault',\r\n name: 'Bank Vault',\r\n tagline: 'Navy, gilt accents, serif gravitas — trusted by institutions.',\r\n tags: ['light', 'corporate', 'serif', 'conservative'],\r\n },\r\n theme: {\r\n name: 'Bank Vault',\r\n darkMode: 'light',\r\n colors: {\r\n primary: '#0b2545',\r\n primaryHover: '#163969',\r\n success: '#2d6a4f',\r\n warning: '#b08d2e',\r\n error: '#8b1a1a',\r\n info: '#1d4e89',\r\n accent: '#b08d2e',\r\n focus: '#0b2545',\r\n surface: '#ffffff',\r\n surfaceHover: '#f7f4ec',\r\n },\r\n backgrounds: {\r\n primary: '#fbfaf6',\r\n secondary: '#f4f0e4',\r\n tertiary: '#ebe5d2',\r\n hover: '#e3dcc4',\r\n elevated: '#ffffff',\r\n inset: '#efeadb',\r\n canvas: '#fbfaf6',\r\n },\r\n text: {\r\n primary: '#0b2545',\r\n secondary: '#3a4b65',\r\n muted: '#7a8399',\r\n inverse: '#fbfaf6',\r\n },\r\n borders: {\r\n color: '#c9bfa3',\r\n radiusSm: '1px',\r\n radiusMd: '2px',\r\n radiusLg: '3px',\r\n radiusXl: '4px',\r\n radiusFull: '9999px',\r\n width: '1px',\r\n divider: '#d4c9a8',\r\n },\r\n shadows: {\r\n sm: '0 1px 0 0 rgba(11,37,69,0.08)',\r\n md: '0 1px 3px rgba(11,37,69,0.08), 0 0 0 1px rgba(176,141,46,0.12)',\r\n lg: '0 4px 10px rgba(11,37,69,0.1)',\r\n xl: '0 12px 24px rgba(11,37,69,0.12)',\r\n },\r\n spacing: SP_TIGHT,\r\n typography: {\r\n fontFamily: \"'DM Sans', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Libre Caslon Text', 'DM Serif Display', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.6875rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.25rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.55,\r\n letterSpacing: '0.005em',\r\n headingLetterSpacing: '-0.01em',\r\n },\r\n transitions: {\r\n fast: '90ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '160ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '260ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n },\r\n displayStyle: 'bank',\r\n variantConfig: { radius: 'sm', shadow: 'subtle', density: 'compact', animation: 'none' },\r\n};\r\n\r\n// ── Registry ─────────────────────────────────────────────────\r\n\r\nexport const NICE_THEME_PACKS = {\r\n obsidianEditorial,\r\n neonArcade,\r\n hyggeScandinavian,\r\n brutalistRaw,\r\n glassAurora,\r\n candyPop,\r\n newspaperBroadsheet,\r\n synthwave84,\r\n zenMinimal,\r\n claymorphism,\r\n bauhaus,\r\n bankVault,\r\n} as const;\r\n\r\nexport const NICE_THEME_PACK_LIST: NiceThemePack[] = Object.values(NICE_THEME_PACKS);\r\n\r\nexport type NiceThemePackId = keyof typeof NICE_THEME_PACKS;\r\n\r\n/** Lookup a pack by its id. Returns undefined if no match. */\r\nexport function getNiceThemePack(id: string): NiceThemePack | undefined {\r\n return (NICE_THEME_PACKS as Record<string, NiceThemePack>)[id];\r\n}\r\n\r\n/** Filter packs by tag (e.g. 'dark', 'serif', 'retro'). */\r\nexport function filterNiceThemePacksByTag(tag: string): NiceThemePack[] {\r\n return NICE_THEME_PACK_LIST.filter((p) => p.meta.tags.includes(tag));\r\n}\r\n","// ============================================================\r\n// Nice2Dev UI — Extended Theme Packs (Vol. 2)\r\n// ============================================================\r\n//\r\n// 24 additional curated packs, organized by aesthetic family.\r\n// Each one deliberately differs from the others — and from\r\n// the Vol. 1 packs in `themePacks.ts` — on multiple axes:\r\n// radii, shadows, typography, density, easing, pattern.\r\n//\r\n// Families (count):\r\n// · Nature / Organic (4)\r\n// · Cultural / Regional (4)\r\n// · Tech / Sci-fi (3)\r\n// · Retro / Vintage (4)\r\n// · Editorial / Print (3)\r\n// · Artistic / Illustrated (3)\r\n// · Minimal / Luxury (3)\r\n//\r\n// Use exactly like Vol. 1:\r\n//\r\n// import { NICE_THEME_PACKS_EXTENDED } from './themePacksExtended';\r\n// const pack = NICE_THEME_PACKS_EXTENDED.japaneseWashi;\r\n// <NiceThemeProvider\r\n// theme={pack.theme}\r\n// displayStyle={pack.displayStyle}\r\n// variantConfig={pack.variantConfig}\r\n// >…</NiceThemeProvider>\r\n//\r\n// If your provider is the v2 patched version, you can also pass\r\n// just the theme and omit `displayStyle` — each theme carries a\r\n// `recommendedDisplayStyle` that will be picked up automatically.\r\n//\r\n// Don't forget to inject NICE_THEME_PACK_FONT_LINKS_EXTENDED into\r\n// <head> once, so the fonts these packs reference actually load.\r\n// ============================================================\r\n\r\nimport type { NiceTheme } from './theme';\r\nimport type { NiceThemePack } from './themePacks';\r\n\r\n// ── Google Fonts links required by packs in this file ───────\r\n\r\nexport const NICE_THEME_PACK_FONT_LINKS_EXTENDED: string[] = [\r\n // Nature family\r\n 'https://fonts.googleapis.com/css2?family=Spectral:wght@300;400;500;600;700&family=Lora:wght@400;500;600;700&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=DM+Sans:wght@400;500;700&display=swap',\r\n // Cultural family\r\n 'https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@300;400;500;700&family=Noto+Sans+JP:wght@300;400;500;700&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Amiri:wght@400;700&family=Cairo:wght@400;500;600;700&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Poiret+One&family=Cormorant+Garamond:wght@300;400;500;600&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Alfa+Slab+One&family=Roboto+Condensed:wght@400;500;700&display=swap',\r\n // Tech family\r\n 'https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&family=Space+Grotesk:wght@400;500;600;700&display=swap',\r\n // Retro family\r\n 'https://fonts.googleapis.com/css2?family=Abril+Fatface&family=Space+Mono:wght@400;700&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=VT323&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Courier+Prime:wght@400;700&family=Special+Elite&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&display=swap',\r\n // Editorial family\r\n 'https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700;800;900&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Bangers&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Permanent+Marker&display=swap',\r\n // Artistic family\r\n 'https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;700&display=swap',\r\n 'https://fonts.googleapis.com/css2?family=Rubik+Mono+One&family=Rubik:wght@400;500;700;800&display=swap',\r\n];\r\n\r\n// ── Local spacing helpers (kept private to this file) ──────\r\n\r\nconst SP_TIGHT = {\r\n space1: '2px',\r\n space2: '4px',\r\n space3: '8px',\r\n space4: '12px',\r\n space5: '16px',\r\n space6: '20px',\r\n space8: '28px',\r\n};\r\nconst SP_NORMAL = {\r\n space1: '4px',\r\n space2: '8px',\r\n space3: '12px',\r\n space4: '16px',\r\n space5: '20px',\r\n space6: '24px',\r\n space8: '32px',\r\n};\r\nconst SP_AIRY = {\r\n space1: '6px',\r\n space2: '12px',\r\n space3: '16px',\r\n space4: '24px',\r\n space5: '32px',\r\n space6: '40px',\r\n space8: '56px',\r\n};\r\nconst SP_GENEROUS = {\r\n space1: '8px',\r\n space2: '16px',\r\n space3: '24px',\r\n space4: '32px',\r\n space5: '44px',\r\n space6: '56px',\r\n space8: '80px',\r\n};\r\n\r\n// ============================================================\r\n// 1. FOREST CANOPY — moss, bark, dappled light\r\n// Organic irregular radii, soft leaf-green shadows, Spectral\r\n// serif for headings.\r\n// ============================================================\r\n\r\nexport const forestCanopy: NiceThemePack = {\r\n meta: {\r\n id: 'forestCanopy',\r\n name: 'Forest Canopy',\r\n tagline: 'Moss on bark, dappled light — organic radii, earth serif.',\r\n tags: ['light', 'nature', 'serif', 'organic'],\r\n },\r\n theme: {\r\n name: 'Forest Canopy',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'scandinavian',\r\n colors: {\r\n primary: '#3d5a40',\r\n primaryHover: '#2d4430',\r\n success: '#4a7c3a',\r\n warning: '#c88d3e',\r\n error: '#a63c3c',\r\n info: '#5a7c8a',\r\n accent: '#8ba878',\r\n focus: '#3d5a40',\r\n surface: '#f4f1e8',\r\n surfaceHover: '#ebe7d5',\r\n },\r\n backgrounds: {\r\n primary: '#f7f4e9',\r\n secondary: '#ede8d4',\r\n tertiary: '#dfd8be',\r\n hover: '#d5cdae',\r\n elevated: '#fcfaf1',\r\n inset: '#e5ddc5',\r\n canvas: '#f0ece0',\r\n },\r\n text: {\r\n primary: '#1e2a1c',\r\n secondary: '#3d4a36',\r\n muted: '#7a8570',\r\n inverse: '#f7f4e9',\r\n },\r\n borders: {\r\n color: '#c4bda0',\r\n width: '1px',\r\n divider: '#d8d0b5',\r\n // Deliberately irregular — feels grown, not machined.\r\n radiusSm: '3px',\r\n radiusMd: '7px',\r\n radiusLg: '14px',\r\n radiusXl: '22px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px rgba(61,90,64,0.06)',\r\n md: '0 4px 12px -2px rgba(61,90,64,0.12), 0 2px 4px rgba(61,90,64,0.05)',\r\n lg: '0 10px 24px -6px rgba(61,90,64,0.16)',\r\n xl: '0 20px 40px -12px rgba(61,90,64,0.22)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'Lora', Georgia, serif\",\r\n headingFontFamily: \"'Spectral', 'Lora', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.625rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.7,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.01em',\r\n },\r\n transitions: {\r\n fast: '180ms cubic-bezier(0.16,1,0.3,1)',\r\n normal: '280ms cubic-bezier(0.16,1,0.3,1)',\r\n slow: '420ms cubic-bezier(0.16,1,0.3,1)',\r\n },\r\n backgroundImage: { type: 'pattern', pattern: 'dots', opacity: 0.25 },\r\n },\r\n displayStyle: 'scandinavian',\r\n variantConfig: { density: 'spacious', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 2. DESERT DUNE — sand, sun, adobe\r\n// Warm ochre, DM Serif Display, large flowing radii,\r\n// horizon-gradient background.\r\n// ============================================================\r\n\r\nexport const desertDune: NiceThemePack = {\r\n meta: {\r\n id: 'desertDune',\r\n name: 'Desert Dune',\r\n tagline: 'Ochre horizons, warm grain, serif that suns itself.',\r\n tags: ['light', 'nature', 'serif', 'warm'],\r\n },\r\n theme: {\r\n name: 'Desert Dune',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'softCloud',\r\n colors: {\r\n primary: '#c8732f',\r\n primaryHover: '#a65a1c',\r\n success: '#7a8c3a',\r\n warning: '#e0a83a',\r\n error: '#b34747',\r\n info: '#7a8fa6',\r\n accent: '#e8a863',\r\n focus: '#c8732f',\r\n surface: '#fbf3e5',\r\n surfaceHover: '#f4e8d0',\r\n },\r\n backgrounds: {\r\n primary: '#fdf7ea',\r\n secondary: '#f6ebd3',\r\n tertiary: '#eeddb6',\r\n hover: '#e5cfa0',\r\n elevated: '#ffffff',\r\n inset: '#f0dfb8',\r\n canvas: '#fdf5e6',\r\n },\r\n text: {\r\n primary: '#3a2413',\r\n secondary: '#6b4823',\r\n muted: '#a88860',\r\n inverse: '#fdf7ea',\r\n },\r\n borders: {\r\n color: '#dcc08c',\r\n width: '1px',\r\n divider: '#e8d0a5',\r\n radiusSm: '12px',\r\n radiusMd: '18px',\r\n radiusLg: '28px',\r\n radiusXl: '40px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 2px 6px -2px rgba(200,115,47,0.1)',\r\n md: '0 8px 20px -6px rgba(200,115,47,0.15)',\r\n lg: '0 18px 36px -10px rgba(200,115,47,0.2)',\r\n xl: '0 32px 56px -18px rgba(200,115,47,0.28)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'DM Sans', -apple-system, sans-serif\",\r\n headingFontFamily: \"'DM Serif Display', Georgia, serif\",\r\n monoFontFamily: \"'Space Mono', ui-monospace, monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.75rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.65,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.025em',\r\n },\r\n transitions: {\r\n fast: '160ms ease-out',\r\n normal: '280ms cubic-bezier(0.22,1,0.36,1)',\r\n slow: '460ms cubic-bezier(0.22,1,0.36,1)',\r\n },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient:\r\n 'linear-gradient(175deg, #fbecc5 0%, #f6ddaf 40%, #eec28a 100%), ' +\r\n 'radial-gradient(ellipse at 80% 10%, #fff4d9 0%, transparent 60%)',\r\n },\r\n },\r\n displayStyle: 'softCloud',\r\n variantConfig: { radius: 'xl', density: 'comfortable', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 3. ARCTIC CRYSTAL — ice facets, negative space\r\n// Sharp radii (very small), ice-blue palette, crystalline\r\n// angular shadows, ultralight type.\r\n// ============================================================\r\n\r\nexport const arcticCrystal: NiceThemePack = {\r\n meta: {\r\n id: 'arcticCrystal',\r\n name: 'Arctic Crystal',\r\n tagline: 'Facets of ice, lean typography, surgical whitespace.',\r\n tags: ['light', 'nature', 'minimal', 'cold'],\r\n },\r\n theme: {\r\n name: 'Arctic Crystal',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'minimal',\r\n colors: {\r\n primary: '#2a6a8c',\r\n primaryHover: '#1e5374',\r\n success: '#4a8a6a',\r\n warning: '#d0a040',\r\n error: '#c24848',\r\n info: '#5a9fc0',\r\n accent: '#a8d4e8',\r\n focus: '#2a6a8c',\r\n surface: '#ffffff',\r\n surfaceHover: '#f0f6fa',\r\n },\r\n backgrounds: {\r\n primary: '#f5fafd',\r\n secondary: '#eaf2f7',\r\n tertiary: '#d8e5ed',\r\n hover: '#cfdce6',\r\n elevated: '#ffffff',\r\n inset: '#e3eef5',\r\n canvas: '#f0f7fb',\r\n },\r\n text: {\r\n primary: '#0a2030',\r\n secondary: '#3a5468',\r\n muted: '#7a95a8',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: '#cfdde8',\r\n width: '1px',\r\n divider: '#e0ebf3',\r\n radiusSm: '2px',\r\n radiusMd: '3px',\r\n radiusLg: '4px',\r\n radiusXl: '6px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n // Sharp directional — like light refracting through ice.\r\n sm: '1px 1px 0 rgba(42,106,140,0.06), -1px 0 0 rgba(42,106,140,0.04)',\r\n md: '2px 2px 0 rgba(42,106,140,0.08), -2px 0 0 rgba(42,106,140,0.04), 0 4px 8px -2px rgba(42,106,140,0.1)',\r\n lg: '4px 4px 0 rgba(42,106,140,0.1), 0 10px 16px -4px rgba(42,106,140,0.14)',\r\n xl: '0 24px 40px -12px rgba(42,106,140,0.2)',\r\n },\r\n spacing: SP_GENEROUS,\r\n typography: {\r\n fontFamily: \"'Inter', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Inter', sans-serif\",\r\n monoFontFamily: \"'IBM Plex Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 200,\r\n fontWeightMedium: 300,\r\n fontWeightSemibold: 500,\r\n fontWeightBold: 600,\r\n lineHeight: 1.6,\r\n letterSpacing: '0.01em',\r\n headingLetterSpacing: '-0.02em',\r\n },\r\n transitions: { fast: '90ms ease', normal: '160ms ease', slow: '260ms ease' },\r\n },\r\n displayStyle: 'minimal',\r\n variantConfig: { radius: 'sm', shadow: 'subtle', density: 'spacious', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 4. AUTUMN FOLIAGE — burnt embers, harvest\r\n// Warm burnt orange / deep crimson / amber, Fraunces serif,\r\n// cozy medium radii, soft warm shadows.\r\n// ============================================================\r\n\r\nexport const autumnFoliage: NiceThemePack = {\r\n meta: {\r\n id: 'autumnFoliage',\r\n name: 'Autumn Foliage',\r\n tagline: 'Ember glow, Fraunces serif, woodsmoke warmth.',\r\n tags: ['light', 'nature', 'serif', 'warm'],\r\n },\r\n theme: {\r\n name: 'Autumn Foliage',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'editorial',\r\n colors: {\r\n primary: '#a83828',\r\n primaryHover: '#842818',\r\n success: '#6b7c2c',\r\n warning: '#c48020',\r\n error: '#8a2020',\r\n info: '#7a5a3a',\r\n accent: '#d89040',\r\n focus: '#a83828',\r\n surface: '#fbf1e3',\r\n surfaceHover: '#f2e4ce',\r\n },\r\n backgrounds: {\r\n primary: '#fdf5e8',\r\n secondary: '#f4e5cc',\r\n tertiary: '#e8d2aa',\r\n hover: '#dec295',\r\n elevated: '#fff9ee',\r\n inset: '#eedab5',\r\n canvas: '#faeed6',\r\n },\r\n text: {\r\n primary: '#2a140a',\r\n secondary: '#5a3020',\r\n muted: '#997860',\r\n inverse: '#fdf5e8',\r\n },\r\n borders: {\r\n color: '#d4b890',\r\n width: '1px',\r\n divider: '#e0c8a0',\r\n radiusSm: '4px',\r\n radiusMd: '8px',\r\n radiusLg: '14px',\r\n radiusXl: '22px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 2px rgba(168,56,40,0.08)',\r\n md: '0 4px 10px -2px rgba(168,56,40,0.12), 0 2px 4px rgba(168,56,40,0.08)',\r\n lg: '0 12px 24px -6px rgba(168,56,40,0.18)',\r\n xl: '0 24px 48px -16px rgba(168,56,40,0.24)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Work Sans', sans-serif\",\r\n headingFontFamily: \"'Fraunces', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.625rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.65,\r\n letterSpacing: '0.005em',\r\n headingLetterSpacing: '-0.02em',\r\n },\r\n transitions: { fast: '140ms ease', normal: '220ms ease', slow: '360ms ease' },\r\n },\r\n displayStyle: 'editorial',\r\n variantConfig: { density: 'comfortable', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 5. JAPANESE WASHI — sumi ink on paper\r\n// Cream washi, deep indigo, minimal serifs (Noto Serif JP),\r\n// tiny radii, grain-paper texture.\r\n// ============================================================\r\n\r\nexport const japaneseWashi: NiceThemePack = {\r\n meta: {\r\n id: 'japaneseWashi',\r\n name: 'Japanese Washi',\r\n tagline: 'Sumi ink on cream — quiet serif, paper grain, zero excess.',\r\n tags: ['light', 'cultural', 'serif', 'minimal'],\r\n },\r\n theme: {\r\n name: 'Japanese Washi',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'zen',\r\n colors: {\r\n primary: '#1d3557',\r\n primaryHover: '#0d2545',\r\n success: '#4a7042',\r\n warning: '#a8803e',\r\n error: '#8b2a2a',\r\n info: '#3a5a78',\r\n accent: '#c83a3a',\r\n focus: '#1d3557',\r\n surface: '#faf6ea',\r\n surfaceHover: '#f2ebd7',\r\n },\r\n backgrounds: {\r\n primary: '#fdf9ee',\r\n secondary: '#f5ecd5',\r\n tertiary: '#ecdfbd',\r\n hover: '#e4d5aa',\r\n elevated: '#ffffff',\r\n inset: '#f0e5c8',\r\n canvas: '#fbf6e7',\r\n },\r\n text: {\r\n primary: '#1a1610',\r\n secondary: '#3d352a',\r\n muted: '#8a7f64',\r\n inverse: '#fdf9ee',\r\n },\r\n borders: {\r\n color: '#1a1610',\r\n width: '1px',\r\n divider: '#d4c89e',\r\n radiusSm: '0',\r\n radiusMd: '1px',\r\n radiusLg: '2px',\r\n radiusXl: '3px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: 'none',\r\n md: '0 1px 0 0 rgba(26,22,16,0.08)',\r\n lg: '0 2px 0 0 rgba(26,22,16,0.1)',\r\n xl: '0 4px 12px rgba(26,22,16,0.08)',\r\n },\r\n spacing: SP_GENEROUS,\r\n typography: {\r\n fontFamily: \"'Noto Sans JP', 'Inter', sans-serif\",\r\n headingFontFamily: \"'Noto Serif JP', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 300,\r\n fontWeightMedium: 400,\r\n fontWeightSemibold: 500,\r\n fontWeightBold: 700,\r\n lineHeight: 1.75,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '0.01em',\r\n },\r\n transitions: { fast: '120ms ease', normal: '220ms ease', slow: '340ms ease' },\r\n backgroundImage: { type: 'pattern', pattern: 'noise', opacity: 0.22, blendMode: 'multiply' },\r\n },\r\n displayStyle: 'zen',\r\n variantConfig: { radius: 'none', shadow: 'none', density: 'spacious', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 6. MOROCCAN MOSAIC — zellige tile\r\n// Terracotta + deep teal + saffron, Amiri serif, geometric\r\n// small radii, tile pattern background.\r\n// ============================================================\r\n\r\nexport const moroccanMosaic: NiceThemePack = {\r\n meta: {\r\n id: 'moroccanMosaic',\r\n name: 'Moroccan Mosaic',\r\n tagline: 'Zellige geometry — terracotta, teal, saffron in tiled rhythm.',\r\n tags: ['light', 'cultural', 'geometric', 'warm'],\r\n },\r\n theme: {\r\n name: 'Moroccan Mosaic',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'bauhaus',\r\n colors: {\r\n primary: '#0f6b5c',\r\n primaryHover: '#0a5246',\r\n success: '#5a8a3a',\r\n warning: '#e0a03a',\r\n error: '#c2522a',\r\n info: '#3a7090',\r\n accent: '#e8a840',\r\n focus: '#0f6b5c',\r\n surface: '#f9f1dc',\r\n surfaceHover: '#f0e5c2',\r\n },\r\n backgrounds: {\r\n primary: '#fbf3e0',\r\n secondary: '#f2e4c2',\r\n tertiary: '#e6d2a0',\r\n hover: '#dac38a',\r\n elevated: '#fdf7e8',\r\n inset: '#ecd8b2',\r\n canvas: '#f8edd3',\r\n },\r\n text: {\r\n primary: '#2a1608',\r\n secondary: '#5a3a20',\r\n muted: '#a08860',\r\n inverse: '#fbf3e0',\r\n },\r\n borders: {\r\n color: '#2a1608',\r\n width: '2px',\r\n divider: '#b89868',\r\n radiusSm: '3px',\r\n radiusMd: '6px',\r\n radiusLg: '10px',\r\n radiusXl: '14px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '2px 2px 0 rgba(42,22,8,0.12)',\r\n md: '3px 3px 0 #0f6b5c, 6px 6px 0 rgba(42,22,8,0.08)',\r\n lg: '4px 4px 0 #0f6b5c, 8px 8px 0 #e8a840',\r\n xl: '6px 6px 0 #c2522a, 12px 12px 0 rgba(42,22,8,0.1)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Cairo', 'Inter', sans-serif\",\r\n headingFontFamily: \"'Amiri', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.625rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.55,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.01em',\r\n },\r\n transitions: { fast: '120ms linear', normal: '200ms linear', slow: '320ms linear' },\r\n backgroundImage: { type: 'pattern', pattern: 'hexagons', opacity: 0.2 },\r\n },\r\n displayStyle: 'bauhaus',\r\n variantConfig: { radius: 'sm', shadow: 'md', density: 'normal', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 7. ART DECO GATSBY — gold, black, emerald\r\n// Geometric chamfered feel, thin gold borders, Poiret One\r\n// display, deep emerald + black palette.\r\n// ============================================================\r\n\r\nexport const artDecoGatsby: NiceThemePack = {\r\n meta: {\r\n id: 'artDecoGatsby',\r\n name: 'Art Deco Gatsby',\r\n tagline: 'Gold, emerald, onyx — geometric glamour, thin gilt lines.',\r\n tags: ['dark', 'cultural', 'luxury', 'geometric'],\r\n },\r\n theme: {\r\n name: 'Art Deco Gatsby',\r\n darkMode: 'dark',\r\n recommendedDisplayStyle: 'luxe',\r\n colors: {\r\n primary: '#d4af37',\r\n primaryHover: '#e8c850',\r\n success: '#4a9c7a',\r\n warning: '#e8c850',\r\n error: '#c24040',\r\n info: '#70a8c0',\r\n accent: '#1e5c4a',\r\n focus: '#d4af37',\r\n surface: '#0f1a16',\r\n surfaceHover: '#16251e',\r\n },\r\n backgrounds: {\r\n primary: '#0a0f0c',\r\n secondary: '#0f1a16',\r\n tertiary: '#16251e',\r\n hover: '#1c3028',\r\n elevated: '#0f1a16',\r\n inset: '#050908',\r\n canvas: '#080c0a',\r\n },\r\n text: {\r\n primary: '#f0e4c2',\r\n secondary: '#c0b080',\r\n muted: '#706448',\r\n inverse: '#0a0f0c',\r\n },\r\n borders: {\r\n color: '#6b5828',\r\n width: '1px',\r\n divider: '#4a3c18',\r\n focusColor: '#d4af37',\r\n radiusSm: '0',\r\n radiusMd: '1px',\r\n radiusLg: '2px',\r\n radiusXl: '3px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 0 0 1px rgba(212,175,55,0.15)',\r\n md: '0 2px 8px rgba(0,0,0,0.5), 0 0 0 1px rgba(212,175,55,0.2)',\r\n lg: '0 8px 24px rgba(0,0,0,0.6), 0 0 0 1px rgba(212,175,55,0.3), inset 0 1px 0 rgba(212,175,55,0.1)',\r\n xl: '0 20px 48px rgba(0,0,0,0.7), 0 0 0 1px rgba(212,175,55,0.4)',\r\n glow: '0 0 16px rgba(212,175,55,0.3)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'Cormorant Garamond', Georgia, serif\",\r\n headingFontFamily: \"'Poiret One', 'Cormorant Garamond', serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.75rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.6,\r\n letterSpacing: '0.04em',\r\n headingLetterSpacing: '0.12em',\r\n },\r\n transitions: {\r\n fast: '140ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '240ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '380ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n },\r\n displayStyle: 'luxe',\r\n variantConfig: { radius: 'none', shadow: 'lg', density: 'comfortable', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 8. SOVIET CONSTRUCTIVIST\r\n// Red / black / cream, heavy slabs (Alfa Slab One),\r\n// asymmetric offset shadows, zero radii.\r\n// ============================================================\r\n\r\nexport const sovietConstructivist: NiceThemePack = {\r\n meta: {\r\n id: 'sovietConstructivist',\r\n name: 'Soviet Constructivist',\r\n tagline: 'Rodchenko red — slab type, hard angles, propaganda poise.',\r\n tags: ['light', 'cultural', 'brutalist', 'geometric'],\r\n },\r\n theme: {\r\n name: 'Soviet Constructivist',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'brutalist',\r\n colors: {\r\n primary: '#c41e1e',\r\n primaryHover: '#8a1414',\r\n success: '#3a6a3a',\r\n warning: '#d08028',\r\n error: '#8a1414',\r\n info: '#2a4060',\r\n accent: '#1a1a1a',\r\n focus: '#c41e1e',\r\n surface: '#f0ead8',\r\n surfaceHover: '#e5dcc0',\r\n },\r\n backgrounds: {\r\n primary: '#f4efde',\r\n secondary: '#e8dec4',\r\n tertiary: '#d8c9a4',\r\n hover: '#ccbb90',\r\n elevated: '#faf5e5',\r\n inset: '#dccda8',\r\n canvas: '#f0ead5',\r\n },\r\n text: {\r\n primary: '#1a1a1a',\r\n secondary: '#3d3d3d',\r\n muted: '#706d5a',\r\n inverse: '#f4efde',\r\n },\r\n borders: {\r\n color: '#1a1a1a',\r\n width: '3px',\r\n divider: '#1a1a1a',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '4px 0 0 0 #c41e1e',\r\n md: '6px 6px 0 0 #1a1a1a, 8px 8px 0 0 #c41e1e',\r\n lg: '10px 10px 0 0 #c41e1e',\r\n xl: '12px -4px 0 0 #1a1a1a, 16px 0 0 0 #c41e1e',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Roboto Condensed', 'Archivo', sans-serif\",\r\n headingFontFamily: \"'Alfa Slab One', 'Archivo Black', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.875rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 700,\r\n lineHeight: 1.35,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '-0.005em',\r\n },\r\n transitions: { fast: '0ms linear', normal: '80ms linear', slow: '160ms linear' },\r\n },\r\n displayStyle: 'brutalist',\r\n variantConfig: { radius: 'none', shadow: 'lg', density: 'normal', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 9. BLUEPRINT — architectural drawing\r\n// Deep cyan background, white technical lines, IBM Plex Mono,\r\n// grid pattern, precise tiny radii.\r\n// ============================================================\r\n\r\nexport const blueprint: NiceThemePack = {\r\n meta: {\r\n id: 'blueprint',\r\n name: 'Blueprint',\r\n tagline: 'Cyanotype drafting — white lines, grid paper, technical mono.',\r\n tags: ['dark', 'tech', 'technical', 'mono'],\r\n },\r\n theme: {\r\n name: 'Blueprint',\r\n darkMode: 'dark',\r\n recommendedDisplayStyle: 'dashboard',\r\n colors: {\r\n primary: '#f0f4f8',\r\n primaryHover: '#ffffff',\r\n success: '#88e0b8',\r\n warning: '#ffcc66',\r\n error: '#ff8888',\r\n info: '#88c8ff',\r\n accent: '#6eb0e0',\r\n focus: '#ffffff',\r\n surface: '#18456a',\r\n surfaceHover: '#1f527e',\r\n },\r\n backgrounds: {\r\n primary: '#0e3356',\r\n secondary: '#124066',\r\n tertiary: '#184d79',\r\n hover: '#1e5a8c',\r\n elevated: '#18456a',\r\n inset: '#082540',\r\n canvas: '#0a2d4a',\r\n },\r\n text: {\r\n primary: '#f0f4f8',\r\n secondary: '#b5c8da',\r\n muted: '#6e8aa4',\r\n inverse: '#0e3356',\r\n },\r\n borders: {\r\n color: '#3870a0',\r\n width: '1px',\r\n divider: '#2a5680',\r\n focusColor: '#ffffff',\r\n radiusSm: '1px',\r\n radiusMd: '2px',\r\n radiusLg: '3px',\r\n radiusXl: '4px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 0 0 1px rgba(240,244,248,0.05)',\r\n md: '0 1px 0 0 rgba(240,244,248,0.1), 0 4px 8px rgba(0,0,0,0.3)',\r\n lg: '0 1px 0 0 rgba(240,244,248,0.14), 0 10px 20px rgba(0,0,0,0.4)',\r\n xl: '0 20px 40px rgba(0,0,0,0.5)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'IBM Plex Mono', ui-monospace, monospace\",\r\n headingFontFamily: \"'Space Grotesk', 'IBM Plex Sans', sans-serif\",\r\n monoFontFamily: \"'IBM Plex Mono', monospace\",\r\n fontSizeXs: '0.6875rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.25rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '-0.01em',\r\n },\r\n transitions: { fast: '80ms linear', normal: '140ms linear', slow: '220ms linear' },\r\n backgroundImage: { type: 'pattern', pattern: 'grid', opacity: 0.4 },\r\n },\r\n displayStyle: 'dashboard',\r\n variantConfig: { radius: 'sm', shadow: 'subtle', density: 'compact', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 10. HOLOGRAM UI\r\n// Iridescent gradient background, translucent cards,\r\n// Orbitron display, saturated neon accents.\r\n// ============================================================\r\n\r\nexport const hologramUI: NiceThemePack = {\r\n meta: {\r\n id: 'hologramUI',\r\n name: 'Hologram UI',\r\n tagline: 'Iridescent light-leaks, translucent layers, futurist geometry.',\r\n tags: ['dark', 'tech', 'glass', 'neon'],\r\n },\r\n theme: {\r\n name: 'Hologram UI',\r\n darkMode: 'dark',\r\n recommendedDisplayStyle: 'cosmic',\r\n colors: {\r\n primary: '#8be9fd',\r\n primaryHover: '#a8f0ff',\r\n success: '#50fa7b',\r\n warning: '#f1fa8c',\r\n error: '#ff5555',\r\n info: '#bd93f9',\r\n accent: '#ff79c6',\r\n focus: '#8be9fd',\r\n surface: 'rgba(40,30,70,0.5)',\r\n surfaceHover: 'rgba(50,40,85,0.6)',\r\n },\r\n backgrounds: {\r\n primary: 'rgba(30,20,55,0.6)',\r\n secondary: 'rgba(40,30,70,0.5)',\r\n tertiary: 'rgba(55,40,90,0.4)',\r\n hover: 'rgba(65,50,105,0.55)',\r\n elevated: 'rgba(50,38,82,0.7)',\r\n inset: 'rgba(25,18,45,0.6)',\r\n canvas: '#0a0618',\r\n },\r\n text: {\r\n primary: '#f0e8ff',\r\n secondary: '#b0a0e0',\r\n muted: '#6a5a94',\r\n inverse: '#0a0618',\r\n },\r\n borders: {\r\n color: 'rgba(139,233,253,0.25)',\r\n width: '1px',\r\n divider: 'rgba(139,233,253,0.15)',\r\n focusColor: '#8be9fd',\r\n radiusSm: '4px',\r\n radiusMd: '8px',\r\n radiusLg: '14px',\r\n radiusXl: '20px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 0 12px rgba(139,233,253,0.2)',\r\n md: '0 4px 20px rgba(189,147,249,0.3), 0 0 1px rgba(139,233,253,0.4)',\r\n lg: '0 8px 40px rgba(255,121,198,0.35), 0 0 2px rgba(139,233,253,0.5), inset 0 1px 0 rgba(255,255,255,0.08)',\r\n xl: '0 20px 60px rgba(139,233,253,0.4), inset 0 1px 0 rgba(255,255,255,0.1)',\r\n glow: '0 0 32px rgba(139,233,253,0.6), 0 0 64px rgba(255,121,198,0.3)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Rajdhani', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Orbitron', 'Rajdhani', sans-serif\",\r\n monoFontFamily: \"'IBM Plex Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '0.06em',\r\n },\r\n transitions: {\r\n fast: '160ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '280ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '440ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient:\r\n 'radial-gradient(at 15% 20%, rgba(139,233,253,0.25) 0%, transparent 50%), ' +\r\n 'radial-gradient(at 85% 25%, rgba(255,121,198,0.25) 0%, transparent 50%), ' +\r\n 'radial-gradient(at 50% 90%, rgba(189,147,249,0.3) 0%, transparent 55%), ' +\r\n 'linear-gradient(135deg, #0a0618 0%, #1a0e38 100%)',\r\n },\r\n },\r\n displayStyle: 'cosmic',\r\n variantConfig: { shadow: 'glow', density: 'normal', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 11. DEEP SEA — bioluminescent abyss\r\n// Near-black navy, cyan/teal glows, rounded organic shadows,\r\n// IBM Plex Sans body.\r\n// ============================================================\r\n\r\nexport const deepSea: NiceThemePack = {\r\n meta: {\r\n id: 'deepSea',\r\n name: 'Deep Sea',\r\n tagline: 'Midnight blue abyss, bioluminescent accents in the dark.',\r\n tags: ['dark', 'tech', 'organic'],\r\n },\r\n theme: {\r\n name: 'Deep Sea',\r\n darkMode: 'dark',\r\n recommendedDisplayStyle: 'modern3d',\r\n colors: {\r\n primary: '#00d9c4',\r\n primaryHover: '#2feedc',\r\n success: '#5af0b0',\r\n warning: '#f0c858',\r\n error: '#ff6a82',\r\n info: '#60c0ff',\r\n accent: '#a878f0',\r\n focus: '#00d9c4',\r\n surface: '#0a1524',\r\n surfaceHover: '#0e1c30',\r\n },\r\n backgrounds: {\r\n primary: '#05101c',\r\n secondary: '#0a1524',\r\n tertiary: '#0f1f34',\r\n hover: '#163044',\r\n elevated: '#0e1c30',\r\n inset: '#030810',\r\n canvas: '#030810',\r\n },\r\n text: {\r\n primary: '#d8f0f5',\r\n secondary: '#88b8c8',\r\n muted: '#4a7080',\r\n inverse: '#030810',\r\n },\r\n borders: {\r\n color: '#183548',\r\n width: '1px',\r\n divider: '#0f2638',\r\n focusColor: '#00d9c4',\r\n radiusSm: '8px',\r\n radiusMd: '14px',\r\n radiusLg: '22px',\r\n radiusXl: '32px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 2px 8px rgba(0,217,196,0.08)',\r\n md: '0 6px 20px rgba(0,217,196,0.12), 0 2px 4px rgba(0,0,0,0.5)',\r\n lg: '0 14px 40px rgba(0,217,196,0.18), 0 4px 8px rgba(0,0,0,0.6)',\r\n xl: '0 28px 64px rgba(0,217,196,0.22), 0 8px 16px rgba(0,0,0,0.7)',\r\n glow: '0 0 24px rgba(0,217,196,0.5)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'IBM Plex Sans', -apple-system, sans-serif\",\r\n headingFontFamily: \"'IBM Plex Sans', sans-serif\",\r\n monoFontFamily: \"'IBM Plex Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.6,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.02em',\r\n },\r\n transitions: {\r\n fast: '160ms cubic-bezier(0.22,1,0.36,1)',\r\n normal: '280ms cubic-bezier(0.22,1,0.36,1)',\r\n slow: '440ms cubic-bezier(0.22,1,0.36,1)',\r\n },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient:\r\n 'radial-gradient(at 20% 30%, rgba(0,217,196,0.08) 0%, transparent 60%), ' +\r\n 'radial-gradient(at 80% 80%, rgba(168,120,240,0.06) 0%, transparent 55%), ' +\r\n 'linear-gradient(180deg, #030810 0%, #05101c 100%)',\r\n },\r\n },\r\n displayStyle: 'modern3d',\r\n variantConfig: { radius: 'xl', density: 'comfortable', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 12. ANALOG 70S\r\n// Mustard + rust + chocolate, Abril Fatface display, chunky\r\n// medium radii, soft warm shadows, Space Mono captions.\r\n// ============================================================\r\n\r\nexport const analog70s: NiceThemePack = {\r\n meta: {\r\n id: 'analog70s',\r\n name: 'Analog 70s',\r\n tagline: 'Mustard, rust, walnut — chunky, warm, turntable energy.',\r\n tags: ['light', 'retro', 'warm', 'serif'],\r\n },\r\n theme: {\r\n name: 'Analog 70s',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'rounded',\r\n colors: {\r\n primary: '#c8621e',\r\n primaryHover: '#a04d14',\r\n success: '#7a8a2a',\r\n warning: '#d8a030',\r\n error: '#a03030',\r\n info: '#6a7a8a',\r\n accent: '#d8a830',\r\n focus: '#c8621e',\r\n surface: '#f5ead2',\r\n surfaceHover: '#ecdfc0',\r\n },\r\n backgrounds: {\r\n primary: '#f7ecd6',\r\n secondary: '#eeddb8',\r\n tertiary: '#e2c998',\r\n hover: '#d8bc80',\r\n elevated: '#fbf2de',\r\n inset: '#e8cfa5',\r\n canvas: '#f2e4c8',\r\n },\r\n text: {\r\n primary: '#2a1608',\r\n secondary: '#5a2e14',\r\n muted: '#a07852',\r\n inverse: '#f7ecd6',\r\n },\r\n borders: {\r\n color: '#b89868',\r\n width: '2px',\r\n divider: '#ccb285',\r\n radiusSm: '10px',\r\n radiusMd: '16px',\r\n radiusLg: '24px',\r\n radiusXl: '34px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 2px 0 0 rgba(42,22,8,0.12)',\r\n md: '0 4px 0 0 rgba(42,22,8,0.15), 0 6px 10px rgba(200,98,30,0.12)',\r\n lg: '0 6px 0 0 rgba(42,22,8,0.18), 0 10px 20px rgba(200,98,30,0.2)',\r\n xl: '0 8px 0 0 rgba(42,22,8,0.22), 0 20px 40px rgba(200,98,30,0.28)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Work Sans', sans-serif\",\r\n headingFontFamily: \"'Abril Fatface', Georgia, serif\",\r\n monoFontFamily: \"'Space Mono', ui-monospace, monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.9375rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '2rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.55,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.02em',\r\n },\r\n transitions: {\r\n fast: '180ms cubic-bezier(0.34,1.56,0.64,1)',\r\n normal: '280ms cubic-bezier(0.34,1.56,0.64,1)',\r\n slow: '440ms cubic-bezier(0.34,1.56,0.64,1)',\r\n },\r\n },\r\n displayStyle: 'rounded',\r\n variantConfig: { radius: 'xl', shadow: 'md', density: 'comfortable', animation: 'playful' },\r\n};\r\n\r\n// ============================================================\r\n// 13. VHS TRACKING — analog degradation\r\n// Magenta/green chromatic aberration, VT323 pixel font,\r\n// scan-line background, zero radius, dark.\r\n// ============================================================\r\n\r\nexport const vhsTracking: NiceThemePack = {\r\n meta: {\r\n id: 'vhsTracking',\r\n name: 'VHS Tracking',\r\n tagline: 'Chromatic smear, scan-line haze, pixel type from another decade.',\r\n tags: ['dark', 'retro', 'pixel', 'experimental'],\r\n },\r\n theme: {\r\n name: 'VHS Tracking',\r\n darkMode: 'dark',\r\n recommendedDisplayStyle: 'retro8bit',\r\n colors: {\r\n primary: '#ff3eb5',\r\n primaryHover: '#ff5fc5',\r\n success: '#3eff90',\r\n warning: '#ffe83e',\r\n error: '#ff3e3e',\r\n info: '#3ee0ff',\r\n accent: '#3eff90',\r\n focus: '#ff3eb5',\r\n surface: '#120818',\r\n surfaceHover: '#1a0c24',\r\n },\r\n backgrounds: {\r\n primary: '#0a0412',\r\n secondary: '#120818',\r\n tertiary: '#1a0c24',\r\n hover: '#241230',\r\n elevated: '#120818',\r\n inset: '#050208',\r\n canvas: '#0a0412',\r\n },\r\n text: {\r\n primary: '#f8e8ff',\r\n secondary: '#c888d8',\r\n muted: '#605070',\r\n inverse: '#0a0412',\r\n },\r\n borders: {\r\n color: '#4a2864',\r\n width: '1px',\r\n divider: '#2a1840',\r\n focusColor: '#ff3eb5',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '0',\r\n },\r\n shadows: {\r\n // Chromatic aberration: magenta-left / cyan-right offset.\r\n sm: '-2px 0 0 rgba(255,62,181,0.5), 2px 0 0 rgba(62,224,255,0.5)',\r\n md: '-3px 0 0 rgba(255,62,181,0.6), 3px 0 0 rgba(62,224,255,0.6), 0 4px 12px rgba(0,0,0,0.6)',\r\n lg: '-4px 0 0 rgba(255,62,181,0.7), 4px 0 0 rgba(62,224,255,0.7), 0 8px 24px rgba(0,0,0,0.7)',\r\n xl: '-6px 0 0 rgba(255,62,181,0.8), 6px 0 0 rgba(62,224,255,0.8)',\r\n glow: '0 0 20px rgba(255,62,181,0.6)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'VT323', 'JetBrains Mono', monospace\",\r\n headingFontFamily: \"'VT323', monospace\",\r\n monoFontFamily: \"'VT323', monospace\",\r\n fontSizeXs: '0.9375rem',\r\n fontSizeSm: '1rem',\r\n fontSizeMd: '1.125rem',\r\n fontSizeLg: '1.375rem',\r\n fontSizeXl: '2rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 400,\r\n fontWeightSemibold: 400,\r\n fontWeightBold: 400,\r\n lineHeight: 1.35,\r\n letterSpacing: '0.01em',\r\n headingLetterSpacing: '0.04em',\r\n },\r\n transitions: { fast: '40ms steps(3)', normal: '100ms steps(5)', slow: '180ms steps(8)' },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient:\r\n 'linear-gradient(180deg, #0a0412 0%, #120818 100%), ' +\r\n 'repeating-linear-gradient(0deg, rgba(255,62,181,0.03) 0 2px, transparent 2px 4px)',\r\n },\r\n },\r\n displayStyle: 'retro8bit',\r\n variantConfig: { radius: 'none', shadow: 'md', density: 'normal', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 14. TYPEWRITER PRESS\r\n// Cream paper + ribbon red accent, Courier Prime body,\r\n// Special Elite headings, no radius, stamped feel.\r\n// ============================================================\r\n\r\nexport const typewriterPress: NiceThemePack = {\r\n meta: {\r\n id: 'typewriterPress',\r\n name: 'Typewriter Press',\r\n tagline: 'Ribbon red on cream — Courier bones, stamped display.',\r\n tags: ['light', 'retro', 'mono', 'editorial'],\r\n },\r\n theme: {\r\n name: 'Typewriter Press',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'editorial',\r\n colors: {\r\n primary: '#b02020',\r\n primaryHover: '#8a1818',\r\n success: '#4a7038',\r\n warning: '#b08018',\r\n error: '#8a1818',\r\n info: '#3a5068',\r\n accent: '#1a1a1a',\r\n focus: '#b02020',\r\n surface: '#faf3df',\r\n surfaceHover: '#f0e7c6',\r\n },\r\n backgrounds: {\r\n primary: '#fbf5e3',\r\n secondary: '#f3e9c8',\r\n tertiary: '#ebdcab',\r\n hover: '#e2cf8f',\r\n elevated: '#fffae7',\r\n inset: '#efe0b0',\r\n canvas: '#fbf5e3',\r\n },\r\n text: {\r\n primary: '#1a1a1a',\r\n secondary: '#3d3428',\r\n muted: '#7a6f4a',\r\n inverse: '#fbf5e3',\r\n },\r\n borders: {\r\n color: '#1a1a1a',\r\n width: '1px',\r\n divider: '#c8b880',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n // Faint \"impression\" shadows — like key-strike bleed.\r\n sm: '0 0 0 rgba(26,26,26,0), 1px 1px 0 rgba(26,26,26,0.12)',\r\n md: '1px 1px 0 rgba(26,26,26,0.15), 2px 2px 0 rgba(176,32,32,0.1)',\r\n lg: '2px 2px 0 rgba(26,26,26,0.2), 4px 4px 0 rgba(176,32,32,0.12)',\r\n xl: '3px 3px 0 rgba(26,26,26,0.25)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Courier Prime', 'Courier New', monospace\",\r\n headingFontFamily: \"'Special Elite', 'Courier Prime', monospace\",\r\n monoFontFamily: \"'Courier Prime', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 400,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 700,\r\n lineHeight: 1.6,\r\n letterSpacing: '0.01em',\r\n headingLetterSpacing: '0.04em',\r\n },\r\n transitions: { fast: '40ms linear', normal: '80ms linear', slow: '140ms linear' },\r\n backgroundImage: { type: 'pattern', pattern: 'noise', opacity: 0.2, blendMode: 'multiply' },\r\n },\r\n displayStyle: 'editorial',\r\n variantConfig: { radius: 'none', shadow: 'subtle', density: 'normal', animation: 'none' },\r\n};\r\n\r\n// ============================================================\r\n// 15. Y2K AQUA — 2001 optimism\r\n// Chrome blues + aqua highlights, Chakra Petch, medium radii,\r\n// glass-button gradients.\r\n// ============================================================\r\n\r\nexport const y2kAqua: NiceThemePack = {\r\n meta: {\r\n id: 'y2kAqua',\r\n name: 'Y2K Aqua',\r\n tagline: 'Chrome and aqua — iMac blue, optimistic futurism, 2001 energy.',\r\n tags: ['light', 'retro', 'glass'],\r\n },\r\n theme: {\r\n name: 'Y2K Aqua',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'modern3d',\r\n colors: {\r\n primary: '#0a84ff',\r\n primaryHover: '#0066cc',\r\n success: '#34c759',\r\n warning: '#ff9500',\r\n error: '#ff3b30',\r\n info: '#5ac8fa',\r\n accent: '#5ac8fa',\r\n focus: '#0a84ff',\r\n surface: '#f0f5fc',\r\n surfaceHover: '#e0ecfa',\r\n },\r\n backgrounds: {\r\n primary: '#e8f2fc',\r\n secondary: '#d8e8f8',\r\n tertiary: '#c0d8f0',\r\n hover: '#a8c8e8',\r\n elevated: '#ffffff',\r\n inset: '#c8dcf4',\r\n canvas: '#dce8f4',\r\n },\r\n text: {\r\n primary: '#0a1a30',\r\n secondary: '#304868',\r\n muted: '#6a88a8',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: '#a0c0e0',\r\n width: '1px',\r\n divider: '#c0d8f0',\r\n radiusSm: '6px',\r\n radiusMd: '10px',\r\n radiusLg: '16px',\r\n radiusXl: '24px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n // Aqua-button: bright top highlight + bottom gloss + drop.\r\n sm: 'inset 0 1px 0 rgba(255,255,255,0.8), 0 1px 2px rgba(10,132,255,0.15)',\r\n md: 'inset 0 1px 0 rgba(255,255,255,0.9), inset 0 -1px 2px rgba(10,132,255,0.2), 0 2px 6px rgba(10,132,255,0.25), 0 4px 12px rgba(10,132,255,0.15)',\r\n lg: 'inset 0 1px 0 rgba(255,255,255,0.95), 0 4px 12px rgba(10,132,255,0.3), 0 10px 24px rgba(90,200,250,0.25)',\r\n xl: 'inset 0 2px 0 rgba(255,255,255,1), 0 8px 24px rgba(10,132,255,0.35), 0 20px 48px rgba(90,200,250,0.3)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Chakra Petch', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Chakra Petch', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.5,\r\n letterSpacing: '0.01em',\r\n headingLetterSpacing: '-0.005em',\r\n },\r\n transitions: {\r\n fast: '140ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '240ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '380ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient: 'linear-gradient(180deg, #f0f7ff 0%, #d8e8f8 60%, #bcd6f0 100%)',\r\n },\r\n },\r\n displayStyle: 'modern3d',\r\n variantConfig: { radius: 'lg', shadow: 'lg', density: 'normal', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 16. VOGUE DIDONE\r\n// Stark black + white, a single red accent, Playfair Display,\r\n// editorial whitespace, near-zero radius.\r\n// ============================================================\r\n\r\nexport const vogueDidone: NiceThemePack = {\r\n meta: {\r\n id: 'vogueDidone',\r\n name: 'Vogue Didone',\r\n tagline: 'Didone serif, arctic whitespace, one red heartbeat.',\r\n tags: ['light', 'editorial', 'serif', 'luxury'],\r\n },\r\n theme: {\r\n name: 'Vogue Didone',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'editorial',\r\n colors: {\r\n primary: '#000000',\r\n primaryHover: '#1a1a1a',\r\n success: '#1f6a3a',\r\n warning: '#8a6a1a',\r\n error: '#c40018',\r\n info: '#2a4068',\r\n accent: '#c40018',\r\n focus: '#c40018',\r\n surface: '#ffffff',\r\n surfaceHover: '#f7f7f7',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#fafafa',\r\n tertiary: '#f2f2f2',\r\n hover: '#ededed',\r\n elevated: '#ffffff',\r\n inset: '#f5f5f5',\r\n canvas: '#ffffff',\r\n },\r\n text: {\r\n primary: '#000000',\r\n secondary: '#2a2a2a',\r\n muted: '#808080',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: '#000000',\r\n width: '1px',\r\n divider: '#dcdcdc',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '1px',\r\n radiusXl: '2px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: 'none',\r\n md: 'none',\r\n lg: '0 1px 0 0 #000000',\r\n xl: '0 2px 0 0 #000000',\r\n },\r\n spacing: SP_GENEROUS,\r\n typography: {\r\n fontFamily: \"'Inter', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Playfair Display', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.6875rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '2rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 900,\r\n lineHeight: 1.7,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '-0.03em',\r\n },\r\n transitions: { fast: '120ms ease', normal: '220ms ease', slow: '360ms ease' },\r\n },\r\n displayStyle: 'editorial',\r\n variantConfig: { radius: 'none', shadow: 'none', density: 'spacious', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 17. COMIC HALFTONE — CMYK pop\r\n// Primary red/yellow/cyan, Bangers display, halftone dots,\r\n// hard offset shadows in primary ink colors.\r\n// ============================================================\r\n\r\nexport const comicHalftone: NiceThemePack = {\r\n meta: {\r\n id: 'comicHalftone',\r\n name: 'Comic Halftone',\r\n tagline: 'CMYK pop — halftone dots, action type, offset ink shadows.',\r\n tags: ['light', 'editorial', 'playful'],\r\n },\r\n theme: {\r\n name: 'Comic Halftone',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'playful',\r\n colors: {\r\n primary: '#e8182c',\r\n primaryHover: '#c01020',\r\n success: '#1ea862',\r\n warning: '#f0c820',\r\n error: '#e8182c',\r\n info: '#1878c8',\r\n accent: '#1878c8',\r\n focus: '#e8182c',\r\n surface: '#fffdf4',\r\n surfaceHover: '#fff8d8',\r\n },\r\n backgrounds: {\r\n primary: '#fffef0',\r\n secondary: '#fff6b8',\r\n tertiary: '#ffe870',\r\n hover: '#ffd838',\r\n elevated: '#ffffff',\r\n inset: '#fff090',\r\n canvas: '#fffdec',\r\n },\r\n text: {\r\n primary: '#0a0a0a',\r\n secondary: '#2a2a2a',\r\n muted: '#707070',\r\n inverse: '#fffef0',\r\n },\r\n borders: {\r\n color: '#0a0a0a',\r\n width: '3px',\r\n divider: '#0a0a0a',\r\n radiusSm: '2px',\r\n radiusMd: '4px',\r\n radiusLg: '8px',\r\n radiusXl: '12px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '3px 3px 0 0 #0a0a0a',\r\n md: '5px 5px 0 0 #0a0a0a',\r\n lg: '6px 6px 0 0 #e8182c, 10px 10px 0 0 #0a0a0a',\r\n xl: '8px 8px 0 0 #1878c8, 12px 12px 0 0 #0a0a0a',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Archivo', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Bangers', 'Archivo Black', cursive\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.9375rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '2.125rem',\r\n fontWeightNormal: 500,\r\n fontWeightMedium: 600,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 800,\r\n lineHeight: 1.45,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '0.03em',\r\n },\r\n transitions: {\r\n fast: '100ms cubic-bezier(0.34,1.56,0.64,1)',\r\n normal: '200ms cubic-bezier(0.34,1.56,0.64,1)',\r\n slow: '320ms cubic-bezier(0.34,1.56,0.64,1)',\r\n },\r\n backgroundImage: { type: 'pattern', pattern: 'dots', opacity: 0.5 },\r\n },\r\n displayStyle: 'playful',\r\n variantConfig: { radius: 'sm', shadow: 'lg', density: 'normal', animation: 'playful' },\r\n};\r\n\r\n// ============================================================\r\n// 18. ZINE PUNK\r\n// Photocopier B/W, hand-lettered headings (Permanent Marker),\r\n// Special Elite body, aggressive asymmetric hard shadows.\r\n// ============================================================\r\n\r\nexport const zinePunk: NiceThemePack = {\r\n meta: {\r\n id: 'zinePunk',\r\n name: 'Zine Punk',\r\n tagline: 'Photocopier grain, marker headlines, cut-and-paste attitude.',\r\n tags: ['light', 'editorial', 'experimental', 'brutalist'],\r\n },\r\n theme: {\r\n name: 'Zine Punk',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'brutalist',\r\n colors: {\r\n primary: '#0a0a0a',\r\n primaryHover: '#000000',\r\n success: '#1a1a1a',\r\n warning: '#2a2a2a',\r\n error: '#0a0a0a',\r\n info: '#1a1a1a',\r\n accent: '#0a0a0a',\r\n focus: '#0a0a0a',\r\n surface: '#f5f3ee',\r\n surfaceHover: '#e8e4d8',\r\n },\r\n backgrounds: {\r\n primary: '#efece0',\r\n secondary: '#e3dfd0',\r\n tertiary: '#d4d0c0',\r\n hover: '#c8c4b4',\r\n elevated: '#f5f3ee',\r\n inset: '#e0dcc8',\r\n canvas: '#ede8d8',\r\n },\r\n text: {\r\n primary: '#0a0a0a',\r\n secondary: '#1a1a1a',\r\n muted: '#505050',\r\n inverse: '#efece0',\r\n },\r\n borders: {\r\n color: '#0a0a0a',\r\n width: '2px',\r\n divider: '#0a0a0a',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n // Slanted \"glued on\" feel.\r\n sm: '2px 3px 0 rgba(10,10,10,0.9)',\r\n md: '4px 6px 0 rgba(10,10,10,0.9), -2px 2px 0 rgba(10,10,10,0.3)',\r\n lg: '6px 10px 0 rgba(10,10,10,1), -4px 2px 0 rgba(10,10,10,0.4)',\r\n xl: '10px 14px 0 rgba(10,10,10,1)',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Special Elite', 'Courier Prime', monospace\",\r\n headingFontFamily: \"'Permanent Marker', 'Special Elite', cursive\",\r\n monoFontFamily: \"'Courier Prime', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.9375rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.875rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 400,\r\n fontWeightSemibold: 400,\r\n fontWeightBold: 400,\r\n lineHeight: 1.5,\r\n letterSpacing: '0.02em',\r\n headingLetterSpacing: '0.01em',\r\n },\r\n transitions: { fast: '20ms linear', normal: '60ms linear', slow: '120ms linear' },\r\n backgroundImage: { type: 'pattern', pattern: 'noise', opacity: 0.3, blendMode: 'multiply' },\r\n },\r\n displayStyle: 'brutalist',\r\n variantConfig: { radius: 'none', shadow: 'lg', density: 'normal', animation: 'none' },\r\n};\r\n\r\n// ============================================================\r\n// 19. WATERCOLOR WASH\r\n// Soft pastel bleeds — lavender, peach, sky — Caveat\r\n// handwriting heading, organic generous radii, gauzy shadows.\r\n// ============================================================\r\n\r\nexport const watercolorWash: NiceThemePack = {\r\n meta: {\r\n id: 'watercolorWash',\r\n name: 'Watercolor Wash',\r\n tagline: 'Soft pastel bleeds, handwritten headings, paper gentleness.',\r\n tags: ['light', 'artistic', 'pastel', 'organic'],\r\n },\r\n theme: {\r\n name: 'Watercolor Wash',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'softCloud',\r\n colors: {\r\n primary: '#9d7bc4',\r\n primaryHover: '#8262ab',\r\n success: '#7bb88a',\r\n warning: '#e0a868',\r\n error: '#d47878',\r\n info: '#7ba8c4',\r\n accent: '#e0a0c0',\r\n focus: '#9d7bc4',\r\n surface: 'rgba(255,250,245,0.8)',\r\n surfaceHover: 'rgba(250,240,238,0.9)',\r\n },\r\n backgrounds: {\r\n primary: '#fdf8f4',\r\n secondary: '#f8eee6',\r\n tertiary: '#f0e0d4',\r\n hover: '#e8d2c0',\r\n elevated: '#ffffff',\r\n inset: '#f4e4d8',\r\n canvas: '#fdf8f4',\r\n },\r\n text: {\r\n primary: '#3a2845',\r\n secondary: '#6a5868',\r\n muted: '#a89ca4',\r\n inverse: '#fdf8f4',\r\n },\r\n borders: {\r\n color: '#e8d4c8',\r\n width: '1px',\r\n divider: '#f0e0d4',\r\n radiusSm: '10px',\r\n radiusMd: '18px',\r\n radiusLg: '30px',\r\n radiusXl: '44px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n // Gauzy / bleed-through.\r\n sm: '0 2px 10px rgba(157,123,196,0.08)',\r\n md: '0 6px 24px rgba(157,123,196,0.12), 0 2px 4px rgba(224,160,192,0.06)',\r\n lg: '0 16px 40px rgba(157,123,196,0.18), 0 6px 12px rgba(224,160,192,0.1)',\r\n xl: '0 30px 64px rgba(157,123,196,0.22)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'Quicksand', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Caveat', 'Quicksand', cursive\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.9375rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '2rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.65,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.005em',\r\n },\r\n transitions: {\r\n fast: '220ms cubic-bezier(0.22,1,0.36,1)',\r\n normal: '380ms cubic-bezier(0.22,1,0.36,1)',\r\n slow: '600ms cubic-bezier(0.22,1,0.36,1)',\r\n },\r\n backgroundImage: {\r\n type: 'gradient',\r\n gradient:\r\n 'radial-gradient(at 18% 22%, rgba(232,208,220,0.5) 0%, transparent 40%), ' +\r\n 'radial-gradient(at 82% 28%, rgba(200,220,240,0.45) 0%, transparent 45%), ' +\r\n 'radial-gradient(at 35% 80%, rgba(232,228,200,0.4) 0%, transparent 50%), ' +\r\n 'linear-gradient(180deg, #fdf8f4 0%, #f8eee6 100%)',\r\n },\r\n },\r\n displayStyle: 'softCloud',\r\n variantConfig: { radius: 'xl', density: 'comfortable', animation: 'normal' },\r\n};\r\n\r\n// ============================================================\r\n// 20. MEMPHIS 80S\r\n// Primary colors, squiggle chaos, Rubik Mono One display,\r\n// sharp small radii, confetti shadows.\r\n// ============================================================\r\n\r\nexport const memphis80s: NiceThemePack = {\r\n meta: {\r\n id: 'memphis80s',\r\n name: 'Memphis 80s',\r\n tagline: 'Squiggle chaos — cyan, pink, yellow, serious typography, no.',\r\n tags: ['light', 'artistic', 'playful'],\r\n },\r\n theme: {\r\n name: 'Memphis 80s',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'playful',\r\n colors: {\r\n primary: '#f02080',\r\n primaryHover: '#c81868',\r\n success: '#28c868',\r\n warning: '#f8d820',\r\n error: '#f02040',\r\n info: '#20b8e8',\r\n accent: '#f8d820',\r\n focus: '#20b8e8',\r\n surface: '#fffffa',\r\n surfaceHover: '#fff7d0',\r\n },\r\n backgrounds: {\r\n primary: '#fffceb',\r\n secondary: '#fff2d0',\r\n tertiary: '#ffe8b4',\r\n hover: '#ffdd98',\r\n elevated: '#ffffff',\r\n inset: '#fff0c0',\r\n canvas: '#fffbe0',\r\n },\r\n text: {\r\n primary: '#0a0a1a',\r\n secondary: '#2a2a3a',\r\n muted: '#6a6a7a',\r\n inverse: '#fffceb',\r\n },\r\n borders: {\r\n color: '#0a0a1a',\r\n width: '2px',\r\n divider: '#0a0a1a',\r\n radiusSm: '4px',\r\n radiusMd: '6px',\r\n radiusLg: '10px',\r\n radiusXl: '14px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '3px 3px 0 0 #20b8e8',\r\n md: '4px 4px 0 0 #f02080, 8px 8px 0 0 #f8d820',\r\n lg: '5px 5px 0 0 #28c868, 10px 10px 0 0 #20b8e8, 15px 15px 0 0 #f02080',\r\n xl: '6px 6px 0 0 #f8d820, 12px 12px 0 0 #f02080, 18px 18px 0 0 #20b8e8',\r\n },\r\n spacing: SP_NORMAL,\r\n typography: {\r\n fontFamily: \"'Rubik', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Rubik Mono One', 'Rubik', sans-serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.8125rem',\r\n fontSizeSm: '0.9375rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.875rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 800,\r\n lineHeight: 1.4,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.01em',\r\n },\r\n transitions: {\r\n fast: '120ms cubic-bezier(0.68,-0.55,0.27,1.55)',\r\n normal: '220ms cubic-bezier(0.68,-0.55,0.27,1.55)',\r\n slow: '360ms cubic-bezier(0.68,-0.55,0.27,1.55)',\r\n },\r\n backgroundImage: { type: 'pattern', pattern: 'zigzag', opacity: 0.3 },\r\n },\r\n displayStyle: 'playful',\r\n variantConfig: { radius: 'sm', shadow: 'lg', density: 'normal', animation: 'playful' },\r\n};\r\n\r\n// ============================================================\r\n// 21. INK SUMI-E — minimal East-Asian brush\r\n// Pure white, charcoal ink, single red seal accent,\r\n// Noto Serif JP, no shadows, almost no radii.\r\n// ============================================================\r\n\r\nexport const inkSumie: NiceThemePack = {\r\n meta: {\r\n id: 'inkSumie',\r\n name: 'Ink Sumi-e',\r\n tagline: 'Charcoal brush on rice paper — vast silence, one red seal.',\r\n tags: ['light', 'artistic', 'serif', 'minimal'],\r\n },\r\n theme: {\r\n name: 'Ink Sumi-e',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'zen',\r\n colors: {\r\n primary: '#1a1a1a',\r\n primaryHover: '#000000',\r\n success: '#2a4a2a',\r\n warning: '#705820',\r\n error: '#b82020',\r\n info: '#2a4060',\r\n accent: '#b82020',\r\n focus: '#1a1a1a',\r\n surface: '#ffffff',\r\n surfaceHover: '#f8f7f3',\r\n },\r\n backgrounds: {\r\n primary: '#fdfcf7',\r\n secondary: '#f5f3eb',\r\n tertiary: '#ebe8dc',\r\n hover: '#dfdbcc',\r\n elevated: '#ffffff',\r\n inset: '#f0edde',\r\n canvas: '#fdfcf7',\r\n },\r\n text: {\r\n primary: '#1a1a1a',\r\n secondary: '#3a3a3a',\r\n muted: '#888482',\r\n inverse: '#fdfcf7',\r\n },\r\n borders: {\r\n color: '#1a1a1a',\r\n width: '1px',\r\n divider: '#d8d4c4',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '1px',\r\n radiusXl: '2px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: { sm: 'none', md: 'none', lg: 'none', xl: '0 0 0 1px #1a1a1a' },\r\n spacing: SP_GENEROUS,\r\n typography: {\r\n fontFamily: \"'Noto Sans JP', -apple-system, sans-serif\",\r\n headingFontFamily: \"'Noto Serif JP', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.9375rem',\r\n fontSizeLg: '1.0625rem',\r\n fontSizeXl: '1.625rem',\r\n fontWeightNormal: 300,\r\n fontWeightMedium: 400,\r\n fontWeightSemibold: 500,\r\n fontWeightBold: 700,\r\n lineHeight: 1.85,\r\n letterSpacing: '0.04em',\r\n headingLetterSpacing: '0',\r\n },\r\n transitions: { fast: '200ms ease', normal: '340ms ease', slow: '520ms ease' },\r\n },\r\n displayStyle: 'zen',\r\n variantConfig: { radius: 'none', shadow: 'none', density: 'spacious', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 22. DIETER RAMS\r\n// Industrial precision — warm gray + sparing yellow, IBM\r\n// Plex Sans, tiny radii, faint functional shadows.\r\n// ============================================================\r\n\r\nexport const dieterRams: NiceThemePack = {\r\n meta: {\r\n id: 'dieterRams',\r\n name: 'Dieter Rams',\r\n tagline: 'Less-but-better — warm gray, single yellow dot, measured everything.',\r\n tags: ['light', 'minimal', 'industrial'],\r\n },\r\n theme: {\r\n name: 'Dieter Rams',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'swiss',\r\n colors: {\r\n primary: '#1a1a1a',\r\n primaryHover: '#0a0a0a',\r\n success: '#3a7840',\r\n warning: '#e8c020',\r\n error: '#c83028',\r\n info: '#3868a0',\r\n accent: '#e8c020',\r\n focus: '#1a1a1a',\r\n surface: '#ffffff',\r\n surfaceHover: '#f8f8f8',\r\n },\r\n backgrounds: {\r\n primary: '#fbfbf9',\r\n secondary: '#f2f2ee',\r\n tertiary: '#e8e8e2',\r\n hover: '#dedeD6',\r\n elevated: '#ffffff',\r\n inset: '#ededE7',\r\n canvas: '#f5f5f1',\r\n },\r\n text: {\r\n primary: '#0a0a0a',\r\n secondary: '#3a3a38',\r\n muted: '#888880',\r\n inverse: '#fbfbf9',\r\n },\r\n borders: {\r\n color: '#d4d4ce',\r\n width: '1px',\r\n divider: '#e0e0da',\r\n radiusSm: '1px',\r\n radiusMd: '2px',\r\n radiusLg: '3px',\r\n radiusXl: '4px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 1px 0 0 rgba(0,0,0,0.04)',\r\n md: '0 1px 0 0 rgba(0,0,0,0.06), 0 4px 8px -2px rgba(0,0,0,0.06)',\r\n lg: '0 2px 0 0 rgba(0,0,0,0.08), 0 10px 20px -6px rgba(0,0,0,0.1)',\r\n xl: '0 20px 40px -12px rgba(0,0,0,0.14)',\r\n },\r\n spacing: SP_TIGHT,\r\n typography: {\r\n fontFamily: \"'IBM Plex Sans', -apple-system, sans-serif\",\r\n headingFontFamily: \"'IBM Plex Sans', sans-serif\",\r\n monoFontFamily: \"'IBM Plex Mono', monospace\",\r\n fontSizeXs: '0.6875rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.375rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 600,\r\n fontWeightBold: 700,\r\n lineHeight: 1.55,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.015em',\r\n },\r\n transitions: {\r\n fast: '100ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '180ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '280ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n },\r\n displayStyle: 'swiss',\r\n variantConfig: { radius: 'sm', shadow: 'subtle', density: 'compact', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 23. BLACK TIE GALA\r\n// Absolute black, gold foil accents, Cormorant Garamond,\r\n// gilt 1px borders, subtle glow on interactions.\r\n// ============================================================\r\n\r\nexport const blackTieGala: NiceThemePack = {\r\n meta: {\r\n id: 'blackTieGala',\r\n name: 'Black Tie Gala',\r\n tagline: 'Absolute black, hand-gilded detail, whispered serif elegance.',\r\n tags: ['dark', 'luxury', 'serif'],\r\n },\r\n theme: {\r\n name: 'Black Tie Gala',\r\n darkMode: 'dark',\r\n recommendedDisplayStyle: 'luxe',\r\n colors: {\r\n primary: '#c89848',\r\n primaryHover: '#e0b868',\r\n success: '#68a878',\r\n warning: '#e0b050',\r\n error: '#c85858',\r\n info: '#8aa8d0',\r\n accent: '#e8d0a0',\r\n focus: '#c89848',\r\n surface: '#0e0e0e',\r\n surfaceHover: '#161616',\r\n },\r\n backgrounds: {\r\n primary: '#050505',\r\n secondary: '#0e0e0e',\r\n tertiary: '#161616',\r\n hover: '#1e1e1e',\r\n elevated: '#0e0e0e',\r\n inset: '#020202',\r\n canvas: '#030303',\r\n },\r\n text: {\r\n primary: '#f0ead8',\r\n secondary: '#a89870',\r\n muted: '#605848',\r\n inverse: '#050505',\r\n },\r\n borders: {\r\n color: '#3a2e18',\r\n width: '1px',\r\n divider: '#241a0c',\r\n focusColor: '#c89848',\r\n radiusSm: '1px',\r\n radiusMd: '2px',\r\n radiusLg: '3px',\r\n radiusXl: '4px',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: '0 0 0 1px rgba(200,152,72,0.1)',\r\n md: '0 4px 16px rgba(0,0,0,0.8), 0 0 0 1px rgba(200,152,72,0.15)',\r\n lg: '0 10px 32px rgba(0,0,0,0.9), 0 0 0 1px rgba(200,152,72,0.25), inset 0 1px 0 rgba(232,208,160,0.08)',\r\n xl: '0 24px 56px rgba(0,0,0,1), 0 0 0 1px rgba(200,152,72,0.35)',\r\n glow: '0 0 24px rgba(200,152,72,0.25)',\r\n },\r\n spacing: SP_AIRY,\r\n typography: {\r\n fontFamily: \"'Cormorant Garamond', Georgia, serif\",\r\n headingFontFamily: \"'Cormorant Garamond', Georgia, serif\",\r\n monoFontFamily: \"'JetBrains Mono', monospace\",\r\n fontSizeXs: '0.75rem',\r\n fontSizeSm: '0.875rem',\r\n fontSizeMd: '1rem',\r\n fontSizeLg: '1.125rem',\r\n fontSizeXl: '1.75rem',\r\n fontWeightNormal: 300,\r\n fontWeightMedium: 400,\r\n fontWeightSemibold: 500,\r\n fontWeightBold: 600,\r\n lineHeight: 1.65,\r\n letterSpacing: '0.05em',\r\n headingLetterSpacing: '0.08em',\r\n },\r\n transitions: {\r\n fast: '180ms cubic-bezier(0.4,0,0.2,1)',\r\n normal: '320ms cubic-bezier(0.4,0,0.2,1)',\r\n slow: '500ms cubic-bezier(0.4,0,0.2,1)',\r\n },\r\n },\r\n displayStyle: 'luxe',\r\n variantConfig: { radius: 'sm', shadow: 'lg', density: 'spacious', animation: 'subtle' },\r\n};\r\n\r\n// ============================================================\r\n// 24. SWISS GRID\r\n// Helvetica-DNA (Inter), white + black + one red, rigorous\r\n// small radii, mono details, tight grid density.\r\n// ============================================================\r\n\r\nexport const swissGrid: NiceThemePack = {\r\n meta: {\r\n id: 'swissGrid',\r\n name: 'Swiss Grid',\r\n tagline: 'Akzidenz rigor — white, black, one red, grid discipline.',\r\n tags: ['light', 'minimal', 'editorial'],\r\n },\r\n theme: {\r\n name: 'Swiss Grid',\r\n darkMode: 'light',\r\n recommendedDisplayStyle: 'swiss',\r\n colors: {\r\n primary: '#e30613',\r\n primaryHover: '#b8040f',\r\n success: '#00683d',\r\n warning: '#b8700a',\r\n error: '#e30613',\r\n info: '#004c98',\r\n accent: '#e30613',\r\n focus: '#e30613',\r\n surface: '#ffffff',\r\n surfaceHover: '#f5f5f5',\r\n },\r\n backgrounds: {\r\n primary: '#ffffff',\r\n secondary: '#f5f5f5',\r\n tertiary: '#ebebeb',\r\n hover: '#e0e0e0',\r\n elevated: '#ffffff',\r\n inset: '#f0f0f0',\r\n canvas: '#ffffff',\r\n },\r\n text: {\r\n primary: '#0a0a0a',\r\n secondary: '#2a2a2a',\r\n muted: '#707070',\r\n inverse: '#ffffff',\r\n },\r\n borders: {\r\n color: '#0a0a0a',\r\n width: '1px',\r\n divider: '#d0d0d0',\r\n radiusSm: '0',\r\n radiusMd: '0',\r\n radiusLg: '0',\r\n radiusXl: '0',\r\n radiusFull: '9999px',\r\n },\r\n shadows: {\r\n sm: 'none',\r\n md: '0 1px 0 0 rgba(10,10,10,0.1)',\r\n lg: '0 2px 0 0 rgba(10,10,10,0.12)',\r\n xl: '0 4px 0 0 rgba(10,10,10,0.15)',\r\n },\r\n spacing: SP_TIGHT,\r\n typography: {\r\n fontFamily: \"'Inter', 'Helvetica Neue', sans-serif\",\r\n headingFontFamily: \"'Inter', 'Helvetica Neue', sans-serif\",\r\n monoFontFamily: \"'IBM Plex Mono', monospace\",\r\n fontSizeXs: '0.6875rem',\r\n fontSizeSm: '0.8125rem',\r\n fontSizeMd: '0.875rem',\r\n fontSizeLg: '1rem',\r\n fontSizeXl: '1.5rem',\r\n fontWeightNormal: 400,\r\n fontWeightMedium: 500,\r\n fontWeightSemibold: 700,\r\n fontWeightBold: 700,\r\n lineHeight: 1.45,\r\n letterSpacing: '0',\r\n headingLetterSpacing: '-0.03em',\r\n },\r\n transitions: { fast: '60ms linear', normal: '120ms linear', slow: '200ms linear' },\r\n },\r\n displayStyle: 'swiss',\r\n variantConfig: { radius: 'none', shadow: 'none', density: 'compact', animation: 'subtle' },\r\n};\r\n\r\n// ── Registry ─────────────────────────────────────────────────\r\n\r\nexport const NICE_THEME_PACKS_EXTENDED = {\r\n // Nature\r\n forestCanopy,\r\n desertDune,\r\n arcticCrystal,\r\n autumnFoliage,\r\n // Cultural\r\n japaneseWashi,\r\n moroccanMosaic,\r\n artDecoGatsby,\r\n sovietConstructivist,\r\n // Tech\r\n blueprint,\r\n hologramUI,\r\n deepSea,\r\n // Retro\r\n analog70s,\r\n vhsTracking,\r\n typewriterPress,\r\n y2kAqua,\r\n // Editorial\r\n vogueDidone,\r\n comicHalftone,\r\n zinePunk,\r\n // Artistic\r\n watercolorWash,\r\n memphis80s,\r\n inkSumie,\r\n // Minimal / Luxury\r\n dieterRams,\r\n blackTieGala,\r\n swissGrid,\r\n} as const;\r\n\r\nexport const NICE_THEME_PACK_LIST_EXTENDED: NiceThemePack[] =\r\n Object.values(NICE_THEME_PACKS_EXTENDED);\r\n\r\nexport type NiceThemePackIdExtended = keyof typeof NICE_THEME_PACKS_EXTENDED;\r\n\r\n/** Lookup a pack by id (extended registry only). */\r\nexport function getNiceThemePackExtended(id: string): NiceThemePack | undefined {\r\n return (NICE_THEME_PACKS_EXTENDED as Record<string, NiceThemePack>)[id];\r\n}\r\n\r\n/** Filter extended packs by tag. */\r\nexport function filterNiceThemePacksExtendedByTag(tag: string): NiceThemePack[] {\r\n return NICE_THEME_PACK_LIST_EXTENDED.filter((p) => p.meta.tags.includes(tag));\r\n}\r\n","import React, { useCallback, useId, useMemo, useRef, useEffect, useState } from 'react';\r\n\r\nimport type { NiceDisplayStyle } from '../core/displayStyle';\r\nimport {\r\n NiceDisplayStyleContext,\r\n resolveDisplayStyleConfig,\r\n getDisplayStyleDataAttrs,\r\n} from '../core/displayStyle';\r\nimport type { NiceTheme, NiceThemeDarkMode } from '../core/theme';\r\nimport { NiceThemeContext, themeToCssVars, removeTheme } from '../core/theme';\r\nimport type { ThemeVariantConfig } from '../core/themeVariants';\r\nimport {\r\n applyVariantConfig,\r\n removeVariantConfig,\r\n DEFAULT_VARIANT_CONFIG,\r\n} from '../core/themeVariants';\r\n\r\nexport interface NiceThemeProviderProps {\r\n /** Current theme */\r\n theme: NiceTheme;\r\n /** Optional dark companion theme (used when darkMode='auto' and system prefers dark) */\r\n darkTheme?: NiceTheme;\r\n /** Variant configuration for component styles */\r\n variantConfig?: Partial<ThemeVariantConfig>;\r\n /** Override dark mode preference ('light' | 'dark' | 'auto'); defaults to theme.darkMode */\r\n darkMode?: NiceThemeDarkMode;\r\n /**\r\n * Global display style applied to all child Nice* components.\r\n * Each component can override via its own `displayStyle` prop.\r\n *\r\n * Resolution order:\r\n * 1. This prop (if set)\r\n * 2. theme.recommendedDisplayStyle (if the theme pack carries one)\r\n * 3. 'default'\r\n *\r\n * @see NiceDisplayStyle\r\n */\r\n displayStyle?: NiceDisplayStyle;\r\n /** Animate theme transitions (default: true) */\r\n animateTransitions?: boolean;\r\n children: React.ReactNode;\r\n}\r\n\r\n/** Pick the initial display style from prop → theme recommendation → 'default'. */\r\nfunction pickInitialDisplayStyle(\r\n propStyle: NiceDisplayStyle | undefined,\r\n theme: NiceTheme,\r\n): NiceDisplayStyle {\r\n return propStyle ?? theme.recommendedDisplayStyle ?? 'default';\r\n}\r\n\r\nexport const NiceThemeProvider: React.FC<NiceThemeProviderProps> = ({\r\n theme,\r\n darkTheme,\r\n variantConfig,\r\n darkMode,\r\n displayStyle: displayStyleProp,\r\n animateTransitions = true,\r\n children,\r\n}) => {\r\n // React.useId returns something like \":r0:\" which is valid in attribute\r\n // values but awkward inside CSS attribute selectors. Strip the colons so\r\n // we can safely use it in `[data-ntd-provider=\"...\"]`.\r\n const rawId = useId();\r\n const scopeId = useMemo(() => `p${rawId.replace(/:/g, '')}`, [rawId]);\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n // Body-attached host that carries the same theme CSS variables. Used as the\r\n // portal target for overlay components (NiceModal, NiceDrawer, NiceToast,\r\n // NicePopover, ...). Without this, those components portal to document.body\r\n // and lose the theme scope set by the provider's inner div, which only\r\n // affects descendants.\r\n const portalHostRef = useRef<HTMLDivElement | null>(null);\r\n const [portalHost, setPortalHost] = useState<HTMLDivElement | null>(null);\r\n const [currentTheme, setCurrentTheme] = useState<NiceTheme>(theme);\r\n const [systemDark, setSystemDark] = useState(false);\r\n const [displayStyle, setDisplayStyle] = useState<NiceDisplayStyle>(() =>\r\n pickInitialDisplayStyle(displayStyleProp, theme),\r\n );\r\n\r\n // Sync displayStyle when either the prop changes or (if the prop is\r\n // unset) the theme carries a different recommendation.\r\n useEffect(() => {\r\n if (displayStyleProp !== undefined) {\r\n setDisplayStyle(displayStyleProp);\r\n } else if (theme.recommendedDisplayStyle) {\r\n setDisplayStyle(theme.recommendedDisplayStyle);\r\n }\r\n }, [displayStyleProp, theme.recommendedDisplayStyle]);\r\n\r\n // Listen for system dark mode preference\r\n useEffect(() => {\r\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\r\n setSystemDark(mq.matches);\r\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, []);\r\n\r\n // Determine resolved dark mode\r\n const resolvedDarkMode = darkMode ?? theme.darkMode ?? 'light';\r\n const isDark = resolvedDarkMode === 'dark' || (resolvedDarkMode === 'auto' && systemDark);\r\n\r\n // Sync external theme prop + dark mode\r\n useEffect(() => {\r\n if (isDark && darkTheme) {\r\n setCurrentTheme(darkTheme);\r\n } else {\r\n setCurrentTheme(theme);\r\n }\r\n }, [theme, darkTheme, isDark]);\r\n\r\n // Create / tear down the portal host on mount.\r\n useEffect(() => {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n const host = document.createElement('div');\r\n host.className = 'nice-theme-scope nice-theme-portal-host';\r\n host.dataset.ntdProvider = scopeId;\r\n // The host itself is a layout-neutral wrapper. Its children (overlays)\r\n // own their own positioning. We deliberately give it `display: contents`\r\n // so it never produces an extra box that could change layout, while still\r\n // serving as a CSS-variable scope.\r\n host.style.display = 'contents';\r\n document.body.appendChild(host);\r\n portalHostRef.current = host;\r\n setPortalHost(host);\r\n return () => {\r\n if (host.parentNode) {\r\n host.parentNode.removeChild(host);\r\n }\r\n portalHostRef.current = null;\r\n setPortalHost(null);\r\n };\r\n }, [scopeId]);\r\n\r\n // Apply CSS variables to the container element\r\n useEffect(() => {\r\n const el = containerRef.current;\r\n if (!el) {\r\n return;\r\n }\r\n\r\n // Transition animation\r\n if (animateTransitions) {\r\n el.style.transition = 'background-color 300ms ease, color 300ms ease';\r\n }\r\n\r\n const vars = themeToCssVars(currentTheme);\r\n for (const [prop, value] of Object.entries(vars)) {\r\n el.style.setProperty(prop, value);\r\n }\r\n // Mirror the same vars to the portal host so portaled overlays inherit\r\n // the active theme. Without this, NiceModal etc. would render with the\r\n // documentElement's vars (or no vars) and look unthemed.\r\n const host = portalHostRef.current;\r\n if (host) {\r\n for (const [prop, value] of Object.entries(vars)) {\r\n host.style.setProperty(prop, value);\r\n }\r\n }\r\n\r\n // Color scheme hint for browser widgets\r\n el.style.colorScheme = isDark ? 'dark' : 'light';\r\n el.dataset.ntdColorScheme = isDark ? 'dark' : 'light';\r\n // Enable CSS dark mode selectors (.nice-dark, [data-theme=\"dark\"])\r\n el.dataset.theme = isDark ? 'dark' : 'light';\r\n if (isDark) {\r\n el.classList.add('nice-dark');\r\n } else {\r\n el.classList.remove('nice-dark');\r\n }\r\n if (host) {\r\n host.style.colorScheme = isDark ? 'dark' : 'light';\r\n host.dataset.ntdColorScheme = isDark ? 'dark' : 'light';\r\n host.dataset.theme = isDark ? 'dark' : 'light';\r\n if (isDark) {\r\n host.classList.add('nice-dark');\r\n } else {\r\n host.classList.remove('nice-dark');\r\n }\r\n }\r\n\r\n // Apply background image if configured\r\n const bg = currentTheme.backgroundImage;\r\n if (bg && bg.type !== 'none') {\r\n // Background image vars are set by applyTheme; here we do it on the scoped element\r\n if (bg.type === 'gradient' && bg.gradient) {\r\n el.style.setProperty('--ntd-bg-image', bg.gradient);\r\n }\r\n }\r\n\r\n return () => {\r\n if (el) {\r\n removeTheme(el);\r\n }\r\n };\r\n }, [currentTheme, isDark, animateTransitions, portalHost]);\r\n\r\n // Apply variant config (from explicit variantConfig prop OR from displayStyle).\r\n // Each provider instance is scoped via a unique data attribute, so nested\r\n // or sibling providers with different displayStyles no longer stomp on a\r\n // single global <style> element.\r\n useEffect(() => {\r\n const el = containerRef.current;\r\n if (!el) {\r\n return;\r\n }\r\n const resolved = variantConfig\r\n ? { ...DEFAULT_VARIANT_CONFIG, ...variantConfig }\r\n : resolveDisplayStyleConfig(displayStyle);\r\n applyVariantConfig(resolved, el, scopeId);\r\n // Set display style data attributes for CSS selectors\r\n const attrs = getDisplayStyleDataAttrs(displayStyle);\r\n for (const [key, val] of Object.entries(attrs)) {\r\n el.setAttribute(key, val);\r\n }\r\n return () => {\r\n removeVariantConfig(scopeId, el);\r\n };\r\n }, [variantConfig, displayStyle, scopeId]);\r\n\r\n const handleSetTheme = useCallback((t: NiceTheme) => {\r\n setCurrentTheme(t);\r\n }, []);\r\n\r\n const value = useMemo(\r\n () => ({\r\n theme: currentTheme,\r\n setTheme: handleSetTheme,\r\n portalTarget: portalHost,\r\n }),\r\n [currentTheme, handleSetTheme, portalHost],\r\n );\r\n\r\n const displayStyleValue = useMemo(\r\n () => ({\r\n displayStyle,\r\n variantConfig: resolveDisplayStyleConfig(displayStyle),\r\n setDisplayStyle,\r\n }),\r\n [displayStyle],\r\n );\r\n\r\n return (\r\n <NiceThemeContext.Provider value={value}>\r\n <NiceDisplayStyleContext.Provider value={displayStyleValue}>\r\n <div\r\n ref={containerRef}\r\n className=\"nice-theme-scope\"\r\n data-ntd-provider={scopeId}\r\n style={{ display: 'contents' }}\r\n >\r\n {children}\r\n </div>\r\n </NiceDisplayStyleContext.Provider>\r\n </NiceThemeContext.Provider>\r\n );\r\n};\r\n\r\nNiceThemeProvider.displayName = 'NiceThemeProvider';\r\n","/**\r\n * @file NiceThemeVariants.tsx\r\n * @description React components for theme variant configuration and preview\r\n *\r\n * @version 1.0.0\r\n * @since 2026-03\r\n * @license MIT\r\n */\r\n\r\nimport React, { useState, useEffect, useCallback, createContext, useContext } from 'react';\r\n\r\nimport {\r\n ThemeVariantConfig,\r\n RadiusVariant,\r\n ShadowVariant,\r\n FillVariant,\r\n ButtonStyleVariant,\r\n InputStyleVariant,\r\n CardStyleVariant,\r\n AnimationIntensity,\r\n DensityVariant,\r\n DEFAULT_VARIANT_CONFIG,\r\n VARIANT_PRESETS,\r\n RADIUS_VALUES,\r\n SHADOW_VALUES,\r\n DENSITY_VALUES,\r\n ANIMATION_VALUES,\r\n applyVariantConfig,\r\n generateVariantCSS,\r\n generateButtonStyles,\r\n generateInputStyles,\r\n generateCardStyles,\r\n} from './themeVariants';\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 1. CONTEXT\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\ninterface ThemeVariantContextValue {\r\n config: ThemeVariantConfig;\r\n setConfig: (config: Partial<ThemeVariantConfig>) => void;\r\n applyPreset: (presetName: string) => void;\r\n reset: () => void;\r\n}\r\n\r\nconst ThemeVariantContext = createContext<ThemeVariantContextValue | null>(null);\r\n\r\n/**\r\n * Hook to access theme variant context\r\n */\r\nexport function useThemeVariants(): ThemeVariantContextValue {\r\n const ctx = useContext(ThemeVariantContext);\r\n if (!ctx) {\r\n throw new Error('useThemeVariants must be used within NiceThemeVariantProvider');\r\n }\r\n return ctx;\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 2. PROVIDER\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface NiceThemeVariantProviderProps {\r\n /** Initial variant config */\r\n initialConfig?: Partial<ThemeVariantConfig>;\r\n /** Storage key for persistence */\r\n storageKey?: string;\r\n /** Auto-apply to DOM */\r\n autoApply?: boolean;\r\n /** Children */\r\n children: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Provider for theme variant configuration\r\n */\r\nexport function NiceThemeVariantProvider({\r\n initialConfig,\r\n storageKey = 'ntd-variant-config',\r\n autoApply = true,\r\n children,\r\n}: NiceThemeVariantProviderProps): JSX.Element {\r\n const [config, setConfigState] = useState<ThemeVariantConfig>(() => {\r\n // Load from storage if available\r\n if (typeof window !== 'undefined' && storageKey) {\r\n const stored = localStorage.getItem(storageKey);\r\n if (stored) {\r\n try {\r\n return { ...DEFAULT_VARIANT_CONFIG, ...JSON.parse(stored) };\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n }\r\n }\r\n return { ...DEFAULT_VARIANT_CONFIG, ...initialConfig };\r\n });\r\n\r\n // Apply config to DOM\r\n useEffect(() => {\r\n if (autoApply && typeof window !== 'undefined') {\r\n applyVariantConfig(config);\r\n }\r\n }, [config, autoApply]);\r\n\r\n // Persist to storage\r\n useEffect(() => {\r\n if (typeof window !== 'undefined' && storageKey) {\r\n localStorage.setItem(storageKey, JSON.stringify(config));\r\n }\r\n }, [config, storageKey]);\r\n\r\n const setConfig = useCallback((partial: Partial<ThemeVariantConfig>) => {\r\n setConfigState((prev) => ({ ...prev, ...partial }));\r\n }, []);\r\n\r\n const applyPreset = useCallback((presetName: string) => {\r\n const preset = VARIANT_PRESETS[presetName];\r\n if (preset) {\r\n setConfigState(preset);\r\n }\r\n }, []);\r\n\r\n const reset = useCallback(() => {\r\n setConfigState(DEFAULT_VARIANT_CONFIG);\r\n }, []);\r\n\r\n return (\r\n <ThemeVariantContext.Provider value={{ config, setConfig, applyPreset, reset }}>\r\n {children}\r\n </ThemeVariantContext.Provider>\r\n );\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 3. CONFIGURATOR COMPONENT\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface NiceThemeVariantConfiguratorProps {\r\n /** Show preset selector */\r\n showPresets?: boolean;\r\n /** Show live preview */\r\n showPreview?: boolean;\r\n /** Show CSS output */\r\n showCSS?: boolean;\r\n /** Collapsible sections */\r\n collapsible?: boolean;\r\n /** Custom class */\r\n className?: string;\r\n /** Style */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * UI for configuring theme variants\r\n */\r\nexport function NiceThemeVariantConfigurator({\r\n showPresets = true,\r\n showPreview = true,\r\n showCSS = false,\r\n collapsible = true,\r\n className,\r\n style,\r\n}: NiceThemeVariantConfiguratorProps): JSX.Element {\r\n const { config, setConfig, applyPreset, reset } = useThemeVariants();\r\n const [expandedSections, setExpandedSections] = useState<Set<string>>(\r\n new Set(['presets', 'radius', 'shadow']),\r\n );\r\n\r\n const toggleSection = (section: string) => {\r\n if (!collapsible) {\r\n return;\r\n }\r\n setExpandedSections((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(section)) {\r\n next.delete(section);\r\n } else {\r\n next.add(section);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const isSectionExpanded = (section: string) => !collapsible || expandedSections.has(section);\r\n\r\n return (\r\n <div\r\n className={`ntd-theme-variant-configurator ${className || ''}`}\r\n style={{\r\n fontFamily: 'system-ui, sans-serif',\r\n fontSize: '14px',\r\n ...style,\r\n }}\r\n >\r\n {/* Presets */}\r\n {showPresets && (\r\n <Section\r\n title=\"Presets\"\r\n expanded={isSectionExpanded('presets')}\r\n onToggle={() => toggleSection('presets')}\r\n >\r\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\r\n {Object.keys(VARIANT_PRESETS).map((name) => (\r\n <button\r\n key={name}\r\n onClick={() => applyPreset(name)}\r\n style={{\r\n padding: '6px 12px',\r\n border: '1px solid var(--border-color, #e5e7eb)',\r\n borderRadius: '6px',\r\n background: 'var(--bg-secondary, #f9fafb)',\r\n cursor: 'pointer',\r\n textTransform: 'capitalize',\r\n }}\r\n >\r\n {name}\r\n </button>\r\n ))}\r\n <button\r\n onClick={reset}\r\n style={{\r\n padding: '6px 12px',\r\n border: '1px solid #dc2626',\r\n borderRadius: '6px',\r\n background: 'var(--danger-bg, #fef2f2)',\r\n color: 'var(--color-error, #dc2626)',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Reset\r\n </button>\r\n </div>\r\n </Section>\r\n )}\r\n\r\n {/* Radius */}\r\n <Section\r\n title=\"Border Radius\"\r\n expanded={isSectionExpanded('radius')}\r\n onToggle={() => toggleSection('radius')}\r\n >\r\n <OptionGroup\r\n options={Object.keys(RADIUS_VALUES) as RadiusVariant[]}\r\n value={config.radius}\r\n onChange={(v) => setConfig({ radius: v as RadiusVariant })}\r\n renderPreview={(v) => (\r\n <div\r\n style={{\r\n width: '24px',\r\n height: '24px',\r\n background: 'var(--color-accent, #6366f1)',\r\n borderRadius: RADIUS_VALUES[v as RadiusVariant].md,\r\n }}\r\n />\r\n )}\r\n />\r\n </Section>\r\n\r\n {/* Shadow */}\r\n <Section\r\n title=\"Shadows\"\r\n expanded={isSectionExpanded('shadow')}\r\n onToggle={() => toggleSection('shadow')}\r\n >\r\n <OptionGroup\r\n options={Object.keys(SHADOW_VALUES) as ShadowVariant[]}\r\n value={config.shadow}\r\n onChange={(v) => setConfig({ shadow: v as ShadowVariant })}\r\n renderPreview={(v) => (\r\n <div\r\n style={{\r\n width: '24px',\r\n height: '24px',\r\n background: 'var(--bg-primary, #fff)',\r\n borderRadius: '4px',\r\n boxShadow: SHADOW_VALUES[v as ShadowVariant],\r\n }}\r\n />\r\n )}\r\n />\r\n </Section>\r\n\r\n {/* Button Style */}\r\n <Section\r\n title=\"Button Style\"\r\n expanded={isSectionExpanded('button')}\r\n onToggle={() => toggleSection('button')}\r\n >\r\n <OptionGroup\r\n options={\r\n [\r\n 'flat',\r\n 'raised',\r\n 'outlined',\r\n 'ghost',\r\n 'soft',\r\n 'gradient',\r\n '3d',\r\n 'neumorphic',\r\n ] as ButtonStyleVariant[]\r\n }\r\n value={config.buttonStyle}\r\n onChange={(v) => setConfig({ buttonStyle: v as ButtonStyleVariant })}\r\n />\r\n </Section>\r\n\r\n {/* Input Style */}\r\n <Section\r\n title=\"Input Style\"\r\n expanded={isSectionExpanded('input')}\r\n onToggle={() => toggleSection('input')}\r\n >\r\n <OptionGroup\r\n options={\r\n [\r\n 'bordered',\r\n 'filled',\r\n 'underlined',\r\n 'floating',\r\n 'soft',\r\n 'neumorphic',\r\n ] as InputStyleVariant[]\r\n }\r\n value={config.inputStyle}\r\n onChange={(v) => setConfig({ inputStyle: v as InputStyleVariant })}\r\n />\r\n </Section>\r\n\r\n {/* Card Style */}\r\n <Section\r\n title=\"Card Style\"\r\n expanded={isSectionExpanded('card')}\r\n onToggle={() => toggleSection('card')}\r\n >\r\n <OptionGroup\r\n options={\r\n [\r\n 'flat',\r\n 'elevated',\r\n 'bordered',\r\n 'glass',\r\n 'gradient',\r\n 'neumorphic',\r\n ] as CardStyleVariant[]\r\n }\r\n value={config.cardStyle}\r\n onChange={(v) => setConfig({ cardStyle: v as CardStyleVariant })}\r\n />\r\n </Section>\r\n\r\n {/* Animation */}\r\n <Section\r\n title=\"Animation\"\r\n expanded={isSectionExpanded('animation')}\r\n onToggle={() => toggleSection('animation')}\r\n >\r\n <OptionGroup\r\n options={Object.keys(ANIMATION_VALUES) as AnimationIntensity[]}\r\n value={config.animation}\r\n onChange={(v) => setConfig({ animation: v as AnimationIntensity })}\r\n />\r\n </Section>\r\n\r\n {/* Density */}\r\n <Section\r\n title=\"Density\"\r\n expanded={isSectionExpanded('density')}\r\n onToggle={() => toggleSection('density')}\r\n >\r\n <OptionGroup\r\n options={Object.keys(DENSITY_VALUES) as DensityVariant[]}\r\n value={config.density}\r\n onChange={(v) => setConfig({ density: v as DensityVariant })}\r\n />\r\n </Section>\r\n\r\n {/* Preview */}\r\n {showPreview && (\r\n <Section\r\n title=\"Preview\"\r\n expanded={isSectionExpanded('preview')}\r\n onToggle={() => toggleSection('preview')}\r\n >\r\n <VariantPreview config={config} />\r\n </Section>\r\n )}\r\n\r\n {/* CSS Output */}\r\n {showCSS && (\r\n <Section\r\n title=\"Generated CSS\"\r\n expanded={isSectionExpanded('css')}\r\n onToggle={() => toggleSection('css')}\r\n >\r\n <pre\r\n style={{\r\n background: 'var(--text-primary, #1f2937)',\r\n color: 'var(--border-color, #e5e7eb)',\r\n padding: '12px',\r\n borderRadius: '6px',\r\n fontSize: '12px',\r\n overflow: 'auto',\r\n maxHeight: '200px',\r\n }}\r\n >\r\n {generateVariantCSS(config)}\r\n </pre>\r\n </Section>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 4. HELPER COMPONENTS\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\ninterface SectionProps {\r\n title: string;\r\n expanded: boolean;\r\n onToggle: () => void;\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction Section({ title, expanded, onToggle, children }: SectionProps): JSX.Element {\r\n return (\r\n <div style={{ marginBottom: '16px' }}>\r\n <button\r\n onClick={onToggle}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n width: '100%',\r\n padding: '8px 0',\r\n border: 'none',\r\n background: 'transparent',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: 'var(--text-secondary, #374151)',\r\n textAlign: 'left',\r\n }}\r\n >\r\n <span\r\n style={{ transform: expanded ? 'rotate(90deg)' : 'none', transition: 'transform 150ms' }}\r\n >\r\n ▶\r\n </span>\r\n {title}\r\n </button>\r\n {expanded && <div style={{ paddingLeft: '20px', paddingTop: '8px' }}>{children}</div>}\r\n </div>\r\n );\r\n}\r\n\r\ninterface OptionGroupProps<T extends string> {\r\n options: T[];\r\n value: T;\r\n onChange: (value: T) => void;\r\n renderPreview?: (value: T) => React.ReactNode;\r\n}\r\n\r\nfunction OptionGroup<T extends string>({\r\n options,\r\n value,\r\n onChange,\r\n renderPreview,\r\n}: OptionGroupProps<T>): JSX.Element {\r\n return (\r\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\r\n {options.map((opt) => (\r\n <button\r\n key={opt}\r\n onClick={() => onChange(opt)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '6px',\r\n padding: '6px 12px',\r\n border: value === opt ? '2px solid #6366f1' : '1px solid var(--border-color, #e5e7eb)',\r\n borderRadius: '6px',\r\n background: value === opt ? '#eef2ff' : 'var(--bg-primary, #fff)',\r\n cursor: 'pointer',\r\n textTransform: 'capitalize',\r\n fontSize: '13px',\r\n }}\r\n >\r\n {renderPreview && renderPreview(opt)}\r\n {opt}\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\ninterface VariantPreviewProps {\r\n config: ThemeVariantConfig;\r\n}\r\n\r\nfunction VariantPreview({ config }: VariantPreviewProps): JSX.Element {\r\n const buttonStyles = generateButtonStyles(config.buttonStyle, 'var(--color-accent, #6366f1)');\r\n const inputStyles = generateInputStyles(config.inputStyle);\r\n const cardStyles = generateCardStyles(config.cardStyle);\r\n const radius = RADIUS_VALUES[config.radius];\r\n const density = DENSITY_VALUES[config.density];\r\n\r\n return (\r\n <div\r\n style={{\r\n padding: '20px',\r\n background: 'var(--bg-secondary, #f9fafb)',\r\n borderRadius: '8px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '16px',\r\n }}\r\n >\r\n {/* Card Preview */}\r\n <div\r\n style={{\r\n padding: density.paddingX,\r\n borderRadius: radius.lg,\r\n ...cardStyles,\r\n }}\r\n >\r\n <h4 style={{ margin: '0 0 12px', fontSize: density.fontSize }}>Card Preview</h4>\r\n\r\n {/* Button Group */}\r\n <div style={{ display: 'flex', gap: density.gap, marginBottom: '12px' }}>\r\n <button\r\n style={{\r\n padding: `${density.paddingY} ${density.paddingX}`,\r\n borderRadius: radius.md,\r\n color: 'var(--bg-primary, #fff)',\r\n fontSize: density.fontSize,\r\n cursor: 'pointer',\r\n ...buttonStyles,\r\n }}\r\n >\r\n Primary\r\n </button>\r\n <button\r\n style={{\r\n padding: `${density.paddingY} ${density.paddingX}`,\r\n borderRadius: radius.md,\r\n background: 'var(--border-color, #e5e7eb)',\r\n border: 'none',\r\n fontSize: density.fontSize,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n Secondary\r\n </button>\r\n </div>\r\n\r\n {/* Input Preview */}\r\n <input\r\n type=\"text\"\r\n placeholder=\"Input preview...\"\r\n style={{\r\n width: '100%',\r\n height: density.inputHeight,\r\n padding: `0 ${density.paddingX}`,\r\n fontSize: density.fontSize,\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n ...inputStyles,\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Small chips preview */}\r\n <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\r\n {['Info', 'Success', 'Warning', 'Error'].map((label) => (\r\n <span\r\n key={label}\r\n style={{\r\n padding: '4px 10px',\r\n borderRadius: radius.full,\r\n background: 'var(--border-color, #e5e7eb)',\r\n fontSize: '12px',\r\n }}\r\n >\r\n {label}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ────────────────────────────────────────────────────────────────────────────\r\n 5. EXPORTS\r\n───────────────────────────────────────────────────────────────────────────── */\r\n\r\nexport type {\r\n ThemeVariantConfig,\r\n RadiusVariant,\r\n ShadowVariant,\r\n FillVariant,\r\n ButtonStyleVariant,\r\n InputStyleVariant,\r\n CardStyleVariant,\r\n AnimationIntensity,\r\n DensityVariant,\r\n} from './themeVariants';\r\n\r\nexport {\r\n DEFAULT_VARIANT_CONFIG,\r\n VARIANT_PRESETS,\r\n applyVariantConfig,\r\n generateVariantCSS,\r\n} from './themeVariants';\r\n","import { useEffect, useState } from 'react';\r\n\r\n/**\r\n * Live boolean indicating whether the active theme renders as \"dark\".\r\n *\r\n * Resolution order:\r\n * 1. `<html data-theme=\"dark|light\">` attribute (explicit consumer wins)\r\n * 2. `nice-dark` / `nice-light` (and bare `dark`) class on `<html>`\r\n * 3. `--text-primary` CSS variable luminance (light text → dark theme)\r\n * 4. `prefers-color-scheme: dark` media query as last-resort fallback\r\n *\r\n * Updates whenever any of the above change (MutationObserver on `<html>`\r\n * attributes/class/style + media-query listener), so canvas-based renderers\r\n * (QR, barcode, charts…) stay in sync without consumers wiring `useDarkMode`.\r\n */\r\nexport function useThemeIsDark(): boolean {\r\n const [isDark, setIsDark] = useState<boolean>(() => {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n return detectDark();\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n setIsDark(detectDark());\r\n const observer = new MutationObserver(() => setIsDark(detectDark()));\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['data-theme', 'class', 'style'],\r\n });\r\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\r\n const onMq = () => setIsDark(detectDark());\r\n mq.addEventListener?.('change', onMq);\r\n return () => {\r\n observer.disconnect();\r\n mq.removeEventListener?.('change', onMq);\r\n };\r\n }, []);\r\n\r\n return isDark;\r\n}\r\n\r\nfunction detectDark(): boolean {\r\n try {\r\n const root = document.documentElement;\r\n const attr = root.getAttribute('data-theme');\r\n if (attr === 'dark') {\r\n return true;\r\n }\r\n if (attr === 'light') {\r\n return false;\r\n }\r\n if (root.classList.contains('nice-dark') || root.classList.contains('dark')) {\r\n return true;\r\n }\r\n if (root.classList.contains('nice-light')) {\r\n return false;\r\n }\r\n const cs = getComputedStyle(root);\r\n const textColor = cs.getPropertyValue('--text-primary').trim() || cs.color;\r\n if (textColor) {\r\n const m = textColor.match(/rgba?\\(([^)]+)\\)/);\r\n if (m) {\r\n const [r, g, b] = m[1].split(',').map((s) => parseFloat(s.trim()));\r\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255 > 0.5;\r\n }\r\n if (/^#([0-9a-f]{3,8})$/i.test(textColor)) {\r\n const hex = textColor.replace('#', '');\r\n const v =\r\n hex.length === 3\r\n ? hex\r\n .split('')\r\n .map((c) => c + c)\r\n .join('')\r\n : hex.slice(0, 6);\r\n const r = parseInt(v.slice(0, 2), 16);\r\n const g = parseInt(v.slice(2, 4), 16);\r\n const b = parseInt(v.slice(4, 6), 16);\r\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255 > 0.5;\r\n }\r\n }\r\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","/**\r\n * Shared JSON View Schema — identical view definition format for React ↔ Flutter.\r\n *\r\n * Defines the `.ndv.json` (NiceToDev View) format used by both\r\n * `@nice2dev/ui` (React) and `nice2dev_flutter_ui` (Flutter)\r\n * to render dynamic, data-driven UIs from a single JSON definition.\r\n *\r\n * @module view-schema\r\n */\r\n\r\n// ── View Document ─────────────────────────────────────────────────\r\n\r\n/** Root document for `.ndv.json` files. */\r\nexport interface NiceViewDocument {\r\n $schema?: string;\r\n version: string;\r\n root: NiceViewNode;\r\n dataSources?: NiceViewDataSource[];\r\n theme?: Record<string, unknown>;\r\n i18n?: Record<string, unknown>;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n// ── View Node ─────────────────────────────────────────────────────\r\n\r\n/** A single UI element in the view tree. */\r\nexport interface NiceViewNode {\r\n /** Component type (e.g. 'NiceTextInput', 'NiceDataGrid', 'NiceButton'). */\r\n type: string;\r\n /** Unique ID for referencing in bindings/events. */\r\n id?: string;\r\n /** Static props passed to the component. */\r\n props?: Record<string, unknown>;\r\n /** Child nodes. */\r\n children?: NiceViewNode[];\r\n /** Data bindings: prop name → data source path (e.g. `{ \"value\": \"form.name\" }`). */\r\n bindings?: Record<string, string>;\r\n /** Conditional rendering. */\r\n conditions?: NiceViewCondition;\r\n /** Repeat/loop configuration. */\r\n repeat?: NiceViewRepeat;\r\n /** Event handlers: event name → action. */\r\n events?: Record<string, unknown>;\r\n /** Inline style overrides. */\r\n style?: Record<string, unknown>;\r\n}\r\n\r\n// ── Condition ─────────────────────────────────────────────────────\r\n\r\n/** Condition for conditional rendering. */\r\nexport interface NiceViewCondition {\r\n /** Data source field path. */\r\n field: string;\r\n /** Operator: eq, neq, gt, gte, lt, lte, contains, empty, notEmpty. */\r\n operator: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'empty' | 'notEmpty';\r\n /** Value to compare against. */\r\n value: unknown;\r\n}\r\n\r\n// ── Repeat ────────────────────────────────────────────────────────\r\n\r\n/** Loop configuration: render node N times from a data source collection. */\r\nexport interface NiceViewRepeat {\r\n /** Data source path to iterate over. */\r\n source: string;\r\n /** Variable name for the current item (default: 'item'). */\r\n itemAs?: string;\r\n /** Variable name for the current index (default: 'index'). */\r\n indexAs?: string;\r\n}\r\n\r\n// ── DataSource ────────────────────────────────────────────────────\r\n\r\n/** Data source definition for the view. */\r\nexport interface NiceViewDataSource {\r\n /** Data source identifier. */\r\n id: string;\r\n /** Type: 'rest', 'signalr', 'static', 'local'. */\r\n type: 'rest' | 'signalr' | 'static' | 'local';\r\n /** REST/SignalR URL. */\r\n url?: string;\r\n /** Default data (for type 'static'). */\r\n defaultData?: unknown;\r\n /** Auto-refresh flag. */\r\n autoRefresh?: boolean;\r\n /** Refresh interval in milliseconds. */\r\n refreshInterval?: number;\r\n}\r\n\r\n// ── Known Component Types ─────────────────────────────────────────\r\n\r\n/** Known component types in the NiceToDev ecosystem (for type-safe view definitions). */\r\nexport const NICE_VIEW_COMPONENT_TYPES = [\r\n // Editors\r\n 'NiceTextInput', 'NiceTextArea', 'NiceNumberInput', 'NiceDatePicker',\r\n 'NiceSelect', 'NiceCheckbox', 'NiceToggle', 'NiceRadioGroup',\r\n 'NiceSlider', 'NiceColorPicker', 'NiceAutocomplete', 'NiceLookup',\r\n 'NiceCalendar', 'NiceDateRangeBox', 'NiceTagBox', 'NiceRangeSlider',\r\n 'NiceDropDownBox', 'NiceHtmlEditor', 'NiceForm', 'NiceRating',\r\n 'NiceOtpInput', 'NiceSignaturePad', 'NiceMentionInput', 'NiceTreeSelect',\r\n 'NiceMaskedInput', 'NiceKnob', 'NicePickList', 'NiceInlineEdit',\r\n // Buttons\r\n 'NiceButton', 'NiceButtonGroup', 'NiceIconButton', 'NiceDropDownButton',\r\n 'NiceSpeedDialAction',\r\n // Data\r\n 'NiceTable', 'NiceDataGrid', 'NiceList', 'NiceTreeView', 'NiceTreeList',\r\n 'NiceCardView', 'NiceTileView', 'NicePivotGrid', 'NiceKanbanBoard',\r\n 'NiceSpreadsheet',\r\n // Display\r\n 'NiceBadge', 'NiceTag', 'NiceAvatar', 'NiceAvatarGroup', 'NiceProgress',\r\n 'NiceDivider', 'NiceTooltip', 'NiceSkeleton', 'NiceSpinner',\r\n 'NiceEmpty', 'NiceTimeline', 'NiceCarousel', 'NiceVirtualScroller',\r\n // Feedback\r\n 'NiceAlert', 'NiceModal', 'NiceDrawer', 'NiceToastContainer',\r\n 'NiceConfirmDialog', 'NiceCookieConsent',\r\n // Navigation\r\n 'NiceTabs', 'NiceAccordion', 'NiceBreadcrumb', 'NicePagination',\r\n 'NiceCard', 'NiceMenu', 'NiceContextMenu', 'NiceMultiView',\r\n 'NiceSplitter', 'NiceToolbar', 'NiceAppLayout', 'NiceBottomNavigation',\r\n 'NiceDashboardLayout', 'NiceDesktop', 'NiceConsole',\r\n // Charts\r\n 'NiceChart', 'NicePieChart', 'NicePolarChart', 'NiceCircularGauge',\r\n 'NiceLinearGauge', 'NiceBarGauge', 'NiceSparkline', 'NiceBullet',\r\n 'NiceFunnel', 'NiceSankey', 'NiceRangeSelector', 'NiceVectorMap',\r\n 'NiceHeatMap', 'NiceTreeMap', 'NiceStockChart', 'NiceOrganizationChart',\r\n // Overlays\r\n 'NiceActionSheet', 'NicePopover', 'NiceLoadPanel', 'NiceWindow', 'NiceBlockUI',\r\n // Planning\r\n 'NiceScheduler', 'NiceGantt', 'NiceDiagram', 'NiceStepper',\r\n // Layout\r\n 'NiceBox', 'NiceResponsiveBox', 'NiceResizable', 'NiceScrollView',\r\n // Tools\r\n 'NiceChat', 'NiceFileUploader', 'NiceFileManager', 'NiceFilterBuilder',\r\n 'NiceGallery', 'NiceMap',\r\n // Generic containers\r\n 'div', 'span', 'row', 'column', 'stack', 'container',\r\n] as const;\r\n\r\nexport type NiceViewComponentType = typeof NICE_VIEW_COMPONENT_TYPES[number];\r\n\r\n// ── Validation ────────────────────────────────────────────────────\r\n\r\n/** Validate a NiceViewDocument for structural correctness. */\r\nexport function validateViewDocument(doc: NiceViewDocument): string[] {\r\n const errors: string[] = [];\r\n validateNode(doc.root, errors, 'root');\r\n\r\n const dsIds = new Set((doc.dataSources ?? []).map((d) => d.id));\r\n checkBindingRefs(doc.root, dsIds, errors);\r\n\r\n return errors;\r\n}\r\n\r\nfunction validateNode(node: NiceViewNode, errors: string[], path: string): void {\r\n if (!node.type || node.type.trim() === '') {\r\n errors.push(`${path}: type is empty`);\r\n }\r\n if (node.children) {\r\n for (let i = 0; i < node.children.length; i++) {\r\n validateNode(node.children[i], errors, `${path}.children[${i}]`);\r\n }\r\n }\r\n}\r\n\r\nfunction checkBindingRefs(node: NiceViewNode, dsIds: Set<string>, errors: string[]): void {\r\n if (node.bindings) {\r\n for (const [key, ref] of Object.entries(node.bindings)) {\r\n const dsId = ref.split('.')[0];\r\n if (!dsIds.has(dsId) && dsId !== 'form' && dsId !== 'route') {\r\n errors.push(`Binding \"${key}\" references unknown data source \"${dsId}\"`);\r\n }\r\n }\r\n }\r\n if (node.children) {\r\n for (const child of node.children) {\r\n checkBindingRefs(child, dsIds, errors);\r\n }\r\n }\r\n}\r\n\r\n/** Evaluate a condition against a context map. */\r\nexport function evaluateCondition(condition: NiceViewCondition, context: Record<string, unknown>): boolean {\r\n const fieldValue = resolveField(context, condition.field);\r\n switch (condition.operator) {\r\n case 'eq': return fieldValue === condition.value;\r\n case 'neq': return fieldValue !== condition.value;\r\n case 'gt': return (fieldValue as number) > (condition.value as number);\r\n case 'gte': return (fieldValue as number) >= (condition.value as number);\r\n case 'lt': return (fieldValue as number) < (condition.value as number);\r\n case 'lte': return (fieldValue as number) <= (condition.value as number);\r\n case 'contains': return String(fieldValue).includes(String(condition.value));\r\n case 'empty': return fieldValue == null || String(fieldValue) === '';\r\n case 'notEmpty': return fieldValue != null && String(fieldValue) !== '';\r\n default: return true;\r\n }\r\n}\r\n\r\nfunction resolveField(context: Record<string, unknown>, path: string): unknown {\r\n const parts = path.split('.');\r\n let current: unknown = context;\r\n for (const part of parts) {\r\n if (current && typeof current === 'object' && part in (current as Record<string, unknown>)) {\r\n current = (current as Record<string, unknown>)[part];\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n return current;\r\n}\r\n","/**\r\n * @file virtualization.ts\r\n * @description Nice2Dev Performance — Virtualization Utilities\r\n *\r\n * High-performance virtual scrolling for large datasets.\r\n * Target: 500k rows <1s initial render\r\n */\r\n\r\nimport { useState, useMemo, useCallback, useRef, useEffect } from 'react';\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TYPES\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface VirtualScrollConfig {\r\n /** Total number of items */\r\n itemCount: number;\r\n /** Height of each item (or function for variable heights) */\r\n itemHeight: number | ((index: number) => number);\r\n /** Height of the visible container */\r\n containerHeight: number;\r\n /** Number of items to render outside visible area */\r\n overscan?: number;\r\n /** Enable smooth scrolling */\r\n smoothScroll?: boolean;\r\n /** Initial scroll offset */\r\n initialScrollTop?: number;\r\n}\r\n\r\nexport interface VirtualScrollResult {\r\n /** Items currently in view */\r\n visibleItems: VirtualItem[];\r\n /** Total height of all items (for scroll container) */\r\n totalHeight: number;\r\n /** Current scroll offset */\r\n scrollTop: number;\r\n /** Scroll to specific index */\r\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void;\r\n /** Scroll to specific offset */\r\n scrollTo: (offset: number) => void;\r\n /** Handle scroll event */\r\n onScroll: (e: React.UIEvent<HTMLElement>) => void;\r\n /** Start index of visible range */\r\n startIndex: number;\r\n /** End index of visible range */\r\n endIndex: number;\r\n /** Is scrolling */\r\n isScrolling: boolean;\r\n}\r\n\r\nexport interface VirtualItem {\r\n /** Item index */\r\n index: number;\r\n /** Offset from top */\r\n offset: number;\r\n /** Item height */\r\n height: number;\r\n /** Item key */\r\n key: string | number;\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// VIRTUAL SCROLL HOOK\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Hook for virtual scrolling with 500k+ items\r\n *\r\n * @example\r\n * ```tsx\r\n * function LargeList() {\r\n * const { visibleItems, totalHeight, onScroll } = useVirtualScroll({\r\n * itemCount: 500000,\r\n * itemHeight: 40,\r\n * containerHeight: 600,\r\n * });\r\n *\r\n * return (\r\n * <div style={{ height: 600, overflow: 'auto' }} onScroll={onScroll}>\r\n * <div style={{ height: totalHeight, position: 'relative' }}>\r\n * {visibleItems.map(item => (\r\n * <div\r\n * key={item.key}\r\n * style={{\r\n * position: 'absolute',\r\n * top: item.offset,\r\n * height: item.height,\r\n * }}\r\n * >\r\n * Row {item.index}\r\n * </div>\r\n * ))}\r\n * </div>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useVirtualScroll(config: VirtualScrollConfig): VirtualScrollResult {\r\n const { itemCount, itemHeight, containerHeight, overscan = 3, initialScrollTop = 0 } = config;\r\n\r\n const [scrollTop, setScrollTop] = useState(initialScrollTop);\r\n const [isScrolling, setIsScrolling] = useState(false);\r\n const scrollingTimeoutRef = useRef<number>();\r\n\r\n // Pre-compute item offsets for variable heights\r\n const itemOffsets = useMemo(() => {\r\n if (typeof itemHeight === 'number') {\r\n return null; // Use arithmetic for fixed heights\r\n }\r\n\r\n const offsets: number[] = new Array(itemCount + 1);\r\n offsets[0] = 0;\r\n\r\n for (let i = 0; i < itemCount; i++) {\r\n offsets[i + 1] = offsets[i] + itemHeight(i);\r\n }\r\n\r\n return offsets;\r\n }, [itemCount, itemHeight]);\r\n\r\n // Calculate total height\r\n const totalHeight = useMemo(() => {\r\n if (typeof itemHeight === 'number') {\r\n return itemCount * itemHeight;\r\n }\r\n return itemOffsets ? itemOffsets[itemCount] : 0;\r\n }, [itemCount, itemHeight, itemOffsets]);\r\n\r\n // Get item height by index\r\n const getItemHeight = useCallback(\r\n (index: number): number => {\r\n if (typeof itemHeight === 'number') {\r\n return itemHeight;\r\n }\r\n return itemHeight(index);\r\n },\r\n [itemHeight],\r\n );\r\n\r\n // Get item offset by index\r\n const getItemOffset = useCallback(\r\n (index: number): number => {\r\n if (typeof itemHeight === 'number') {\r\n return index * itemHeight;\r\n }\r\n return itemOffsets ? itemOffsets[index] : 0;\r\n },\r\n [itemHeight, itemOffsets],\r\n );\r\n\r\n // Find first visible item using binary search\r\n const findStartIndex = useCallback(\r\n (scrollOffset: number): number => {\r\n if (typeof itemHeight === 'number') {\r\n return Math.floor(scrollOffset / itemHeight);\r\n }\r\n\r\n if (!itemOffsets) {\r\n return 0;\r\n }\r\n\r\n let low = 0;\r\n let high = itemCount - 1;\r\n\r\n while (low <= high) {\r\n const mid = Math.floor((low + high) / 2);\r\n const offset = itemOffsets[mid];\r\n\r\n if (offset === scrollOffset) {\r\n return mid;\r\n }\r\n if (offset < scrollOffset) {\r\n low = mid + 1;\r\n } else {\r\n high = mid - 1;\r\n }\r\n }\r\n\r\n return Math.max(0, low - 1);\r\n },\r\n [itemCount, itemHeight, itemOffsets],\r\n );\r\n\r\n // Calculate visible range\r\n const { startIndex, endIndex, visibleItems } = useMemo(() => {\r\n const start = Math.max(0, findStartIndex(scrollTop) - overscan);\r\n\r\n let end = start;\r\n let accumulatedHeight = getItemOffset(start);\r\n\r\n while (end < itemCount && accumulatedHeight < scrollTop + containerHeight) {\r\n accumulatedHeight += getItemHeight(end);\r\n end++;\r\n }\r\n\r\n end = Math.min(itemCount, end + overscan);\r\n\r\n const items: VirtualItem[] = [];\r\n for (let i = start; i < end; i++) {\r\n items.push({\r\n index: i,\r\n offset: getItemOffset(i),\r\n height: getItemHeight(i),\r\n key: i,\r\n });\r\n }\r\n\r\n return { startIndex: start, endIndex: end, visibleItems: items };\r\n }, [\r\n scrollTop,\r\n containerHeight,\r\n itemCount,\r\n overscan,\r\n findStartIndex,\r\n getItemOffset,\r\n getItemHeight,\r\n ]);\r\n\r\n // Scroll handler\r\n const onScroll = useCallback((e: React.UIEvent<HTMLElement>) => {\r\n const target = e.currentTarget;\r\n setScrollTop(target.scrollTop);\r\n setIsScrolling(true);\r\n\r\n // Reset scrolling flag after idle\r\n if (scrollingTimeoutRef.current) {\r\n window.clearTimeout(scrollingTimeoutRef.current);\r\n }\r\n scrollingTimeoutRef.current = window.setTimeout(() => {\r\n setIsScrolling(false);\r\n }, 150);\r\n }, []);\r\n\r\n // Scroll to index\r\n const scrollToIndex = useCallback(\r\n (index: number, align: 'start' | 'center' | 'end' = 'start') => {\r\n const offset = getItemOffset(index);\r\n const itemSize = getItemHeight(index);\r\n\r\n let targetOffset: number;\r\n\r\n switch (align) {\r\n case 'center':\r\n targetOffset = offset - containerHeight / 2 + itemSize / 2;\r\n break;\r\n case 'end':\r\n targetOffset = offset - containerHeight + itemSize;\r\n break;\r\n default:\r\n targetOffset = offset;\r\n }\r\n\r\n setScrollTop(Math.max(0, Math.min(targetOffset, totalHeight - containerHeight)));\r\n },\r\n [getItemOffset, getItemHeight, containerHeight, totalHeight],\r\n );\r\n\r\n // Scroll to offset\r\n const scrollTo = useCallback(\r\n (offset: number) => {\r\n setScrollTop(Math.max(0, Math.min(offset, totalHeight - containerHeight)));\r\n },\r\n [totalHeight, containerHeight],\r\n );\r\n\r\n // Cleanup\r\n useEffect(() => {\r\n return () => {\r\n if (scrollingTimeoutRef.current) {\r\n window.clearTimeout(scrollingTimeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return {\r\n visibleItems,\r\n totalHeight,\r\n scrollTop,\r\n scrollToIndex,\r\n scrollTo,\r\n onScroll,\r\n startIndex,\r\n endIndex,\r\n isScrolling,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// VIRTUAL GRID\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface VirtualGridConfig {\r\n /** Total number of rows */\r\n rowCount: number;\r\n /** Total number of columns */\r\n columnCount: number;\r\n /** Height of each row */\r\n rowHeight: number | ((index: number) => number);\r\n /** Width of each column */\r\n columnWidth: number | ((index: number) => number);\r\n /** Height of the visible container */\r\n containerHeight: number;\r\n /** Width of the visible container */\r\n containerWidth: number;\r\n /** Overscan count */\r\n overscan?: number;\r\n}\r\n\r\nexport interface VirtualGridCell {\r\n rowIndex: number;\r\n columnIndex: number;\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n key: string;\r\n}\r\n\r\nexport interface VirtualGridResult {\r\n visibleCells: VirtualGridCell[];\r\n totalWidth: number;\r\n totalHeight: number;\r\n onScroll: (e: React.UIEvent<HTMLElement>) => void;\r\n scrollTop: number;\r\n scrollLeft: number;\r\n isScrolling: boolean;\r\n}\r\n\r\n/**\r\n * Hook for virtual grid with millions of cells\r\n */\r\nexport function useVirtualGrid(config: VirtualGridConfig): VirtualGridResult {\r\n const {\r\n rowCount,\r\n columnCount,\r\n rowHeight,\r\n columnWidth,\r\n containerHeight,\r\n containerWidth,\r\n overscan = 2,\r\n } = config;\r\n\r\n const [scrollTop, setScrollTop] = useState(0);\r\n const [scrollLeft, setScrollLeft] = useState(0);\r\n const [isScrolling, setIsScrolling] = useState(false);\r\n const scrollingTimeoutRef = useRef<number>();\r\n\r\n // Calculate totals\r\n const totalHeight = useMemo(() => {\r\n if (typeof rowHeight === 'number') {\r\n return rowCount * rowHeight;\r\n }\r\n let total = 0;\r\n for (let i = 0; i < rowCount; i++) {\r\n total += rowHeight(i);\r\n }\r\n return total;\r\n }, [rowCount, rowHeight]);\r\n\r\n const totalWidth = useMemo(() => {\r\n if (typeof columnWidth === 'number') {\r\n return columnCount * columnWidth;\r\n }\r\n let total = 0;\r\n for (let i = 0; i < columnCount; i++) {\r\n total += columnWidth(i);\r\n }\r\n return total;\r\n }, [columnCount, columnWidth]);\r\n\r\n // Calculate visible cells\r\n const visibleCells = useMemo(() => {\r\n const cells: VirtualGridCell[] = [];\r\n\r\n // Find visible row range\r\n let rowStart = 0;\r\n let accHeight = 0;\r\n if (typeof rowHeight === 'number') {\r\n rowStart = Math.floor(scrollTop / rowHeight);\r\n accHeight = rowStart * rowHeight;\r\n } else {\r\n while (rowStart < rowCount && accHeight + rowHeight(rowStart) < scrollTop) {\r\n accHeight += rowHeight(rowStart);\r\n rowStart++;\r\n }\r\n }\r\n rowStart = Math.max(0, rowStart - overscan);\r\n\r\n let rowEnd = rowStart;\r\n let visibleHeight = typeof rowHeight === 'number' ? rowStart * rowHeight : accHeight;\r\n while (rowEnd < rowCount && visibleHeight < scrollTop + containerHeight) {\r\n visibleHeight += typeof rowHeight === 'number' ? rowHeight : rowHeight(rowEnd);\r\n rowEnd++;\r\n }\r\n rowEnd = Math.min(rowCount, rowEnd + overscan);\r\n\r\n // Find visible column range\r\n let colStart = 0;\r\n let accWidth = 0;\r\n if (typeof columnWidth === 'number') {\r\n colStart = Math.floor(scrollLeft / columnWidth);\r\n accWidth = colStart * columnWidth;\r\n } else {\r\n while (colStart < columnCount && accWidth + columnWidth(colStart) < scrollLeft) {\r\n accWidth += columnWidth(colStart);\r\n colStart++;\r\n }\r\n }\r\n colStart = Math.max(0, colStart - overscan);\r\n\r\n let colEnd = colStart;\r\n let visibleWidth = typeof columnWidth === 'number' ? colStart * columnWidth : accWidth;\r\n while (colEnd < columnCount && visibleWidth < scrollLeft + containerWidth) {\r\n visibleWidth += typeof columnWidth === 'number' ? columnWidth : columnWidth(colEnd);\r\n colEnd++;\r\n }\r\n colEnd = Math.min(columnCount, colEnd + overscan);\r\n\r\n // Generate visible cells\r\n let top =\r\n typeof rowHeight === 'number'\r\n ? rowStart * rowHeight\r\n : (() => {\r\n let t = 0;\r\n for (let i = 0; i < rowStart; i++) {\r\n t += rowHeight(i);\r\n }\r\n return t;\r\n })();\r\n\r\n for (let row = rowStart; row < rowEnd; row++) {\r\n const cellHeight = typeof rowHeight === 'number' ? rowHeight : rowHeight(row);\r\n\r\n let left =\r\n typeof columnWidth === 'number'\r\n ? colStart * columnWidth\r\n : (() => {\r\n let l = 0;\r\n for (let i = 0; i < colStart; i++) {\r\n l += columnWidth(i);\r\n }\r\n return l;\r\n })();\r\n\r\n for (let col = colStart; col < colEnd; col++) {\r\n const cellWidth = typeof columnWidth === 'number' ? columnWidth : columnWidth(col);\r\n\r\n cells.push({\r\n rowIndex: row,\r\n columnIndex: col,\r\n top,\r\n left,\r\n width: cellWidth,\r\n height: cellHeight,\r\n key: `${row}:${col}`,\r\n });\r\n\r\n left += cellWidth;\r\n }\r\n\r\n top += cellHeight;\r\n }\r\n\r\n return cells;\r\n }, [\r\n scrollTop,\r\n scrollLeft,\r\n rowCount,\r\n columnCount,\r\n rowHeight,\r\n columnWidth,\r\n containerHeight,\r\n containerWidth,\r\n overscan,\r\n ]);\r\n\r\n const onScroll = useCallback((e: React.UIEvent<HTMLElement>) => {\r\n const target = e.currentTarget;\r\n setScrollTop(target.scrollTop);\r\n setScrollLeft(target.scrollLeft);\r\n setIsScrolling(true);\r\n\r\n if (scrollingTimeoutRef.current) {\r\n window.clearTimeout(scrollingTimeoutRef.current);\r\n }\r\n scrollingTimeoutRef.current = window.setTimeout(() => {\r\n setIsScrolling(false);\r\n }, 150);\r\n }, []);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (scrollingTimeoutRef.current) {\r\n window.clearTimeout(scrollingTimeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return {\r\n visibleCells,\r\n totalWidth,\r\n totalHeight,\r\n onScroll,\r\n scrollTop,\r\n scrollLeft,\r\n isScrolling,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// WINDOWED LIST (Simplified API)\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface WindowedListProps<T> {\r\n items: T[];\r\n height: number;\r\n itemHeight: number;\r\n renderItem: (item: T, index: number, style: React.CSSProperties) => React.ReactNode;\r\n overscan?: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Pre-configured windowed list for quick usage\r\n */\r\nexport function useWindowedList<T>(items: T[], height: number, itemHeight: number, overscan = 3) {\r\n const result = useVirtualScroll({\r\n itemCount: items.length,\r\n itemHeight,\r\n containerHeight: height,\r\n overscan,\r\n });\r\n\r\n const getItemData = useCallback((virtualItem: VirtualItem) => items[virtualItem.index], [items]);\r\n\r\n return {\r\n ...result,\r\n getItemData,\r\n containerStyle: {\r\n height,\r\n overflow: 'auto' as const,\r\n },\r\n innerStyle: {\r\n height: result.totalHeight,\r\n position: 'relative' as const,\r\n },\r\n getItemStyle: (item: VirtualItem): React.CSSProperties => ({\r\n position: 'absolute',\r\n top: item.offset,\r\n left: 0,\r\n right: 0,\r\n height: item.height,\r\n }),\r\n };\r\n}\r\n","/**\r\n * @file concurrent.ts\r\n * @description Nice2Dev Performance — Concurrent Rendering Utilities\r\n *\r\n * React 18+ concurrent rendering optimizations.\r\n * Uses useTransition, useDeferredValue for responsive UIs.\r\n */\r\n\r\nimport {\r\n useState,\r\n useTransition,\r\n useDeferredValue,\r\n useCallback,\r\n useMemo,\r\n useRef,\r\n useEffect,\r\n startTransition,\r\n} from 'react';\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TYPES\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface DeferredSearchConfig<T> {\r\n /** Items to search through */\r\n items: T[];\r\n /** Search function */\r\n searchFn: (item: T, query: string) => boolean;\r\n /** Debounce time in ms */\r\n debounce?: number;\r\n /** Minimum query length to trigger search */\r\n minLength?: number;\r\n}\r\n\r\nexport interface TransitionState<T> {\r\n /** Current stable value */\r\n value: T;\r\n /** Pending value (during transition) */\r\n pendingValue: T;\r\n /** Is transition in progress */\r\n isPending: boolean;\r\n /** Update value with transition */\r\n setValue: (value: T | ((prev: T) => T)) => void;\r\n /** Update value immediately */\r\n setValueImmediate: (value: T | ((prev: T) => T)) => void;\r\n}\r\n\r\nexport interface ChunkedProcessorConfig<T, R> {\r\n /** Items to process */\r\n data: T[];\r\n /** Processing function */\r\n processFn: (item: T, index: number) => R;\r\n /** Chunk size (items per frame) */\r\n chunkSize?: number;\r\n /** Priority (user-blocking, user-visible, background) */\r\n priority?: 'user-blocking' | 'user-visible' | 'background';\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// DEFERRED SEARCH\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Search with deferred value for responsive UI\r\n *\r\n * @example\r\n * ```tsx\r\n * function SearchableList({ items }) {\r\n * const { query, setQuery, results, isStale } = useDeferredSearch({\r\n * items,\r\n * searchFn: (item, q) => item.name.toLowerCase().includes(q.toLowerCase()),\r\n * });\r\n *\r\n * return (\r\n * <>\r\n * <input value={query} onChange={e => setQuery(e.target.value)} />\r\n * <div style={{ opacity: isStale ? 0.7 : 1 }}>\r\n * {results.map(item => <div key={item.id}>{item.name}</div>)}\r\n * </div>\r\n * </>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useDeferredSearch<T>(config: DeferredSearchConfig<T>) {\r\n const { items, searchFn, debounce = 0, minLength = 0 } = config;\r\n\r\n const [query, setQuery] = useState('');\r\n const deferredQuery = useDeferredValue(query);\r\n const [debouncedQuery, setDebouncedQuery] = useState('');\r\n const debounceRef = useRef<number>();\r\n\r\n // Apply debounce\r\n useEffect(() => {\r\n if (debounce > 0) {\r\n debounceRef.current = window.setTimeout(() => {\r\n setDebouncedQuery(query);\r\n }, debounce);\r\n\r\n return () => {\r\n if (debounceRef.current) {\r\n window.clearTimeout(debounceRef.current);\r\n }\r\n };\r\n } else {\r\n setDebouncedQuery(query);\r\n }\r\n }, [query, debounce]);\r\n\r\n // Use the deferred version of debounced query for filtering\r\n const searchQuery = useDeferredValue(debouncedQuery);\r\n\r\n // Filter results\r\n const results = useMemo(() => {\r\n if (searchQuery.length < minLength) {\r\n return items;\r\n }\r\n return items.filter((item) => searchFn(item, searchQuery));\r\n }, [items, searchQuery, searchFn, minLength]);\r\n\r\n // Is the UI showing stale data?\r\n const isStale = searchQuery !== deferredQuery;\r\n\r\n return {\r\n query,\r\n setQuery,\r\n results,\r\n isStale,\r\n deferredQuery: searchQuery,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TRANSITION STATE\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * State with useTransition for non-blocking updates\r\n *\r\n * @example\r\n * ```tsx\r\n * function Tab({ content }) {\r\n * const { value, setValue, isPending } = useTransitionState(0);\r\n *\r\n * return (\r\n * <>\r\n * <nav>\r\n * {tabs.map((tab, i) => (\r\n * <button key={i} onClick={() => setValue(i)}>\r\n * {tab.title}\r\n * </button>\r\n * ))}\r\n * </nav>\r\n * {isPending && <Spinner />}\r\n * <TabPanel index={value} />\r\n * </>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useTransitionState<T>(initialValue: T): TransitionState<T> {\r\n const [value, setValueRaw] = useState(initialValue);\r\n const [pendingValue, setPendingValue] = useState(initialValue);\r\n const [isPending, startTransitionFn] = useTransition();\r\n\r\n const setValue = useCallback(\r\n (newValue: T | ((prev: T) => T)) => {\r\n const resolved =\r\n typeof newValue === 'function' ? (newValue as (prev: T) => T)(value) : newValue;\r\n\r\n setPendingValue(resolved);\r\n startTransitionFn(() => {\r\n setValueRaw(resolved);\r\n });\r\n },\r\n [value],\r\n );\r\n\r\n const setValueImmediate = useCallback(\r\n (newValue: T | ((prev: T) => T)) => {\r\n const resolved =\r\n typeof newValue === 'function' ? (newValue as (prev: T) => T)(value) : newValue;\r\n\r\n setPendingValue(resolved);\r\n setValueRaw(resolved);\r\n },\r\n [value],\r\n );\r\n\r\n return {\r\n value,\r\n pendingValue,\r\n isPending,\r\n setValue,\r\n setValueImmediate,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// CHUNKED PROCESSING\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Process large arrays in chunks to keep UI responsive\r\n *\r\n * @example\r\n * ```tsx\r\n * function DataProcessor({ data }) {\r\n * const { result, progress, isProcessing } = useChunkedProcessor({\r\n * data,\r\n * processFn: (item) => complexTransform(item),\r\n * chunkSize: 1000,\r\n * });\r\n *\r\n * return (\r\n * <div>\r\n * {isProcessing && <ProgressBar value={progress} />}\r\n * {result && <DataView data={result} />}\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useChunkedProcessor<T, R>(config: ChunkedProcessorConfig<T, R>) {\r\n const { data, processFn, chunkSize = 1000, priority = 'user-visible' } = config;\r\n\r\n const [result, setResult] = useState<R[] | null>(null);\r\n const [progress, setProgress] = useState(0);\r\n const [isProcessing, setIsProcessing] = useState(false);\r\n const abortRef = useRef(false);\r\n\r\n // Start processing\r\n const process = useCallback(async () => {\r\n if (data.length === 0) {\r\n setResult([]);\r\n return;\r\n }\r\n\r\n setIsProcessing(true);\r\n setProgress(0);\r\n abortRef.current = false;\r\n\r\n const results: R[] = [];\r\n const total = data.length;\r\n\r\n for (let i = 0; i < total; i += chunkSize) {\r\n if (abortRef.current) {\r\n break;\r\n }\r\n\r\n const chunk = data.slice(i, i + chunkSize);\r\n\r\n // Process chunk\r\n const chunkResults = chunk.map((item, idx) => processFn(item, i + idx));\r\n results.push(...chunkResults);\r\n\r\n // Update progress\r\n const newProgress = Math.min(100, ((i + chunk.length) / total) * 100);\r\n\r\n // Yield to main thread based on priority\r\n if (priority === 'background') {\r\n // Use requestIdleCallback for background priority\r\n await new Promise((resolve) => {\r\n if ('requestIdleCallback' in window) {\r\n (\r\n window as Window & { requestIdleCallback: (cb: () => void) => number }\r\n ).requestIdleCallback(resolve as () => void);\r\n } else {\r\n setTimeout(resolve, 0);\r\n }\r\n });\r\n } else if (priority === 'user-visible') {\r\n // Use rAF for user-visible priority\r\n await new Promise((resolve) => requestAnimationFrame(resolve as FrameRequestCallback));\r\n }\r\n // user-blocking runs synchronously (no yield)\r\n\r\n startTransition(() => {\r\n setProgress(newProgress);\r\n });\r\n }\r\n\r\n setResult(results);\r\n setIsProcessing(false);\r\n setProgress(100);\r\n }, [data, processFn, chunkSize, priority]);\r\n\r\n // Cancel processing\r\n const cancel = useCallback(() => {\r\n abortRef.current = true;\r\n }, []);\r\n\r\n // Auto-process when data changes\r\n useEffect(() => {\r\n process();\r\n return () => {\r\n abortRef.current = true;\r\n };\r\n }, [process]);\r\n\r\n return {\r\n result,\r\n progress,\r\n isProcessing,\r\n process,\r\n cancel,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// DEFERRED LIST\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * List that renders items progressively for fast initial display\r\n *\r\n * @example\r\n * ```tsx\r\n * function LargeList({ items }) {\r\n * const { visibleItems, isComplete } = useDeferredList(items, {\r\n * initialCount: 20,\r\n * batchSize: 50,\r\n * });\r\n *\r\n * return (\r\n * <ul>\r\n * {visibleItems.map(item => <li key={item.id}>{item.name}</li>)}\r\n * {!isComplete && <li>Loading more...</li>}\r\n * </ul>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useDeferredList<T>(\r\n items: T[],\r\n options: {\r\n /** Initial items to render */\r\n initialCount?: number;\r\n /** Items to add per batch */\r\n batchSize?: number;\r\n /** Delay between batches */\r\n batchDelay?: number;\r\n } = {},\r\n) {\r\n const { initialCount = 20, batchSize = 50, batchDelay = 16 } = options;\r\n\r\n const [visibleCount, setVisibleCount] = useState(Math.min(initialCount, items.length));\r\n const [isComplete, setIsComplete] = useState(items.length <= initialCount);\r\n\r\n useEffect(() => {\r\n if (visibleCount >= items.length) {\r\n setIsComplete(true);\r\n return;\r\n }\r\n\r\n const timer = setTimeout(() => {\r\n startTransition(() => {\r\n setVisibleCount((prev) => Math.min(prev + batchSize, items.length));\r\n });\r\n }, batchDelay);\r\n\r\n return () => clearTimeout(timer);\r\n }, [visibleCount, items.length, batchSize, batchDelay]);\r\n\r\n // Reset when items change\r\n useEffect(() => {\r\n setVisibleCount(Math.min(initialCount, items.length));\r\n setIsComplete(items.length <= initialCount);\r\n }, [items, initialCount]);\r\n\r\n const visibleItems = useMemo(() => {\r\n return items.slice(0, visibleCount);\r\n }, [items, visibleCount]);\r\n\r\n return {\r\n visibleItems,\r\n visibleCount,\r\n totalCount: items.length,\r\n isComplete,\r\n progress: (visibleCount / items.length) * 100,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// OPTIMISTIC UPDATES\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface OptimisticConfig<T> {\r\n /** Initial value */\r\n initial: T;\r\n /** Async mutation function */\r\n mutate: (value: T) => Promise<T>;\r\n /** Rollback on error */\r\n rollbackOnError?: boolean;\r\n}\r\n\r\n/**\r\n * Optimistic UI updates with automatic rollback\r\n *\r\n * @example\r\n * ```tsx\r\n * function LikeButton({ postId, initialLikes }) {\r\n * const { value, update, isPending, error } = useOptimistic({\r\n * initial: initialLikes,\r\n * mutate: (likes) => api.updateLikes(postId, likes),\r\n * });\r\n *\r\n * return (\r\n * <button onClick={() => update(value + 1)}>\r\n * ❤️ {value} {isPending && '...'}\r\n * </button>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useOptimistic<T>(config: OptimisticConfig<T>) {\r\n const { initial, mutate, rollbackOnError = true } = config;\r\n\r\n const [value, setValue] = useState(initial);\r\n const [isPending, setIsPending] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n const previousValueRef = useRef(initial);\r\n\r\n const update = useCallback(\r\n async (newValue: T) => {\r\n previousValueRef.current = value;\r\n setError(null);\r\n\r\n // Optimistically update\r\n setValue(newValue);\r\n setIsPending(true);\r\n\r\n try {\r\n const result = await mutate(newValue);\r\n setValue(result);\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n if (rollbackOnError) {\r\n setValue(previousValueRef.current);\r\n }\r\n } finally {\r\n setIsPending(false);\r\n }\r\n },\r\n [value, mutate, rollbackOnError],\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setValue(initial);\r\n setError(null);\r\n setIsPending(false);\r\n }, [initial]);\r\n\r\n return {\r\n value,\r\n update,\r\n isPending,\r\n error,\r\n reset,\r\n };\r\n}\r\n","/**\r\n * @file workers.ts\r\n * @description Nice2Dev Performance — Web Worker Utilities\r\n *\r\n * Offload heavy computations to Web Workers.\r\n * Keeps main thread responsive during data processing.\r\n */\r\n\r\nimport { useState, useCallback, useRef, useEffect } from 'react';\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TYPES\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface WorkerTask<T, R> {\r\n /** Task ID */\r\n id: string;\r\n /** Task data */\r\n data: T;\r\n /** Resolve function */\r\n resolve: (result: R) => void;\r\n /** Reject function */\r\n reject: (error: Error) => void;\r\n}\r\n\r\nexport interface WorkerPoolConfig {\r\n /** Number of workers in pool */\r\n poolSize?: number;\r\n /** Worker script URL or function */\r\n workerScript: string | URL | (() => void);\r\n /** Terminate idle workers after ms */\r\n idleTimeout?: number;\r\n}\r\n\r\nexport interface WorkerResult<R> {\r\n /** Result data */\r\n result: R | null;\r\n /** Is currently processing */\r\n isProcessing: boolean;\r\n /** Error if any */\r\n error: Error | null;\r\n /** Execute task */\r\n execute: (data: unknown) => Promise<R>;\r\n /** Cancel current task */\r\n cancel: () => void;\r\n /** Terminate worker */\r\n terminate: () => void;\r\n}\r\n\r\nexport interface WorkerMessage<T = unknown, R = unknown> {\r\n type: 'task' | 'result' | 'error' | 'progress' | 'cancel';\r\n id: string;\r\n data?: T;\r\n result?: R;\r\n error?: string;\r\n progress?: number;\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// SINGLE WORKER HOOK\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Hook for using a single Web Worker\r\n *\r\n * @example\r\n * ```tsx\r\n * // worker.ts\r\n * self.onmessage = (e) => {\r\n * const result = heavyComputation(e.data);\r\n * self.postMessage({ type: 'result', result });\r\n * };\r\n *\r\n * // Component.tsx\r\n * function DataProcessor() {\r\n * const { result, isProcessing, execute } = useWorker({\r\n * workerScript: new URL('./worker.ts', import.meta.url),\r\n * });\r\n *\r\n * return (\r\n * <button onClick={() => execute(largeData)}>\r\n * {isProcessing ? 'Processing...' : 'Process Data'}\r\n * </button>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useWorker<T = unknown, R = unknown>(\r\n config: Omit<WorkerPoolConfig, 'poolSize'>,\r\n): WorkerResult<R> {\r\n const { workerScript, idleTimeout = 30000 } = config;\r\n\r\n const [result, setResult] = useState<R | null>(null);\r\n const [isProcessing, setIsProcessing] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const workerRef = useRef<Worker | null>(null);\r\n const taskIdRef = useRef(0);\r\n const currentTaskRef = useRef<string | null>(null);\r\n const idleTimeoutRef = useRef<number>();\r\n\r\n // Create worker\r\n const getWorker = useCallback(() => {\r\n if (!workerRef.current) {\r\n if (typeof workerScript === 'function') {\r\n // Create inline worker from function\r\n const blob = new Blob([`(${workerScript.toString()})()`], {\r\n type: 'application/javascript',\r\n });\r\n workerRef.current = new Worker(URL.createObjectURL(blob));\r\n } else {\r\n workerRef.current = new Worker(workerScript, { type: 'module' });\r\n }\r\n\r\n workerRef.current.onmessage = (e: MessageEvent<WorkerMessage<T, R>>) => {\r\n const msg = e.data;\r\n\r\n if (msg.id !== currentTaskRef.current) {\r\n return;\r\n }\r\n\r\n if (msg.type === 'result') {\r\n setResult(msg.result ?? null);\r\n setIsProcessing(false);\r\n currentTaskRef.current = null;\r\n resetIdleTimeout();\r\n } else if (msg.type === 'error') {\r\n setError(new Error(msg.error));\r\n setIsProcessing(false);\r\n currentTaskRef.current = null;\r\n resetIdleTimeout();\r\n }\r\n };\r\n\r\n workerRef.current.onerror = (e) => {\r\n setError(new Error(e.message));\r\n setIsProcessing(false);\r\n currentTaskRef.current = null;\r\n };\r\n }\r\n\r\n return workerRef.current;\r\n }, [workerScript]);\r\n\r\n // Reset idle timeout\r\n const resetIdleTimeout = useCallback(() => {\r\n if (idleTimeoutRef.current) {\r\n window.clearTimeout(idleTimeoutRef.current);\r\n }\r\n\r\n if (idleTimeout > 0) {\r\n idleTimeoutRef.current = window.setTimeout(() => {\r\n if (workerRef.current && !currentTaskRef.current) {\r\n workerRef.current.terminate();\r\n workerRef.current = null;\r\n }\r\n }, idleTimeout);\r\n }\r\n }, [idleTimeout]);\r\n\r\n // Execute task\r\n const execute = useCallback(\r\n (data: T): Promise<R> => {\r\n return new Promise((resolve, reject) => {\r\n const worker = getWorker();\r\n const taskId = `task-${++taskIdRef.current}`;\r\n\r\n currentTaskRef.current = taskId;\r\n setIsProcessing(true);\r\n setError(null);\r\n\r\n // Store resolve/reject for use in message handler\r\n const originalOnMessage = worker.onmessage;\r\n worker.onmessage = (e: MessageEvent<WorkerMessage<T, R>>) => {\r\n originalOnMessage?.call(worker, e);\r\n\r\n if (e.data.id === taskId) {\r\n if (e.data.type === 'result') {\r\n resolve(e.data.result as R);\r\n } else if (e.data.type === 'error') {\r\n reject(new Error(e.data.error));\r\n }\r\n }\r\n };\r\n\r\n worker.postMessage({\r\n type: 'task',\r\n id: taskId,\r\n data,\r\n } as WorkerMessage<T, R>);\r\n });\r\n },\r\n [getWorker],\r\n );\r\n\r\n // Cancel current task\r\n const cancel = useCallback(() => {\r\n if (workerRef.current && currentTaskRef.current) {\r\n workerRef.current.postMessage({\r\n type: 'cancel',\r\n id: currentTaskRef.current,\r\n });\r\n currentTaskRef.current = null;\r\n setIsProcessing(false);\r\n }\r\n }, []);\r\n\r\n // Terminate worker\r\n const terminate = useCallback(() => {\r\n if (workerRef.current) {\r\n workerRef.current.terminate();\r\n workerRef.current = null;\r\n }\r\n if (idleTimeoutRef.current) {\r\n window.clearTimeout(idleTimeoutRef.current);\r\n }\r\n currentTaskRef.current = null;\r\n setIsProcessing(false);\r\n }, []);\r\n\r\n // Cleanup\r\n useEffect(() => {\r\n return () => {\r\n terminate();\r\n };\r\n }, [terminate]);\r\n\r\n return {\r\n result,\r\n isProcessing,\r\n error,\r\n execute: execute as (data: unknown) => Promise<R>,\r\n cancel,\r\n terminate,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// WORKER POOL\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\ninterface PooledWorker {\r\n worker: Worker;\r\n busy: boolean;\r\n taskId: string | null;\r\n}\r\n\r\n/**\r\n * Worker pool for parallel processing\r\n *\r\n * @example\r\n * ```tsx\r\n * function ParallelProcessor() {\r\n * const pool = useWorkerPool({\r\n * workerScript: new URL('./worker.ts', import.meta.url),\r\n * poolSize: 4,\r\n * });\r\n *\r\n * const processAll = async () => {\r\n * const results = await Promise.all(\r\n * chunks.map(chunk => pool.execute(chunk))\r\n * );\r\n * };\r\n * }\r\n * ```\r\n */\r\nexport function useWorkerPool<T = unknown, R = unknown>(config: WorkerPoolConfig) {\r\n const {\r\n workerScript,\r\n poolSize = navigator.hardwareConcurrency || 4,\r\n idleTimeout = 60000,\r\n } = config;\r\n\r\n const workersRef = useRef<PooledWorker[]>([]);\r\n const queueRef = useRef<WorkerTask<T, R>[]>([]);\r\n const taskIdRef = useRef(0);\r\n const idleTimeoutRef = useRef<number>();\r\n\r\n // Create a new worker\r\n const createWorker = useCallback((): Worker => {\r\n if (typeof workerScript === 'function') {\r\n const blob = new Blob([`(${workerScript.toString()})()`], { type: 'application/javascript' });\r\n return new Worker(URL.createObjectURL(blob));\r\n }\r\n return new Worker(workerScript, { type: 'module' });\r\n }, [workerScript]);\r\n\r\n // Get available worker or create new one\r\n const getAvailableWorker = useCallback((): PooledWorker | null => {\r\n // Find idle worker\r\n const idle = workersRef.current.find((w) => !w.busy);\r\n if (idle) {\r\n return idle;\r\n }\r\n\r\n // Create new worker if pool not full\r\n if (workersRef.current.length < poolSize) {\r\n const worker = createWorker();\r\n const pooledWorker: PooledWorker = {\r\n worker,\r\n busy: false,\r\n taskId: null,\r\n };\r\n workersRef.current.push(pooledWorker);\r\n return pooledWorker;\r\n }\r\n\r\n return null;\r\n }, [createWorker, poolSize]);\r\n\r\n // Process queue\r\n const processQueue = useCallback(() => {\r\n while (queueRef.current.length > 0) {\r\n const available = getAvailableWorker();\r\n if (!available) {\r\n break;\r\n }\r\n\r\n const task = queueRef.current.shift()!;\r\n available.busy = true;\r\n available.taskId = task.id;\r\n\r\n available.worker.onmessage = (e: MessageEvent<WorkerMessage<T, R>>) => {\r\n const msg = e.data;\r\n\r\n if (msg.id !== task.id) {\r\n return;\r\n }\r\n\r\n available.busy = false;\r\n available.taskId = null;\r\n\r\n if (msg.type === 'result') {\r\n task.resolve(msg.result as R);\r\n } else if (msg.type === 'error') {\r\n task.reject(new Error(msg.error));\r\n }\r\n\r\n // Process next in queue\r\n processQueue();\r\n resetIdleTimeout();\r\n };\r\n\r\n available.worker.onerror = (e) => {\r\n available.busy = false;\r\n available.taskId = null;\r\n task.reject(new Error(e.message));\r\n processQueue();\r\n };\r\n\r\n available.worker.postMessage({\r\n type: 'task',\r\n id: task.id,\r\n data: task.data,\r\n });\r\n }\r\n }, [getAvailableWorker]);\r\n\r\n // Reset idle timeout\r\n const resetIdleTimeout = useCallback(() => {\r\n if (idleTimeoutRef.current) {\r\n window.clearTimeout(idleTimeoutRef.current);\r\n }\r\n\r\n if (idleTimeout > 0) {\r\n idleTimeoutRef.current = window.setTimeout(() => {\r\n // Terminate idle workers\r\n const idle = workersRef.current.filter((w) => !w.busy);\r\n idle.forEach((w) => {\r\n w.worker.terminate();\r\n workersRef.current = workersRef.current.filter((x) => x !== w);\r\n });\r\n }, idleTimeout);\r\n }\r\n }, [idleTimeout]);\r\n\r\n // Execute task\r\n const execute = useCallback(\r\n (data: T): Promise<R> => {\r\n return new Promise((resolve, reject) => {\r\n const taskId = `pool-task-${++taskIdRef.current}`;\r\n\r\n queueRef.current.push({\r\n id: taskId,\r\n data,\r\n resolve,\r\n reject,\r\n });\r\n\r\n processQueue();\r\n });\r\n },\r\n [processQueue],\r\n );\r\n\r\n // Execute multiple tasks in parallel\r\n const executeAll = useCallback(\r\n (items: T[]): Promise<R[]> => {\r\n return Promise.all(items.map((item) => execute(item)));\r\n },\r\n [execute],\r\n );\r\n\r\n // Terminate all workers\r\n const terminateAll = useCallback(() => {\r\n workersRef.current.forEach((w) => w.worker.terminate());\r\n workersRef.current = [];\r\n queueRef.current = [];\r\n\r\n if (idleTimeoutRef.current) {\r\n window.clearTimeout(idleTimeoutRef.current);\r\n }\r\n }, []);\r\n\r\n // Get pool stats\r\n const getStats = useCallback(() => {\r\n return {\r\n total: workersRef.current.length,\r\n busy: workersRef.current.filter((w) => w.busy).length,\r\n idle: workersRef.current.filter((w) => !w.busy).length,\r\n queued: queueRef.current.length,\r\n };\r\n }, []);\r\n\r\n // Cleanup\r\n useEffect(() => {\r\n return () => {\r\n terminateAll();\r\n };\r\n }, [terminateAll]);\r\n\r\n return {\r\n execute,\r\n executeAll,\r\n terminateAll,\r\n getStats,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// INLINE WORKER HELPER\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Create an inline worker from a function\r\n *\r\n * @example\r\n * ```tsx\r\n * const sortWorker = createInlineWorker<number[], number[]>((data) => {\r\n * return data.sort((a, b) => a - b);\r\n * });\r\n *\r\n * function SortButton() {\r\n * const { execute, result, isProcessing } = useWorker({\r\n * workerScript: sortWorker,\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport function createInlineWorker<T, R>(processFn: (data: T) => R): URL {\r\n const workerCode = `\r\n self.onmessage = function(e) {\r\n const msg = e.data;\r\n \r\n if (msg.type === 'task') {\r\n try {\r\n const processFn = ${processFn.toString()};\r\n const result = processFn(msg.data);\r\n \r\n self.postMessage({\r\n type: 'result',\r\n id: msg.id,\r\n result: result,\r\n });\r\n } catch (err) {\r\n self.postMessage({\r\n type: 'error',\r\n id: msg.id,\r\n error: err.message,\r\n });\r\n }\r\n }\r\n };\r\n `;\r\n\r\n const blob = new Blob([workerCode], { type: 'application/javascript' });\r\n return new URL(URL.createObjectURL(blob));\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TRANSFERABLE OBJECTS\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Helper to extract transferable objects from data\r\n */\r\nexport function getTransferables(data: unknown): Transferable[] {\r\n const transferables: Transferable[] = [];\r\n\r\n const extract = (obj: unknown): void => {\r\n if (obj instanceof ArrayBuffer) {\r\n transferables.push(obj);\r\n } else if (obj instanceof MessagePort) {\r\n transferables.push(obj);\r\n } else if (\r\n 'buffer' in (obj as ArrayBufferView) &&\r\n (obj as ArrayBufferView).buffer instanceof ArrayBuffer\r\n ) {\r\n transferables.push((obj as ArrayBufferView).buffer);\r\n } else if (obj instanceof ImageBitmap) {\r\n transferables.push(obj);\r\n } else if (Array.isArray(obj)) {\r\n obj.forEach(extract);\r\n } else if (obj && typeof obj === 'object') {\r\n Object.values(obj).forEach(extract);\r\n }\r\n };\r\n\r\n extract(data);\r\n return transferables;\r\n}\r\n","/**\r\n * @file memory.ts\r\n * @description Nice2Dev Performance — Memory Optimization Utilities\r\n *\r\n * Memory-efficient caching, automatic cleanup, and monitoring.\r\n */\r\n\r\nimport { useEffect, useRef, useCallback, useState } from 'react';\r\n\r\n// Ambient shims for ES2021 globals (some downstream package tsconfigs target ES2020).\r\ndeclare const WeakRef: {\r\n new <T extends object>(target: T): WeakRef<T>;\r\n readonly prototype: WeakRef<object>;\r\n};\r\ninterface WeakRef<T extends object> {\r\n deref(): T | undefined;\r\n}\r\ndeclare const FinalizationRegistry: {\r\n new <T>(cleanupCallback: (heldValue: T) => void): FinalizationRegistry<T>;\r\n readonly prototype: FinalizationRegistry<unknown>;\r\n};\r\ninterface FinalizationRegistry<T> {\r\n register(target: object, heldValue: T, unregisterToken?: object): void;\r\n unregister(unregisterToken: object): void;\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TYPES\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface WeakCacheOptions<K extends object> {\r\n /** Maximum cache size (for LRU eviction on fallback) */\r\n maxSize?: number;\r\n /** TTL in milliseconds (optional) */\r\n ttl?: number;\r\n /** Key extractor function */\r\n getKey?: (key: K) => string;\r\n}\r\n\r\nexport interface MemoryStats {\r\n /** JS heap size limit */\r\n jsHeapSizeLimit: number;\r\n /** Total JS heap size */\r\n totalJSHeapSize: number;\r\n /** Used JS heap size */\r\n usedJSHeapSize: number;\r\n /** Used heap percentage */\r\n usedPercent: number;\r\n /** Is available */\r\n isSupported: boolean;\r\n}\r\n\r\nexport interface EventCleanup {\r\n /** Add event listener with automatic cleanup */\r\n add: <K extends keyof WindowEventMap>(\r\n target: EventTarget,\r\n event: K | string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions,\r\n ) => void;\r\n /** Remove all registered listeners */\r\n removeAll: () => void;\r\n /** Get count of active listeners */\r\n count: () => number;\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// WEAK CACHE\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * WeakMap-based cache that automatically releases memory\r\n * when keys are garbage collected.\r\n *\r\n * @example\r\n * ```tsx\r\n * const userCache = createWeakCache<User, UserProfile>();\r\n *\r\n * function UserCard({ user }) {\r\n * let profile = userCache.get(user);\r\n *\r\n * if (!profile) {\r\n * profile = computeExpensiveProfile(user);\r\n * userCache.set(user, profile);\r\n * }\r\n *\r\n * return <div>{profile.name}</div>;\r\n * }\r\n * ```\r\n */\r\nexport function createWeakCache<K extends object, V>() {\r\n const cache = new WeakMap<K, V>();\r\n\r\n return {\r\n get: (key: K): V | undefined => cache.get(key),\r\n set: (key: K, value: V): void => {\r\n cache.set(key, value);\r\n },\r\n has: (key: K): boolean => cache.has(key),\r\n delete: (key: K): boolean => cache.delete(key),\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// LRU WEAK CACHE (with TTL and size limits)\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\ninterface CacheEntry<V> {\r\n value: V;\r\n timestamp: number;\r\n size?: number;\r\n}\r\n\r\n/**\r\n * LRU cache with optional TTL and WeakRef for values\r\n *\r\n * @example\r\n * ```tsx\r\n * const imageCache = createLRUCache<string, ImageBitmap>({\r\n * maxSize: 100,\r\n * ttl: 60000, // 1 minute\r\n * });\r\n * ```\r\n */\r\nexport function createLRUCache<K, V>(\r\n options: {\r\n maxSize?: number;\r\n ttl?: number;\r\n } = {},\r\n) {\r\n const { maxSize = 1000, ttl } = options;\r\n const cache = new Map<K, CacheEntry<V>>();\r\n\r\n const isExpired = (entry: CacheEntry<V>): boolean => {\r\n if (!ttl) {\r\n return false;\r\n }\r\n return Date.now() - entry.timestamp > ttl;\r\n };\r\n\r\n const evictOldest = (): void => {\r\n if (cache.size <= maxSize) {\r\n return;\r\n }\r\n\r\n // Remove oldest entries\r\n const keysToDelete: K[] = [];\r\n for (const [key, entry] of cache.entries()) {\r\n if (isExpired(entry) || cache.size - keysToDelete.length > maxSize) {\r\n keysToDelete.push(key);\r\n }\r\n if (cache.size - keysToDelete.length <= maxSize) {\r\n break;\r\n }\r\n }\r\n\r\n keysToDelete.forEach((k) => cache.delete(k));\r\n };\r\n\r\n return {\r\n get: (key: K): V | undefined => {\r\n const entry = cache.get(key);\r\n if (!entry) {\r\n return undefined;\r\n }\r\n\r\n if (isExpired(entry)) {\r\n cache.delete(key);\r\n return undefined;\r\n }\r\n\r\n // Move to end (most recently used)\r\n cache.delete(key);\r\n cache.set(key, { ...entry, timestamp: Date.now() });\r\n\r\n return entry.value;\r\n },\r\n\r\n set: (key: K, value: V): void => {\r\n cache.delete(key); // Remove if exists\r\n cache.set(key, { value, timestamp: Date.now() });\r\n evictOldest();\r\n },\r\n\r\n has: (key: K): boolean => {\r\n const entry = cache.get(key);\r\n if (!entry) {\r\n return false;\r\n }\r\n if (isExpired(entry)) {\r\n cache.delete(key);\r\n return false;\r\n }\r\n return true;\r\n },\r\n\r\n delete: (key: K): boolean => cache.delete(key),\r\n\r\n clear: (): void => cache.clear(),\r\n\r\n size: (): number => cache.size,\r\n\r\n keys: (): K[] => Array.from(cache.keys()),\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// WEAK REF CACHE\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Cache using WeakRef for values - allows GC to collect unused values\r\n *\r\n * @example\r\n * ```tsx\r\n * const componentCache = createWeakRefCache<string, React.ComponentType>();\r\n *\r\n * // Values can be garbage collected when no other references exist\r\n * componentCache.set('MyComponent', MyComponent);\r\n * ```\r\n */\r\nexport function createWeakRefCache<K, V extends object>() {\r\n const cache = new Map<K, WeakRef<V>>();\r\n const registry = new FinalizationRegistry<K>((key) => {\r\n cache.delete(key);\r\n });\r\n\r\n return {\r\n get: (key: K): V | undefined => {\r\n const ref = cache.get(key);\r\n if (!ref) {\r\n return undefined;\r\n }\r\n\r\n const value = ref.deref();\r\n if (value === undefined) {\r\n cache.delete(key);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n set: (key: K, value: V): void => {\r\n const existing = cache.get(key);\r\n if (existing) {\r\n // Unregister old value\r\n const oldValue = existing.deref();\r\n if (oldValue) {\r\n registry.unregister(oldValue);\r\n }\r\n }\r\n\r\n cache.set(key, new WeakRef(value));\r\n registry.register(value, key, value);\r\n },\r\n\r\n has: (key: K): boolean => {\r\n const ref = cache.get(key);\r\n if (!ref) {\r\n return false;\r\n }\r\n return ref.deref() !== undefined;\r\n },\r\n\r\n delete: (key: K): boolean => {\r\n const ref = cache.get(key);\r\n if (ref) {\r\n const value = ref.deref();\r\n if (value) {\r\n registry.unregister(value);\r\n }\r\n }\r\n return cache.delete(key);\r\n },\r\n\r\n clear: (): void => cache.clear(),\r\n\r\n size: (): number => {\r\n // Count only non-collected entries\r\n let count = 0;\r\n for (const ref of cache.values()) {\r\n if (ref.deref() !== undefined) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n },\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// EVENT LISTENER CLEANUP\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\ninterface RegisteredListener {\r\n target: EventTarget;\r\n event: string;\r\n handler: EventListener;\r\n options?: AddEventListenerOptions;\r\n}\r\n\r\n/**\r\n * Hook for automatic event listener cleanup\r\n *\r\n * @example\r\n * ```tsx\r\n * function ScrollTracker() {\r\n * const events = useEventCleanup();\r\n *\r\n * useEffect(() => {\r\n * events.add(window, 'scroll', handleScroll);\r\n * events.add(document, 'keydown', handleKeyDown);\r\n * // All listeners automatically removed on unmount\r\n * }, []);\r\n *\r\n * return <div>...</div>;\r\n * }\r\n * ```\r\n */\r\nexport function useEventCleanup(): EventCleanup {\r\n const listenersRef = useRef<RegisteredListener[]>([]);\r\n\r\n const add = useCallback(\r\n <K extends keyof WindowEventMap>(\r\n target: EventTarget,\r\n event: K | string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions,\r\n ): void => {\r\n target.addEventListener(event as string, handler, options);\r\n listenersRef.current.push({\r\n target,\r\n event: event as string,\r\n handler,\r\n options,\r\n });\r\n },\r\n [],\r\n );\r\n\r\n const removeAll = useCallback((): void => {\r\n listenersRef.current.forEach(({ target, event, handler, options }) => {\r\n target.removeEventListener(event, handler, options);\r\n });\r\n listenersRef.current = [];\r\n }, []);\r\n\r\n const count = useCallback((): number => {\r\n return listenersRef.current.length;\r\n }, []);\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n removeAll();\r\n };\r\n }, [removeAll]);\r\n\r\n return { add, removeAll, count };\r\n}\r\n\r\n/**\r\n * Create standalone event cleanup manager\r\n */\r\nexport function createEventCleanup(): EventCleanup & { dispose: () => void } {\r\n const listeners: RegisteredListener[] = [];\r\n\r\n return {\r\n add: <K extends keyof WindowEventMap>(\r\n target: EventTarget,\r\n event: K | string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions,\r\n ): void => {\r\n target.addEventListener(event as string, handler, options);\r\n listeners.push({ target, event: event as string, handler, options });\r\n },\r\n\r\n removeAll: (): void => {\r\n listeners.forEach(({ target, event, handler, options }) => {\r\n target.removeEventListener(event, handler, options);\r\n });\r\n listeners.length = 0;\r\n },\r\n\r\n count: (): number => listeners.length,\r\n\r\n dispose: (): void => {\r\n listeners.forEach(({ target, event, handler, options }) => {\r\n target.removeEventListener(event, handler, options);\r\n });\r\n listeners.length = 0;\r\n },\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// MEMORY MONITORING\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\ninterface PerformanceMemory {\r\n jsHeapSizeLimit: number;\r\n totalJSHeapSize: number;\r\n usedJSHeapSize: number;\r\n}\r\n\r\n/**\r\n * Get current memory stats (Chrome only)\r\n */\r\nexport function getMemoryStats(): MemoryStats {\r\n const performance = window.performance as Performance & { memory?: PerformanceMemory };\r\n\r\n if (!performance.memory) {\r\n return {\r\n jsHeapSizeLimit: 0,\r\n totalJSHeapSize: 0,\r\n usedJSHeapSize: 0,\r\n usedPercent: 0,\r\n isSupported: false,\r\n };\r\n }\r\n\r\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = performance.memory;\r\n\r\n return {\r\n jsHeapSizeLimit,\r\n totalJSHeapSize,\r\n usedJSHeapSize,\r\n usedPercent: (usedJSHeapSize / jsHeapSizeLimit) * 100,\r\n isSupported: true,\r\n };\r\n}\r\n\r\n/**\r\n * Hook for monitoring memory usage\r\n *\r\n * @example\r\n * ```tsx\r\n * function MemoryMonitor() {\r\n * const { stats, isHighUsage } = useMemoryMonitor({\r\n * warningThreshold: 80, // Warn at 80% usage\r\n * pollInterval: 5000,\r\n * });\r\n *\r\n * if (isHighUsage) {\r\n * console.warn('High memory usage!');\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function useMemoryMonitorPerf(\r\n options: {\r\n warningThreshold?: number;\r\n pollInterval?: number;\r\n onHighUsage?: (stats: MemoryStats) => void;\r\n } = {},\r\n) {\r\n const { warningThreshold = 75, pollInterval = 10000, onHighUsage } = options;\r\n\r\n const [stats, setStats] = useState<MemoryStats>(getMemoryStats);\r\n const [isHighUsage, setIsHighUsage] = useState(false);\r\n\r\n useEffect(() => {\r\n const initialStats = getMemoryStats();\r\n if (!initialStats.isSupported) {\r\n return;\r\n }\r\n\r\n const timer = setInterval(() => {\r\n const newStats = getMemoryStats();\r\n setStats(newStats);\r\n\r\n const highUsage = newStats.usedPercent > warningThreshold;\r\n setIsHighUsage(highUsage);\r\n\r\n if (highUsage && onHighUsage) {\r\n onHighUsage(newStats);\r\n }\r\n }, pollInterval);\r\n\r\n return () => clearInterval(timer);\r\n }, [warningThreshold, pollInterval, onHighUsage]);\r\n\r\n return { stats, isHighUsage };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// IMAGE LAZY LOADING\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface LazyImageOptions {\r\n /** Intersection Observer root margin */\r\n rootMargin?: string;\r\n /** Intersection Observer threshold */\r\n threshold?: number;\r\n /** Placeholder while loading */\r\n placeholder?: string;\r\n /** Enable progressive loading (blur-up) */\r\n progressive?: boolean;\r\n}\r\n\r\n/**\r\n * Hook for lazy loading images with intersection observer\r\n *\r\n * @example\r\n * ```tsx\r\n * function LazyImage({ src, alt }) {\r\n * const { ref, isLoaded, isInView } = useLazyImage({ src });\r\n *\r\n * return (\r\n * <img\r\n * ref={ref}\r\n * src={isInView ? src : placeholder}\r\n * alt={alt}\r\n * className={isLoaded ? 'loaded' : 'loading'}\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useLazyImage(options: LazyImageOptions & { src: string }) {\r\n const { src, rootMargin = '200px', threshold = 0, placeholder, progressive } = options;\r\n\r\n const ref = useRef<HTMLImageElement>(null);\r\n const [isInView, setIsInView] = useState(false);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [currentSrc, setCurrentSrc] = useState(placeholder || '');\r\n\r\n useEffect(() => {\r\n const element = ref.current;\r\n if (!element) {\r\n return;\r\n }\r\n\r\n const observer = new IntersectionObserver(\r\n ([entry]) => {\r\n if (entry.isIntersecting) {\r\n setIsInView(true);\r\n observer.disconnect();\r\n }\r\n },\r\n { rootMargin, threshold },\r\n );\r\n\r\n observer.observe(element);\r\n\r\n return () => observer.disconnect();\r\n }, [rootMargin, threshold]);\r\n\r\n useEffect(() => {\r\n if (!isInView) {\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n setCurrentSrc(src);\r\n setIsLoaded(true);\r\n };\r\n\r\n img.src = src;\r\n\r\n return () => {\r\n img.onload = null;\r\n };\r\n }, [isInView, src, progressive]);\r\n\r\n return {\r\n ref,\r\n isInView,\r\n isLoaded,\r\n currentSrc,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// OBJECT POOL\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Object pool for reducing GC pressure\r\n *\r\n * @example\r\n * ```tsx\r\n * const vectorPool = createObjectPool({\r\n * create: () => ({ x: 0, y: 0 }),\r\n * reset: (v) => { v.x = 0; v.y = 0; },\r\n * maxSize: 100,\r\n * });\r\n *\r\n * function useVector() {\r\n * const v = vectorPool.acquire();\r\n * // Use vector...\r\n * vectorPool.release(v);\r\n * }\r\n * ```\r\n */\r\nexport function createObjectPool<T>(options: {\r\n create: () => T;\r\n reset?: (obj: T) => void;\r\n maxSize?: number;\r\n}) {\r\n const { create, reset, maxSize = 100 } = options;\r\n const pool: T[] = [];\r\n\r\n return {\r\n acquire: (): T => {\r\n if (pool.length > 0) {\r\n return pool.pop()!;\r\n }\r\n return create();\r\n },\r\n\r\n release: (obj: T): void => {\r\n if (pool.length < maxSize) {\r\n if (reset) {\r\n reset(obj);\r\n }\r\n pool.push(obj);\r\n }\r\n // Otherwise, let GC collect it\r\n },\r\n\r\n preallocate: (count: number): void => {\r\n const needed = Math.min(count, maxSize - pool.length);\r\n for (let i = 0; i < needed; i++) {\r\n pool.push(create());\r\n }\r\n },\r\n\r\n clear: (): void => {\r\n pool.length = 0;\r\n },\r\n\r\n size: (): number => pool.length,\r\n };\r\n}\r\n","/**\r\n * @file images.ts\r\n * @description Nice2Dev Performance — Image Optimization Utilities\r\n *\r\n * Lazy loading, progressive rendering, responsive images, and format detection.\r\n */\r\n\r\nimport { useEffect, useRef, useState, useCallback } from 'react';\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// TYPES\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport interface ImageFormat {\r\n format: 'avif' | 'webp' | 'jpg' | 'png' | 'gif';\r\n mimeType: string;\r\n supported: boolean;\r\n}\r\n\r\nexport interface ResponsiveImageSource {\r\n src: string;\r\n width: number;\r\n format?: ImageFormat['format'];\r\n}\r\n\r\nexport interface ProgressiveImageState {\r\n /** Current displayed source */\r\n currentSrc: string | null;\r\n /** Thumbnail/LQIP source */\r\n thumbnailSrc: string | null;\r\n /** Full-res source */\r\n fullSrc: string;\r\n /** Loading stage: 'idle' | 'thumbnail' | 'loading' | 'loaded' | 'error' */\r\n stage: 'idle' | 'thumbnail' | 'loading' | 'loaded' | 'error';\r\n /** Is fully loaded */\r\n isLoaded: boolean;\r\n /** Is in viewport */\r\n isInView: boolean;\r\n /** Error if any */\r\n error: Error | null;\r\n}\r\n\r\nexport interface LazyImageConfig {\r\n /** Intersection Observer root margin */\r\n rootMargin?: string;\r\n /** Intersection Observer threshold */\r\n threshold?: number;\r\n /** Enable progressive loading */\r\n progressive?: boolean;\r\n /** Low-quality image placeholder src */\r\n lqip?: string;\r\n /** Blur amount for LQIP (in px) */\r\n blurRadius?: number;\r\n /** Delay before loading (for prioritization) */\r\n delay?: number;\r\n /** Priority: 'high' | 'low' | 'auto' */\r\n priority?: 'high' | 'low' | 'auto';\r\n /** Callback when loaded */\r\n onLoad?: () => void;\r\n /** Callback on error */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// FORMAT DETECTION\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nconst formatSupport: Record<string, boolean | null> = {\r\n avif: null,\r\n webp: null,\r\n};\r\n\r\n/**\r\n * Check if browser supports a specific image format\r\n */\r\nexport async function checkFormatSupport(format: 'avif' | 'webp'): Promise<boolean> {\r\n if (formatSupport[format] !== null) {\r\n return formatSupport[format]!;\r\n }\r\n\r\n const testImages: Record<string, string> = {\r\n avif: 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKBzgABhAQ0AIy0IEAAAAAAAAAAMHN',\r\n webp: 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA',\r\n };\r\n\r\n return new Promise((resolve) => {\r\n const img = new Image();\r\n img.onload = () => {\r\n formatSupport[format] = img.width > 0 && img.height > 0;\r\n resolve(formatSupport[format]!);\r\n };\r\n img.onerror = () => {\r\n formatSupport[format] = false;\r\n resolve(false);\r\n };\r\n img.src = testImages[format];\r\n });\r\n}\r\n\r\n/**\r\n * Hook to get supported image formats\r\n */\r\nexport function useImageFormats() {\r\n const [formats, setFormats] = useState<Record<string, boolean>>({\r\n avif: false,\r\n webp: false,\r\n jpg: true,\r\n png: true,\r\n gif: true,\r\n });\r\n const [isChecking, setIsChecking] = useState(true);\r\n\r\n useEffect(() => {\r\n Promise.all([checkFormatSupport('avif'), checkFormatSupport('webp')]).then(([avif, webp]) => {\r\n setFormats((f) => ({ ...f, avif, webp }));\r\n setIsChecking(false);\r\n });\r\n }, []);\r\n\r\n return { formats, isChecking };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// RESPONSIVE IMAGES\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Generate srcset string from sources\r\n */\r\nexport function generateSrcset(sources: ResponsiveImageSource[]): string {\r\n return sources.map((s) => `${s.src} ${s.width}w`).join(', ');\r\n}\r\n\r\n/**\r\n * Generate sizes attribute for responsive images\r\n */\r\nexport function generateSizes(\r\n breakpoints: { maxWidth: number; size: string }[],\r\n defaultSize: string,\r\n): string {\r\n const parts = breakpoints.map((bp) => `(max-width: ${bp.maxWidth}px) ${bp.size}`);\r\n parts.push(defaultSize);\r\n return parts.join(', ');\r\n}\r\n\r\n/**\r\n * Select optimal image source based on viewport and DPR\r\n */\r\nexport function selectOptimalSource(\r\n sources: ResponsiveImageSource[],\r\n containerWidth: number,\r\n dpr: number = window.devicePixelRatio,\r\n): ResponsiveImageSource {\r\n const targetWidth = containerWidth * dpr;\r\n\r\n // Sort by width ascending\r\n const sorted = [...sources].sort((a, b) => a.width - b.width);\r\n\r\n // Find smallest source that's at least as wide as target\r\n for (const source of sorted) {\r\n if (source.width >= targetWidth) {\r\n return source;\r\n }\r\n }\r\n\r\n // Return largest available if none are big enough\r\n return sorted[sorted.length - 1];\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// PROGRESSIVE IMAGE LOADING\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Hook for progressive image loading (blur-up technique)\r\n *\r\n * @example\r\n * ```tsx\r\n * function ProgressiveImage({ src, lqip, alt }) {\r\n * const { currentSrc, stage, style, ref } = useProgressiveImage({\r\n * src,\r\n * lqip,\r\n * blurRadius: 20,\r\n * });\r\n *\r\n * return (\r\n * <img\r\n * ref={ref}\r\n * src={currentSrc}\r\n * alt={alt}\r\n * style={style}\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useProgressiveImage(config: LazyImageConfig & { src: string }) {\r\n const {\r\n src,\r\n lqip,\r\n rootMargin = '200px',\r\n threshold = 0,\r\n blurRadius = 20,\r\n delay = 0,\r\n priority = 'auto',\r\n onLoad,\r\n onError,\r\n } = config;\r\n\r\n const ref = useRef<HTMLImageElement>(null);\r\n const [state, setState] = useState<ProgressiveImageState>({\r\n currentSrc: lqip || null,\r\n thumbnailSrc: lqip || null,\r\n fullSrc: src,\r\n stage: 'idle',\r\n isLoaded: false,\r\n isInView: false,\r\n error: null,\r\n });\r\n\r\n // Intersection Observer for lazy loading\r\n useEffect(() => {\r\n if (priority === 'high') {\r\n setState((s) => ({ ...s, isInView: true }));\r\n return;\r\n }\r\n\r\n const element = ref.current;\r\n if (!element) {\r\n return;\r\n }\r\n\r\n const observer = new IntersectionObserver(\r\n ([entry]) => {\r\n if (entry.isIntersecting) {\r\n setState((s) => ({ ...s, isInView: true }));\r\n observer.disconnect();\r\n }\r\n },\r\n { rootMargin, threshold },\r\n );\r\n\r\n observer.observe(element);\r\n return () => observer.disconnect();\r\n }, [rootMargin, threshold, priority]);\r\n\r\n // Load full image when in view\r\n useEffect(() => {\r\n if (!state.isInView || state.isLoaded) {\r\n return;\r\n }\r\n\r\n setState((s) => ({ ...s, stage: lqip ? 'thumbnail' : 'loading' }));\r\n\r\n const timeoutId = delay > 0 ? setTimeout(loadImage, delay) : null;\r\n if (!timeoutId) {\r\n loadImage();\r\n }\r\n\r\n function loadImage() {\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n setState((s) => ({\r\n ...s,\r\n currentSrc: src,\r\n stage: 'loaded',\r\n isLoaded: true,\r\n }));\r\n onLoad?.();\r\n };\r\n\r\n img.onerror = () => {\r\n const error = new Error(`Failed to load image: ${src}`);\r\n setState((s) => ({\r\n ...s,\r\n stage: 'error',\r\n error,\r\n }));\r\n onError?.(error);\r\n };\r\n\r\n img.src = src;\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n };\r\n }, [state.isInView, state.isLoaded, src, lqip, delay, onLoad, onError]);\r\n\r\n // Dynamic styles for blur transition\r\n const style: React.CSSProperties = {\r\n filter: state.stage === 'thumbnail' ? `blur(${blurRadius}px)` : 'none',\r\n transition: 'filter 0.3s ease-out',\r\n ...(state.stage === 'thumbnail' && {\r\n transform: 'scale(1.05)', // Slight scale to hide blur edges\r\n }),\r\n };\r\n\r\n return {\r\n ref,\r\n ...state,\r\n style,\r\n };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// IMAGE PRELOADING\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Preload images in the background\r\n */\r\nexport function preloadImages(urls: string[]): Promise<void[]> {\r\n return Promise.all(\r\n urls.map(\r\n (url) =>\r\n new Promise<void>((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = () => resolve();\r\n img.onerror = () => reject(new Error(`Failed to preload: ${url}`));\r\n img.src = url;\r\n }),\r\n ),\r\n );\r\n}\r\n\r\n/**\r\n * Hook for preloading images on mount\r\n */\r\nexport function useImagePreload(urls: string[]) {\r\n const [state, setState] = useState<{\r\n loaded: number;\r\n total: number;\r\n isComplete: boolean;\r\n errors: string[];\r\n }>({\r\n loaded: 0,\r\n total: urls.length,\r\n isComplete: false,\r\n errors: [],\r\n });\r\n\r\n useEffect(() => {\r\n if (urls.length === 0) {\r\n setState({ loaded: 0, total: 0, isComplete: true, errors: [] });\r\n return;\r\n }\r\n\r\n let loaded = 0;\r\n const errors: string[] = [];\r\n\r\n urls.forEach((url) => {\r\n const img = new Image();\r\n img.onload = () => {\r\n loaded++;\r\n updateState();\r\n };\r\n img.onerror = () => {\r\n loaded++;\r\n errors.push(url);\r\n updateState();\r\n };\r\n img.src = url;\r\n });\r\n\r\n function updateState() {\r\n setState({\r\n loaded,\r\n total: urls.length,\r\n isComplete: loaded === urls.length,\r\n errors,\r\n });\r\n }\r\n }, [urls]);\r\n\r\n return state;\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// IMAGE DECODE API\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Load and decode image off main thread\r\n */\r\nexport async function loadAndDecodeImage(src: string): Promise<HTMLImageElement> {\r\n const img = new Image();\r\n img.src = src;\r\n\r\n // Use decode() API for off-main-thread decoding if available\r\n if (typeof img.decode === 'function') {\r\n await img.decode();\r\n } else {\r\n // Fallback to onload\r\n await new Promise<void>((resolve, reject) => {\r\n (img as HTMLImageElement).onload = () => resolve();\r\n (img as HTMLImageElement).onerror = () => reject(new Error(`Failed to load: ${src}`));\r\n });\r\n }\r\n\r\n return img;\r\n}\r\n\r\n/**\r\n * Hook that loads and decodes image before rendering\r\n */\r\nexport function useDecodedImage(src: string | null) {\r\n const [image, setImage] = useState<HTMLImageElement | null>(null);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n useEffect(() => {\r\n if (!src) {\r\n setImage(null);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n loadAndDecodeImage(src)\r\n .then((img) => {\r\n if (!cancelled) {\r\n setImage(img);\r\n setIsLoading(false);\r\n }\r\n })\r\n .catch((err) => {\r\n if (!cancelled) {\r\n setError(err);\r\n setIsLoading(false);\r\n }\r\n });\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [src]);\r\n\r\n return { image, isLoading, error };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// INTERSECTION OBSERVER BATCH\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\ntype LazyLoadCallback = (entry: IntersectionObserverEntry) => void;\r\n\r\n/**\r\n * Shared IntersectionObserver for multiple images\r\n * Reduces overhead compared to one observer per image\r\n */\r\nexport function createImageObserver(options: IntersectionObserverInit = {}): {\r\n observe: (element: Element, callback: LazyLoadCallback) => void;\r\n unobserve: (element: Element) => void;\r\n disconnect: () => void;\r\n} {\r\n const callbacks = new Map<Element, LazyLoadCallback>();\r\n\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n const callback = callbacks.get(entry.target);\r\n if (callback && entry.isIntersecting) {\r\n callback(entry);\r\n }\r\n });\r\n }, options);\r\n\r\n return {\r\n observe: (element: Element, callback: LazyLoadCallback) => {\r\n callbacks.set(element, callback);\r\n observer.observe(element);\r\n },\r\n unobserve: (element: Element) => {\r\n callbacks.delete(element);\r\n observer.unobserve(element);\r\n },\r\n disconnect: () => {\r\n callbacks.clear();\r\n observer.disconnect();\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Hook for using shared image observer\r\n */\r\nexport function useSharedImageObserver(\r\n observer: ReturnType<typeof createImageObserver>,\r\n onIntersect: () => void,\r\n) {\r\n const ref = useRef<HTMLImageElement>(null);\r\n const [isInView, setIsInView] = useState(false);\r\n\r\n useEffect(() => {\r\n const element = ref.current;\r\n if (!element) {\r\n return;\r\n }\r\n\r\n observer.observe(element, () => {\r\n setIsInView(true);\r\n onIntersect();\r\n observer.unobserve(element);\r\n });\r\n\r\n return () => {\r\n observer.unobserve(element);\r\n };\r\n }, [observer, onIntersect]);\r\n\r\n return { ref, isInView };\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// IMAGE PLACEHOLDER GENERATION\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\n/**\r\n * Generate a solid color placeholder as data URI\r\n */\r\nexport function generateColorPlaceholder(color: string, width = 10, height = 10): string {\r\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\"><rect width=\"100%\" height=\"100%\" fill=\"${color}\"/></svg>`;\r\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\r\n}\r\n\r\n/**\r\n * Generate a gradient placeholder as data URI\r\n */\r\nexport function generateGradientPlaceholder(\r\n colors: [string, string],\r\n direction: 'horizontal' | 'vertical' = 'vertical',\r\n width = 10,\r\n height = 10,\r\n): string {\r\n const gradientId = 'g';\r\n const x2 = direction === 'horizontal' ? '100%' : '0%';\r\n const y2 = direction === 'vertical' ? '100%' : '0%';\r\n\r\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\r\n <defs>\r\n <linearGradient id=\"${gradientId}\" x1=\"0%\" y1=\"0%\" x2=\"${x2}\" y2=\"${y2}\">\r\n <stop offset=\"0%\" style=\"stop-color:${colors[0]}\"/>\r\n <stop offset=\"100%\" style=\"stop-color:${colors[1]}\"/>\r\n </linearGradient>\r\n </defs>\r\n <rect width=\"100%\" height=\"100%\" fill=\"url(#${gradientId})\"/>\r\n </svg>`;\r\n\r\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n// EXPORTS SUMMARY\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n\r\nexport const ImageOptimization = {\r\n // Format detection\r\n checkFormatSupport,\r\n useImageFormats,\r\n // Responsive\r\n generateSrcset,\r\n generateSizes,\r\n selectOptimalSource,\r\n // Progressive loading\r\n useProgressiveImage,\r\n // Preloading\r\n preloadImages,\r\n useImagePreload,\r\n // Decoding\r\n loadAndDecodeImage,\r\n useDecodedImage,\r\n // Batch observer\r\n createImageObserver,\r\n useSharedImageObserver,\r\n // Placeholders\r\n generateColorPlaceholder,\r\n generateGradientPlaceholder,\r\n};\r\n"],"names":["LEGACY_SIZE_MAP","_warnedSizes","normalizeSize","size","componentName","mapped","key","RADIUS_VALUES","SHADOW_VALUES","SHADOW_DARK_MODE_VALUES","DENSITY_VALUES","ANIMATION_VALUES","generateFillStyles","variant","primaryColor","secondaryColor","adjustColor","generateButtonStyles","color","base","generateInputStyles","generateCardStyles","generateBadgeStyles","generateTabStyles","activeColor","generateToggleStyles","generateTooltipStyles","generateTableStyles","DEFAULT_VARIANT_CONFIG","VARIANT_PRESETS","generateVariantCSS","config","selector","radius","shadow","density","animation","lines","value","cssKey","applyVariantConfig","element","scopeId","styleElId","css","styleEl","removeVariantConfig","amount","hex","num","r","g","b","applyVariantsToTheme","theme","mergedConfig","NICE_DISPLAY_STYLES","resolveDisplayStyleConfig","style","NiceDisplayStyleContext","createContext","useNiceDisplayStyle","useContext","useResolvedDisplayStyle","propStyle","ctx","effective","useComponentDisplayStyle","componentType","getComponentStyleFromConfig","useComponentDisplayClass","useDisplayDensity","d","useDisplayAnimation","a","getDisplayStyleDataAttrs","NICE_DISPLAY_STYLE_INFO","useDisplayModeEdit","enabled","readOnly","disabled","editing","setEditing","useState","wantFocusRef","useRef","enterEdit","useCallback","exitEdit","autoFocusRef","node","useEffect","DisplayModeView","placeholder","onActivate","className","ariaLabel","isEmpty","handleKey","e","jsx","sanitizeHtml","html","result","isSafeUrl","url","trimmed","BUILTIN_PATHS","ICON_SIZES","NiceIconContext","NiceIconProvider","resolver","children","React","BuiltinSvgIcon","path","title","onClick","jsxs","NiceIcon","name","pxSize","resolved","useNiceIcon","icon","NICE_BUILTIN_ICONS","useIsTouchDevice","isTouch","setIsTouch","mq","handler","useInputMode","mode","setMode","onTouch","onMouse","useLongPress","callback","holdMs","timerRef","clear","useControlId","externalId","generated","useId","useDebouncedValue","delayMs","debounced","setDebounced","timer","useClickOutside","ref","listener","useFocusTrap","active","el","previouslyFocused","focusable","first","last","trap","_a","useDarkMode","options","defaultMode","storageKey","darkClass","lightClass","systemPreference","setSystemPreference","stored","isDark","root","setLight","setDark","setSystem","toggle","prev","useBrandColors","imageSource","colorCount","quality","colors","setColors","loading","setLoading","error","setError","img","resolve","reject","canvas","maxSize","scale","imageData","pixels","step","i","brightness","sortedColors","kMeansClustering","satA","toHex","rgb","c","getContrastText","dominantSorted","k","maxIterations","centroids","used","idx","iter","clusters","pixel","minDist","closest","dist","changed","newCentroid","p","generatePaletteFromColor","baseColor","max","min","h","s","hslToHex","l","hue2rgb","q","t","rr","gg","bb","NICE_BREAKPOINTS","BREAKPOINT_ORDER","useBreakpoint","breakpoints","width","setWidth","raf","handleResize","current","useMemo","isAbove","bp","isBelow","isBetween","lower","upper","useMediaQuery","query","matches","setMatches","useResponsiveValue","map","val","useContainerSize","setSize","observer","entry","height","useDevice","screenIsMobile","prefersReducedMotion","isPortrait","pixelRatio","isPhone","isTablet","isDesktop","useAdaptiveVariant","forceVariant","isMobile","device","useShowAt","showAt","hideAt","mobileOnly","desktopOnly","tabletOnly","useOrientation","useSafeAreaInsets","insets","setInsets","measure","testEl","computed","resolveDuration","PRESET_ENTER_CLASS","PRESET_EXIT_CLASS","useNiceTransition","visible","duration","onEntered","onExited","state","setState","shouldRender","setShouldRender","ms","prefersReduced","effectiveDuration","useNiceCollapse","expanded","setHeight","niceStaggerDelay","index","interval","getNiceAnimationClass","preset","phase","NiceRTLContext","v","NiceRTLProvider","direction","isRTL","flip","flipStyle","property","useNiceRTL","logicalProps","NiceAccessContext","NiceAccessControl","permissions","componentId","fieldId","_b","useNiceAccessMode","propAccessMode","accessModeAttrs","useSwipe","threshold","maxDuration","onSwipe","onSwipeLeft","onSwipeRight","onSwipeUp","onSwipeDown","isSwiping","setIsSwiping","swipeDirection","setSwipeDirection","startPoint","handleTouchStart","touch","handleTouchMove","deltaX","deltaY","handleTouchEnd","endPoint","distance","velocity","gesture","handleTouchCancel","usePinch","onPinch","onPinchStart","onPinchEnd","minScale","maxScale","setScale","isPinching","setIsPinching","initialDistance","initialScale","getDistance","t1","t2","dx","dy","getCenter","currentDistance","newScale","usePan","onPan","onPanStart","onPanEnd","isPanning","setIsPanning","setDeltaX","setDeltaY","lastPoint","point","now","currentPoint","dt","velocityX","velocityY","usePullToRefresh","onRefresh","maxPull","isPulling","setIsPulling","isRefreshing","setIsRefreshing","pullDistance","setPullDistance","startY","pullProgress","delta","pull","NiceSwipeableListItem","leftActions","rightActions","actionWidth","maxSwipe","containerRef","contentRef","offset","setOffset","isAnimating","setIsAnimating","startX","currentOffset","leftWidth","rightWidth","maxLeftSwipe","maxRightSwipe","newOffset","handleActionClick","action","close","NicePullToRefresh","pullingContent","refreshingContent","triggerHaptic","type","patterns","useHaptic","NiceTouchTarget","minSize","useVirtualKeyboard","isKeyboardVisible","setIsKeyboardVisible","keyboardHeight","setKeyboardHeight","initialHeight","vv","heightDiff","defaultConfig","NiceA11yContext","NiceA11yProvider","userConfig","politeRef","assertiveRef","osReducedMotion","setOsReducedMotion","osHighContrast","setOsHighContrast","prefersHighContrast","announce","message","priority","srOnlyStyle","useNiceA11y","buildAriaDescribedBy","ids","filtered","buildFormFieldAria","props","errorId","helperId","useRovingTabIndex","wrap","itemSelector","container","getItems","handleKeyDown","items","next","isH","isV","item","useRestoreFocus","previousRef","NiceVisuallyHidden","Tag","NiceSkipLink","targetId","target","COMMON_SHORTCUTS","formatShortcut","shortcut","parts","_c","_d","matchesShortcut","mods","NiceKeyboardHint","shortcuts","position","setVisible","triggerRef","coords","setCoords","updatePosition","rect","top","left","handleMouseEnter","handleFocus","Fragment","useSubmitOnEnter","onSubmit","preventDefault","requireCtrl","skipTextarea","useAccessibleClick","role","tabIndex","triggerOnSpace","handleClick","isSpace","useVoiceControl","isListening","setIsListening","transcript","setTranscript","recognitionRef","isSupported","processTranscript","text","cmd","match","start","Ctor","recognition","event","isFinal","stop","useLiveAnnouncement","setMessage","regionProps","useRouteAnnouncement","pageTitle","useFocusManagement","focusFirst","focusElement","getFocusableElements","DEFAULT_COGNITIVE","useCognitiveAccessibility","settings","setSettings","updateSetting","generateCognitiveCSS","rootClasses","rootStyle","rules","checkContrastAAA","foreground","background","isLargeText","fgLum","relativeLuminance","parseColor","bgLum","ratio","contrastRatio","auditWCAG22AAA","results","hasAriaLabel","section","fontSize","linearize","l1","l2","lighter","darker","NICE_COLOR_BLIND_MODES","SPRITE_ID","STYLE_ID","FILTERS","ensureSprite","svgNs","svg","defs","matrix","filter","fe","m","clearAllClasses","applyColorBlindMode","useColorBlindMode","lastTargetRef","createColorBlindController","defaultPolicy","requested","defaultStorage","createNicePluginSystem","policy","storage","logger","entries","hostEvents","systemEvents","emitSystem","record","set","buildContext","manifest","granted","cleanups","grantedSet","level","args","off","payload","plugin","id","dep","depEntry","err","testId","niceSelectors","NiceTestWrapper","simulateKeyboard","evt","simulateType","nativeSetter","createMockDataSource","data","delay","keyField","values","checkAriaCompliance","violations","input","hasLabel","IS_DEV","globalConfig","renderTimings","componentStats","performanceMarks","nextRenderId","configureProfiler","getProfilingStats","getComponentStats","getRecentTimings","limit","clearProfilingData","getSlowRenders","thresholdMs","shouldSample","updateStats","timing","existing","formatDuration","NiceProfiler","onRender","onSlowRender","slowThreshold","logToConsole","handleRender","profilerId","actualDuration","baseDuration","startTime","commitTime","isSlow","Profiler","useWhyDidYouRender","prevPropsRef","renderCountRef","prevProps","changes","allKeys","oldValue","newValue","withWhyDidYouRender","Component","displayName","WrappedComponent","useRenderCount","countRef","startMark","detail","mark","endMark","measureAsync","operation","measureSync","useMeasureEffect","effect","deps","cleanup","getPerformanceReport","stats","slowRenders","totalRenders","sum","avgRenderTime","marks","printPerformanceReport","report","baselineStats","saveBaseline","checkRegression","thresholdPercent","regressions","baseline","avgChange","maxChange","ProfilerOverlay","memo","defaultCollapsed","collapsed","setCollapsed","setStats","memory","setMemory","update","allStats","perf","positionStyles","setupReactDevToolsIntegration","leakReports","trackedTimers","trackedListeners","mountedComponents","nextReportId","getStack","generateListenerId","reportLeak","severity","configureLeakDetector","getLeakReports","clearLeakReports","getLeakSummary","acc","useSafeState","initialState","mountedRef","nameRef","safeSetState","useSafeTimeout","timeoutRef","useSafeInterval","intervalRef","useSafeEventListener","listenersRef","useSafeAbortController","controllerRef","useSafeFetch","getAbortSignal","init","signal","useSafeSubscription","cleanupsRef","useSafeWebSocket","protocols","socket","setSocket","readyState","setReadyState","ws","send","code","reason","withLeakTracking","TrackedComponent","instanceRef","useUnmountLog","mountTimeRef","lifetime","takeMemorySnapshot","label","performance","forceGC","useMemoryMonitor","intervalMs","warnThresholdMB","mem","usedMB","totalMB","limitMB","isWarning","LeakDetectorStatus","leaks","totalLeaks","createReactQueryAdapter","invalidate","params","createZustandAdapter","useStore","createNiceReduxMiddleware","prefix","store","gridId","formId","niceReduxActions","sort","niceReduxReducer","kind","op","createGraphQLSubscriptionSource","latestData","msg","obj","firstKey","generateFromOpenAPI","swaggerUrl","schemaName","response","spec","schema","required","columns","formFields","prop","dataType","mapOpenAPIType","caption","humanize","mapToEditorType","buildEditorOptions","generateColumnsFromSchema","generateFormFieldsFromSchema","fields","opts","defaultHelpConfig","defaultContentLoader","locale","HelpContext","NiceHelpProvider","initialConfig","preloadedContent","setConfigState","disabledComponents","setDisabledComponents","helpCache","setHelpCache","setConfig","newConfig","toggleGlobalHelp","disableComponentHelp","enableComponentHelp","isHelpEnabled","getHelpContent","content","useNiceHelp","useComponentHelp","setContent","loadContent","helpContent","PropsTable","compact","useNiceTranslation","TipsList","tips","tip","ExamplesList","examples","selectedExample","setSelectedExample","ex","NiceInlineHelp","overrideContent","overridePosition","overrideExpanded","showProps","showExamples","showTips","loadedContent","configPosition","configExpanded","showHelpIcon","isExpanded","setExpanded","HelpPanel","onToggle","NiceQuickHelp","show","setShow","NiceHelpIcon","onOpen","helpText","helpTitle","LocalStorageAdapter","preferences","IndexedDBAdapter","dbName","storeName","request","db","RestAPISyncAdapter","baseUrl","getAuthHeaders","UserPreferencesContext","useUserPreferences","useControlPreferences","controlId","getControlPreferences","setControlPreferences","updateControlPreferences","prefs","u","useGridPreferences","useChartPreferences","chartId","EMPTY_STORE","NiceUserPreferencesProvider","syncAdapter","autoSyncInterval","saveDebounce","setPreferences","isLoading","setIsLoading","isSyncing","setIsSyncing","saveTimeoutRef","syncIntervalRef","mounted","debouncedSave","sync","updates","existingPrefs","merged","clearControlPreferences","_","rest","getGlobalPreferences","setGlobalPreferences","serverTimestamp","localTimestamp","serverPrefs","toSync","exportPreferences","importPreferences","json","imported","resetAllPreferences","NicePreferencesPanel","showGlobal","showControls","showExportImport","showSync","fileInputRef","handleExport","blob","handleImport","file","reader","controlIds","ctrl","types","DEFAULT_TRACELESS_POLICY","TRACELESS_MODE_PRESETS","PRIVACY_LEVEL_ORDER","getMorePrivateMode","indexA","indexB","isAtLeastAsPrivate","resolveTracelessPolicy","instanceCeiling","tenantPolicy","groupPolicy","userPreference","effectiveMode","source","deriveMode","shouldShowConsentBanner","cookiesAllowed","localStorageAllowed","sessionStorageAllowed","strictAuthCookieOnly","memoryStorage","StorageAdapter","namespace","defaultBackend","preferredBackend","backend","fullKey","serialized","keysToRemove","resolveControlStoragePermissions","globalPolicy","controlProps","cookies","localStorage","storageMode","generateTracelessComplianceReport","instanceId","tenantId","generateComplianceStatement","getTracelessBadgeInfo","getGracefulDegradationInfo","useCase","canPersist","canSession","TRACELESS_POLICY_HEADER","parsePolicyFromHeader","headerValue","normalized","createPolicyHeader","createStorageAdapter","createRestrictiveInstanceCeiling","createPermissiveInstanceCeiling","clearAllClientStorage","cookie","auditStorageCompliance","NiceAIContext","NiceAIProvider","abortControllerRef","cancel","parseSSEStream","onChunk","provider","decoder","buffer","done","line","_e","_f","buildOpenAIRequest","messages","buildAnthropicRequest","systemMessage","nonSystemMessages","complete","headers","body","errorText","choice","tc","stream","useNiceAI","context","useAICompletion","ai","setResponse","history","setHistory","sendStreaming","fullResponse","chunk","clearHistory","useCodeCompletion","suggestion","setSuggestion","suffix","completion","explain","refactor","instruction","generateFromComment","comment","useNaturalLanguageFilter","filters","useChartSuggestion","suggestChartType","description","sampleData","generateInsights","chartType","useFormGeneration","useTextImprovement","improveText","translate","targetLanguage","generateHtml","prompt","NiceEventEmitter","fn","matchesCondition","row","cond","matchesFilter","group","test","applyClientOps","f","totalCount","av","bv","cmp","skip","take","createArrayDataSource","emitter","updated","resolveHeaders","cfg","resolveKeyUrl","pattern","defaultLoadParams","defaultExtractLoadResult","createRestDataSource","doFetch","resp","qs","conditionToOData","version","filterToOData","createODataDataSource","restCfg","odata","createGraphQLDataSource","gql","variables","extra","defaultMapVariables","vars","defaultExtractLoad","total","defaultExtractItem","createCustomDataSource","handlers","NiceDataCache","ttl","oldest","NiceRequestDeduplicator","fetcher","promise","withCaching","cache","byKeyCache","deduplicator","generateKey","cacheLoads","cacheByKey","cacheKey","cached","withCursorPagination","cursorField","pageSize","loadDirection","cursorFilter","decodeCursor","hasMore","lastItem","firstItem","encodeCursor","cursor","page","createInfiniteScroll","initialPage","listeners","notify","partial","loadOptions","loadMore","newItems","reset","handleScroll","createWebSocketDataSource","baseSource","reconnectDelay","maxReconnects","heartbeatInterval","reconnectAttempts","heartbeatTimer","localData","emit","parseMessage","serializeMessage","applyMessage","connect","startHeartbeat","stopHeartbeat","disconnect","sendMessage","local","createSignalRDataSource","connection","methods","handleInsert","handleUpdate","handleRemove","withOptimisticUpdates","pending","opId","generateOpId","tempItem","original","calculateDataDiff","oldData","newData","oldMap","newMap","inserted","removed","unchanged","newItem","oldItem","deepEqual","aObj","bObj","keys","withPolling","autoStart","pauseWhenHidden","onDataChange","pollInterval","lastData","currentOptions","poll","diff","startPolling","stopPolling","wrapped","unsub","createSSEDataSource","withCredentials","eventSource","reconnectTimer","parseEvent","aggregate","specs","groupBy","aggregates","includeItems","sortGroups","groupsMap","keyValues","field","keyStr","aVal","bVal","groupByHierarchical","groupFields","firstField","restFields","groups","pivot","rowFields","columnField","valueField","aggregateFunction","rowTotals","columnTotals","grandTotal","columnHeaders","rowGroups","pivotRows","colHeader","colItems","aggResult","rowAgg","colTotals","grand","withCalculatedColumns","col","ColumnFormulas","all","slice","window","condition","trueValue","falseValue","format","dateValue","validateData","errors","byIndex","byField","rule","errorCount","warningCount","ValidationRules","regex","validate","BatchOperations","itemChanges","remaining","transformer","parallel","batchSize","succeeded","batch","batchResults","j","seen","incoming","updateExisting","addNew","existingMap","existingItem","useNiceDataSource","autoLoad","defPageSize","setData","setTotalCount","setPage","setPageSize","setSort","setFilter","search","setSearch","loadCounter","extraOpts","doLoad","setSortField","handleSetFilter","handleSetSearch","handleSetPageSize","insert","remove","useNiceRecord","setChanges","loadId","editData","isDirty","setMany","ch","save","useNiceField","setValue","fieldChanges","useNiceLookupSource","labelField","rawData","setRawData","searchQuery","rec","opt","createIndexedDBDataSource","indexes","getDB","database","withStore","withStoreCursor","sortField","sortDir","skipped","taken","matchesSearch","count","tx","createOfflineFirstDataSource","remoteSource","offlineConfig","syncStrategy","onConflict","onSync","localSource","pendingStore","isOnline","pendingId","addPendingChange","change","added","remoteResult","localResult","localMap","remoteItem","localItem","withCrossTabSync","channelName","channel","broadcast","createURLStateManager","persist","useHash","getParams","setParams","filterStr","sortStr","NiceStateIO","metadata","snapshot","filename","createUserPreferencesStore","load","defaultValue","THEME_TO_CSS","getNestedValue","themeToCssVars","cssVar","applyTheme","applyBackgroundImage","SVG_PATTERNS","bg","encoded","removeTheme","getComputedTheme","cs","serializeTheme","deserializeTheme","parsed","NiceThemeContext","useNiceTheme","SP","TY","TR","br","SL","SD","lt","bc","dk","themeSlate","themeZinc","themeStone","themeCoolGray","themeWarmGray","themeSilver","themeCharcoal","themeIvory","themeRose","themeEmerald","themeAmber","themeViolet","themeTeal","themeIndigo","themeCyan","themeLime","themePink","themeOrange","themeFuchsia","themeSky","themeRuby","themeCoral","themeMidnight","themeObsidian","themeEclipse","themeOnyx","themeCarbon","themeCosmos","themeNebula","themeAbyss","themeShadow","themeEmeraldDark","themeForest","themeOcean","themeDesert","themeSunset","themeAurora","themeLavender","themeAutumn","themeSpring","themeArctic","themeTropical","themePastelRose","themePastelSky","themePastelMint","themePastelPeach","themePastelLavender","themePastelLemon","themePastelSage","themePastelCoral","themeBanking","themeHealthcare","themeLegal","themeTechStartup","themeEnterprise","themeGovernment","themeEducation","themeRealEstate","themeNord","themeDracula","themeSolarizedLight","themeSolarizedDark","themeMonokai","themeOneDark","themeSynthwave","themeVaporwave","themeTerminalGreen","themeSepia","themeVintage","themeCyberpunk","themeNeon","themeRetrowave","themeChristmas","themeHalloween","themeValentine","themeEaster","themeSummerBeach","themeWinterFrost","themeCherryBlossom","themeHarvest","themeJapaneseZen","themeMoroccan","themeScandinavian","themeMediterranean","themeChineseNewYear","themeIndianFestive","themeBrazilianCarnival","themeAfricanEarth","themeHighContrastDark","themeMonochrome","themeEnhancedContrast","themeLargeText","themeGlassmorphism","themeNeumorphismLight","themeNeumorphismDark","themeMinimalist","themeWarmDark","themeSoftDark","themeCoffee","themeWine","NICE_THEME_GALLERY","BASE_SPACING","BASE_TYPOGRAPHY","BASE_BORDERS_LIGHT","BASE_TRANSITIONS","niceThemeLight","niceThemeDark","niceThemeBlue","niceThemeHighContrast","niceThemeMaterial","niceThemeBootstrap","niceThemeFluent","NICE_THEME_PRESETS","NICE_THEME_PACK_FONT_LINKS","SP_TIGHT","SP_NORMAL","SP_AIRY","obsidianEditorial","neonArcade","hyggeScandinavian","brutalistRaw","glassAurora","candyPop","newspaperBroadsheet","synthwave84","zenMinimal","claymorphism","bauhaus","bankVault","NICE_THEME_PACKS","NICE_THEME_PACK_LIST","getNiceThemePack","filterNiceThemePacksByTag","tag","NICE_THEME_PACK_FONT_LINKS_EXTENDED","SP_GENEROUS","forestCanopy","desertDune","arcticCrystal","autumnFoliage","japaneseWashi","moroccanMosaic","artDecoGatsby","sovietConstructivist","blueprint","hologramUI","deepSea","analog70s","vhsTracking","typewriterPress","y2kAqua","vogueDidone","comicHalftone","zinePunk","watercolorWash","memphis80s","inkSumie","dieterRams","blackTieGala","swissGrid","NICE_THEME_PACKS_EXTENDED","NICE_THEME_PACK_LIST_EXTENDED","getNiceThemePackExtended","filterNiceThemePacksExtendedByTag","pickInitialDisplayStyle","NiceThemeProvider","darkTheme","variantConfig","darkMode","displayStyleProp","animateTransitions","rawId","portalHostRef","portalHost","setPortalHost","currentTheme","setCurrentTheme","systemDark","setSystemDark","displayStyle","setDisplayStyle","resolvedDarkMode","host","attrs","handleSetTheme","displayStyleValue","ThemeVariantContext","useThemeVariants","NiceThemeVariantProvider","autoApply","applyPreset","presetName","NiceThemeVariantConfigurator","showPresets","showPreview","showCSS","collapsible","expandedSections","setExpandedSections","toggleSection","isSectionExpanded","Section","OptionGroup","VariantPreview","onChange","renderPreview","buttonStyles","inputStyles","cardStyles","useThemeIsDark","setIsDark","detectDark","onMq","attr","textColor","NICE_VIEW_COMPONENT_TYPES","validateViewDocument","doc","validateNode","dsIds","checkBindingRefs","dsId","child","evaluateCondition","fieldValue","resolveField","part","useVirtualScroll","itemCount","itemHeight","containerHeight","overscan","initialScrollTop","scrollTop","setScrollTop","isScrolling","setIsScrolling","scrollingTimeoutRef","itemOffsets","offsets","totalHeight","getItemHeight","getItemOffset","findStartIndex","scrollOffset","low","high","mid","startIndex","endIndex","visibleItems","end","accumulatedHeight","onScroll","scrollToIndex","align","itemSize","targetOffset","scrollTo","useVirtualGrid","rowCount","columnCount","rowHeight","columnWidth","containerWidth","scrollLeft","setScrollLeft","totalWidth","visibleCells","cells","rowStart","accHeight","rowEnd","visibleHeight","colStart","accWidth","colEnd","visibleWidth","cellHeight","cellWidth","useWindowedList","getItemData","virtualItem","useDeferredSearch","searchFn","debounce","minLength","setQuery","deferredQuery","useDeferredValue","debouncedQuery","setDebouncedQuery","debounceRef","useTransitionState","initialValue","setValueRaw","pendingValue","setPendingValue","isPending","startTransitionFn","useTransition","setValueImmediate","useChunkedProcessor","processFn","chunkSize","setResult","progress","setProgress","isProcessing","setIsProcessing","abortRef","process","chunkResults","newProgress","startTransition","useDeferredList","initialCount","batchDelay","visibleCount","setVisibleCount","isComplete","setIsComplete","useOptimistic","initial","mutate","rollbackOnError","setIsPending","previousValueRef","useWorker","workerScript","idleTimeout","workerRef","taskIdRef","currentTaskRef","idleTimeoutRef","getWorker","resetIdleTimeout","execute","worker","taskId","originalOnMessage","terminate","useWorkerPool","poolSize","workersRef","queueRef","createWorker","getAvailableWorker","idle","w","pooledWorker","processQueue","available","task","x","executeAll","terminateAll","getStats","createInlineWorker","workerCode","getTransferables","transferables","extract","createWeakCache","createLRUCache","isExpired","evictOldest","keysToDelete","createWeakRefCache","registry","useEventCleanup","add","removeAll","createEventCleanup","getMemoryStats","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","useMemoryMonitorPerf","warningThreshold","onHighUsage","isHighUsage","setIsHighUsage","newStats","highUsage","useLazyImage","src","rootMargin","progressive","isInView","setIsInView","isLoaded","setIsLoaded","currentSrc","setCurrentSrc","createObjectPool","create","pool","needed","formatSupport","checkFormatSupport","testImages","useImageFormats","formats","setFormats","isChecking","setIsChecking","avif","webp","generateSrcset","sources","generateSizes","defaultSize","selectOptimalSource","dpr","targetWidth","sorted","useProgressiveImage","lqip","blurRadius","onLoad","onError","timeoutId","loadImage","preloadImages","urls","useImagePreload","loaded","updateState","loadAndDecodeImage","useDecodedImage","image","setImage","cancelled","createImageObserver","callbacks","useSharedImageObserver","onIntersect","generateColorPlaceholder","generateGradientPlaceholder","ImageOptimization"],"mappings":";;;;AAWA,MAAMA,KAA4C;AAAA,EAChD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT,GAEMC,yBAAmB,IAAA;AAMlB,SAASC,GAAcC,GAA0BC,GAAkC;AACxF,MAAI,CAACD;AACH,WAAO;AAET,QAAME,IAASL,GAAgBG,CAAI;AACnC,MAAIE,GAAQ;AACV,QAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,YAAMC,IAAM,GAAGF,KAAiB,EAAE,IAAID,CAAI;AAC1C,MAAKF,GAAa,IAAIK,CAAG,MACvBL,GAAa,IAAIK,CAAG,GACpB,QAAQ;AAAA,QACN,+BAA+BH,CAAI,IAAIC,IAAgB,QAAQA,CAAa,MAAM,EAAE,UAC1EC,CAAM;AAAA,MAAA;AAAA,IAGtB;AACA,WAAOA;AAAA,EACT;AACA,SAAOF;AACT;AC1CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmJO,MAAMI,KAA+D;AAAA,EAC1E,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAEV,GAKaC,KAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR,GAKaC,KAAyD;AAAA,EACpE,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR,GAKaC,KAAiE;AAAA,EAC5E,SAAS;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,EAAA;AAAA,EAEhB,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,EAAA;AAAA,EAEhB,UAAU;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,EAAA;AAElB,GAKaC,KAAuE;AAAA,EAClF,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,EAAA;AAAA,EAEjB,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,EAAA;AAAA,EAEjB,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,EAAA;AAAA,EAEjB,SAAS;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,EAAA;AAAA,EAEjB,UAAU;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,EAAA;AAEnB;AASO,SAASC,GACdC,GACAC,GACAC,GACwB;AACxB,UAAQF,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,YAAYC;AAAA,MAAA;AAAA,IAGhB,KAAK;AACH,aAAO;AAAA,QACL,YAAY,2BAA2BA,CAAY,QAAQC,KAAkBC,EAAYF,GAAc,GAAG,CAAC;AAAA,MAAA;AAAA,IAG/G,KAAK;AACH,aAAO;AAAA,QACL,YAAY,uCAAuCA,CAAY,QAAQC,KAAkBC,EAAYF,GAAc,GAAG,CAAC;AAAA,MAAA;AAAA,IAG3H,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,QAAQ;AAAA,MAAA;AAAA,IAGZ,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,QAAQ;AAAA,MAAA;AAAA,IAGZ,KAAK;AACH,aAAO;AAAA,QACL,iBAAiB,6HAA6H,mBAAmBA,CAAY,CAAC;AAAA,QAC9K,iBAAiB;AAAA,MAAA;AAAA,IAGrB,KAAK;AACH,aAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,qBAAqB;AAAA,QACrB,iBAAiBA;AAAA,MAAA;AAAA,IAGrB,KAAK;AACH,aAAO;AAAA,QACL,YAAY,+BAA+BA,CAAY,KAAKC,KAAkBC,EAAYF,GAAc,GAAG,CAAC,KAAKA,CAAY;AAAA,MAAA;AAAA,IAGjI,KAAK;AACH,aAAO;AAAA,QACL,YAAY,+BAA+BA,CAAY,qDAAqDC,KAAkBC,EAAYF,GAAc,EAAE,CAAC,qDAAqDE,EAAYF,GAAc,GAAG,CAAC;AAAA,QAC9O,iBAAiB;AAAA,MAAA;AAAA,IAGrB;AACE,aAAO,EAAE,YAAYA,EAAA;AAAA,EAAa;AAExC;AASO,SAASG,GACdJ,GACAK,GACwB;AACxB,QAAMC,IAAO;AAAA,IACX,YAAY;AAAA,EAAA;AAGd,UAAQN,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,GAAGM;AAAA,QACH,YAAYD;AAAA,QACZ,WAAW;AAAA,QACX,QAAQ;AAAA,MAAA;AAAA,IAGZ,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAYD;AAAA,QACZ,WAAW;AAAA,QACX,QAAQ;AAAA,MAAA;AAAA,IAGZ,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ,aAAaD,CAAK;AAAA,QAC1B,OAAAA;AAAA,MAAA;AAAA,IAGJ,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAAD;AAAA,MAAA;AAAA,IAGJ,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY,GAAGD,CAAK;AAAA,QACpB,QAAQ;AAAA,QACR,OAAAA;AAAA,MAAA;AAAA,IAGJ,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY,2BAA2BD,CAAK,QAAQF,EAAYE,GAAO,GAAG,CAAC;AAAA,QAC3E,QAAQ;AAAA,QACR,WAAW,cAAcA,CAAK;AAAA,MAAA;AAAA,IAGlC,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAYD;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW,WAAWF,EAAYE,GAAO,GAAG,CAAC;AAAA,QAC7C,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAAD;AAAA,MAAA;AAAA,IAGJ,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAYD;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAAA,IAGlB,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAAD;AAAA,QACA,gBAAgB;AAAA,QAChB,SAAS;AAAA,MAAA;AAAA,IAGb,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAYD;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAc;AAAA,MAAA;AAAA,IAGlB;AACE,aAAOC;AAAA,EAAA;AAEb;AAKO,SAASC,GAAoBP,GAAoD;AACtF,QAAMM,IAAO;AAAA,IACX,YAAY;AAAA,EAAA;AAGd,UAAQN,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,GAAGM;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,MAAA;AAAA,IAGlB,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,MAAA;AAAA,IAGlB,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,cAAc;AAAA,QACd,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAAA,IAGlB,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,MAAA;AAAA,IAGhB,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,MAAA;AAAA,IAGlB,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WACE;AAAA,MAAA;AAAA,IAGN,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAAA,IAGlB,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,IAGb;AACE,aAAOA;AAAA,EAAA;AAEb;AAKO,SAASE,GAAmBR,GAAmD;AACpF,QAAMM,IAAO;AAAA,IACX,YAAY;AAAA,EAAA;AAGd,UAAQN,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,GAAGM;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YACE;AAAA,QACF,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAGf,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAc;AAAA,MAAA;AAAA,IAGlB;AACE,aAAOA;AAAA,EAAA;AAEb;AAOO,SAASG,GACdT,GACAK,GACwB;AACxB,QAAMC,IAAO;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAEd,UAAQN,GAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,GAAGM,GAAM,YAAYD,GAAO,OAAO,QAAQ,SAAS,WAAW,cAAc,MAAA;AAAA,IACxF,KAAK;AACH,aAAO,EAAE,GAAGC,GAAM,YAAY,GAAGD,CAAK,MAAM,OAAAA,GAAO,SAAS,WAAW,cAAc,MAAA;AAAA,IACvF,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ,aAAaD,CAAK;AAAA,QAC1B,OAAAA;AAAA,QACA,SAAS;AAAA,QACT,cAAc;AAAA,MAAA;AAAA,IAElB,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAYD;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS;AAAA,MAAA;AAAA,IAEb,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAYD;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,MAAA;AAAA,IAElB,KAAK;AACH,aAAO;AAAA,QACL,GAAGC;AAAA,QACH,YAAY,2BAA2BD,CAAK,KAAKF,EAAYE,GAAO,GAAG,CAAC;AAAA,QACxE,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,MAAA;AAAA,IAElB;AACE,aAAOC;AAAA,EAAA;AAEb;AAGO,SAASI,GACdV,GACAW,GACwB;AACxB,UAAQX,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,cAAc,aAAaW,CAAW;AAAA,QACtC,YAAY;AAAA,QACZ,OAAOA;AAAA,MAAA;AAAA,IAEX,KAAK;AACH,aAAO;AAAA,QACL,YAAYA;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,MAAA;AAAA,IAEb,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,cAAc;AAAA,MAAA;AAAA,IAElB,KAAK;AACH,aAAO;AAAA,QACL,YAAY,GAAGA,CAAW;AAAA,QAC1B,OAAOA;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,MAAA;AAAA,IAEb,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,cAAc;AAAA,QACd,WAAW;AAAA,MAAA;AAAA,IAEf,KAAK;AACH,aAAO;AAAA,QACL,QAAQ,aAAaA,CAAW;AAAA,QAChC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,cAAc;AAAA,MAAA;AAAA,IAElB;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;AAGO,SAASC,GAAqBZ,GAAqD;AACxF,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,cAAc,QAAQ,OAAO,QAAQ,QAAQ,OAAA;AAAA,IACxD,KAAK;AACH,aAAO;AAAA,QACL,cAAc;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IAEf,KAAK;AACH,aAAO,EAAE,cAAc,OAAO,OAAO,QAAQ,QAAQ,OAAA;AAAA,IACvD,KAAK;AACH,aAAO,EAAE,cAAc,UAAU,OAAO,QAAQ,QAAQ,OAAA;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,cAAc,KAAK,OAAO,QAAQ,QAAQ,OAAA;AAAA,IACrD;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;AAGO,SAASa,GAAsBb,GAAsD;AAC1F,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,MAAA;AAAA,IAEf,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,MAAA;AAAA,IAEZ,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,MAAA;AAAA,IAEb,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,MAAA;AAAA,IAEb,KAAK;AACH,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,QACT,QAAQ;AAAA,MAAA;AAAA,IAEZ;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;AAGO,SAASc,GAAoBd,GAAoD;AACtF,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,gBAAgB,WAAA;AAAA,IAC3B,KAAK;AACH,aAAO,EAAE,gBAAgB,WAAA;AAAA,IAC3B,KAAK;AACH,aAAO,EAAE,QAAQ,6CAA6C,gBAAgB,WAAA;AAAA,IAChF,KAAK;AACH,aAAO,EAAE,gBAAgB,YAAY,UAAU,YAAA;AAAA,IACjD,KAAK;AACH,aAAO,EAAE,gBAAgB,WAAA;AAAA,IAC3B,KAAK;AACH,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAAA;AAAA,IAElB;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;AAiDO,MAAMe,IAA6C;AAAA,EACxD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AACX,GAKaC,KAAsD;AAAA,EACjE,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA;AAAA,EAMX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,cAAc;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA;AAAA,EAGX,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAEb;AAeO,SAASC,GAAmBC,GAA4BC,IAAmB,SAAiB;AACjG,QAAMC,IAAS1B,GAAcwB,EAAO,MAAM,GACpCG,IAASH,EAAO,QAChBI,IAAUzB,GAAeqB,EAAO,OAAO,GACvCK,IAAYzB,GAAiBoB,EAAO,SAAS,GAE7CM,IAAkB,CAAC,GAAGL,CAAQ,IAAI;AAGxC,aAAW,CAAC1B,GAAKgC,CAAK,KAAK,OAAO,QAAQL,CAAM;AAC9C,IAAAI,EAAM,KAAK,kBAAkB/B,CAAG,KAAKgC,CAAK,GAAG;AAI/C,EAAAD,EAAM,KAAK,mBAAmB7B,GAAc0B,CAAM,CAAC,GAAG,GACtDG,EAAM,KAAK,wBAAwB5B,GAAwByB,CAAM,CAAC,GAAG;AAGrE,aAAW,CAAC5B,GAAKgC,CAAK,KAAK,OAAO,QAAQH,CAAO,GAAG;AAClD,UAAMI,IAASjC,EAAI,QAAQ,YAAY,KAAK,EAAE,YAAA;AAC9C,IAAA+B,EAAM,KAAK,WAAWE,CAAM,KAAKD,CAAK,GAAG;AAAA,EAC3C;AAGA,aAAW,CAAChC,GAAKgC,CAAK,KAAK,OAAO,QAAQF,CAAS,GAAG;AACpD,UAAMG,IAASjC,EAAI,QAAQ,YAAY,KAAK,EAAE,YAAA;AAC9C,IAAA+B,EAAM,KAAK,qBAAqBE,CAAM,KAAKD,CAAK,GAAG;AAAA,EACrD;AAGA,SAAIP,EAAO,mBACTM,EAAM,KAAK,0BAA0BN,EAAO,eAAe,KAAK,GAG9DA,EAAO,qBACTM,EAAM,KAAK,uBAAuBN,EAAO,iBAAiB,GAAG,GAG/DM,EAAM,KAAK,GAAG,GAEPA,EAAM,KAAK;AAAA,CAAI;AACxB;AAeO,SAASG,GACdT,GACAU,IAAuB,SAAS,iBAChCC,GACM;AACN,QAAMV,IAAWU,IAAU,uBAAuBA,CAAO,OAAO,SAC1DC,IAAYD,IAAU,sBAAsBA,CAAO,KAAK,sBAExDE,IAAMd,GAAmBC,GAAQC,CAAQ;AAG/C,MAAIa,IAAU,SAAS,eAAeF,CAAS;AAC/C,EAAKE,MACHA,IAAU,SAAS,cAAc,OAAO,GACxCA,EAAQ,KAAKF,GACb,SAAS,KAAK,YAAYE,CAAO,IAGnCA,EAAQ,cAAcD,GAElBF,KACFD,EAAQ,aAAa,qBAAqBC,CAAO,GAInDD,EAAQ,QAAQ,YAAYV,EAAO,QACnCU,EAAQ,QAAQ,YAAYV,EAAO,QACnCU,EAAQ,QAAQ,UAAUV,EAAO,MACjCU,EAAQ,QAAQ,YAAYV,EAAO,aACnCU,EAAQ,QAAQ,WAAWV,EAAO,YAClCU,EAAQ,QAAQ,UAAUV,EAAO,WACjCU,EAAQ,QAAQ,eAAeV,EAAO,WACtCU,EAAQ,QAAQ,aAAaV,EAAO,SAChCA,EAAO,eACTU,EAAQ,QAAQ,WAAWV,EAAO,aAEhCA,EAAO,aACTU,EAAQ,QAAQ,SAASV,EAAO,WAE9BA,EAAO,gBACTU,EAAQ,QAAQ,YAAYV,EAAO,cAEjCA,EAAO,iBACTU,EAAQ,QAAQ,aAAaV,EAAO,eAElCA,EAAO,eACTU,EAAQ,QAAQ,WAAWV,EAAO,aAEhCA,EAAO,eACTU,EAAQ,QAAQ,WAAWV,EAAO,aAEhCA,EAAO,cACTU,EAAQ,QAAQ,UAAUV,EAAO;AAErC;AASO,SAASe,GAAoBJ,GAAiBD,GAA6B;AAChF,QAAMI,IAAU,SAAS,eAAe,sBAAsBH,CAAO,EAAE;AACvE,EAAIG,KACFA,EAAQ,OAAA,GAENJ,KACFA,EAAQ,gBAAgB,mBAAmB;AAE/C;AASA,SAASzB,EAAYE,GAAe6B,GAAwB;AAE1D,MAAI7B,EAAM,WAAW,GAAG,GAAG;AACzB,UAAM8B,IAAM9B,EAAM,MAAM,CAAC,GACnB+B,IAAM,SAASD,GAAK,EAAE,GACtBE,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAOD,KAAO,KAAM,OAAOF,CAAM,CAAC,GAC3DI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAOF,KAAO,IAAK,OAAOF,CAAM,CAAC,GAC1DK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAMH,IAAM,OAAOF,CAAM,CAAC;AACzD,WAAO,KAAMG,KAAK,KAAOC,KAAK,IAAKC,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,EACrE;AACA,SAAOlC;AACT;AAMO,SAASmC,GACdC,GACAvB,GACmD;AACnD,QAAMwB,IAAe,EAAE,GAAG3B,GAAwB,GAAGG,EAAA;AAErD,SAAO;AAAA,IACL,GAAGuB;AAAA,IACH,eAAeC;AAAA,EAAA;AAEnB;ACr5DO,MAAMC,KAA0C;AAAA;AAAA,EAErD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAASC,GAA0BC,GAA6C;AACrF,SAAIA,MAAU,YACL9B,IAEFC,GAAgB6B,CAAK,KAAK9B;AACnC;AA4BO,MAAM+B,KAA0BC,EAA4C;AAAA,EACjF,cAAc;AAAA,EACd,eAAehC;AAAA,EACf,iBAAiB,MAAM;AAAA,EAAC;AAC1B,CAAC;AAOM,SAASiC,KAAoD;AAClE,SAAOC,EAAWH,EAAuB;AAC3C;AAMO,SAASI,GAAwBC,GAGtC;AACA,QAAMC,IAAMH,EAAWH,EAAuB,GACxCO,IAAYF,KAAaC,EAAI,gBAAgB,WAC7ClC,IAAS0B,GAA0BS,CAAS;AAClD,SAAO,EAAE,OAAOA,GAAW,QAAAnC,EAAA;AAC7B;AAUO,SAASoC,GACdC,GACAJ,GACAlD,IAAe,iCACM;AACrB,QAAM,EAAE,QAAAiB,EAAA,IAAWgC,GAAwBC,CAAS;AACpD,SAAOK,GAA4BD,GAAerC,GAAQjB,CAAY;AACxE;AAMO,SAASwD,GACdF,GACAJ,GACQ;AACR,QAAM,EAAE,QAAAjC,EAAA,IAAWgC,GAAwBC,CAAS;AACpD,UAAQI,GAAA;AAAA,IACN,KAAK;AACH,aAAOrC,EAAO;AAAA,IAChB,KAAK;AACH,aAAOA,EAAO;AAAA,IAChB,KAAK;AACH,aAAOA,EAAO;AAAA,IAChB,KAAK;AACH,aAAOA,EAAO,cAAc;AAAA,IAC9B,KAAK;AACH,aAAOA,EAAO,YAAY;AAAA,IAC5B,KAAK;AACH,aAAOA,EAAO,eAAe;AAAA,IAC/B,KAAK;AACH,aAAOA,EAAO,gBAAgB;AAAA,IAChC,KAAK;AACH,aAAOA,EAAO,cAAc;AAAA,IAC9B,KAAK;AACH,aAAOA,EAAO,cAAc;AAAA,IAC9B,KAAK;AACH,aAAOA,EAAO,aAAa;AAAA,IAC7B;AACE,aAAO;AAAA,EAAA;AAEb;AAKO,SAASwC,GAAkBP,GAAmD;AACnF,QAAM,EAAE,QAAAjC,EAAA,IAAWgC,GAAwBC,CAAS,GAC9CQ,IAAI9D,GAAeqB,EAAO,OAAO;AACvC,SAAO;AAAA,IACL,mBAAmByC,EAAE;AAAA,IACrB,mBAAmBA,EAAE;AAAA,IACrB,aAAaA,EAAE;AAAA,IACf,mBAAmBA,EAAE;AAAA,IACrB,qBAAqBA,EAAE;AAAA,IACvB,sBAAsBA,EAAE;AAAA,IACxB,uBAAuBA,EAAE;AAAA,EAAA;AAE7B;AAKO,SAASC,GAAoBT,GAAmD;AACrF,QAAM,EAAE,QAAAjC,EAAA,IAAWgC,GAAwBC,CAAS,GAC9CU,IAAI/D,GAAiBoB,EAAO,SAAS;AAC3C,SAAO;AAAA,IACL,uBAAuB2C,EAAE;AAAA,IACzB,qBAAqBA,EAAE;AAAA,IACvB,qBAAqBA,EAAE;AAAA,IACvB,qBAAqBA,EAAE;AAAA,EAAA;AAE3B;AAQO,SAASL,GACdD,GACArC,GACAjB,IAAe,WACM;AACrB,UAAQsD,GAAA;AAAA,IACN,KAAK;AACH,aAAOnD,GAAqBc,EAAO,aAAajB,CAAY;AAAA,IAC9D,KAAK;AACH,aAAOM,GAAoBW,EAAO,UAAU;AAAA,IAC9C,KAAK;AACH,aAAOV,GAAmBU,EAAO,SAAS;AAAA,IAC5C,KAAK;AACH,aAAOT,GAAoBS,EAAO,cAAc,SAASjB,CAAY;AAAA,IACvE,KAAK;AACH,aAAOS,GAAkBQ,EAAO,YAAY,aAAajB,CAAY;AAAA,IACvE,KAAK;AACH,aAAOW,GAAqBM,EAAO,eAAe,SAAS;AAAA,IAC7D,KAAK;AACH,aAAOL,GAAsBK,EAAO,gBAAgB,MAAM;AAAA,IAC5D,KAAK;AACH,aAAOJ,GAAoBI,EAAO,cAAc,SAAS;AAAA,IAC3D,KAAK;AACH,aAAO,CAAA;AAAA,IACT,KAAK;AACH,aAAO,CAAA;AAAA,IACT;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;AAMO,SAAS4C,GAAyBjB,GAAiD;AACxF,QAAM3B,IAAS0B,GAA0BC,CAAK;AAC9C,SAAO;AAAA,IACL,0BAA0BA;AAAA,IAC1B,oBAAoB3B,EAAO;AAAA,IAC3B,sBAAsBA,EAAO;AAAA,IAC7B,mBAAmBA,EAAO;AAAA,IAC1B,mBAAmBA,EAAO;AAAA,IAC1B,kBAAkBA,EAAO;AAAA,IACzB,iBAAiBA,EAAO;AAAA,EAAA;AAE5B;AAcO,MAAM6C,KAAkD;AAAA;AAAA,EAE7D;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA;AAAA,EAGb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA;AAAA,EAGb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA;AAAA,EAGb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA;AAAA,EAGb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA;AAAA,EAGb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAEf;ACzwBO,SAASC,GAAmB;AAAA,EACjC,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AACF,GAAgD;AAC9C,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtCC,IAAeC,EAAO,EAAK,GAE3BC,IAAYC,EAAY,MAAM;AAClC,IAAIR,KAAYC,KAAY,CAACF,MAG7BM,EAAa,UAAU,IACvBF,EAAW,EAAI;AAAA,EACjB,GAAG,CAACH,GAAUC,GAAUF,CAAO,CAAC,GAE1BU,IAAWD,EAAY,MAAM;AACjC,IAAAL,EAAW,EAAK;AAAA,EAClB,GAAG,CAAA,CAAE,GAECO,IAAeF,EAAY,CAACG,MAA6B;AAC7D,IAAIA,KAAQN,EAAa,YACvBA,EAAa,UAAU,IAEvB,sBAAsB,MAAM;AAE1B,UADAM,EAAK,MAAA,GACDA,aAAgB,oBAAoBA,aAAgB;AACtD,YAAI;AACF,UAAAA,EAAK,OAAA;AAAA,QACP,QAAQ;AAAA,QAER;AAAA,IAEJ,CAAC;AAAA,EAEL,GAAG,CAAA,CAAE;AAGL,SAAAC,EAAU,MAAM;AACd,KAAKZ,KAAYC,MAAaC,KAC5BC,EAAW,EAAK;AAAA,EAEpB,GAAG,CAACH,GAAUC,GAAUC,CAAO,CAAC,GAEzB;AAAA,IACL,WAAW,CAAC,CAACH,KAAW,CAACG;AAAA,IACzB,WAAAK;AAAA,IACA,UAAAE;AAAA,IACA,cAAAC;AAAA,EAAA;AAEJ;AAgBO,MAAMG,KAAkD,CAAC;AAAA,EAC9D,OAAAtD;AAAA,EACA,aAAAuD;AAAA,EACA,UAAAb;AAAA,EACA,UAAAD;AAAA,EACA,YAAAe;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC;AACF,MAAM;AACJ,QAAMC,IAAU3D,KAAS,QAAQA,MAAU,IACrC4D,IAAY,CAACC,MAA4C;AAC7D,IAAInB,KAAYD,MAGZoB,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFL,EAAA;AAAA,EAEJ;AACA,SACE,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAUpB,IAAW,KAAK;AAAA,MAC1B,WAAW,sBAAsBiB,IAAU,8BAA8B,EAAE,IACzEjB,IAAW,iCAAiC,EAC9C,IAAID,IAAW,iCAAiC,EAAE,IAAIgB,KAAa,EAAE,GAAG,KAAA;AAAA,MACxE,SAAS,MAAM;AACb,QAAI,CAACf,KAAY,CAACD,KAChBe,EAAA;AAAA,MAEJ;AAAA,MACA,WAAWI;AAAA,MACX,cAAYF;AAAA,MACZ,iBAAehB,KAAY;AAAA,MAE1B,UAAAiB,IAAWJ,KAAe,MAAOvD;AAAA,IAAA;AAAA,EAAA;AAGxC;AChIO,SAAS+D,GAAaC,GAAsB;AACjD,MAAI,CAACA;AACH,WAAO;AAET,MAAIC,IAASD;AAEb,SAAAC,IAASA,EAAO,QAAQ,uDAAuD,EAAE,GAEjFA,IAASA,EAAO,QAAQ,gDAAgD,EAAE,GAE1EA,IAASA,EAAO;AAAA,IACd;AAAA,IACA;AAAA,EAAA,GAEFA,IAASA,EAAO;AAAA,IACd;AAAA,IACA;AAAA,EAAA,GAGFA,IAASA,EAAO,QAAQ,4CAA4C,EAAE,GAC/DA;AACT;AAOO,SAASC,GAAUC,GAAsB;AAC9C,QAAMC,IAAUD,EAAI,KAAA,EAAO,YAAA;AAW3B,SATE,GAAAC,EAAQ,WAAW,SAAS,KAC5BA,EAAQ,WAAW,UAAU,KAC7BA,EAAQ,WAAW,OAAO,KAIxBA,EAAQ,WAAW,aAAa,KAGhCA,EAAQ,WAAW,GAAG,KAAKA,EAAQ,WAAW,IAAI,KAAKA,EAAQ,WAAW,KAAK;AAIrF;AC/CA,MAAMC,KAAwC;AAAA;AAAA,EAE5C,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA;AAAA,EAGd,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OACE;AAAA,EACF,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA;AAAA,EAGT,QAAQ;AAAA,EACR,QACE;AAAA,EACF,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,UACE;AAAA,EACF,KAAK;AAAA,EACL,WACE;AAAA,EACF,MAAM;AAAA;AAAA,EAGN,MAAM;AAAA,EACN,SACE;AAAA,EACF,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA;AAAA,EAGN,UACE;AAAA,EACF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OACE;AAAA,EACF,MAAM;AAAA,EACN,OACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA;AAAA,EAGN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA;AAAA,EAGN,QACE;AAAA,EACF,UACE;AAAA,EACF,iBAAiB;AACnB,GAQMC,KAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GA2BMC,KAAkBjD,EAAoC,EAAE,GAajDkD,KAAoD,CAAC,EAAE,UAAAC,GAAU,UAAAC,QACrEC,GAAM,cAAcJ,GAAgB,UAAU,EAAE,OAAO,EAAE,UAAAE,IAAS,GAAKC,CAAQ;AAMxF,SAASE,GAAe;AAAA,EACtB,MAAAC;AAAA,EACA,MAAAhH;AAAA,EACA,WAAA4F;AAAA,EACA,OAAArC;AAAA,EACA,OAAAxC;AAAA,EACA,OAAAkG;AAAA,EACA,SAAAC;AACF,GAQG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAOnH;AAAA,MACP,QAAQA;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAQe,KAAS;AAAA,MACjB,aAAa;AAAA,MACb,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAW,aAAa6E,KAAa,EAAE;AAAA,MACvC,OAAArC;AAAA,MACA,MAAM0D,IAAQ,QAAQ;AAAA,MACtB,cAAYA;AAAA,MACZ,eAAa,CAACA;AAAA,MACd,SAAAC;AAAA,MAEC,UAAA;AAAA,QAAAD,KAAS,gBAAAhB,EAAC,WAAO,UAAAgB,EAAA,CAAM;AAAA,QACxB,gBAAAhB,EAAC,QAAA,EAAK,GAAGe,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGrB;AASO,MAAMI,KAAoC,CAAC;AAAA,EAChD,MAAAC;AAAA,EACA,MAAArH,IAAO;AAAA,EACP,WAAA4F;AAAA,EACA,OAAArC;AAAA,EACA,OAAAxC;AAAA,EACA,OAAAkG;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAM,EAAE,UAAAN,EAAA,IAAajD,EAAW+C,EAAe,GACzCY,IAAS,OAAOtH,KAAS,WAAWA,IAAOyG,GAAWzG,CAAI;AAGhE,MAAI4G,GAAU;AACZ,UAAMW,IAAWX,EAASS,GAAMC,CAAM;AACtC,QAAIC;AACF,aACE,gBAAAtB,EAAC,UAAK,WAAW,kBAAkBL,KAAa,EAAE,IAAI,OAAArC,GAAc,SAAA2D,GACjE,UAAAK,EAAA,CACH;AAAA,EAGN;AAGA,QAAMP,IAAOR,GAAca,CAAI;AAC/B,SAAIL,IAEA,gBAAAf;AAAA,IAACc;AAAA,IAAA;AAAA,MACC,MAAAC;AAAA,MACA,MAAMM;AAAA,MACN,WAAA1B;AAAA,MACA,OAAArC;AAAA,MACA,OAAAxC;AAAA,MACA,OAAAkG;AAAA,MACA,SAAAC;AAAA,IAAA;AAAA,EAAA,IAMC;AACT;AASO,SAASM,KAAc;AAC5B,QAAM,EAAE,UAAAZ,EAAA,IAAajD,EAAW+C,EAAe;AAkB/C,SAAO,EAAE,YAhBUtB;AAAA,IACjB,CACEqC,GACAzH,IAA8B,SAEJyH,KAAS,OAC1B,OAEL,OAAOA,KAAS,WACXA,IAEFX,GAAM,cAAcM,IAAU,EAAE,MAAMK,GAAM,MAAAzH,GAAM;AAAA,IAE3D,CAAC4G,CAAQ;AAAA,EAAA,EAGF;AACX;AAGO,MAAMc,KAAqB,OAAO,KAAKlB,EAAa;ACxQpD,SAASmB,KAA4B;AAC1C,QAAM,CAACC,GAASC,CAAU,IAAI7C;AAAA,IAAS,MACrC,OAAO,SAAW,MAAc,OAAO,WAAW,mBAAmB,EAAE,UAAU;AAAA,EAAA;AAEnF,SAAAQ,EAAU,MAAM;AACd,UAAMsC,IAAK,OAAO,WAAW,mBAAmB;AAChD,IAAAD,EAAWC,EAAG,OAAO;AACrB,UAAMC,IAAU,CAAC/B,MAA2B6B,EAAW7B,EAAE,OAAO;AAChE,WAAA8B,EAAG,iBAAiB,UAAUC,CAAO,GAC9B,MAAMD,EAAG,oBAAoB,UAAUC,CAAO;AAAA,EACvD,GAAG,CAAA,CAAE,GACEH;AACT;AAMO,SAASI,KAAkC;AAChD,QAAM,CAACC,GAAMC,CAAO,IAAIlD;AAAA,IAA4B,MAClD,OAAO,SAAW,OAAe,OAAO,WAAW,mBAAmB,EAAE,UACpE,UACA;AAAA,EAAA;AAEN,SAAAQ,EAAU,MAAM;AACd,UAAM2C,IAAU,MAAMD,EAAQ,OAAO,GAC/BE,IAAU,CAACpC,MAAoB;AACnC,MAAIA,EAAE,gBAAgB,WACpBkC,EAAQ,OAAO;AAAA,IAEnB;AACA,kBAAO,iBAAiB,cAAcC,GAAS,EAAE,SAAS,IAAM,SAAS,IAAM,GAC/E,OAAO,iBAAiB,eAAeC,GAAS,EAAE,SAAS,IAAM,GAC1D,MAAM;AACX,aAAO,oBAAoB,cAAcD,GAAS,EAAE,SAAS,IAA8B,GAC3F,OAAO,oBAAoB,eAAeC,GAAS,EAAE,SAAS,IAA8B;AAAA,IAC9F;AAAA,EACF,GAAG,CAAA,CAAE,GACEH;AACT;AAQO,SAASI,GACdC,GACAC,IAAS,KAKT;AACA,QAAMC,IAAWtD,EAA6C,IAAI,GAC5DuD,IAAQrD,EAAY,MAAM;AAC9B,IAAIoD,EAAS,YACX,aAAaA,EAAS,OAAO,GAC7BA,EAAS,UAAU;AAAA,EAEvB,GAAG,CAAA,CAAE;AAWL,SAAO,EAAE,eAVapD;AAAA,IACpB,CAACY,MAA0B;AACzB,MAAIA,EAAE,gBAAgB,YAGtByC,EAAA,GACAD,EAAS,UAAU,WAAWF,GAAUC,CAAM;AAAA,IAChD;AAAA,IACA,CAACD,GAAUC,GAAQE,CAAK;AAAA,EAAA,GAEF,aAAaA,GAAO,iBAAiBA,EAAA;AAC/D;AAOO,SAASC,GAAaC,GAA6B;AACxD,QAAMC,IAAYC,GAAA;AAClB,SAAOF,KAAcC;AACvB;AAQO,SAASE,GAAqB3G,GAAU4G,GAAoB;AACjE,QAAM,CAACC,GAAWC,CAAY,IAAIjE,EAAS7C,CAAK;AAChD,SAAAqD,EAAU,MAAM;AACd,UAAM0D,IAAQ,WAAW,MAAMD,EAAa9G,CAAK,GAAG4G,CAAO;AAC3D,WAAO,MAAM,aAAaG,CAAK;AAAA,EACjC,GAAG,CAAC/G,GAAO4G,CAAO,CAAC,GACZC;AACT;AAOO,SAASG,GAAgBC,GAA0CrB,GAAqB;AAC7F,EAAAvC,EAAU,MAAM;AACd,UAAM6D,IAAW,CAACrD,MAA+B;AAC/C,MAAI,CAACoD,EAAI,WAAWA,EAAI,QAAQ,SAASpD,EAAE,MAAc,KAGzD+B,EAAA;AAAA,IACF;AACA,oBAAS,iBAAiB,aAAasB,CAAQ,GAC/C,SAAS,iBAAiB,cAAcA,CAAQ,GACzC,MAAM;AACX,eAAS,oBAAoB,aAAaA,CAAQ,GAClD,SAAS,oBAAoB,cAAcA,CAAQ;AAAA,IACrD;AAAA,EACF,GAAG,CAACD,GAAKrB,CAAO,CAAC;AACnB;AASO,SAASuB,GAAaF,GAA0CG,GAAiB;AACtF,EAAA/D,EAAU,MAAM;AACd,QAAI,CAAC+D,KAAU,CAACH,EAAI;AAClB;AAEF,UAAMI,IAAKJ,EAAI,SAETK,IAAoB,SAAS,eAE7BC,IAAYF,EAAG;AAAA,MACnB;AAAA,IAAA,GAEIG,IAAQD,EAAU,CAAC,GACnBE,IAAOF,EAAUA,EAAU,SAAS,CAAC,GAErCG,IAAO,CAAC7D,MAAqB;AACjC,MAAIA,EAAE,QAAQ,UAGVA,EAAE,WACA,SAAS,kBAAkB2D,MAC7B3D,EAAE,eAAA,GACF4D,KAAA,QAAAA,EAAM,WAGJ,SAAS,kBAAkBA,MAC7B5D,EAAE,eAAA,GACF2D,KAAA,QAAAA,EAAO;AAAA,IAGb;AAEA,WAAAA,KAAA,QAAAA,EAAO,SACPH,EAAG,iBAAiB,WAAWK,CAAI,GAC5B,MAAM;;AACX,MAAAL,EAAG,oBAAoB,WAAWK,CAAI,IAEtCC,IAAAL,KAAA,gBAAAA,EAAmB,UAAnB,QAAAK,EAAA,KAAAL;AAAA,IACF;AAAA,EACF,GAAG,CAACL,GAAKG,CAAM,CAAC;AAClB;AAgDO,SAASQ,GAAYC,IAA8B,IAAuB;AAC/E,QAAM;AAAA,IACJ,aAAAC,IAAc;AAAA,IACd,YAAAC,IAAa;AAAA,IACb,WAAAC,IAAY;AAAA,IACZ,YAAAC,IAAa;AAAA,EAAA,IACXJ,GAGE,CAACK,GAAkBC,CAAmB,IAAItF,EAA2B,MACrE,OAAO,SAAW,MACb,UAEF,OAAO,WAAW,8BAA8B,EAAE,UAAU,SAAS,OAC7E,GAGK,CAACiD,GAAMC,CAAO,IAAIlD,EAAsC,MAAM;AAClE,QAAI,OAAO,SAAW;AACpB,aAAOiF;AAET,UAAMM,IAAS,aAAa,QAAQL,CAAU;AAC9C,WAAIK,MAAW,WAAWA,MAAW,UAAUA,MAAW,WACjDA,IAEFN;AAAA,EACT,CAAC;AAGD,EAAAzE,EAAU,MAAM;AACd,UAAMsC,IAAK,OAAO,WAAW,8BAA8B,GACrDC,IAAU,CAAC/B,MAA2BsE,EAAoBtE,EAAE,UAAU,SAAS,OAAO;AAC5F,WAAA8B,EAAG,iBAAiB,UAAUC,CAAO,GAC9B,MAAMD,EAAG,oBAAoB,UAAUC,CAAO;AAAA,EACvD,GAAG,CAAA,CAAE;AAGL,QAAMyC,IAASvC,MAAS,WAAWoC,MAAqB,SAASpC,MAAS;AAG1E,EAAAzC,EAAU,MAAM;AACd,UAAMiF,IAAO,SAAS;AACtB,WAAID,KACFC,EAAK,UAAU,IAAIN,CAAS,GAC5BM,EAAK,UAAU,OAAOL,CAAU,MAEhCK,EAAK,UAAU,IAAIL,CAAU,GAC7BK,EAAK,UAAU,OAAON,CAAS,IAE1B,MAAM;AACX,MAAAM,EAAK,UAAU,OAAON,GAAWC,CAAU;AAAA,IAC7C;AAAA,EACF,GAAG,CAACI,GAAQL,GAAWC,CAAU,CAAC,GAGlC5E,EAAU,MAAM;AACd,iBAAa,QAAQ0E,GAAYjC,CAAI;AAAA,EACvC,GAAG,CAACA,GAAMiC,CAAU,CAAC;AAErB,QAAMQ,IAAWtF,EAAY,MAAM8C,EAAQ,OAAO,GAAG,CAAA,CAAE,GACjDyC,IAAUvF,EAAY,MAAM8C,EAAQ,MAAM,GAAG,CAAA,CAAE,GAC/C0C,IAAYxF,EAAY,MAAM8C,EAAQ,QAAQ,GAAG,CAAA,CAAE,GACnD2C,IAASzF;AAAA,IACb,MACE8C,EAAQ,CAAC4C,MACHA,MAAS,WACJT,MAAqB,SAAS,UAAU,SAE1CS,MAAS,SAAS,UAAU,MACpC;AAAA,IACH,CAACT,CAAgB;AAAA,EAAA;AAGnB,SAAO,EAAE,QAAAG,GAAQ,MAAAvC,GAAM,kBAAAoC,GAAkB,UAAAK,GAAU,SAAAC,GAAS,WAAAC,GAAW,QAAAC,EAAA;AACzE;AAyCO,SAASE,GACdC,GACAhB,IAAiC,IAKjC;AACA,QAAM,EAAE,YAAAiB,IAAa,GAAG,SAAAC,IAAU,MAAMlB,GAClC,CAACmB,GAAQC,CAAS,IAAIpG,EAA6B,IAAI,GACvD,CAACqG,GAASC,CAAU,IAAItG,EAAS,EAAK,GACtC,CAACuG,GAAOC,CAAQ,IAAIxG,EAAwB,IAAI;AAEtD,SAAAQ,EAAU,MAAM;AACd,QAAI,CAACwF,GAAa;AAChB,MAAAI,EAAU,IAAI;AACd;AAAA,IACF;AA8FA,KA5FsB,YAAY;AAChC,MAAAE,EAAW,EAAI,GACfE,EAAS,IAAI;AAEb,UAAI;AAEF,YAAIC;AACJ,QAAI,OAAOT,KAAgB,YACzBS,IAAM,IAAI,MAAA,GACVA,EAAI,cAAc,aAClB,MAAM,IAAI,QAAc,CAACC,GAASC,MAAW;AAC3C,UAAAF,EAAI,SAAS,MAAMC,EAAA,GACnBD,EAAI,UAAU,MAAME,EAAO,IAAI,MAAM,sBAAsB,CAAC,GAC5DF,EAAI,MAAMT;AAAA,QACZ,CAAC,KAEDS,IAAMT;AAIR,cAAMY,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAU,KACVC,IAAQ,KAAK,IAAID,IAAUJ,EAAI,OAAOI,IAAUJ,EAAI,QAAQ,CAAC;AACnE,QAAAG,EAAO,QAAQH,EAAI,QAAQK,GAC3BF,EAAO,SAASH,EAAI,SAASK;AAE7B,cAAMhI,IAAM8H,EAAO,WAAW,IAAI;AAClC,YAAI,CAAC9H;AACH,gBAAM,IAAI,MAAM,4BAA4B;AAG9C,QAAAA,EAAI,UAAU2H,GAAK,GAAG,GAAGG,EAAO,OAAOA,EAAO,MAAM;AACpD,cAAMG,IAAYjI,EAAI,aAAa,GAAG,GAAG8H,EAAO,OAAOA,EAAO,MAAM,GAG9DI,IAAqC,CAAA,GACrCC,IAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAKf,CAAO,CAAC;AACjD,iBAASgB,IAAI,GAAGA,IAAIH,EAAU,KAAK,QAAQG,KAAK,IAAID,GAAM;AACxD,gBAAMlJ,IAAIgJ,EAAU,KAAKG,CAAC,GACpBlJ,IAAI+I,EAAU,KAAKG,IAAI,CAAC,GACxBjJ,IAAI8I,EAAU,KAAKG,IAAI,CAAC;AAG9B,cAFUH,EAAU,KAAKG,IAAI,CAAC,IAEtB,KAAK;AACX,kBAAMC,KAAcpJ,IAAIC,IAAIC,KAAK;AACjC,YAAIkJ,IAAa,MAAMA,IAAa,OAClCH,EAAO,KAAK,CAACjJ,GAAGC,GAAGC,CAAC,CAAC;AAAA,UAEzB;AAAA,QACF;AAEA,YAAI+I,EAAO,WAAW;AACpB,gBAAM,IAAI,MAAM,gCAAgC;AAOlD,cAAMI,IAHkBC,GAAiBL,GAAQf,CAAU,EAGtB,KAAK,CAAC1G,GAAGtB,MAAM;AAClD,gBAAMqJ,IAAO,KAAK,IAAI,GAAG/H,CAAC,IAAI,KAAK,IAAI,GAAGA,CAAC;AAE3C,iBADa,KAAK,IAAI,GAAGtB,CAAC,IAAI,KAAK,IAAI,GAAGA,CAAC,IAC7BqJ;AAAA,QAChB,CAAC,GAEKC,IAAQ,CAACC,MACb,MAAMA,EAAI,IAAI,CAACC,MAAM,KAAK,MAAMA,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,GAErEC,IAAkB,CAACF,OACV,QAAQA,EAAI,CAAC,IAAI,QAAQA,EAAI,CAAC,IAAI,QAAQA,EAAI,CAAC,KAAK,MACpD,MAAM,YAAY,WAI3BG,IAAiBP,EAAa,MAAA;AAEpC,QAAAhB,EAAU;AAAA,UACR,SAASmB,EAAMI,EAAe,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,UACnD,WAAWJ,EAAMI,EAAe,CAAC,KAAKA,EAAe,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,UAC1E,QAAQJ,EAAMH,EAAa,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA;AAAA,UAChD,SAASO,EAAe,IAAIJ,CAAK;AAAA,UACjC,aAAaG,EAAgBC,EAAe,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,UACjE,eAAeD,EAAgBC,EAAe,CAAC,KAAKA,EAAe,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,QAAA,CACzF;AAAA,MACH,SAAS3G,GAAG;AACV,QAAAwF,EAASxF,aAAa,QAAQA,EAAE,UAAU,eAAe,GACzDoF,EAAU,IAAI;AAAA,MAChB,UAAA;AACE,QAAAE,EAAW,EAAK;AAAA,MAClB;AAAA,IACF,GAEA;AAAA,EACF,GAAG,CAACN,GAAaC,GAAYC,CAAO,CAAC,GAE9B,EAAE,QAAAC,GAAQ,SAAAE,GAAS,OAAAE,EAAA;AAC5B;AAKA,SAASc,GACPL,GACAY,GACAC,IAAgB,IACY;AAC5B,MAAIb,EAAO,UAAUY;AACnB,WAAOZ;AAIT,QAAMc,IAAwC,CAAA,GACxCC,wBAAW,IAAA;AACjB,SAAOD,EAAU,SAASF,KAAG;AAC3B,UAAMI,IAAM,KAAK,MAAM,KAAK,OAAA,IAAWhB,EAAO,MAAM;AACpD,IAAKe,EAAK,IAAIC,CAAG,MACfD,EAAK,IAAIC,CAAG,GACZF,EAAU,KAAK,CAAC,GAAGd,EAAOgB,CAAG,CAAC,CAAC;AAAA,EAEnC;AAEA,WAASC,IAAO,GAAGA,IAAOJ,GAAeI,KAAQ;AAE/C,UAAMC,IAAyC,MAAM,KAAK,EAAE,QAAQN,EAAA,GAAK,MAAM,EAAE;AAEjF,eAAWO,KAASnB,GAAQ;AAC1B,UAAIoB,IAAU,OACVC,IAAU;AACd,eAASZ,IAAI,GAAGA,IAAIG,GAAGH,KAAK;AAC1B,cAAMa,IAAO,KAAK;AAAA,WACfH,EAAM,CAAC,IAAIL,EAAUL,CAAC,EAAE,CAAC,MAAM,KAC7BU,EAAM,CAAC,IAAIL,EAAUL,CAAC,EAAE,CAAC,MAAM,KAC/BU,EAAM,CAAC,IAAIL,EAAUL,CAAC,EAAE,CAAC,MAAM;AAAA,QAAA;AAEpC,QAAIa,IAAOF,MACTA,IAAUE,GACVD,IAAUZ;AAAA,MAEd;AACA,MAAAS,EAASG,CAAO,EAAE,KAAKF,CAAK;AAAA,IAC9B;AAGA,QAAII,IAAU;AACd,aAAS,IAAI,GAAG,IAAIX,GAAG,KAAK;AAC1B,UAAIM,EAAS,CAAC,EAAE,WAAW;AACzB;AAEF,YAAMM,IAAwC,CAAC,GAAG,GAAG,CAAC;AACtD,iBAAWC,KAAKP,EAAS,CAAC;AACxB,QAAAM,EAAY,CAAC,KAAKC,EAAE,CAAC,GACrBD,EAAY,CAAC,KAAKC,EAAE,CAAC,GACrBD,EAAY,CAAC,KAAKC,EAAE,CAAC;AAEvB,MAAAD,EAAY,CAAC,KAAKN,EAAS,CAAC,EAAE,QAC9BM,EAAY,CAAC,KAAKN,EAAS,CAAC,EAAE,QAC9BM,EAAY,CAAC,KAAKN,EAAS,CAAC,EAAE,SAG5B,KAAK,IAAIM,EAAY,CAAC,IAAIV,EAAU,CAAC,EAAE,CAAC,CAAC,IAAI,KAC7C,KAAK,IAAIU,EAAY,CAAC,IAAIV,EAAU,CAAC,EAAE,CAAC,CAAC,IAAI,KAC7C,KAAK,IAAIU,EAAY,CAAC,IAAIV,EAAU,CAAC,EAAE,CAAC,CAAC,IAAI,OAE7CS,IAAU,KAEZT,EAAU,CAAC,IAAIU;AAAA,IACjB;AAEA,QAAI,CAACD;AACH;AAAA,EAEJ;AAEA,SAAOT;AACT;AAYO,SAASY,GAAyBC,GAUvC;AAEA,QAAM9K,IAAM8K,EAAU,QAAQ,KAAK,EAAE,GAC/B,IAAI,SAAS9K,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAChCG,IAAI,SAASH,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAChCI,IAAI,SAASJ,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAGhC+K,IAAM,KAAK,IAAI,GAAG5K,GAAGC,CAAC,IAAI,KAC1B4K,IAAM,KAAK,IAAI,GAAG7K,GAAGC,CAAC,IAAI;AAChC,MAAI6K,IAAI,GACNC,IAAI;AACN,QAAM,KAAKH,IAAMC,KAAO;AAExB,MAAID,MAAQC,GAAK;AACf,UAAMxJ,IAAIuJ,IAAMC;AAEhB,YADAE,IAAI,IAAI,MAAM1J,KAAK,IAAIuJ,IAAMC,KAAOxJ,KAAKuJ,IAAMC,IACvCD,GAAA;AAAA,MACN,KAAK,IAAI;AACP,QAAAE,MAAM9K,IAAI,MAAMC,IAAI,OAAOoB,KAAKrB,IAAIC,IAAI,IAAI,MAAM;AAClD;AAAA,MACF,KAAKD,IAAI;AACP,QAAA8K,MAAM7K,IAAI,MAAM,IAAI,OAAOoB,IAAI,KAAK;AACpC;AAAA,MACF,KAAKpB,IAAI;AACP,QAAA6K,MAAM,IAAI,MAAM9K,IAAI,OAAOqB,IAAI,KAAK;AACpC;AAAA,IAAA;AAAA,EAEN;AAEA,QAAM2J,IAAW,CAACF,GAAWC,GAAWE,MAAsB;AAC5D,UAAMC,IAAU,CAACT,GAAWU,GAAWC,OACjCA,IAAI,MACNA,KAAK,IAEHA,IAAI,MACNA,KAAK,IAEHA,IAAI,sBACCX,KAAKU,IAAIV,KAAK,IAAIW,IAEvBA,IAAI,MACCD,IAELC,IAAI,qBACCX,KAAKU,IAAIV,MAAM,qBAAQW,KAAK,IAE9BX,IAGHU,IAAIF,IAAI,MAAMA,KAAK,IAAIF,KAAKE,IAAIF,IAAIE,IAAIF,GACxCN,IAAI,IAAIQ,IAAIE,GACZE,IAAK,KAAK,MAAMH,EAAQT,GAAGU,GAAGL,IAAI,IAAI,CAAC,IAAI,GAAG,GAC9CQ,IAAK,KAAK,MAAMJ,EAAQT,GAAGU,GAAGL,CAAC,IAAI,GAAG,GACtCS,IAAK,KAAK,MAAML,EAAQT,GAAGU,GAAGL,IAAI,IAAI,CAAC,IAAI,GAAG;AACpD,WAAO,MAAM,CAACO,GAAIC,GAAIC,CAAE,EAAE,IAAI,CAAC9B,MAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,EAC/E;AAEA,SAAO;AAAA,IACL,UAAUuB,EAASF,GAAG,KAAK,IAAIC,IAAI,KAAK,CAAC,GAAG,IAAI;AAAA,IAChD,SAASC,EAASF,GAAG,KAAK,IAAIC,IAAI,KAAK,CAAC,GAAG,GAAG;AAAA,IAC9C,OAAOC,EAASF,GAAG,KAAK,IAAIC,IAAI,KAAK,CAAC,GAAG,GAAG;AAAA,IAC5C,MAAMJ;AAAA,IACN,MAAMK,EAASF,GAAG,KAAK,IAAIC,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,GAAG,CAAC;AAAA,IAC/D,QAAQC,EAASF,GAAG,KAAK,IAAIC,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC;AAAA,IAClE,SAASC,EAASF,GAAG,KAAK,IAAIC,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC;AAAA,IACnE,MAAM,IAAI,MAAM,YAAY;AAAA,IAC5B,aAAa,IAAI,MAAM,YAAY;AAAA,EAAA;AAEvC;AC5lBO,MAAMS,KAAoC;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AACP,GAIMC,KAAqC,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAuBxE,SAASC,GACdC,IAA+BH,IACV;AACrB,QAAM,CAACI,GAAOC,CAAQ,IAAI7J;AAAA,IAAS,MACjC,OAAO,SAAW,MAAc,OAAO,aAAa2J,EAAY;AAAA,EAAA;AAGlE,EAAAnJ,EAAU,MAAM;AACd,QAAIsJ;AACJ,UAAMC,IAAe,MAAM;AACzB,MAAID,KACF,qBAAqBA,CAAG,GAE1BA,IAAM,sBAAsB,MAAMD,EAAS,OAAO,UAAU,CAAC;AAAA,IAC/D;AACA,kBAAO,iBAAiB,UAAUE,CAAY,GACvC,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAY,GAC7CD,KACF,qBAAqBA,CAAG;AAAA,IAE5B;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAME,IAAUC,EAAwB,MAAM;AAC5C,aAAS/C,IAAIuC,GAAiB,SAAS,GAAGvC,KAAK,GAAGA;AAChD,UAAI0C,KAASD,EAAYF,GAAiBvC,CAAC,CAAC;AAC1C,eAAOuC,GAAiBvC,CAAC;AAG7B,WAAO;AAAA,EACT,GAAG,CAAC0C,GAAOD,CAAW,CAAC,GAEjBO,IAAU9J;AAAA,IACd,CAAC+J,MAAuBP,KAASD,EAAYQ,CAAE;AAAA,IAC/C,CAACP,GAAOD,CAAW;AAAA,EAAA,GAEfS,IAAUhK;AAAA,IACd,CAAC+J,MAAuBP,IAAQD,EAAYQ,CAAE;AAAA,IAC9C,CAACP,GAAOD,CAAW;AAAA,EAAA,GAEfU,IAAYjK;AAAA,IAChB,CAACkK,GAAuBC,MACtBX,KAASD,EAAYW,CAAK,KAAKV,IAAQD,EAAYY,CAAK;AAAA,IAC1D,CAACX,GAAOD,CAAW;AAAA,EAAA;AAGrB,SAAO;AAAA,IACL,SAAAK;AAAA,IACA,OAAAJ;AAAA,IACA,SAAAM;AAAA,IACA,SAAAE;AAAA,IACA,WAAAC;AAAA,IACA,UAAUT,IAAQD,EAAY;AAAA,IAC9B,UAAUC,KAASD,EAAY,MAAMC,IAAQD,EAAY;AAAA,IACzD,WAAWC,KAASD,EAAY;AAAA,EAAA;AAEpC;AAIO,SAASa,GAAcC,GAAwB;AACpD,QAAM,CAACC,GAASC,CAAU,IAAI3K,EAAS,MACjC,OAAO,SAAW,MACb,KAEF,OAAO,WAAWyK,CAAK,EAAE,OACjC;AAED,SAAAjK,EAAU,MAAM;AACd,UAAMsC,IAAK,OAAO,WAAW2H,CAAK;AAClC,IAAAE,EAAW7H,EAAG,OAAO;AACrB,UAAMC,IAAU,CAAC/B,MAA2B2J,EAAW3J,EAAE,OAAO;AAChE,WAAA8B,EAAG,iBAAiB,UAAUC,CAAO,GAC9B,MAAMD,EAAG,oBAAoB,UAAUC,CAAO;AAAA,EACvD,GAAG,CAAC0H,CAAK,CAAC,GAEHC;AACT;AAeO,SAASE,GACdzN,GACAwM,IAA+BH,IAC5B;AACH,QAAM,EAAE,SAAAQ,EAAA,IAAYN,GAAcC,CAAW;AAE7C,SAAOM,EAAQ,MAAM;AACnB,QACE9M,KAAU,QAEV,OAAOA,KAAU,YACjB,MAAM,QAAQA,CAAK;AAEnB,aAAOA;AAGT,UAAM0N,IAAM1N,GACN6K,IAAMyB,GAAiB,QAAQO,CAAO;AAG5C,aAAS9C,IAAIc,GAAKd,KAAK,GAAGA,KAAK;AAC7B,YAAM4D,IAAMD,EAAIpB,GAAiBvC,CAAC,CAAC;AACnC,UAAI4D,MAAQ;AACV,eAAOA;AAAA,IAEX;AAGA,aAAS5D,IAAIc,IAAM,GAAGd,IAAIuC,GAAiB,QAAQvC,KAAK;AACtD,YAAM4D,IAAMD,EAAIpB,GAAiBvC,CAAC,CAAC;AACnC,UAAI4D,MAAQ;AACV,eAAOA;AAAA,IAEX;AAAA,EAGF,GAAG,CAAC3N,GAAO6M,CAAO,CAAC;AACrB;AASO,SAASe,GAAiB3G,GAAkE;AACjG,QAAM,CAACpJ,GAAMgQ,CAAO,IAAIhL,EAAiC,EAAE,OAAO,GAAG,QAAQ,GAAG;AAEhF,SAAAQ,EAAU,MAAM;AACd,UAAMgE,IAAKJ,EAAI;AACf,QAAI,CAACI;AACH;AAGF,UAAMyG,IAAW,IAAI,eAAe,CAAC,CAACC,CAAK,MAAM;AAC/C,YAAM,EAAE,OAAAtB,GAAO,QAAAuB,EAAA,IAAWD,EAAM;AAChC,MAAAF,EAAQ,EAAE,OAAApB,GAAO,QAAAuB,GAAQ;AAAA,IAC3B,CAAC;AAED,WAAAF,EAAS,QAAQzG,CAAE,GACZ,MAAMyG,EAAS,WAAA;AAAA,EACxB,GAAG,CAAC7G,CAAG,CAAC,GAEDpJ;AACT;AAuBO,SAASoQ,KAA6B;AAC3C,QAAM,EAAE,OAAAxB,GAAO,UAAUyB,EAAA,IAAmB3B,GAAA,GAEtC9G,IAAUqH,EAAQ,MAClB,OAAO,SAAW,MACb,KAEF,kBAAkB,UAAU,UAAU,iBAAiB,GAC7D,CAAA,CAAE,GAECqB,IAAuBd,GAAc,kCAAkC,GACvEe,IAAaf,GAAc,yBAAyB,GAEpDgB,IAAavB,EAAQ,MACrB,OAAO,SAAW,MACb,IAEF,OAAO,oBAAoB,GACjC,CAAA,CAAE,GAECwB,IAAUJ,KAAkBzI,GAC5B8I,IAAW,CAACL,KAAkBzB,IAAQJ,GAAiB,MAAM5G,GAC7D+I,IAAY,CAAC/I,KAAWgH,KAASJ,GAAiB;AAExD,SAAO;AAAA,IACL,UAAUiC,KAAWC;AAAA,IACrB,SAAA9I;AAAA,IACA,SAAA6I;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,sBAAAL;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;AAiBO,SAASI,GAAmB5G,IAAqC,IAAqB;AAC3F,QAAM,EAAE,cAAA6G,GAAc,aAAAlC,IAAcH,GAAA,IAAqBxE,GACnD,EAAE,UAAA8G,GAAU,UAAAJ,GAAU,WAAAC,EAAA,IAAcjC,GAAcC,CAAW,GAC7DoC,IAASX,GAAA;AAEf,SAAIS,MAKAE,EAAO,UACF,WAELA,EAAO,WACF,WAELA,EAAO,YACF,YAILD,IACK,WAELJ,IACK,WAEF;AACT;AAoBO,SAASM,GAAUhH,IAA4B,IAAa;AACjE,QAAM,EAAE,QAAAiH,GAAQ,QAAAC,GAAQ,YAAAC,GAAY,aAAAC,GAAa,YAAAC,MAAerH,GAC1D,EAAE,SAAAgF,GAAS,UAAA8B,GAAU,UAAAJ,GAAU,WAAAC,EAAA,IAAcjC,GAAA;AAEnD,SAAIyC,IACKL,IAELM,IACKT,IAELU,IACKX,IAGLQ,KAAUA,EAAO,SAASlC,CAAO,IAC5B,KAELiC,IACKA,EAAO,SAASjC,CAAO,IAGzB;AACT;AAMO,SAASsC,KAAoC;AAElD,SADmB9B,GAAc,yBAAyB,IACtC,aAAa;AACnC;AAeO,SAAS+B,KAAoC;AAClD,QAAM,CAACC,GAAQC,CAAS,IAAIzM,EAAyB;AAAA,IACnD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA,CACP;AAED,SAAAQ,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,OAAe,CAAC,IAAI,SAAS,eAAe,0BAA0B;AAC1F;AAGF,UAAMkM,IAAU,MAAM;AACN,uBAAiB,SAAS,eAAe;AAOvD,YAAMC,IAAS,SAAS,cAAc,KAAK;AAC3C,MAAAA,EAAO,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQvB,SAAS,KAAK,YAAYA,CAAM;AAEhC,YAAMC,IAAW,iBAAiBD,CAAM;AACxC,MAAAF,EAAU;AAAA,QACR,KAAK,SAASG,EAAS,YAAY,EAAE,KAAK;AAAA,QAC1C,OAAO,SAASA,EAAS,cAAc,EAAE,KAAK;AAAA,QAC9C,QAAQ,SAASA,EAAS,eAAe,EAAE,KAAK;AAAA,QAChD,MAAM,SAASA,EAAS,aAAa,EAAE,KAAK;AAAA,MAAA,CAC7C,GAED,SAAS,KAAK,YAAYD,CAAM;AAAA,IAClC;AAEA,WAAAD,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAO,GACzC,OAAO,iBAAiB,qBAAqBA,CAAO,GAE7C,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAO,GAC5C,OAAO,oBAAoB,qBAAqBA,CAAO;AAAA,IACzD;AAAA,EACF,GAAG,CAAA,CAAE,GAEEF;AACT;AC5YA,SAASK,GAAgBxN,IAAyB,UAAkB;AAClE,SAAI,OAAOA,KAAM,WACRA,IAEFA,MAAM,SAAS,MAAMA,MAAM,SAAS,MAAM;AACnD;AAIA,MAAMyN,KAA0D;AAAA,EAC9D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR,GAEMC,KAAyD;AAAA,EAC7D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AA8BO,SAASC,GAAkBhI,GAA4D;AAC5F,QAAM,EAAE,SAAAiI,GAAS,WAAAhQ,IAAY,QAAQ,UAAAiQ,IAAW,UAAU,WAAAC,GAAW,UAAAC,MAAapI,GAC5E,CAACqI,GAAOC,CAAQ,IAAItN,EAA8BiN,IAAU,YAAY,QAAQ,GAChF,CAACM,GAAcC,CAAe,IAAIxN,EAASiN,CAAO,GAClDzJ,IAAWtD,EAAA,GACXuN,IAAKZ,GAAgBK,CAAQ,GAG7BQ,IAAiBzD,EAAQ,MACzB,OAAO,SAAW,MACb,KAEF,OAAO,WAAW,kCAAkC,EAAE,SAC5D,CAAA,CAAE,GAEC0D,IAAoBD,KAAkBzQ,MAAc,SAAS,IAAIwQ;AAEvE,EAAAjN,EAAU,OACJgD,EAAS,WACX,aAAaA,EAAS,OAAO,GAG3ByJ,KACFO,EAAgB,EAAI,GACpBF,EAAS,UAAU,GACnB9J,EAAS,UAAU,WAAW,MAAM;AAClC,IAAA8J,EAAS,SAAS,GAClBH,KAAA,QAAAA;AAAA,EACF,GAAGQ,CAAiB,MAEpBL,EAAS,SAAS,GAClB9J,EAAS,UAAU,WAAW,MAAM;AAClC,IAAA8J,EAAS,QAAQ,GACjBE,EAAgB,EAAK,GACrBJ,KAAA,QAAAA;AAAA,EACF,GAAGO,CAAiB,IAGf,MAAM;AACX,IAAInK,EAAS,WACX,aAAaA,EAAS,OAAO;AAAA,EAEjC,IACC,CAACyJ,GAASU,CAAiB,CAAC;AAE/B,QAAM/M,IAAYqJ,EAAQ,MACpBhN,MAAc,UAAUyQ,IACnB,KAELL,MAAU,aACLP,GAAmB7P,CAAS,IAEjCoQ,MAAU,YACLN,GAAkB9P,CAAS,IAEhCoQ,MAAU,YACL,GAAGP,GAAmB7P,CAAS,CAAC,sBAElC,IACN,CAACA,GAAWoQ,GAAOK,CAAc,CAAC,GAE/BnP,IAAQ0L;AAAA,IACZ,OAAO;AAAA,MACL,mBAAmB,GAAG0D,CAAiB;AAAA,MACvC,oBAAoB,GAAGA,CAAiB;AAAA,IAAA;AAAA,IAE1C,CAACA,CAAiB;AAAA,EAAA;AAGpB,SAAO,EAAE,OAAAN,GAAO,cAAAE,GAAc,WAAA3M,GAAW,OAAArC,EAAA;AAC3C;AASO,SAASqP,GACdxJ,GACAY,GACqB;AACrB,QAAM,EAAE,UAAA6I,GAAU,UAAAX,IAAW,SAAA,IAAalI,GACpC,CAACmG,GAAQ2C,CAAS,IAAI9N,EAA0B6N,IAAW,SAAS,CAAC,GACrEJ,IAAKZ,GAAgBK,CAAQ;AAEnC,SAAA1M,EAAU,MAAM;AACd,UAAMgE,IAAKJ,EAAI;AACf,QAAKI;AAGL,UAAIqJ,GAAU;AACZ,cAAM/E,IAAItE,EAAG;AACb,QAAAsJ,EAAUhF,CAAC;AACX,cAAM5E,IAAQ,WAAW,MAAM4J,EAAU,MAAM,GAAGL,CAAE;AACpD,eAAO,MAAM,aAAavJ,CAAK;AAAA,MACjC,OAAO;AAEL,cAAM4E,IAAItE,EAAG;AACb,QAAAsJ,EAAUhF,CAAC,GACX,sBAAsB,MAAM;AAC1B,gCAAsB,MAAMgF,EAAU,CAAC,CAAC;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,EACF,GAAG,CAACD,GAAUJ,GAAIrJ,CAAG,CAAC,GAEf;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,OAAO+G,KAAW,WAAW,GAAGA,CAAM,OAAOA;AAAA,IACrD,YAAY,UAAUsC,CAAE;AAAA,EAAA;AAE5B;AAQO,SAASM,GAAiBC,GAAeC,IAAmB,IAAY;AAC7E,SAAO,GAAGD,IAAQC,CAAQ;AAC5B;AAIO,SAASC,GACdC,GACAC,GACQ;AACR,SAAOA,MAAU,UAAUtB,GAAmBqB,CAAM,IAAIpB,GAAkBoB,CAAM;AAClF;AC9LA,MAAME,KAAiB5P,EAA+B;AAAA,EACpD,WAAW;AAAA,EACX,OAAO;AAAA,EACP,MAAM,CAAC6P,MAAMA;AAAA,EACb,WAAW,CAAC7F,GAAG6F,OAAO,EAAE,CAAC7F,CAAC,GAAG6F,EAAA;AAC/B,CAAC,GAIYC,KAAkD,CAAC,EAAE,WAAAC,GAAW,UAAA3M,QAAe;AAE1F,QAAMU,IAA0B0H,EAAQ,MAClCuE,MAAc,SACTA,IAEL,OAAO,WAAa,OACV,SAAS,gBAAgB,aAAa,KAAK,MAC3C,QACH,QAGJ,OACN,CAACA,CAAS,CAAC,GAERC,IAAQlM,MAAa;AAG3B,EAAA/B,EAAU,OACJgO,MAAc,WAChB,SAAS,gBAAgB,aAAa,OAAOjM,CAAQ,GACrD,SAAS,gBAAgB,MAAM,YAAYA,IAEtC,MAAM;AACX,IAAIiM,MAAc,WAChB,SAAS,gBAAgB,gBAAgB,KAAK,GAC9C,SAAS,gBAAgB,MAAM,YAAY;AAAA,EAE/C,IACC,CAACA,GAAWjM,CAAQ,CAAC;AAExB,QAAMmM,IAAOtO;AAAA,IACX,CAACjD,MACMsR,IAG2D;AAAA,MAC9D,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,KAAK;AAAA,IAAA,EAEItR,CAAK,KAAKA,IARZA;AAAA,IAUX,CAACsR,CAAK;AAAA,EAAA,GAGFE,IAAYvO;AAAA,IAChB,CAACwO,GAAkBzR,MACZsR,IASE,EAAE,CAN+B;AAAA,MACtC,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA,EAEGG,CAAQ,KAAKA,CAAQ,GAAGzR,EAAA,IARjC,EAAE,CAACyR,CAAQ,GAAGzR,EAAA;AAAA,IAUzB,CAACsR,CAAK;AAAA,EAAA,GAGF3P,IAAMmL;AAAA,IACV,OAAO;AAAA,MACL,WAAW1H;AAAA,MACX,OAAAkM;AAAA,MACA,MAAAC;AAAA,MACA,WAAAC;AAAA,IAAA;AAAA,IAEF,CAACpM,GAAUkM,GAAOC,GAAMC,CAAS;AAAA,EAAA;AAGnC,2BACGN,GAAe,UAAf,EAAwB,OAAOvP,GAC9B,4BAAC,OAAA,EAAI,KAAKyD,GAAU,OAAO,EAAE,WAAWA,GAAU,SAAS,WAAA,GACxD,UAAAV,GACH,GACF;AAEJ;AAEA0M,GAAgB,cAAc;AAIvB,SAASM,KAA8B;AAC5C,SAAOlQ,EAAW0P,EAAc;AAClC;AAQO,MAAMS,KAAe;AAAA,EAC1B,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL,WAAW;AAAA,IACT,OAAO;AAAA,IACP,KAAK;AAAA,EAAA;AAET,GCvIMC,KAAoBtQ,EAAsC;AAAA,EAC9D,aAAa,CAAA;AAAA,EACb,eAAe,MAAM;AACvB,CAAC,GAsBYuQ,KAAsD,CAAC,EAAE,aAAAC,GAAa,UAAApN,QAAe;AAChG,QAAM1E,IAAQ8M;AAAA,IACZ,OAAO;AAAA,MACL,aAAAgF;AAAA,MACA,eAAe,CAACC,GAAsBC,MAAqB;;AAEzD,eAAIA,KAAWD,OAAepK,IAAAmK,EAAY,WAAZ,QAAAnK,EAAqB,GAAGoK,CAAW,IAAIC,CAAO,OACnEF,EAAY,OAAO,GAAGC,CAAW,IAAIC,CAAO,EAAE,IAEnDD,OAAeE,IAAAH,EAAY,eAAZ,QAAAG,EAAyBF,MACnCD,EAAY,WAAWC,CAAW,IAEpCD,EAAY,eAAe;AAAA,MACpC;AAAA,IAAA;AAAA,IAEF,CAACA,CAAW;AAAA,EAAA;AAGd,SAAO,gBAAAhO,EAAC8N,GAAkB,UAAlB,EAA2B,OAAA5R,GAAe,UAAA0E,EAAA,CAAS;AAC7D;AAEAmN,GAAkB,cAAc;AAkBzB,SAASK,GACdC,GACAJ,GACAC,GACgB;AAChB,QAAMrQ,IAAMH,EAAWoQ,EAAiB;AAExC,SAAIO,KAGGxQ,EAAI,cAAcoQ,GAAaC,CAAO;AAC/C;AAMO,SAASI,GAAgBtM,GAK9B;AACA,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,UAAU,IAAM,iBAAiB,IAAM,UAAU,GAAA;AAAA,IAC5D,KAAK;AACH,aAAO,EAAE,UAAU,GAAA;AAAA,IACrB;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;AC9CO,SAASuM,GAASxK,IAA2B,IAAoB;AACtE,QAAM;AAAA,IACJ,WAAAyK,IAAY;AAAA,IACZ,aAAAC,IAAc;AAAA,IACd,SAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,SAAApQ,IAAU;AAAA,EAAA,IACRqF,GAEEZ,IAAMlE,EAA2B,IAAI,GACrC,CAAC8P,GAAWC,CAAY,IAAIjQ,EAAS,EAAK,GAC1C,CAACkQ,GAAgBC,CAAiB,IAAInQ,EAA2C,IAAI,GACrFoQ,IAAalQ,EAA0B,IAAI;AAEjD,SAAAM,EAAU,MAAM;AACd,UAAMgE,IAAKJ,EAAI;AACf,QAAI,CAACI,KAAM,CAAC7E;AACV;AAGF,UAAM0Q,IAAmB,CAACrP,MAAkB;AAC1C,UAAIA,EAAE,QAAQ,WAAW;AACvB;AAEF,YAAMsP,IAAQtP,EAAE,QAAQ,CAAC;AACzB,MAAAoP,EAAW,UAAU;AAAA,QACnB,GAAGE,EAAM;AAAA,QACT,GAAGA,EAAM;AAAA,QACT,WAAW,KAAK,IAAA;AAAA,MAAI,GAEtBL,EAAa,EAAI,GACjBE,EAAkB,IAAI;AAAA,IACxB,GAEMI,IAAkB,CAACvP,MAAkB;AACzC,UAAI,CAACoP,EAAW,WAAWpP,EAAE,QAAQ,WAAW;AAC9C;AAEF,YAAMsP,IAAQtP,EAAE,QAAQ,CAAC,GACnBwP,IAASF,EAAM,UAAUF,EAAW,QAAQ,GAC5CK,IAASH,EAAM,UAAUF,EAAW,QAAQ;AAGlD,MAAI,KAAK,IAAII,CAAM,IAAI,KAAK,IAAIC,CAAM,IACpCN,EAAkBK,IAAS,IAAI,UAAU,MAAM,IAE/CL,EAAkBM,IAAS,IAAI,SAAS,IAAI;AAAA,IAEhD,GAEMC,IAAiB,CAAC1P,MAAkB;AACxC,UAAI,CAACoP,EAAW;AACd;AAGF,YAAME,IAAQtP,EAAE,eAAe,CAAC,GAC1B2P,IAAuB;AAAA,QAC3B,GAAGL,EAAM;AAAA,QACT,GAAGA,EAAM;AAAA,QACT,WAAW,KAAK,IAAA;AAAA,MAAI,GAGhBE,IAASG,EAAS,IAAIP,EAAW,QAAQ,GACzCK,IAASE,EAAS,IAAIP,EAAW,QAAQ,GACzClD,IAAWyD,EAAS,YAAYP,EAAW,QAAQ,WACnDQ,IAAW,KAAK,KAAKJ,IAASA,IAASC,IAASA,CAAM,GACtDI,IAAWD,IAAW1D;AAI5B,UAFA+C,EAAa,EAAK,GAEd/C,KAAYwC,KAAekB,KAAYnB,GAAW;AACpD,YAAIjB;AACJ,QAAI,KAAK,IAAIgC,CAAM,IAAI,KAAK,IAAIC,CAAM,IACpCjC,IAAYgC,IAAS,IAAI,UAAU,SAEnChC,IAAYiC,IAAS,IAAI,SAAS;AAGpC,cAAMK,IAAwB,EAAE,WAAAtC,GAAW,UAAAoC,GAAU,UAAAC,GAAU,UAAA3D,EAAA;AAG/D,gBAFAyC,KAAA,QAAAA,EAAUmB,IAEFtC,GAAA;AAAA,UACN,KAAK;AACH,YAAAoB,KAAA,QAAAA,EAAckB;AACd;AAAA,UACF,KAAK;AACH,YAAAjB,KAAA,QAAAA,EAAeiB;AACf;AAAA,UACF,KAAK;AACH,YAAAhB,KAAA,QAAAA,EAAYgB;AACZ;AAAA,UACF,KAAK;AACH,YAAAf,KAAA,QAAAA,EAAce;AACd;AAAA,QAAA;AAAA,MAEN;AAEA,MAAAV,EAAW,UAAU,MACrBD,EAAkB,IAAI;AAAA,IACxB,GAEMY,IAAoB,MAAM;AAC9B,MAAAX,EAAW,UAAU,MACrBH,EAAa,EAAK,GAClBE,EAAkB,IAAI;AAAA,IACxB;AAEA,WAAA3L,EAAG,iBAAiB,cAAc6L,GAAkB,EAAE,SAAS,IAAM,GACrE7L,EAAG,iBAAiB,aAAa+L,GAAiB,EAAE,SAAS,IAAM,GACnE/L,EAAG,iBAAiB,YAAYkM,GAAgB,EAAE,SAAS,IAAM,GACjElM,EAAG,iBAAiB,eAAeuM,GAAmB,EAAE,SAAS,IAAM,GAEhE,MAAM;AACX,MAAAvM,EAAG,oBAAoB,cAAc6L,CAAgB,GACrD7L,EAAG,oBAAoB,aAAa+L,CAAe,GACnD/L,EAAG,oBAAoB,YAAYkM,CAAc,GACjDlM,EAAG,oBAAoB,eAAeuM,CAAiB;AAAA,IACzD;AAAA,EACF,GAAG,CAACpR,GAAS8P,GAAWC,GAAaC,GAASC,GAAaC,GAAcC,GAAWC,CAAW,CAAC,GAEzF,EAAE,KAAA3L,GAAK,WAAA4L,GAAW,gBAAAE,EAAA;AAC3B;AA4BO,SAASc,GAAShM,IAA2B,IAAoB;AACtE,QAAM;AAAA,IACJ,SAAAiM;AAAA,IACA,cAAAC;AAAA,IACA,YAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,UAAAC,IAAW;AAAA,IACX,SAAA1R,IAAU;AAAA,EAAA,IACRqF,GAEEZ,IAAMlE,EAA2B,IAAI,GACrC,CAAC4G,GAAOwK,CAAQ,IAAItR,EAAS,CAAC,GAC9B,CAACuR,GAAYC,CAAa,IAAIxR,EAAS,EAAK,GAC5CyR,IAAkBvR,EAAsB,IAAI,GAC5CwR,IAAexR,EAAO,CAAC;AAE7B,SAAAM,EAAU,MAAM;AACd,UAAMgE,IAAKJ,EAAI;AACf,QAAI,CAACI,KAAM,CAAC7E;AACV;AAGF,UAAMgS,IAAc,CAACC,GAAWC,MAAc;AAC5C,YAAMC,IAAKF,EAAG,UAAUC,EAAG,SACrBE,IAAKH,EAAG,UAAUC,EAAG;AAC3B,aAAO,KAAK,KAAKC,IAAKA,IAAKC,IAAKA,CAAE;AAAA,IACpC,GAEMC,IAAY,CAACJ,GAAWC,OAAe;AAAA,MAC3C,IAAID,EAAG,UAAUC,EAAG,WAAW;AAAA,MAC/B,IAAID,EAAG,UAAUC,EAAG,WAAW;AAAA,IAAA,IAG3BxB,IAAmB,CAACrP,MAAkB;AAC1C,MAAIA,EAAE,QAAQ,WAAW,MACvByQ,EAAgB,UAAUE,EAAY3Q,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,CAAC,CAAC,GAChE0Q,EAAa,UAAU5K,GACvB0K,EAAc,EAAI,GAClBN,KAAA,QAAAA;AAAA,IAEJ,GAEMX,IAAkB,CAACvP,MAAkB;AACzC,UAAIA,EAAE,QAAQ,WAAW,KAAK,CAACyQ,EAAgB;AAC7C;AAGF,YAAMQ,IAAkBN,EAAY3Q,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,CAAC,CAAC,GACxDkR,IAAW,KAAK;AAAA,QACpBb;AAAA,QACA,KAAK,IAAID,GAAUM,EAAa,WAAWO,IAAkBR,EAAgB,QAAQ;AAAA,MAAA;AAGvF,MAAAH,EAASY,CAAQ,GACjBjB,KAAA,QAAAA,EAAU;AAAA,QACR,OAAOiB;AAAA,QACP,QAAQF,EAAUhR,EAAE,QAAQ,CAAC,GAAGA,EAAE,QAAQ,CAAC,CAAC;AAAA,MAAA;AAAA,IAEhD,GAEM0P,IAAiB,MAAM;AAC3B,MAAIa,MACFC,EAAc,EAAK,GACnBL,KAAA,QAAAA,EAAarK,IACb2K,EAAgB,UAAU;AAAA,IAE9B;AAEA,WAAAjN,EAAG,iBAAiB,cAAc6L,GAAkB,EAAE,SAAS,IAAM,GACrE7L,EAAG,iBAAiB,aAAa+L,GAAiB,EAAE,SAAS,IAAM,GACnE/L,EAAG,iBAAiB,YAAYkM,GAAgB,EAAE,SAAS,IAAM,GACjElM,EAAG,iBAAiB,eAAekM,GAAgB,EAAE,SAAS,IAAM,GAE7D,MAAM;AACX,MAAAlM,EAAG,oBAAoB,cAAc6L,CAAgB,GACrD7L,EAAG,oBAAoB,aAAa+L,CAAe,GACnD/L,EAAG,oBAAoB,YAAYkM,CAAc,GACjDlM,EAAG,oBAAoB,eAAekM,CAAc;AAAA,IACtD;AAAA,EACF,GAAG,CAAC/Q,GAASmH,GAAOyK,GAAYH,GAAUC,GAAUJ,GAASC,GAAcC,CAAU,CAAC,GAE/E,EAAE,KAAA/M,GAAK,OAAA0C,GAAO,YAAAyK,EAAA;AACvB;AAyBO,SAASY,GAAOnN,IAAyB,IAAkB;AAChE,QAAM,EAAE,OAAAoN,GAAO,YAAAC,GAAY,UAAAC,GAAU,SAAA3S,IAAU,OAASqF,GAElDZ,IAAMlE,EAA2B,IAAI,GACrC,CAACqS,GAAWC,CAAY,IAAIxS,EAAS,EAAK,GAC1C,CAACwQ,GAAQiC,CAAS,IAAIzS,EAAS,CAAC,GAChC,CAACyQ,GAAQiC,CAAS,IAAI1S,EAAS,CAAC,GAChCoQ,IAAalQ,EAA0B,IAAI,GAC3CyS,IAAYzS,EAA0B,IAAI;AAEhD,SAAAM,EAAU,MAAM;AACd,UAAMgE,IAAKJ,EAAI;AACf,QAAI,CAACI,KAAM,CAAC7E;AACV;AAGF,UAAM0Q,IAAmB,CAACrP,MAAkB;AAC1C,UAAIA,EAAE,QAAQ,WAAW;AACvB;AAEF,YAAMsP,IAAQtP,EAAE,QAAQ,CAAC,GACnB4R,IAAoB;AAAA,QACxB,GAAGtC,EAAM;AAAA,QACT,GAAGA,EAAM;AAAA,QACT,WAAW,KAAK,IAAA;AAAA,MAAI;AAEtB,MAAAF,EAAW,UAAUwC,GACrBD,EAAU,UAAUC,GACpBJ,EAAa,EAAI,GACjBC,EAAU,CAAC,GACXC,EAAU,CAAC,GACXL,KAAA,QAAAA;AAAA,IACF,GAEM9B,IAAkB,CAACvP,MAAkB;AACzC,UAAI,CAACoP,EAAW,WAAW,CAACuC,EAAU,WAAW3R,EAAE,QAAQ,WAAW;AACpE;AAGF,YAAMsP,IAAQtP,EAAE,QAAQ,CAAC,GACnB6R,IAAM,KAAK,IAAA,GACXC,IAA2B,EAAE,GAAGxC,EAAM,SAAS,GAAGA,EAAM,SAAS,WAAWuC,EAAA,GAE5Ef,IAAKgB,EAAa,IAAI1C,EAAW,QAAQ,GACzC2B,IAAKe,EAAa,IAAI1C,EAAW,QAAQ,GACzC2C,IAAKD,EAAa,YAAYH,EAAU,QAAQ,aAAa,GAE7DK,KAAaF,EAAa,IAAIH,EAAU,QAAQ,KAAKI,GACrDE,KAAaH,EAAa,IAAIH,EAAU,QAAQ,KAAKI;AAE3D,MAAAN,EAAUX,CAAE,GACZY,EAAUX,CAAE,GAEZK,KAAA,QAAAA,EAAQ,EAAE,QAAQN,GAAI,QAAQC,GAAI,WAAAiB,GAAW,WAAAC,MAC7CN,EAAU,UAAUG;AAAA,IACtB,GAEMpC,IAAiB,MAAM;AAC3B,UAAI,CAAC6B,KAAa,CAACnC,EAAW,WAAW,CAACuC,EAAU;AAClD;AAGF,YAAMb,IAAKtB,GACLuB,IAAKtB,GACLsC,IAAKJ,EAAU,QAAQ,YAAYvC,EAAW,QAAQ,aAAa;AAEzE,MAAAkC,KAAA,QAAAA,EAAW;AAAA,QACT,QAAQR;AAAA,QACR,QAAQC;AAAA,QACR,WAAWD,IAAKiB;AAAA,QAChB,WAAWhB,IAAKgB;AAAA,MAAA,IAGlBP,EAAa,EAAK,GAClBpC,EAAW,UAAU,MACrBuC,EAAU,UAAU;AAAA,IACtB;AAEA,WAAAnO,EAAG,iBAAiB,cAAc6L,GAAkB,EAAE,SAAS,IAAM,GACrE7L,EAAG,iBAAiB,aAAa+L,GAAiB,EAAE,SAAS,IAAM,GACnE/L,EAAG,iBAAiB,YAAYkM,GAAgB,EAAE,SAAS,IAAM,GACjElM,EAAG,iBAAiB,eAAekM,GAAgB,EAAE,SAAS,IAAM,GAE7D,MAAM;AACX,MAAAlM,EAAG,oBAAoB,cAAc6L,CAAgB,GACrD7L,EAAG,oBAAoB,aAAa+L,CAAe,GACnD/L,EAAG,oBAAoB,YAAYkM,CAAc,GACjDlM,EAAG,oBAAoB,eAAekM,CAAc;AAAA,IACtD;AAAA,EACF,GAAG,CAAC/Q,GAAS4S,GAAW/B,GAAQC,GAAQ2B,GAAOC,GAAYC,CAAQ,CAAC,GAE7D,EAAE,KAAAlO,GAAK,WAAAmO,GAAW,QAAA/B,GAAQ,QAAAC,EAAA;AACnC;AA0BO,SAASyC,GAAiBlO,GAA0D;AACzF,QAAM,EAAE,WAAAmO,GAAW,WAAA1D,IAAY,IAAI,SAAA2D,IAAU,KAAK,SAAAzT,IAAU,OAASqF,GAE/DZ,IAAMlE,EAA2B,IAAI,GACrC,CAACmT,GAAWC,CAAY,IAAItT,EAAS,EAAK,GAC1C,CAACuT,GAAcC,CAAe,IAAIxT,EAAS,EAAK,GAChD,CAACyT,GAAcC,CAAe,IAAI1T,EAAS,CAAC,GAC5C2T,IAASzT,EAAsB,IAAI,GAEnC0T,IAAe,KAAK,IAAI,GAAGH,IAAehE,CAAS;AAEzD,SAAAjP,EAAU,MAAM;AACd,UAAMgE,IAAKJ,EAAI;AACf,QAAI,CAACI,KAAM,CAAC7E,KAAW4T;AACrB;AAGF,UAAMlD,IAAmB,CAACrP,MAAkB;AAE1C,MAAIwD,EAAG,YAAY,KAGfxD,EAAE,QAAQ,WAAW,MAGzB2S,EAAO,UAAU3S,EAAE,QAAQ,CAAC,EAAE;AAAA,IAChC,GAEMuP,IAAkB,CAACvP,MAAkB;AACzC,UAAI2S,EAAO,YAAY,QAAQ3S,EAAE,QAAQ,WAAW;AAClD;AAIF,YAAM6S,IADW7S,EAAE,QAAQ,CAAC,EAAE,UACL2S,EAAO;AAGhC,UAAIE,KAAS,GAAG;AACd,QAAAH,EAAgB,CAAC,GACjBJ,EAAa,EAAK;AAClB;AAAA,MACF;AAIA,YAAMQ,IAAO,KAAK,IAAIV,GAASS,IADZ,GAC8B;AAEjD,MAAAH,EAAgBI,CAAI,GACpBR,EAAaQ,IAAO,CAAC,GAGjBA,IAAO,KACT9S,EAAE,eAAA;AAAA,IAEN,GAEM0P,IAAiB,YAAY;AACjC,UAAI+C,KAAgBhE,KAAa,CAAC8D,GAAc;AAC9C,QAAAC,EAAgB,EAAI,GACpBE,EAAgBjE,CAAS;AAEzB,YAAI;AACF,gBAAM0D,EAAA;AAAA,QACR,UAAA;AACE,UAAAK,EAAgB,EAAK,GACrBE,EAAgB,CAAC;AAAA,QACnB;AAAA,MACF;AACE,QAAAA,EAAgB,CAAC;AAGnB,MAAAJ,EAAa,EAAK,GAClBK,EAAO,UAAU;AAAA,IACnB;AAEA,WAAAnP,EAAG,iBAAiB,cAAc6L,GAAkB,EAAE,SAAS,IAAM,GACrE7L,EAAG,iBAAiB,aAAa+L,GAAiB,EAAE,SAAS,IAAO,GACpE/L,EAAG,iBAAiB,YAAYkM,GAAgB,EAAE,SAAS,IAAM,GACjElM,EAAG,iBAAiB,eAAekM,GAAgB,EAAE,SAAS,IAAM,GAE7D,MAAM;AACX,MAAAlM,EAAG,oBAAoB,cAAc6L,CAAgB,GACrD7L,EAAG,oBAAoB,aAAa+L,CAAe,GACnD/L,EAAG,oBAAoB,YAAYkM,CAAc,GACjDlM,EAAG,oBAAoB,eAAekM,CAAc;AAAA,IACtD;AAAA,EACF,GAAG,CAAC/Q,GAAS4T,GAAcE,GAAchE,GAAW2D,GAASD,CAAS,CAAC,GAEhE,EAAE,KAAA/O,GAAK,WAAAiP,GAAW,cAAAE,GAAc,cAAAE,GAAc,cAAAG,EAAA;AACvD;AAqCO,MAAMG,KAA8D,CAAC;AAAA,EAC1E,UAAAlS;AAAA,EACA,aAAAmS,IAAc,CAAA;AAAA,EACd,cAAAC,IAAe,CAAA;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,UAAAC,IAAW;AAAA,EACX,WAAA1E,IAAY;AAAA,EACZ,WAAA7O;AAAA,EACA,OAAArC;AACF,MAAM;AACJ,QAAM6V,IAAelU,EAAuB,IAAI,GAC1CmU,IAAanU,EAAuB,IAAI,GACxC,CAACoU,GAAQC,CAAS,IAAIvU,EAAS,CAAC,GAChC,CAACwU,GAAaC,CAAc,IAAIzU,EAAS,EAAK,GAC9C0U,IAASxU,EAAO,CAAC,GACjByU,IAAgBzU,EAAO,CAAC,GAExB0U,IAAYZ,EAAY,SAASE,GACjCW,IAAaZ,EAAa,SAASC,GACnCY,IAAeF,IAAYT,GAC3BY,IAAgBF,IAAaV,GAE7B9D,IAAmBjQ;AAAA,IACvB,CAACY,MAAwB;AACvB,MAAAyT,EAAe,EAAK,GACpBC,EAAO,UAAU1T,EAAE,QAAQ,CAAC,EAAE,SAC9B2T,EAAc,UAAUL;AAAA,IAC1B;AAAA,IACA,CAACA,CAAM;AAAA,EAAA,GAGH/D,IAAkBnQ;AAAA,IACtB,CAACY,MAAwB;AACvB,YAAMwP,IAASxP,EAAE,QAAQ,CAAC,EAAE,UAAU0T,EAAO;AAC7C,UAAIM,IAAYL,EAAc,UAAUnE;AAUxC,MAPIwE,IAAYF,IACdE,IAAYF,KAAgBE,IAAYF,KAAgB,MAC/CE,IAAY,CAACD,MACtBC,IAAY,CAACD,KAAiBC,IAAYD,KAAiB,MAIzD,EAAAC,IAAY,KAAKhB,EAAY,WAAW,OAGxCgB,IAAY,KAAKf,EAAa,WAAW,KAI7CM,EAAUS,CAAS;AAAA,IACrB;AAAA,IACA,CAACF,GAAcC,GAAef,EAAY,QAAQC,EAAa,MAAM;AAAA,EAAA,GAGjEvD,IAAiBtQ,EAAY,MAAM;AACvC,IAAAqU,EAAe,EAAI,GAGfH,IAASM,IAAYnF,IAEvB8E,EAAUK,CAAS,IACVN,IAAS,CAACO,IAAapF,IAEhC8E,EAAU,CAACM,CAAU,IAGrBN,EAAU,CAAC;AAAA,EAEf,GAAG,CAACD,GAAQM,GAAWC,GAAYpF,CAAS,CAAC,GAEvCwF,IAAoB7U,EAAY,CAAC8U,MAAwB;AAC7D,IAAAT,EAAe,EAAI,GACnBF,EAAU,CAAC,GACXW,EAAO,SAAA;AAAA,EACT,GAAG,CAAA,CAAE,GAECC,IAAQ/U,EAAY,MAAM;AAC9B,IAAAqU,EAAe,EAAI,GACnBF,EAAU,CAAC;AAAA,EACb,GAAG,CAAA,CAAE;AAEL,SACE,gBAAApS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKiS;AAAA,MACL,WAAW,kBAAkBxT,KAAa,EAAE;AAAA,MAC5C,OAAO,EAAE,GAAGrC,GAAO,UAAU,YAAY,UAAU,SAAA;AAAA,MAGnD,UAAA;AAAA,QAAA,gBAAA0C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,UAAU;AAAA,cACV,MAAM;AAAA,cACN,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,OAAO2T;AAAA,YAAA;AAAA,YAGR,UAAAZ,EAAY,IAAI,CAACkB,MAChB,gBAAAjU;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,OAAOiT;AAAA,kBACP,YAAYgB,EAAO;AAAA,kBACnB,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,SAAS,MAAMD,EAAkBC,CAAM;AAAA,gBAEtC,UAAAA,EAAO;AAAA,cAAA;AAAA,cAdHA,EAAO;AAAA,YAAA,CAgBf;AAAA,UAAA;AAAA,QAAA;AAAA,QAIH,gBAAAjU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,OAAO4T;AAAA,YAAA;AAAA,YAGR,UAAAZ,EAAa,IAAI,CAACiB,MACjB,gBAAAjU;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,OAAOiT;AAAA,kBACP,YAAYgB,EAAO;AAAA,kBACnB,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,SAAS,MAAMD,EAAkBC,CAAM;AAAA,gBAEtC,UAAAA,EAAO;AAAA,cAAA;AAAA,cAdHA,EAAO;AAAA,YAAA,CAgBf;AAAA,UAAA;AAAA,QAAA;AAAA,QAIH,gBAAAjU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKoT;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,cACL,WAAW,cAAcC,CAAM;AAAA,cAC/B,YAAYE,IAAc,4BAA4B;AAAA,cACtD,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,QAAQ;AAAA,YAAA;AAAA,YAEV,cAAcnE;AAAA,YACd,aAAaE;AAAA,YACb,YAAYG;AAAA,YACZ,SAAS4D,MAAW,IAAIa,IAAQ;AAAA,YAE/B,UAAAtT;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN,GA0BauT,KAAsD,CAAC;AAAA,EAClE,UAAAvT;AAAA,EACA,WAAAsR;AAAA,EACA,WAAA1D,IAAY;AAAA,EACZ,gBAAA4F;AAAA,EACA,mBAAAC;AAAA,EACA,SAAA3V,IAAU;AAAA,EACV,WAAAiB;AAAA,EACA,OAAArC;AACF,MAAM;AACJ,QAAM,EAAE,KAAA6F,GAAK,WAAAiP,GAAW,cAAAE,GAAc,cAAAE,GAAc,cAAAG,EAAA,IAAiBV,GAAiB;AAAA,IACpF,WAAAC;AAAA,IACA,WAAA1D;AAAA,IACA,SAAA9P;AAAA,EAAA,CACD;AAID,SACE,gBAAAwC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAiC;AAAA,MACA,WAAW,qBAAqBxD,KAAa,EAAE;AAAA,MAC/C,OAAO;AAAA,QACL,GAAGrC;AAAA,QACH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,oBAAoB;AAAA,MAAA;AAAA,MAItB,UAAA;AAAA,QAAA,gBAAA0C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,QAAQwS;AAAA,cACR,UAAU;AAAA,cACV,YAAYJ,IAAY,SAAS;AAAA,YAAA;AAAA,YAGlC,UAAAE,IACG+B,KACE,gBAAArU,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCAAA,CAAgC,EAAA,CACjD,IAEFoU,KACE,gBAAApU;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,WAAW,UAAU2S,KAAgB,IAAI,MAAM,CAAC;AAAA,kBAChD,YAAY;AAAA,kBACZ,SAASA;AAAA,gBAAA;AAAA,gBAGX,UAAA,gBAAA3S;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,QAAO;AAAA,oBACP,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,aAAY;AAAA,oBAEZ,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,wBAAA,CAAwB;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAClC;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,QAKR,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,WAAW,cAAcwS,CAAY;AAAA,cACrC,YAAYJ,IAAY,SAAS;AAAA,YAAA;AAAA,YAGlC,UAAAxR;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAiBO,SAAS0T,GAAcC,IAA2B,SAAe;AACtE,MAAI,EAAE,aAAa;AACjB;AAGF,QAAMC,IAA0D;AAAA,IAC9D,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS,CAAC,IAAI,IAAI,EAAE;AAAA,IACpB,SAAS,CAAC,IAAI,IAAI,EAAE;AAAA,IACpB,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,EAAA;AAGxB,MAAI;AACF,cAAU,QAAQA,EAASD,CAAI,CAAC;AAAA,EAClC,QAAQ;AAAA,EAER;AACF;AAKO,SAASE,KAAY;AAC1B,SAAOtV,EAAY,CAACoV,IAA2B,YAAY;AACzD,IAAAD,GAAcC,CAAI;AAAA,EACpB,GAAG,CAAA,CAAE;AACP;AAqBO,MAAMG,KAA8C,CAAC;AAAA,EAC1D,SAAAC,IAAU;AAAA,EACV,UAAA/T;AAAA,EACA,WAAAjB;AAAA,EACA,OAAArC;AAAA,EACA,SAAA2D;AACF,MAEI,gBAAAjB;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAW,qBAAqBL,KAAa,EAAE;AAAA,IAC/C,OAAO;AAAA,MACL,GAAGrC;AAAA,MACH,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,UAAUqX;AAAA,MACV,WAAWA;AAAA,MACX,QAAQ1T,IAAU,YAAY;AAAA,IAAA;AAAA,IAEhC,SAAAA;AAAA,IAEC,UAAAL;AAAA,EAAA;AAAA;AAgBA,SAASgU,KAA+C;AAC7D,QAAM,CAACC,GAAmBC,CAAoB,IAAI/V,EAAS,EAAK,GAC1D,CAACgW,GAAgBC,CAAiB,IAAIjW,EAAS,CAAC,GAChDkW,IAAgBhW,EAAO,OAAO,SAAW,MAAc,OAAO,cAAc,CAAC;AAEnF,SAAAM,EAAU,MAAM;AACd,QAAI,OAAO,SAAW;AACpB;AAIF,QAAI,oBAAoB,UAAU,OAAO,gBAAgB;AACvD,YAAM2V,IAAK,OAAO,gBAEZpM,IAAe,MAAM;AACzB,cAAMqM,IAAaF,EAAc,UAAUC,EAAG,QACxC1G,IAAY;AAElB,QAAAsG,EAAqBK,IAAa3G,CAAS,GAC3CwG,EAAkBG,IAAa3G,IAAY2G,IAAa,CAAC;AAAA,MAC3D;AAEA,aAAAD,EAAG,iBAAiB,UAAUpM,CAAY,GACnC,MAAMoM,EAAG,oBAAoB,UAAUpM,CAAY;AAAA,IAC5D;AAGA,UAAMA,IAAe,MAAM;AACzB,YAAMqM,IAAaF,EAAc,UAAU,OAAO,aAC5CzG,IAAY;AAElB,MAAAsG,EAAqBK,IAAa3G,CAAS,GAC3CwG,EAAkBG,IAAa3G,IAAY2G,IAAa,CAAC;AAAA,IAC3D;AAEA,kBAAO,iBAAiB,UAAUrM,CAAY,GACvC,MAAM,OAAO,oBAAoB,UAAUA,CAAY;AAAA,EAChE,GAAG,CAAA,CAAE,GAEE,EAAE,mBAAA+L,GAAmB,gBAAAE,EAAA;AAC9B;ACj9BA,MAAMK,KAAgC;AAAA,EACpC,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,gBAAgB;AAClB,GAWMC,KAAkB7X,EAAuC,IAAI,GAStD8X,KAAoD,CAAC;AAAA,EAChE,QAAQC;AAAA,EACR,UAAA3U;AACF,MAAM;AACJ,QAAMjF,IAASqN,EAAQ,OAAO,EAAE,GAAGoM,IAAe,GAAGG,EAAA,IAAe,CAACA,CAAU,CAAC,GAC1EC,IAAYvW,EAAuB,IAAI,GACvCwW,IAAexW,EAAuB,IAAI,GAG1C,CAACyW,GAAiBC,CAAkB,IAAI5W,EAAS,EAAK;AAC5D,EAAAQ,EAAU,MAAM;AACd,UAAMsC,IAAK,OAAO,WAAW,kCAAkC;AAC/D,IAAA8T,EAAmB9T,EAAG,OAAO;AAC7B,UAAMC,IAAU,CAAC/B,MAA2B4V,EAAmB5V,EAAE,OAAO;AACxE,WAAA8B,EAAG,iBAAiB,UAAUC,CAAO,GAC9B,MAAMD,EAAG,oBAAoB,UAAUC,CAAO;AAAA,EACvD,GAAG,CAAA,CAAE;AAGL,QAAM,CAAC8T,GAAgBC,CAAiB,IAAI9W,EAAS,EAAK;AAC1D,EAAAQ,EAAU,MAAM;AACd,UAAMsC,IAAK,OAAO,WAAW,0BAA0B;AACvD,IAAAgU,EAAkBhU,EAAG,OAAO;AAC5B,UAAMC,IAAU,CAAC/B,MAA2B8V,EAAkB9V,EAAE,OAAO;AACvE,WAAA8B,EAAG,iBAAiB,UAAUC,CAAO,GAC9B,MAAMD,EAAG,oBAAoB,UAAUC,CAAO;AAAA,EACvD,GAAG,CAAA,CAAE;AAEL,QAAMuI,IACJ1O,EAAO,iBAAiB,WACpB,KACAA,EAAO,iBAAiB,UACtB,KACA+Z,GAEFI,IACJna,EAAO,iBAAiB,WACpB,KACAA,EAAO,iBAAiB,UACtB,KACAia,GAEFG,IAAW5W;AAAA,IACf,CAAC6W,GAAiBC,IAAmC,aAAa;AAChE,UAAI,CAACta,EAAO;AACV;AAEF,YAAM4H,IAAK0S,MAAa,cAAcR,EAAa,UAAUD,EAAU;AACvE,MAAKjS,MAILA,EAAG,cAAc,IACjB,sBAAsB,MAAM;AAC1B,QAAAA,EAAG,cAAcyS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,CAACra,EAAO,eAAe;AAAA,EAAA,GAGnBO,IAAQ8M;AAAA,IACZ,OAAO;AAAA,MACL,QAAArN;AAAA,MACA,UAAAoa;AAAA,MACA,sBAAA1L;AAAA,MACA,qBAAAyL;AAAA,IAAA;AAAA,IAEF,CAACna,GAAQoa,GAAU1L,GAAsByL,CAAmB;AAAA,EAAA;AAG9D,SACE,gBAAA5U,EAACmU,GAAgB,UAAhB,EAAyB,OAAAnZ,GACvB,UAAA;AAAA,IAAA0E;AAAA,IAED,gBAAAZ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKwV;AAAA,QACL,MAAK;AAAA,QACL,aAAU;AAAA,QACV,eAAY;AAAA,QACZ,OAAOU;AAAA,MAAA;AAAA,IAAA;AAAA,IAET,gBAAAlW;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKyV;AAAA,QACL,MAAK;AAAA,QACL,aAAU;AAAA,QACV,eAAY;AAAA,QACZ,OAAOS;AAAA,MAAA;AAAA,IAAA;AAAA,EACT,GACF;AAEJ;AAEAZ,GAAiB,cAAc;AAIxB,SAASa,KAAgC;AAC9C,QAAMtY,IAAMH,EAAW2X,EAAe;AACtC,SAAIxX,KAKG;AAAA,IACL,QAAQuX;AAAA,IACR,UAAU,MAAM;AAAA,IAAC;AAAA,IACjB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,EAAA;AAEzB;AAIA,MAAMc,KAAmC;AAAA,EACvC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AACV;AAKO,SAASE,MACXC,GACiB;AACpB,QAAMC,IAAWD,EAAI,OAAO,OAAO;AACnC,SAAOC,EAAS,SAAS,IAAIA,EAAS,KAAK,GAAG,IAAI;AACpD;AAGO,SAASC,GAAmBC,GAQc;AAC/C,QAAMC,IAAUD,EAAM,QAAQ,GAAGA,EAAM,EAAE,WAAW,QAC9CE,IAAWF,EAAM,aAAa,GAAGA,EAAM,EAAE,YAAY;AAE3D,SAAO;AAAA,IACL,gBAAgBA,EAAM,QAAQ,KAAO;AAAA,IACrC,iBAAiBA,EAAM,YAAY;AAAA,IACnC,iBAAiBA,EAAM,YAAY;AAAA,IACnC,iBAAiBA,EAAM,YAAY;AAAA,IACnC,oBAAoBJ,GAAqBK,GAASC,CAAQ;AAAA,IAC1D,qBAAqBD;AAAA,EAAA;AAEzB;AAsBO,SAASE,GACdxD,GACApP,GACA;AACA,QAAM;AAAA,IACJ,WAAAwJ;AAAA,IACA,MAAAqJ,IAAO;AAAA,IACP,cAAAC,IAAe;AAAA,EAAA,IACb9S;AAEJ,EAAAxE,EAAU,MAAM;AACd,UAAMuX,IAAY3D,EAAa;AAC/B,QAAI,CAAC2D;AACH;AAGF,UAAMC,IAAW,MACf,MAAM,KAAKD,EAAU,iBAA8BD,CAAY,CAAC,EAAE;AAAA,MAChE,CAACtT,MAAO,CAACA,EAAG,aAAa,UAAU,KAAKA,EAAG,aAAa,eAAe,MAAM;AAAA,IAAA,GAG3EyT,IAAgB,CAACjX,MAAqB;;AAC1C,YAAMkX,IAAQF,EAAA;AACd,UAAIE,EAAM,WAAW;AACnB;AAGF,YAAMlO,IAAU,SAAS,eACnBhC,IAAMkQ,EAAM,QAAQlO,CAAO;AACjC,UAAIhC,MAAQ;AACV;AAGF,UAAImQ,IAAO;AACX,YAAMC,IAAM5J,MAAc,gBAAgBA,MAAc,UAAUA,MAAc,QAC1E6J,IAAM7J,MAAc,cAAcA,MAAc,UAAUA,MAAc;AAE9E,UAAI4J,KAAOpX,EAAE,QAAQ;AACnB,QAAAmX,IAAOnQ,IAAM;AAAA,eACJoQ,KAAOpX,EAAE,QAAQ;AAC1B,QAAAmX,IAAOnQ,IAAM;AAAA,eACJqQ,KAAOrX,EAAE,QAAQ;AAC1B,QAAAmX,IAAOnQ,IAAM;AAAA,eACJqQ,KAAOrX,EAAE,QAAQ;AAC1B,QAAAmX,IAAOnQ,IAAM;AAAA,eACJhH,EAAE,QAAQ;AACnB,QAAAmX,IAAO;AAAA,eACEnX,EAAE,QAAQ;AACnB,QAAAmX,IAAOD,EAAM,SAAS;AAAA;AAEtB;AAGF,MAAAlX,EAAE,eAAA,GAEE6W,IACFM,KAASA,IAAOD,EAAM,SAAUA,EAAM,UAAUA,EAAM,SAEtDC,IAAO,KAAK,IAAI,GAAG,KAAK,IAAID,EAAM,SAAS,GAAGC,CAAI,CAAC,GAGrDD,EAAM,QAAQ,CAACI,GAAMpR,MAAM;AACzB,QAAAoR,EAAK,WAAWpR,MAAMiR,IAAO,IAAI;AAAA,MACnC,CAAC,IACDrT,IAAAoT,EAAMC,CAAI,MAAV,QAAArT,EAAa;AAAA,IACf;AAEA,WAAAiT,EAAU,iBAAiB,WAAWE,CAAa,GAC5C,MAAMF,EAAU,oBAAoB,WAAWE,CAAa;AAAA,EACrE,GAAG,CAAC7D,GAAc5F,GAAWqJ,GAAMC,CAAY,CAAC;AAClD;AAKO,SAASS,GAAgBhU,GAAiB;AAC/C,QAAMiU,IAActY,EAA2B,IAAI;AAEnD,EAAAM,EAAU,OACJ+D,MACFiU,EAAY,UAAU,SAAS,gBAE1B,MAAM;AACX,IAAIjU,KAAUiU,EAAY,WAAW,OAAOA,EAAY,QAAQ,SAAU,cACxEA,EAAY,QAAQ,MAAA;AAAA,EAExB,IACC,CAACjU,CAAM,CAAC;AACb;AAGO,MAAMkU,KAGR,CAAC,EAAE,UAAA5W,GAAU,IAAI6W,IAAM,OAAA,MAAa5W,GAAM,cAAc4W,GAAK,EAAE,OAAOvB,GAAA,GAAetV,CAAQ;AAElG4W,GAAmB,cAAc;AAW1B,MAAME,KAA4C,CAAC;AAAA,EACxD,UAAAC;AAAA,EACA,UAAA/W,IAAW;AACb,MACE,gBAAAZ;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAM,IAAI2X,CAAQ;AAAA,IAClB,WAAU;AAAA,IACV,SAAS,CAAC5X,MAAM;AACd,MAAAA,EAAE,eAAA;AACF,YAAM6X,IAAS,SAAS,eAAeD,CAAQ;AAC/C,MAAIC,MACFA,EAAO,WAAW,IAClBA,EAAO,MAAA;AAAA,IAEX;AAAA,IAEC,UAAAhX;AAAA,EAAA;AACH;AAGF8W,GAAa,cAAc;AAiBpB,MAAMG,KAAmB;AAAA;AAAA,EAE9B,QAAQ,EAAE,KAAK,SAAS,aAAa,oBAAoB,gBAAgB,mBAAA;AAAA,EACzE,QAAQ,EAAE,KAAK,UAAU,aAAa,kBAAkB,gBAAgB,mBAAA;AAAA,EACxE,OAAO;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,MAAM;AAAA,EAAA;AAAA;AAAA,EAIpB,QAAQ,EAAE,KAAK,WAAW,aAAa,WAAW,gBAAgB,mBAAA;AAAA,EAClE,UAAU,EAAE,KAAK,aAAa,aAAa,aAAa,gBAAgB,qBAAA;AAAA,EACxE,UAAU,EAAE,KAAK,aAAa,aAAa,aAAa,gBAAgB,qBAAA;AAAA,EACxE,WAAW;AAAA,IACT,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,EAAA;AAAA,EAElB,OAAO,EAAE,KAAK,QAAQ,aAAa,eAAe,gBAAgB,kBAAA;AAAA,EAClE,MAAM,EAAE,KAAK,OAAO,aAAa,cAAc,gBAAgB,iBAAA;AAAA,EAC/D,QAAQ,EAAE,KAAK,UAAU,aAAa,WAAW,gBAAgB,mBAAA;AAAA,EACjE,UAAU,EAAE,KAAK,YAAY,aAAa,aAAa,gBAAgB,qBAAA;AAAA;AAAA,EAGvE,WAAW;AAAA,IACT,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,MAAM;AAAA,EAAA;AAAA,EAEpB,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,EAAA;AAAA;AAAA,EAIlB,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,MAAM;AAAA,EAAA;AAAA,EAEpB,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,MAAM;AAAA,EAAA;AAAA,EAEpB,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,MAAM;AAAA,EAAA;AAAA,EAEpB,OAAO;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,MAAM;AAAA,EAAA;AAAA,EAEpB,KAAK;AAAA,IACH,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,MAAM;AAAA,EAAA;AAAA;AAAA,EAIpB,MAAM,EAAE,KAAK,SAAS,aAAa,aAAa,gBAAgB,iBAAA;AAAA,EAChE,KAAK,EAAE,KAAK,OAAO,aAAa,aAAa,gBAAgB,gBAAA;AAAA,EAC7D,UAAU;AAAA,IACR,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,WAAW,CAAC,OAAO;AAAA,EAAA;AAAA;AAAA,EAIrB,MAAM,EAAE,KAAK,aAAa,aAAa,iBAAiB,gBAAgB,iBAAA;AAAA,EACxE,OAAO,EAAE,KAAK,UAAU,aAAa,eAAe,gBAAgB,kBAAA;AAAA;AAAA,EAGpE,WAAW;AAAA,IACT,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,EAAA;AAAA,EAElB,WAAW;AAAA,IACT,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,EAAA;AAAA,EAElB,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,EAAA;AAAA,EAElB,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,EAAA;AAEpB;AAGO,SAASC,GAAeC,GAAoC;;AACjE,QAAMC,IAAkB,CAAA;AACxB,UAAInU,IAAAkU,EAAS,cAAT,QAAAlU,EAAoB,SAAS,WAC/BmU,EAAM,KAAK,MAAM,IAEf7J,IAAA4J,EAAS,cAAT,QAAA5J,EAAoB,SAAS,UAC/B6J,EAAM,KAAK,KAAK,IAEdC,IAAAF,EAAS,cAAT,QAAAE,EAAoB,SAAS,YAC/BD,EAAM,KAAK,OAAO,IAEhBE,IAAAH,EAAS,cAAT,QAAAG,EAAoB,SAAS,WAC/BF,EAAM,KAAK,GAAG,GAEhBA,EAAM,KAAKD,EAAS,GAAG,GAChBC,EAAM,KAAK,GAAG;AACvB;AAGO,SAASG,GACd,GACAJ,GACS;AAET,MAAI,EADa,EAAE,QAAQA,EAAS,OAAO,EAAE,IAAI,YAAA,MAAkBA,EAAS,IAAI,YAAA;AAE9E,WAAO;AAGT,QAAMK,IAAOL,EAAS,aAAa,CAAA;AAOnC,SANI,EAAAK,EAAK,SAAS,MAAM,OAAO,EAAE,WAAW,EAAE,YAG1CA,EAAK,SAAS,KAAK,MAAM,EAAE,UAG3BA,EAAK,SAAS,OAAO,MAAM,EAAE;AAKnC;AAqBO,MAAMC,KAAoD,CAAC;AAAA,EAChE,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAA/W;AAAA,EACA,MAAAzH,IAAO;AAAA,EACP,WAAA4F;AACF,MAAM;AACJ,QAAM,CAACqM,GAASwM,CAAU,IAAIzZ,EAAS,EAAK,GACtC0Z,IAAaxZ,EAA0B,IAAI,GAC3C,CAACyZ,GAAQC,CAAS,IAAI5Z,EAAwC,EAAE,KAAK,GAAG,MAAM,GAAG,GAEjF6Z,IAAiBzZ,EAAY,MAAM;AACvC,QAAI,CAACsZ,EAAW;AACd;AAEF,UAAMI,IAAOJ,EAAW,QAAQ,sBAAA,GAC1BpF,IAAS;AAEf,QAAIyF,IAAM,GACRC,IAAO;AACT,YAAQR,GAAA;AAAA,MACN,KAAK;AACH,QAAAO,IAAMD,EAAK,MAAMxF,GACjB0F,IAAOF,EAAK,OAAOA,EAAK,QAAQ;AAChC;AAAA,MACF,KAAK;AACH,QAAAC,IAAMD,EAAK,SAASxF,GACpB0F,IAAOF,EAAK,OAAOA,EAAK,QAAQ;AAChC;AAAA,MACF,KAAK;AACH,QAAAC,IAAMD,EAAK,MAAMA,EAAK,SAAS,GAC/BE,IAAOF,EAAK,OAAOxF;AACnB;AAAA,MACF,KAAK;AACH,QAAAyF,IAAMD,EAAK,MAAMA,EAAK,SAAS,GAC/BE,IAAOF,EAAK,QAAQxF;AACpB;AAAA,IAAA;AAEJ,IAAAsF,EAAU,EAAE,KAAAG,GAAK,MAAAC,GAAM;AAAA,EACzB,GAAG,CAACR,CAAQ,CAAC,GAEPS,IAAmB7Z,EAAY,MAAM;AACzC,IAAAyZ,EAAA,GACAJ,EAAW,EAAI;AAAA,EACjB,GAAG,CAACI,CAAc,CAAC,GAEbK,IAAc9Z,EAAY,MAAM;AACpC,IAAAyZ,EAAA,GACAJ,EAAW,EAAI;AAAA,EACjB,GAAG,CAACI,CAAc,CAAC;AAEnB,SAAIN,EAAU,WAAW,IAChB,OAIP,gBAAApX,EAAAgY,IAAA,EACE,UAAA;AAAA,IAAA,gBAAAlZ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKyY;AAAA,QACL,MAAK;AAAA,QACL,WAAW,0CAA0C1e,CAAI,IAAI4F,KAAa,EAAE;AAAA,QAC5E,cAAcqZ;AAAA,QACd,cAAc,MAAMR,EAAW,EAAK;AAAA,QACpC,SAASS;AAAA,QACT,QAAQ,MAAMT,EAAW,EAAK;AAAA,QAC9B,cAAW;AAAA,QACX,UAAU;AAAA,QAET,UAAAhX,KAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAEVwK,KACC,gBAAA9K;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,4DAA4DqX,CAAQ;AAAA,QAC/E,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAKG,EAAO;AAAA,UACZ,MAAMA,EAAO;AAAA,UACb,WACEH,MAAa,QACT,2BACAA,MAAa,WACX,uBACAA,MAAa,SACX,2BACA;AAAA,QAAA;AAAA,QAEZ,MAAK;AAAA,QAEL,UAAA;AAAA,UAAA,gBAAAvY,EAAC,OAAA,EAAI,WAAU,6BAA4B,UAAA,sBAAkB;AAAA,UAC7D,gBAAAA,EAAC,MAAA,EAAG,WAAU,4BACX,UAAAsY,EAAU,IAAI,CAACxQ,GAAG7B,MACjB,gBAAA/E,EAAC,MAAA,EAAW,WAAU,4BACpB,UAAA;AAAA,YAAA,gBAAAlB,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAA8X,GAAehQ,CAAC,GAAE;AAAA,YAC5D,gBAAA9H,EAAC,QAAA,EAAK,WAAU,4BAA4B,YAAE,YAAA,CAAY;AAAA,UAAA,EAAA,GAFnDiG,CAGT,CACD,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;AAEAoS,GAAiB,cAAc;AAqBxB,SAASc,GACdpV,IAAmC,IACD;AAClC,QAAM;AAAA,IACJ,SAAArF,IAAU;AAAA,IACV,UAAA0a;AAAA,IACA,gBAAAC,IAAiB;AAAA,IACjB,aAAAC,IAAc;AAAA,IACd,cAAAC,IAAe;AAAA,EAAA,IACbxV;AAEJ,SAAO5E;AAAA,IACL,CAACY,MAA2B;AAC1B,MAAI,CAACrB,KAAW,CAAC0a,KAGbrZ,EAAE,QAAQ,YAGVuZ,KAAe,CAACvZ,EAAE,WAAW,CAACA,EAAE,WAGhCwZ,KAAiBxZ,EAAE,OAAuB,YAAY,eAItDsZ,KACFtZ,EAAE,eAAA,GAEJqZ,EAAA;AAAA,IACF;AAAA,IACA,CAAC1a,GAAS0a,GAAUC,GAAgBC,GAAaC,CAAY;AAAA,EAAA;AAEjE;AAqCO,SAASC,GAAmBzV,IAAqC,IAA0B;AAChG,QAAM,EAAE,SAAA9C,GAAS,UAAArC,IAAW,IAAO,MAAA6a,IAAO,UAAU,UAAAC,GAAU,gBAAAC,IAAiB,GAAA,IAAS5V,GAElF6V,IAAcza;AAAA,IAClB,CAACY,MAAwB;AACvB,MAAInB,KAGJqC,KAAA,QAAAA,EAAUlB;AAAA,IACZ;AAAA,IACA,CAACnB,GAAUqC,CAAO;AAAA,EAAA,GAGd+V,IAAgB7X;AAAA,IACpB,CAACY,MAA2B;AAC1B,UAAInB;AACF;AAEF,YAAMib,IAAUF,MAAmB5Z,EAAE,QAAQ,OAAOA,EAAE,QAAQ;AAC9D,OAAIA,EAAE,QAAQ,WAAW8Z,OACvB9Z,EAAE,eAAA,GACFkB,KAAA,QAAAA,EAAUlB;AAAA,IAEd;AAAA,IACA,CAACnB,GAAUqC,GAAS0Y,CAAc;AAAA,EAAA,GAG9BnD,IAA8B;AAAA,IAClC,MAAAiD;AAAA,IACA,UAAUC,MAAa9a,IAAW,KAAK;AAAA,IACvC,SAASgb;AAAA,IACT,WAAW5C;AAAA,EAAA;AAEb,SAAIpY,MACF4X,EAAM,eAAe,IAAI,KAEpBA;AACT;ACxsBO,SAASsD,GAAgB/V,IAA+B,IAAqB;AAClF,QAAM,CAACgW,GAAaC,CAAc,IAAIjb,EAAS,EAAK,GAC9C,CAACkb,GAAYC,CAAa,IAAInb,EAAS,EAAE,GACzCob,IAAiBlb,EAAyC,IAAI,GAE9Dmb,IACJ,OAAO,SAAW,QACjB,uBAAuB,UAAU,6BAA6B,SAE3DC,IAAoBlb;AAAA,IACxB,CAACmb,MAAiB;AAChB,UAAI,CAACvW,EAAQ;AACX;AAEF,YAAMsF,IAAQiR,EAAK,YAAA,EAAc,KAAA;AAEjC,iBAAWC,KAAOxW,EAAQ;AACxB,YAAI,OAAOwW,EAAI,UAAW;AACxB,cAAIlR,MAAUkR,EAAI,OAAO,YAAA,GAAe;AACtC,YAAAA,EAAI,OAAO,CAAA,GAAID,CAAI;AACnB;AAAA,UACF;AAAA,eACK;AACL,gBAAME,IAAQF,EAAK,MAAMC,EAAI,MAAM;AACnC,cAAIC,GAAO;AACT,YAAAD,EAAI,OAAO,MAAM,KAAKC,CAAK,GAAGF,CAAI;AAClC;AAAA,UACF;AAAA,QACF;AAAA,IAEJ;AAAA,IACA,CAACvW,EAAQ,QAAQ;AAAA,EAAA,GAGb0W,IAAQtb,EAAY,MAAM;AAC9B,QAAI,CAACib,KAAeL;AAClB;AAGF,UAAMW,IACH,OAAmE,qBACnE,OAAmE,yBAEhEC,IAAc,IAAID,EAAA;AACxB,IAAAC,EAAY,OAAO5W,EAAQ,YAAY,SACvC4W,EAAY,aAAa5W,EAAQ,cAAc,IAC/C4W,EAAY,iBAAiB5W,EAAQ,kBAAkB,IAEvD4W,EAAY,WAAW,CAACC,MAAkC;;AACxD,YAAMjX,IAAOiX,EAAM,QAAQA,EAAM,QAAQ,SAAS,CAAC,GAC7CN,IAAO3W,EAAK,CAAC,EAAE,YACfkX,IAAUlX,EAAK;AAErB,MAAAuW,EAAcI,CAAI,IAClBzW,IAAAE,EAAQ,iBAAR,QAAAF,EAAA,KAAAE,GAAuBuW,GAAMO,IAEzBA,KACFR,EAAkBC,CAAI;AAAA,IAE1B,GAEAK,EAAY,UAAU,CAACC,MAAuC;;AAC5D,OAAA/W,IAAAE,EAAQ,YAAR,QAAAF,EAAA,KAAAE,GAAkB6W,EAAM,QACpBA,EAAM,UAAU,iBAClBZ,EAAe,EAAK;AAAA,IAExB,GAEAW,EAAY,QAAQ,MAAM;AACxB,UAAIZ,KAAehW,EAAQ;AACzB,YAAI;AACF,UAAA4W,EAAY,MAAA;AAAA,QACd,QAAQ;AACN,UAAAX,EAAe,EAAK;AAAA,QACtB;AAAA;AAEA,QAAAA,EAAe,EAAK;AAAA,IAExB,GAEAG,EAAe,UAAUQ,GACzBA,EAAY,MAAA,GACZX,EAAe,EAAI;AAAA,EACrB,GAAG,CAACI,GAAaL,GAAahW,EAAQ,UAAUA,EAAQ,UAAU,CAAC,GAE7D+W,IAAO3b,EAAY,MAAM;;AAC7B,KAAA0E,IAAAsW,EAAe,YAAf,QAAAtW,EAAwB,QACxBsW,EAAe,UAAU,MACzBH,EAAe,EAAK;AAAA,EACtB,GAAG,CAAA,CAAE;AAEL,SAAAza,EAAU,MAAM,MAAMub,EAAA,GAAQ,EAAE,GAEzB,EAAE,aAAAf,GAAa,aAAAK,GAAa,OAAAK,GAAO,MAAAK,GAAM,YAAAb,EAAA;AAClD;AAcO,SAASc,GAAoBhX,IAA6B,IAAI;AACnE,QAAM,CAACiS,GAASgF,CAAU,IAAIjc,EAAS,EAAE,GACnCwD,IAAWtD,EAAA,GAEX8W,IAAW5W;AAAA,IACf,CAACmb,MAAiB;AAEhB,MAAAU,EAAW,EAAE,GACb,sBAAsB,MAAM;AAC1B,QAAAA,EAAWV,CAAI,GACXvW,EAAQ,iBACNxB,EAAS,WACX,aAAaA,EAAS,OAAO,GAE/BA,EAAS,UAAU,WAAW,MAAMyY,EAAW,EAAE,GAAGjX,EAAQ,YAAY;AAAA,MAE5E,CAAC;AAAA,IACH;AAAA,IACA,CAACA,EAAQ,YAAY;AAAA,EAAA;AAGvB,EAAAxE;AAAA,IACE,MAAM,MAAM;AACV,MAAIgD,EAAS,WACX,aAAaA,EAAS,OAAO;AAAA,IAEjC;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAM0Y,IAAc;AAAA,IAClB,MAAM;AAAA,IACN,aAAalX,EAAQ,cAAe;AAAA,IACpC,eAAeA,EAAQ,UAAU;AAAA,IACjC,iBAAiBA,EAAQ,YAAa;AAAA,IACtC,OAAO;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,IAAA;AAAA,EACd;AAGF,SAAO,EAAE,SAAAiS,GAAS,UAAAD,GAAU,aAAAkF,EAAA;AAC9B;AAKO,SAASC,KAAuB;AACrC,QAAM,EAAE,UAAAnF,GAAU,aAAAkF,GAAa,SAAAjF,EAAA,IAAY+E,GAAoB;AAAA,IAC7D,YAAY;AAAA,IACZ,cAAc;AAAA,EAAA,CACf;AAaD,SAAO,EAAE,oBAXkB5b;AAAA,IACzB,CAACgc,MAAsB;AACrB,MAAApF,EAAS,iBAAiBoF,CAAS,EAAE,GAEjC,OAAO,WAAa,QACtB,SAAS,QAAQA;AAAA,IAErB;AAAA,IACA,CAACpF,CAAQ;AAAA,EAAA,GAGkB,aAAAkF,GAAa,SAAAjF,EAAA;AAC5C;AAKO,SAASoF,KAAqB;AACnC,QAAMjI,IAAelU,EAAoB,IAAI,GAGvCoc,IAAalc,EAAY,MAAM;;AACnC,UAAMoE,KAAKM,IAAAsP,EAAa,YAAb,gBAAAtP,EAAsB;AAAA,MAC/B;AAAA;AAEF,IAAAN,KAAA,QAAAA,EAAI;AAAA,EACN,GAAG,CAAA,CAAE,GAGC+X,IAAenc,EAAY,CAACvD,MAAqB;;AACrD,KAAAuS,KAAAtK,IAAAsP,EAAa,YAAb,gBAAAtP,EAAsB,cAA2BjI,OAAjD,QAAAuS,EAA4D;AAAA,EAC9D,GAAG,CAAA,CAAE,GAGCoN,IAAuBpc,EAAY,MAClCgU,EAAa,UAGX,MAAM;AAAA,IACXA,EAAa,QAAQ;AAAA,MACnB;AAAA,IAAA;AAAA,EACF,IALO,CAAA,GAOR,CAAA,CAAE;AAEL,SAAO,EAAE,cAAAA,GAAc,YAAAkI,GAAY,cAAAC,GAAc,sBAAAC,EAAA;AACnD;AA2BA,MAAMC,KAAmD;AAAA,EACvD,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AACf;AAOO,SAASC,GACd1X,IAAyCyX,IACzC;AACA,QAAM,CAACE,GAAUC,CAAW,IAAI5c,EAAS,EAAE,GAAGyc,IAAmB,GAAGzX,GAAS,GAEvE6X,IAAgBzc;AAAA,IACpB,CACEjF,GACAgC,MACG;AACH,MAAAyf,EAAY,CAAC9W,OAAU,EAAE,GAAGA,GAAM,CAAC3K,CAAG,GAAGgC,EAAA,EAAQ;AAAA,IACnD;AAAA,IACA,CAAA;AAAA,EAAC,GAIGM,IAAMqf,GAAqBH,CAAQ,GAGnCI,IAAc;AAAA,IAClBJ,EAAS,kBAAkB;AAAA,IAC3BA,EAAS,oBAAoB;AAAA,IAC7BA,EAAS,iBAAiB;AAAA,IAC1BA,EAAS,gBAAgB;AAAA,IACzBA,EAAS,cAAc;AAAA,IACvBA,EAAS,gBAAgB;AAAA,IACzBA,EAAS,gBAAgB;AAAA,EAAA,EAExB,OAAO,OAAO,EACd,KAAK,GAAG,GAGLK,IAAoC,CAAA;AAC1C,SAAIL,EAAS,eAAeA,EAAS,gBAAgB,QACnDK,EAAU,aAAa,OAAOL,EAAS,WAAW,IAEhDA,EAAS,eAAeA,EAAS,gBAAgB,MACnDK,EAAU,cAAc,IAAIL,EAAS,cAAc,KAAK,IAAI,OAGvD,EAAE,UAAAA,GAAU,eAAAE,GAAe,KAAApf,GAAK,aAAAsf,GAAa,WAAAC,EAAA;AACtD;AAEA,SAASF,GAAqBH,GAAiD;AAC7E,QAAMM,IAAkB,CAAA;AAExB,SAAIN,EAAS,kBACXM,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA,qGAIsF,GAG/FN,EAAS,oBACXM,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA,+DAIgD,GAGzDN,EAAS,iBACXM,EAAM,KAAK;AAAA;AAAA,oGAEqF,GAG9FN,EAAS,gBACXM,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA,EAIb,GAGIN,EAAS,gBACXM,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA,EAIb,GAGIN,EAAS,gBACXM,EAAM,KAAK;AAAA,gIACiH,GAGvHA,EAAM,KAAK;AAAA,CAAI;AACxB;AAgBO,SAASC,GACdC,GACAC,GACAC,IAAc,IACG;AACjB,QAAMC,IAAQC,GAAkBC,GAAWL,CAAU,CAAC,GAChDM,IAAQF,GAAkBC,GAAWJ,CAAU,CAAC,GAChDM,IAAQC,GAAcL,GAAOG,CAAK,GAClChO,IAAY4N,IAAc,MAAM;AAEtC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQK,KAASjO;AAAA,IACjB,SAAS,kBAAkBiO,EAAM,QAAQ,CAAC,CAAC,gBAAgBjO,CAAS,aAAa4N,IAAc,gBAAgB,EAAE;AAAA,EAAA;AAErH;AAKO,SAASO,KAAoC;AAClD,MAAI,OAAO,WAAa;AACtB,WAAO,CAAA;AAET,QAAMC,IAA6B,CAAA;AAGnC,kBAAS,iBAAiB,GAAG,EAAE,QAAQ,CAACte,MAAM;;AAC5C,UAAMgc,MAAOzW,IAAAvF,EAAE,gBAAF,gBAAAuF,EAAe,WAAU,IAChCgZ,IAAe,CAAC,CAACve,EAAE,aAAa,YAAY;AAElD,IADgB,CAAC,cAAc,aAAa,cAAc,QAAQ,MAAM,EAC5D,SAASgc,EAAK,aAAa,KAAK,CAACuC,KAC3CD,EAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,2BAA2BtC,CAAI;AAAA,MACxC,SAAShc,EAAE,UAAU,MAAM,GAAG,GAAG;AAAA,IAAA,CAClC;AAAA,EAEL,CAAC,GAGgB,SAAS,iBAAiB,wBAAwB,GAClD,SAAS,iBAAiB,+BAA+B,EACjE,QAAQ,CAACwe,MAAY;AAE5B,IADmBA,EAAQ,cAAc,wBAAwB,KAE/DF,EAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,IAAIE,EAAQ,QAAQ,aAAa;AAAA,MAC1C,SAASA,EAAQ,QAAQ,YAAA;AAAA,IAAY,CACtC;AAAA,EAEL,CAAC,GAGD,SAAS,iBAAiB,iBAAiB,EAAE,QAAQ,CAACvZ,MAAO;AAC3D,UAAMjG,IAAQ,OAAO,iBAAiBiG,CAAE,GAClCoF,IAAQ,WAAWrL,EAAM,KAAK,GAC9Byf,IAAW,WAAWzf,EAAM,QAAQ;AAC1C,IAAIyf,IAAW,KAAKpU,IAAQoU,IAAW,MACrCH,EAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,0CAA0C,KAAK,MAAMjU,IAAQoU,CAAQ,CAAC;AAAA,MAC/E,SAASxZ,EAAG,QAAQ,YAAA;AAAA,IAAY,CACjC;AAAA,EAEL,CAAC,GAGD,SAAS,iBAAiB,qDAAqD,EAAE,QAAQ,CAACA,MAAO;AAE/F,IADoBA,EAAG,aAAa,UAAU,KAE5CqZ,EAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAASrZ,EAAG,QAAQ,YAAA;AAAA,IAAY,CACjC;AAAA,EAEL,CAAC,GAID,SAAS,iBAAiB,kCAAkC,EAAE,QAAQ,CAACA,MAAO;AAC5E,IAAAqZ,EAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAASrZ,EAAG,QAAQ,YAAA;AAAA,IAAY,CACjC;AAAA,EACH,CAAC,GAEMqZ;AACT;AAIA,SAASL,GAAWzhB,GAAyC;AAC3D,MAAIA,EAAM,WAAW,GAAG,GAAG;AACzB,UAAM8B,IAAM9B,EAAM,MAAM,CAAC,GACnB,IAAI,SAAS8B,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACpCG,IAAI,SAASH,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACpCI,IAAI,SAASJ,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC1C,WAAO,CAAC,GAAGG,GAAGC,CAAC;AAAA,EACjB;AACA,SAAO,CAAC,GAAG,GAAG,CAAC;AACjB;AAEA,SAASsf,GAAkB,CAACxf,GAAGC,GAAGC,CAAC,GAAqC;AACtE,QAAMggB,IAAY,CAACxW,MAAeA,KAAK,UAAUA,IAAI,QAAQ,KAAK,KAAKA,IAAI,SAAS,OAAO,GAAG;AAC9F,SAAO,SAASwW,EAAUlgB,CAAC,IAAI,SAASkgB,EAAUjgB,CAAC,IAAI,SAASigB,EAAUhgB,CAAC;AAC7E;AAEA,SAAS0f,GAAcO,GAAYC,GAAoB;AACrD,QAAMC,IAAU,KAAK,IAAIF,GAAIC,CAAE,GACzBE,IAAS,KAAK,IAAIH,GAAIC,CAAE;AAC9B,UAAQC,IAAU,SAASC,IAAS;AACtC;ACthBO,MAAMC,KAA+C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,KAAY,gCACZC,KAAW,+BAKXC,KAA+D;AAAA,EACnE,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,eAAe;AACjB;AAEA,SAASC,KAAqB;AAI5B,MAHI,OAAO,WAAa,OAGpB,SAAS,eAAeH,EAAS;AACnC;AAGF,QAAMI,IAAQ,8BACRC,IAAM,SAAS,gBAAgBD,GAAO,KAAK;AACjD,EAAAC,EAAI,KAAKL,IACTK,EAAI,aAAa,eAAe,MAAM,GACtCA,EAAI,aAAa,aAAa,OAAO,GACrCA,EAAI,MAAM,WAAW,YACrBA,EAAI,MAAM,QAAQ,KAClBA,EAAI,MAAM,SAAS,KACnBA,EAAI,MAAM,WAAW;AAErB,QAAMC,IAAO,SAAS,gBAAgBF,GAAO,MAAM;AACnD,aAAW,CAAC1b,GAAM6b,CAAM,KAAK,OAAO,QAAQL,EAAO,GAAG;AACpD,UAAMM,IAAS,SAAS,gBAAgBJ,GAAO,QAAQ;AACvD,IAAAI,EAAO,KAAK,WAAW9b,CAAI,IAC3B8b,EAAO,aAAa,+BAA+B,MAAM;AACzD,UAAMC,IAAK,SAAS,gBAAgBL,GAAO,eAAe;AAC1D,IAAAK,EAAG,aAAa,QAAQ,QAAQ,GAChCA,EAAG,aAAa,UAAUF,CAAM,GAChCC,EAAO,YAAYC,CAAE,GACrBH,EAAK,YAAYE,CAAM;AAAA,EACzB;AAIA,MAHAH,EAAI,YAAYC,CAAI,GACpB,SAAS,KAAK,YAAYD,CAAG,GAEzB,CAAC,SAAS,eAAeJ,EAAQ,GAAG;AACtC,UAAMjgB,IAAQ,SAAS,cAAc,OAAO;AAC5C,IAAAA,EAAM,KAAKigB,IACXjgB,EAAM,cAAc,OAAO,KAAKkgB,EAAO,EACpC,IAAI,CAACQ,MAAM,qBAAqBA,CAAC,wBAAwBA,CAAC,eAAe,EACzE,KAAK,EAAE,GACV,SAAS,KAAK,YAAY1gB,CAAK;AAAA,EACjC;AACF;AAEA,SAAS2gB,GAAgBrG,GAA2B;AAClD,aAAW5V,KAAQ,OAAO,KAAKwb,EAAO;AACpC,IAAA5F,EAAO,UAAU,OAAO,oBAAoB5V,CAAI,EAAE;AAEtD;AAGO,SAASkc,GACdlc,GACA4V,IAA6B,OAAO,WAAa,MAAc,SAAS,kBAAkB,MACpF;AACN,EAAKA,MAGL6F,GAAA,GACAQ,GAAgBrG,CAAM,GAClB5V,MAAS,UACX4V,EAAO,UAAU,IAAI,oBAAoB5V,CAAI,EAAE;AAEnD;AAcO,SAASmc,GACdnc,GACA+B,IAAoC,IAC9B;AACN,QAAM,EAAE,QAAA6T,MAAW7T,GACbqa,IAAgBnf,EAA2B,IAAI;AAErD,EAAAM,EAAU,MAAM;AACd,UAAMiF,IAAOoT,MAAW,OAAO,WAAa,MAAc,SAAS,kBAAkB;AACrF,WAAAwG,EAAc,UAAU5Z,GACxB0Z,GAAoBlc,GAAMwC,CAAI,GACvB,MAAM;AACX,YAAM1H,IAAIshB,EAAc;AACxB,MAAIthB,KACFmhB,GAAgBnhB,CAAC;AAAA,IAErB;AAAA,EACF,GAAG,CAACkF,GAAM4V,CAAM,CAAC;AACnB;AAGO,SAASyG,GACdzG,IAA6B,OAAO,WAAa,MAAc,SAAS,kBAAkB,MAI1F;AACA,SAAO;AAAA,IACL,KAAK,CAAC5V,MAASkc,GAAoBlc,GAAM4V,CAAM;AAAA,IAC/C,OAAO,MAAM;AACX,MAAIA,KACFqG,GAAgBrG,CAAM;AAAA,IAE1B;AAAA,EAAA;AAEJ;ACnCA,MAAM0G,KAAgB,CAACC,MAA2E;AAAA,EAChG,GAAGA;AACL,GAEMC,KAAiB,MAAuD;AAC5E,QAAM5U,wBAAU,IAAA;AAChB,SAAO;AAAA,IACL,SAAS,CAACjD,MAAM,QAAQ,QAAQiD,EAAI,IAAIjD,CAAC,CAAC;AAAA,IAC1C,SAAS,CAACA,GAAG0G,OACXzD,EAAI,IAAIjD,GAAG0G,CAAC,GACL,QAAQ,QAAA;AAAA,EACjB;AAEJ;AAMO,SAASoR,GAAuB1a,IAAmC,IAAsB;AAC9F,QAAM2a,IAAS3a,EAAQ,oBAAoBua,IACrCK,IAAU5a,EAAQ,WAAWya,GAAA,GAC7BI,IAAS7a,EAAQ,QACjB8a,wBAAc,IAAA,GACdC,wBAAiB,IAAA,GACjBC,wBAAmB,IAAA,GAEnBC,IAAa,CACjBpE,GACAqE,MACS;AACT,UAAMC,IAAMH,EAAa,IAAInE,CAAK;AAClC,QAAKsE;AAGL,iBAAWrX,KAAKqX;AACd,YAAI;AACF,UAAArX,EAAEoX,CAAM;AAAA,QACV,QAAQ;AAAA,QAER;AAAA,EAEJ,GAEME,IAAe,CACnBC,GACAC,GACAC,MACsB;AACtB,UAAMC,IAAa,IAAI,IAAIF,CAAO;AAClC,WAAO;AAAA,MACL,aAAaE;AAAA,MACb,KAAK,CAACC,MAAUC,MAAS;AACvB,QAAIb,KACFA,EAAOQ,EAAS,IAAII,GAAOC,CAAI;AAAA,MAEnC;AAAA,MACA,IAAI,CAAC7E,GAAO9Y,MAAY;AACtB,YAAIod,IAAMJ,EAAW,IAAIlE,CAAK;AAC9B,QAAKsE,MACHA,wBAAU,IAAA,GACVJ,EAAW,IAAIlE,GAAOsE,CAAG,IAE3BA,EAAI,IAAIpd,CAAO;AACf,cAAM4d,IAAM,MAAY;AACtB,UAAAR,EAAK,OAAOpd,CAAO;AAAA,QACrB;AACA,eAAAwd,EAAS,KAAKI,CAAG,GACVA;AAAA,MACT;AAAA,MACA,MAAM,CAAC9E,GAAO+E,MAAY;AACxB,YAAI,CAACJ,EAAW,IAAI,aAAa;AAC/B;AAEF,cAAML,IAAMJ,EAAW,IAAIlE,CAAK;AAChC,YAAKsE;AAGL,qBAAWrX,KAAKqX;AACd,gBAAI;AACF,cAAArX,EAAE8X,CAAO;AAAA,YACX,QAAQ;AAAA,YAER;AAAA,MAEJ;AAAA,MACA,SAAS,OAAOzlB,GAAKgC,MAAU;AAC7B,QAAKqjB,EAAW,IAAI,eAAe,KAGnC,MAAMZ,EAAQ,QAAQ,GAAGS,EAAS,EAAE,IAAIllB,CAAG,IAAIgC,CAAK;AAAA,MACtD;AAAA,MACA,SAAS,OAAoBhC,MAAwC;AACnE,YAAKqlB,EAAW,IAAI,cAAc;AAGlC,iBAAQ,MAAMZ,EAAQ,QAAQ,GAAGS,EAAS,EAAE,IAAIllB,CAAG,EAAE;AAAA,MACvD;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,SAAS0lB,GAAQ;AACf,YAAMC,IAAKD,EAAO,SAAS;AAC3B,UAAIf,EAAQ,IAAIgB,CAAE;AAChB,cAAM,IAAI,MAAM,WAAWA,CAAE,sBAAsB;AAErD,YAAMZ,IAA2B;AAAA,QAC/B,UAAUW,EAAO;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAAf,EAAQ,IAAIgB,GAAI,EAAE,QAAAD,GAAQ,QAAAX,GAAQ,UAAU,CAAA,GAAI,GAChDD,EAAW,YAAYC,CAAM,GACtBA;AAAA,IACT;AAAA,IACA,WAAWY,GAAI;AAEb,aADchB,EAAQ,IAAIgB,CAAE,KAI5BhB,EAAQ,OAAOgB,CAAE,GACV,MAHE;AAAA,IAIX;AAAA,IACA,MAAM,SAASA,GAAI;AACjB,YAAM5V,IAAQ4U,EAAQ,IAAIgB,CAAE;AAC5B,UAAI,CAAC5V;AACH,cAAM,IAAI,MAAM,mBAAmB4V,CAAE,GAAG;AAE1C,UAAI5V,EAAM,OAAO,WAAW;AAC1B,eAAOA,EAAM;AAGf,iBAAW6V,KAAO7V,EAAM,OAAO,SAAS,aAAa,IAAI;AACvD,cAAM8V,IAAWlB,EAAQ,IAAIiB,CAAG;AAChC,YAAI,CAACC;AACH,gBAAA9V,EAAM,OAAO,SAAS,SACtBA,EAAM,OAAO,QAAQ,uBAAuB6V,CAAG,IAC/Cd,EAAW,SAAS/U,EAAM,MAAM,GAC1B,IAAI,MAAMA,EAAM,OAAO,KAAK;AAEpC,QAAI8V,EAAS,OAAO,WAAW,YAC7B,MAAM,KAAK,SAASD,CAAG;AAAA,MAE3B;AACA,MAAA7V,EAAM,OAAO,SAAS;AACtB,UAAI;AACF,cAAMoV,IAAUX,EAAOzU,EAAM,OAAO,SAAS,eAAe,IAAIA,EAAM,OAAO,QAAQ,GAC/EpM,IAAMshB,EAAalV,EAAM,OAAO,UAAUoV,GAASpV,EAAM,QAAQ;AACvE,cAAMA,EAAM,OAAO,SAASpM,CAAG,GAC/BoM,EAAM,OAAO,SAAS,UACtBA,EAAM,OAAO,cAAc,KAAK,IAAA,GAChCA,EAAM,OAAO,QAAQ,QACrB+U,EAAW,YAAY/U,EAAM,MAAM;AAAA,MACrC,SAAS+V,GAAK;AACZ,cAAA/V,EAAM,OAAO,SAAS,SACtBA,EAAM,OAAO,QAAQ+V,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,GACpEhB,EAAW,SAAS/U,EAAM,MAAM,GAC1B+V;AAAA,MACR;AACA,aAAO/V,EAAM;AAAA,IACf;AAAA,IACA,MAAM,WAAW4V,GAAI;;AACnB,YAAM5V,IAAQ4U,EAAQ,IAAIgB,CAAE;AAC5B,UAAI,CAAC5V;AACH,cAAM,IAAI,MAAM,mBAAmB4V,CAAE,GAAG;AAE1C,UAAI5V,EAAM,OAAO,WAAW;AAC1B,eAAOA,EAAM;AAEf,MAAAA,EAAM,OAAO,SAAS;AACtB,UAAI;AACF,gBAAMkE,KAAAtK,IAAAoG,EAAM,QAAO,eAAb,gBAAAkE,EAAA,KAAAtK;AACN,mBAAW2C,KAAKyD,EAAM,SAAS,OAAO,CAAC;AACrC,gBAAMzD,EAAA;AAER,QAAAyD,EAAM,OAAO,SAAS,YACtB+U,EAAW,cAAc/U,EAAM,MAAM;AAAA,MACvC,SAAS+V,GAAK;AACZ,cAAA/V,EAAM,OAAO,SAAS,SACtBA,EAAM,OAAO,QAAQ+V,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,GACpEhB,EAAW,SAAS/U,EAAM,MAAM,GAC1B+V;AAAA,MACR;AACA,aAAO/V,EAAM;AAAA,IACf;AAAA,IACA,OAAO;AACL,aAAO,CAAC,GAAG4U,EAAQ,OAAA,CAAQ,EAAE,IAAI,CAAC9e,OAAO,EAAE,GAAGA,EAAE,SAAS;AAAA,IAC3D;AAAA,IACA,IAAI8f,GAAI;AACN,YAAM5V,IAAQ4U,EAAQ,IAAIgB,CAAE;AAC5B,aAAO5V,IAAQ,EAAE,GAAGA,EAAM,WAAW;AAAA,IACvC;AAAA,IACA,GAAG2Q,GAAO9Y,GAAS;AACjB,UAAIod,IAAMH,EAAa,IAAInE,CAAK;AAChC,aAAKsE,MACHA,wBAAU,IAAA,GACVH,EAAa,IAAInE,GAAOsE,CAAG,IAE7BA,EAAI,IAAIpd,CAAO,GACR,MAAM;AACX,QAAAod,EAAK,OAAOpd,CAAO;AAAA,MACrB;AAAA,IACF;AAAA,EAAA;AAEJ;AC3TO,SAASme,MAAUjI,GAAoC;AAC5D,SAAOA,EAAM,KAAK,GAAG;AACvB;AAaO,MAAMkI,KAAgB;AAAA,EAC3B,QAAQ,CAACL,MAAiBA,IAAK,eAAeA,CAAE,KAAK;AAAA,EACrD,WAAW,CAACA,MAAiBA,IAAK,mBAAmBA,CAAE,KAAK;AAAA,EAC5D,aAAa,CAACA,MAAiBA,IAAK,qBAAqBA,CAAE,KAAK;AAAA,EAChE,QAAQ,CAACA,MAAiBA,IAAK,eAAeA,CAAE,KAAK;AAAA,EACrD,UAAU,CAACA,MAAiBA,IAAK,iBAAiBA,CAAE,KAAK;AAAA,EACzD,QAAQ,CAACA,MAAiBA,IAAK,eAAeA,CAAE,KAAK;AAAA,EACrD,YAAY,CAACA,MAAiBA,IAAK,oBAAoBA,CAAE,KAAK;AAAA,EAC9D,UAAU,CAACA,MAAiBA,IAAK,iBAAiBA,CAAE,KAAK;AAAA,EACzD,OAAO,CAACA,MAAiBA,IAAK,cAAcA,CAAE,KAAK;AAAA,EACnD,MAAM,CAACA,MAAiBA,IAAK,aAAaA,CAAE,KAAK;AAAA,EACjD,UAAU,CAACA,MAAiBA,IAAK,aAAaA,CAAE,KAAK;AAAA,EACrD,OAAO,CAACA,MAAiBA,IAAK,cAAcA,CAAE,KAAK;AAAA,EACnD,QAAQ,CAACA,MAAiBA,IAAK,eAAeA,CAAE,KAAK;AAAA,EACrD,MAAM,CAACA,MAAiBA,IAAK,aAAaA,CAAE,KAAK;AAAA,EACjD,MAAM,CAACA,MAAiBA,IAAK,aAAaA,CAAE,KAAK;AAAA,EACjD,MAAM,CAACA,MAAiBA,IAAK,aAAaA,CAAE,KAAK;AAAA,EACjD,OAAO,CAACA,MAAiBA,IAAK,cAAcA,CAAE,KAAK;AAAA,EACnD,WAAW,CAACA,MAAiBA,IAAK,kBAAkBA,CAAE,KAAK;AAC7D,GA2BaM,KAAkD,CAAC,EAAE,UAAAvf,GAAU,WAAA2M,IAAY,MAAA,MACtF1M,GAAM;AAAA,EACJ;AAAA,EACA;AAAA,IACE,KAAK0M;AAAA,IACL,eAAe;AAAA,IACf,OAAO,EAAE,WAAAA,EAAA;AAAA,EAAU;AAAA,EAErB3M;AACF;AAEFuf,GAAgB,cAAc;AAYvB,SAASC,GACd/jB,GACAnC,GACA6J,GACM;AACN,QAAMsc,IAAM,IAAI,cAAc,WAAW;AAAA,IACvC,KAAAnmB;AAAA,IACA,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,GAAG6J;AAAA,EAAA,CACJ;AACD,EAAA1H,EAAQ,cAAcgkB,CAAG;AAC3B;AAMO,SAASC,GAAajkB,GAAiDie,GAAoB;;AAChG,QAAMiG,MACJ1c,IAAA,OAAO,yBAAyB,OAAO,iBAAiB,WAAW,OAAO,MAA1E,gBAAAA,EAA6E,UAC7EsK,IAAA,OAAO,yBAAyB,OAAO,oBAAoB,WAAW,OAAO,MAA7E,gBAAAA,EAAgF;AAElF,EAAIoS,KACFA,EAAa,KAAKlkB,GAASie,CAAI,GAEjCje,EAAQ,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,GAAA,CAAM,CAAC,GAC3DA,EAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,GAAA,CAAM,CAAC;AAC9D;AAmBO,SAASmkB,GACdzc,GACA;AACA,QAAM,EAAE,MAAA0c,GAAM,OAAAC,IAAQ,GAAG,UAAAC,IAAW,SAAS5c;AAC7C,MAAIkT,IAAQ,CAAC,GAAGwJ,CAAI;AAEpB,SAAO;AAAA,IACL,KAAKE;AAAA,IACL,MAAM,aACAD,IAAQ,KACV,MAAM,IAAI,QAAQ,CAAC5jB,MAAM,WAAWA,GAAG4jB,CAAK,CAAC,GAExC,EAAE,MAAM,CAAC,GAAGzJ,CAAK,GAAG,YAAYA,EAAM,OAAA;AAAA,IAE/C,QAAQ,OAAOI,OACbJ,EAAM,KAAKI,CAAI,GACRA;AAAA,IAET,QAAQ,OAAOnd,GAAc0mB,MAAuB;AAClD,YAAM7Z,IAAMkQ,EAAM,UAAU,CAAChR,MAAMA,EAAE0a,CAAQ,MAAMzmB,CAAG;AACtD,MAAI6M,KAAO,MACTkQ,EAAMlQ,CAAG,IAAI,EAAE,GAAGkQ,EAAMlQ,CAAG,GAAG,GAAG6Z,EAAA;AAAA,IAErC;AAAA,IACA,QAAQ,OAAO1mB,MAAiB;AAC9B,MAAA+c,IAAQA,EAAM,OAAO,CAAC,MAAM,EAAE0J,CAAQ,MAAMzmB,CAAG;AAAA,IACjD;AAAA,IACA,SAAS,MAAM,CAAC,GAAG+c,CAAK;AAAA,IACxB,OAAO,MAAM;AACX,MAAAA,IAAQ,CAAC,GAAGwJ,CAAI;AAAA,IAClB;AAAA,EAAA;AAEJ;AAQO,SAASI,GAAoBxkB,GAAgC;AAClE,QAAMykB,IAAuB,CAAA;AAM7B,SAHoBzkB,EAAQ;AAAA,IAC1B;AAAA,EAAA,EAEU,QAAQ,CAACkH,MAAO;;AAM1B,IAJEA,EAAG,aAAa,YAAY,KAC5BA,EAAG,aAAa,iBAAiB,OACjCM,IAAAN,EAAG,gBAAH,gBAAAM,EAAgB,WAChBN,EAAG,aAAa,OAAO,KAEvBud,EAAW;AAAA,MACT,GAAGvd,EAAG,QAAQ,YAAA,CAAa,GAAGA,EAAG,KAAK,MAAMA,EAAG,KAAK,EAAE;AAAA,IAAA;AAAA,EAG5D,CAAC,GAGclH,EAAQ,iBAAmC,KAAK,EACxD,QAAQ,CAACmJ,MAAQ;AACtB,IAAI,CAACA,EAAI,OAAOA,EAAI,aAAa,MAAM,MAAM,kBAC3Csb,EAAW;AAAA,MACT,MAAMtb,EAAI,MAAM,WAAWA,EAAI,IAAI,UAAU,GAAG,EAAE,IAAI,UAAU,EAAE;AAAA,IAAA;AAAA,EAGxE,CAAC,GAGcnJ,EAAQ;AAAA,IACrB;AAAA,EAAA,EAEK,QAAQ,CAAC0kB,MAAU;AACxB,UAAMC,IAAWD,EAAM,MAAM1kB,EAAQ,cAAc,cAAc0kB,EAAM,EAAE,IAAI,GACvElE,IAAekE,EAAM,aAAa,YAAY,KAAKA,EAAM,aAAa,iBAAiB;AAC7F,IAAI,CAACC,KAAY,CAACnE,KAChBiE,EAAW;AAAA,MACT,GAAGC,EAAM,QAAQ,YAAA,CAAa,GAAGA,EAAM,OAAO,YAAYA,EAAM,OAAO,OAAO,EAAE;AAAA,IAAA;AAAA,EAGtF,CAAC,GAEMD;AACT;ACpGA,MAAMG,KAAS,QAAQ,IAAI,aAAa;AAExC,IAAIC,IAA+B;AAAA,EACjC,SAASD;AAAAA,EACT,cAAc;AAAA,EACd,qBAAqB;AAAA;AAAA,EACrB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,mBAAmB;AACrB;AAEA,MAAME,KAAgC,CAAA,GAChCC,wBAAqB,IAAA,GACrBC,yBAAuB,IAAA;AAE7B,IAAIC,KAAe;AAmBZ,SAASC,GAAkB5lB,GAAuC;AACvEulB,EAAAA,IAAe,EAAE,GAAGA,GAAc,GAAGvlB,EAAA;AACvC;AAKO,SAAS6lB,KAA8C;AAC5D,SAAO,IAAI,IAAIJ,CAAc;AAC/B;AAKO,SAASK,GAAkBznB,GAAgD;AAChF,SAAOonB,EAAe,IAAIpnB,CAAa;AACzC;AAKO,SAAS0nB,GAAiBC,IAAgB,KAAqB;AACpE,SAAOR,GAAc,MAAM,CAACQ,CAAK;AACnC;AAKO,SAASC,KAA2B;AACzC,EAAAT,GAAc,SAAS,GACvBC,EAAe,MAAA,GACfC,GAAiB,MAAA;AACnB;AAKO,SAASQ,GAAeC,GAAsC;AACnE,QAAMtT,IAAYsT,KAAeZ,EAAa,uBAAuB;AACrE,SAAOC,GAAc,OAAO,CAAChZ,MAAMA,EAAE,iBAAiBqG,CAAS;AACjE;AAMA,SAASuT,KAAwB;AAC/B,SAAO,KAAK,OAAA,KAAYb,EAAa,gBAAgB;AACvD;AAEA,SAASc,GAAYC,GAA4B;AAC/C,QAAMC,IAAWd,EAAe,IAAIa,EAAO,aAAa;AAExD,EAAIC,KACFA,EAAS,eACLD,EAAO,UAAU,UACnBC,EAAS,eAETA,EAAS,eAEXA,EAAS,mBAAmBD,EAAO,gBACnCC,EAAS,gBAAgBA,EAAS,kBAAkBA,EAAS,aAC7DA,EAAS,gBAAgB,KAAK,IAAIA,EAAS,eAAeD,EAAO,cAAc,GAC/EC,EAAS,gBAAgB,KAAK,IAAIA,EAAS,eAAeD,EAAO,cAAc,GAC/EC,EAAS,eAAeD,EAAO,WAC3BA,EAAO,kBAAkBf,EAAa,uBAAuB,OAC/DgB,EAAS,qBAGXd,EAAe,IAAIa,EAAO,eAAe;AAAA,IACvC,eAAeA,EAAO;AAAA,IACtB,aAAa;AAAA,IACb,YAAYA,EAAO,UAAU,UAAU,IAAI;AAAA,IAC3C,aAAaA,EAAO,UAAU,UAAU,IAAI;AAAA,IAC5C,eAAeA,EAAO;AAAA,IACtB,eAAeA,EAAO;AAAA,IACtB,eAAeA,EAAO;AAAA,IACtB,iBAAiBA,EAAO;AAAA,IACxB,cAAcA,EAAO;AAAA,IACrB,iBAAiBA,EAAO,kBAAkBf,EAAa,uBAAuB,MAAM,IAAI;AAAA,EAAA,CACzF;AAEL;AAEA,SAASiB,EAAe3V,GAAoB;AAC1C,SAAIA,IAAK,IACA,IAAIA,IAAK,KAAM,QAAQ,CAAC,CAAC,OAE9BA,IAAK,MACA,GAAGA,EAAG,QAAQ,CAAC,CAAC,OAElB,IAAIA,IAAK,KAAM,QAAQ,CAAC,CAAC;AAClC;AA+BO,MAAM4V,KAA4C,CAAC;AAAA,EACxD,IAAAvC;AAAA,EACA,UAAAjf;AAAA,EACA,UAAAyhB;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AACF,MAAM;AACJ,QAAMC,IAAyCtjB;AAAA,IAC7C,CACEujB,GACAvV,GACAwV,GACAC,GACAC,GACAC,MACG;;AAIH,UAHI,CAAC5B,EAAa,WAAW,CAACa,SAG1Bb,IAAAA,EAAa,qBAAbA,QAAAA,EAA+B,SAASwB;AAC1C;AAGF,YAAMT,IAAuB;AAAA,QAC3B,eAAeS;AAAA,QACf,UAAU,UAAUpB,IAAc;AAAA,QAClC,OAAAnU;AAAA,QACA,gBAAAwV;AAAA,QACA,cAAAC;AAAA,QACA,WAAAC;AAAA,QACA,YAAAC;AAAA,QACA,kCAAkB,IAAA;AAAA,QAClB,WAAW,KAAK,IAAA;AAAA,MAAI;AAOtB,UAJA3B,GAAc,KAAKc,CAAM,GACzBD,GAAYC,CAAM,GAGdf,EAAa;AACf,YAAI;AACF,sBAAY,QAAQ,QAAQwB,CAAU,IAAIvV,CAAK,IAAI;AAAA,YACjD,OAAO0V;AAAA,YACP,UAAUF;AAAA,UAAA,CACX;AAAA,QACH,QAAQ;AAAA,QAER;AAKF,UADkBH,KAAgBtB,EAAa,cAChC;AACb,cAAM1S,IAAY+T,KAAiBrB,EAAa,uBAAuB,IACjE6B,IAASJ,IAAiBnU;AAEhC,gBAAQ;AAAA,UACN,eAAekU,CAAU,IAAIvV,CAAK;AAAA,UAClC,UAAU4V,IAAS,gCAAgC,+BAA+B,kBAAkBA,IAAS,SAAS,QAAQ;AAAA,UAC9H;AAAA,YACE,QAAQZ,EAAeQ,CAAc;AAAA,YACrC,MAAMR,EAAeS,CAAY;AAAA,YACjC,SAAS,KAAK,IAAID,IAAiBC,KAAgB,KAAK,QAAQ,CAAC,CAAC;AAAA,UAAA;AAAA,QACpE;AAAA,MAEJ;AAGA,MAAAP,KAAA,QAAAA,EAAWJ,KACXf,IAAAA,EAAa,aAAbA,QAAAA,EAAAA,KAAAA,GAAwBe;AAExB,YAAMzT,IAAY+T,KAAiBrB,EAAa,uBAAuB;AACvE,MAAIyB,IAAiBnU,MACnB8T,KAAA,QAAAA,EAAeL,KACff,IAAAA,EAAa,iBAAbA,QAAAA,EAAAA,KAAAA,GAA4Be;AAAA,IAEhC;AAAA,IACA,CAACpC,GAAIwC,GAAUC,GAAcC,GAAeC,CAAY;AAAA,EAAA;AAG1D,SAAKtB,EAAa,UAKhB,gBAAAlhB,EAACgjB,IAAA,EAAS,IAAAnD,GAAQ,UAAU4C,GACzB,UAAA7hB,GACH,4BANU,UAAAA,GAAS;AAQvB;AAiBO,SAASqiB,GAAmBjpB,GAAuBwc,GAAsC;AAC9F,QAAM0M,IAAejkB,EAAA,GACfkkB,IAAiBlkB,EAAO,CAAC;AAE/B,EAAAM,EAAU,MAAM;AACd,QAAI,CAAC2hB,EAAa,WAAW,CAACA,EAAa;AACzC;AAKF,QAFAiC,EAAe,WAEXA,EAAe,YAAY,GAAG;AAEhC,MAAAD,EAAa,UAAU1M;AACvB;AAAA,IACF;AAEA,UAAM4M,IAAYF,EAAa,SACzBG,IAAyB,CAAA,GAGzBC,IAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAKF,KAAa,CAAA,CAAE,GAAG,GAAG,OAAO,KAAK5M,CAAK,CAAC,CAAC;AAEhF,eAAWtc,KAAOopB,GAAS;AACzB,YAAMC,IAAWH,KAAA,gBAAAA,EAAYlpB,IACvBspB,IAAWhN,EAAMtc,CAAG;AAE1B,MAAK,OAAO,GAAGqpB,GAAUC,CAAQ,KAC/BH,EAAQ,KAAK;AAAA,QACX,UAAUnpB;AAAA,QACV,UAAAqpB;AAAA,QACA,UAAAC;AAAA,QACA,WAAW,KAAK,IAAA;AAAA,MAAI,CACrB;AAAA,IAEL;AAEA,IAAIH,EAAQ,SAAS,KAAKnC,EAAa,gBACrC,QAAQ;AAAA,MACN,mBAAmBlnB,CAAa;AAAA,MAChC;AAAA,MACA,WAAWmpB,EAAe,OAAO;AAAA,MACjCE,EAAQ,IAAI,CAAC7c,OAAO;AAAA,QAClB,MAAMA,EAAE;AAAA,QACR,MAAMA,EAAE;AAAA,QACR,IAAIA,EAAE;AAAA,QACN,MAAM,OAAOA,EAAE;AAAA,MAAA,EACf;AAAA,IAAA,GAIN0c,EAAa,UAAU1M;AAAA,EACzB,CAAC;AACH;AAKO,SAASiN,GACdC,GACAC,GACa;AACb,QAAMviB,IAAOuiB,KAAeD,EAAU,eAAeA,EAAU,QAAQ,WAEjEE,IAAgC,CAACpN,OACrCyM,GAAmB7hB,GAAMoV,CAAgC,GAClD,gBAAAxW,EAAC0jB,GAAA,EAAW,GAAGlN,EAAA,CAAO;AAG/B,SAAAoN,EAAiB,cAAc,mBAAmBxiB,CAAI,KAE/CwiB;AACT;AAkBO,SAASC,GAAe7pB,GAAgC;AAC7D,QAAM8pB,IAAW7kB,EAAO,CAAC;AACzB,SAAA6kB,EAAS,WAETvkB,EAAU,MAAM;AACd,IAAI2hB,EAAa,WAAWA,EAAa,gBAAgBlnB,KACvD,QAAQ;AAAA,MACN,oBAAoBA,CAAa,KAAK8pB,EAAS,OAAO;AAAA,MACtD,UAAUA,EAAS,UAAU,KAAK,kCAAkC,+BAA+B;AAAA,IAAA;AAAA,EAGzG,CAAC,GAEMA,EAAS;AAClB;AAiBO,SAASC,GAAU3iB,GAAc4iB,GAAwC;AAC9E,MAAI,CAAC9C,EAAa;AAChB;AAGF,QAAM+C,IAAwB;AAAA,IAC5B,MAAA7iB;AAAA,IACA,WAAW,YAAY,IAAA;AAAA,IACvB,QAAA4iB;AAAA,EAAA;AAKF,MAFA3C,GAAiB,IAAIjgB,GAAM6iB,CAAI,GAE3B/C,EAAa;AACf,QAAI;AACF,kBAAY,KAAK,QAAQ9f,CAAI,UAAU,EAAE,QAAA4iB,GAAQ;AAAA,IACnD,QAAQ;AAAA,IAER;AAEJ;AAKO,SAASE,GAAQ9iB,GAAsB;AAC5C,MAAI,CAAC8f,EAAa;AAChB,WAAO;AAGT,QAAM+C,IAAO5C,GAAiB,IAAIjgB,CAAI;AACtC,MAAI,CAAC6iB;AACH,mBAAQ,KAAK,gCAAgC7iB,CAAI,EAAE,GAC5C;AAGT,QAAM6K,IAAW,YAAY,IAAA,IAAQgY,EAAK;AAG1C,MAFAA,EAAK,WAAWhY,GAEZiV,EAAa;AACf,QAAI;AACF,kBAAY,KAAK,QAAQ9f,CAAI,MAAM,GACnC,YAAY,QAAQ,QAAQA,CAAI,IAAI,QAAQA,CAAI,UAAU,QAAQA,CAAI,MAAM;AAAA,IAC9E,QAAQ;AAAA,IAER;AAGF,SAAI8f,EAAa,gBACf,QAAQ;AAAA,IACN,eAAe9f,CAAI,KAAK+gB,EAAelW,CAAQ,CAAC;AAAA,IAChD,UAAUA,IAAW,MAAM,kCAAkC,+BAA+B;AAAA,EAAA,GAIzFA;AACT;AAKA,eAAsBkY,GACpB/iB,GACAgjB,GACAJ,GACY;AACZ,EAAAD,GAAU3iB,GAAM4iB,CAAM;AACtB,MAAI;AACF,WAAO,MAAMI,EAAA;AAAA,EACf,UAAA;AACE,IAAAF,GAAQ9iB,CAAI;AAAA,EACd;AACF;AAKO,SAASijB,GACdjjB,GACAgjB,GACAJ,GACG;AACH,EAAAD,GAAU3iB,GAAM4iB,CAAM;AACtB,MAAI;AACF,WAAOI,EAAA;AAAA,EACT,UAAA;AACE,IAAAF,GAAQ9iB,CAAI;AAAA,EACd;AACF;AAKO,SAASkjB,GACdljB,GACAmjB,GACAC,GACM;AACN,EAAAjlB,EAAU,MAAM;AACd,IAAAwkB,GAAU3iB,CAAI;AACd,UAAMqjB,IAAUF,EAAA;AAChB,WAAAL,GAAQ9iB,CAAI,GAELqjB;AAAA,EACT,GAAGD,CAAI;AACT;AASO,SAASE,KAMd;AACA,QAAMC,IAAQ,MAAM,KAAKvD,EAAe,QAAQ,GAC1CwD,IAAc/C,GAAA,GACdgD,IAAeF,EAAM,OAAO,CAACG,GAAKhd,MAAMgd,IAAMhd,EAAE,aAAa,CAAC,GAC9Did,IACJJ,EAAM,SAAS,IAAIA,EAAM,OAAO,CAACG,GAAKhd,MAAMgd,IAAMhd,EAAE,eAAe,CAAC,IAAI6c,EAAM,SAAS,GACnFK,IAAQ,MAAM,KAAK3D,GAAiB,QAAQ;AAElD,SAAO,EAAE,OAAAsD,GAAO,aAAAC,GAAa,cAAAC,GAAc,eAAAE,GAAe,OAAAC,EAAA;AAC5D;AAKO,SAASC,KAA+B;AAC7C,QAAMC,IAASR,GAAA;AAEf,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,EAAA,GAGF,QAAQ,IAAI,kBAAkBQ,EAAO,YAAY,EAAE,GACnD,QAAQ,IAAI,wBAAwB/C,EAAe+C,EAAO,aAAa,CAAC,EAAE,GAC1E,QAAQ,IAAI,iBAAiBA,EAAO,YAAY,MAAM,EAAE,GAExD,QAAQ,MAAM,iBAAiB,GAC/B,QAAQ;AAAA,IACNA,EAAO,MACJ,KAAK,CAAC5mB,GAAGtB,MAAMA,EAAE,kBAAkBsB,EAAE,eAAe,EACpD,IAAI,CAACwJ,OAAO;AAAA,MACX,MAAMA,EAAE;AAAA,MACR,SAASA,EAAE;AAAA,MACX,YAAYqa,EAAera,EAAE,aAAa;AAAA,MAC1C,YAAYqa,EAAera,EAAE,aAAa;AAAA,MAC1C,cAAcqa,EAAera,EAAE,eAAe;AAAA,MAC9C,gBAAgBA,EAAE;AAAA,IAAA,EAClB;AAAA,EAAA,GAEN,QAAQ,SAAA,GAEJod,EAAO,YAAY,SAAS,MAC9B,QAAQ,MAAM,wBAAwB,GACtC,QAAQ;AAAA,IACNA,EAAO,YAAY,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO;AAAA,MACxC,WAAW,EAAE;AAAA,MACb,OAAO,EAAE;AAAA,MACT,UAAU/C,EAAe,EAAE,cAAc;AAAA,MACzC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,mBAAA;AAAA,IAAmB,EAC/C;AAAA,EAAA,GAEJ,QAAQ,SAAA,IAGN+C,EAAO,MAAM,SAAS,MACxB,QAAQ,MAAM,cAAc,GAC5B,QAAQ;AAAA,IACNA,EAAO,MACJ,OAAO,CAAClH,MAAMA,EAAE,QAAQ,EACxB,IAAI,CAACA,OAAO;AAAA,MACX,MAAMA,EAAE;AAAA,MACR,UAAUmE,EAAenE,EAAE,QAAS;AAAA,IAAA,EACpC;AAAA,EAAA,GAEN,QAAQ,SAAA,IAGV,QAAQ,SAAA;AACV;AAMA,MAAMmH,yBAAoB,IAAA;AAKnB,SAASC,KAAqB;AACnC,aAAW,CAAChkB,GAAMujB,CAAK,KAAKvD;AAC1B,IAAA+D,GAAc,IAAI/jB,GAAM,EAAE,GAAGujB,GAAO;AAEtC,UAAQ,IAAI,0BAA0B;AACxC;AAKO,SAASU,GAAgBC,IAA2B,IAMxD;AACD,QAAMC,IAMD,CAAA;AAEL,aAAW,CAACnkB,GAAM2H,CAAO,KAAKqY,GAAgB;AAC5C,UAAMoE,IAAWL,GAAc,IAAI/jB,CAAI;AACvC,QAAI,CAACokB;AACH;AAIF,UAAMC,KACF1c,EAAQ,gBAAgByc,EAAS,iBAAiBA,EAAS,gBAAiB;AAChF,IAAIC,IAAYH,KACdC,EAAY,KAAK;AAAA,MACf,eAAenkB;AAAA,MACf,QAAQ;AAAA,MACR,UAAUokB,EAAS;AAAA,MACnB,SAASzc,EAAQ;AAAA,MACjB,eAAe0c;AAAA,IAAA,CAChB;AAIH,UAAMC,KACF3c,EAAQ,gBAAgByc,EAAS,iBAAiBA,EAAS,gBAAiB;AAChF,IAAIE,IAAYJ,KACdC,EAAY,KAAK;AAAA,MACf,eAAenkB;AAAA,MACf,QAAQ;AAAA,MACR,UAAUokB,EAAS;AAAA,MACnB,SAASzc,EAAQ;AAAA,MACjB,eAAe2c;AAAA,IAAA,CAChB;AAAA,EAEL;AAEA,SAAIH,EAAY,SAAS,KAAKrE,EAAa,gBACzC,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACAqE;AAAA,EAAA,GAIGA;AACT;AAqBO,MAAMI,KAAkDC;AAAA,EAC7D,CAAC,EAAE,UAAArN,IAAW,gBAAgB,kBAAAsN,IAAmB,SAAW;AAC1D,UAAM,CAACC,GAAWC,CAAY,IAAIhnB,EAAS8mB,CAAgB,GACrD,CAAClB,GAAOqB,CAAQ,IAAIjnB,EAAwB,CAAA,CAAE,GAC9C,CAACknB,GAAQC,CAAS,IAAInnB,EAAS,EAAE,MAAM,GAAG,OAAO,GAAG;AAwB1D,QArBAQ,EAAU,MAAM;AACd,YAAM4mB,IAAS,MAAM;AACnB,cAAMC,IAAW,MAAM,KAAKhF,EAAe,QAAQ;AACnD,QAAA4E,EAASI,EAAS,KAAK,CAAC9nB,GAAGtB,MAAMA,EAAE,kBAAkBsB,EAAE,eAAe,EAAE,MAAM,GAAG,EAAE,CAAC;AAEpF,cAAM+nB,IAAO,OAAO;AAGpB,QAAIA,EAAK,UACPH,EAAU;AAAA,UACR,MAAMG,EAAK,OAAO,iBAAiB,OAAO;AAAA,UAC1C,OAAOA,EAAK,OAAO,kBAAkB,OAAO;AAAA,QAAA,CAC7C;AAAA,MAEL;AAEA,MAAAF,EAAA;AACA,YAAMnZ,IAAW,YAAYmZ,GAAQ,GAAI;AACzC,aAAO,MAAM,cAAcnZ,CAAQ;AAAA,IACrC,GAAG,CAAA,CAAE,GAED,CAACkU,EAAa;AAChB,aAAO;AAGT,UAAMoF,IAAsC;AAAA,MAC1C,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,GAAI/N,EAAS,SAAS,KAAK,IAAI,EAAE,KAAK,EAAA,IAAM,EAAE,QAAQ,EAAA;AAAA,MACtD,GAAIA,EAAS,SAAS,MAAM,IAAI,EAAE,MAAM,EAAA,IAAM,EAAE,OAAO,EAAA;AAAA,IAAE;AAG3D,WACE,gBAAArX;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,GAAGolB;AAAA,UACH,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,SAASR,IAAY,YAAY;AAAA,UACjC,UAAUA,IAAY,SAAS;AAAA,UAC/B,WAAWA,IAAY,SAAS;AAAA,UAChC,UAAU;AAAA,QAAA;AAAA,QAGZ,UAAA;AAAA,UAAA,gBAAA5kB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,QAAQ,WAAW,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAA;AAAA,cACxE,SAAS,MAAM6kB,EAAa,CAACvf,MAAM,CAACA,CAAC;AAAA,cAErC,UAAA;AAAA,gBAAA,gBAAAxG,EAAC,UAAK,OAAO,EAAE,OAAO,gCAAA,GAAmC,UAAA,KAAC;AAAA,gBAC1D,gBAAAA,EAAC,UAAK,UAAA,WAAA,CAAQ;AAAA,gBACbimB,EAAO,OAAO,KACb,gBAAA/kB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OACE+kB,EAAO,OAAO,MACV,kCACA;AAAA,oBAAA;AAAA,oBAGP,UAAA;AAAA,sBAAAA,EAAO,KAAK,QAAQ,CAAC;AAAA,sBAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG5B,gBAAAjmB,EAAC,QAAA,EAAK,OAAO,EAAE,YAAY,QAAQ,SAAS,IAAA,GAAQ,UAAA8lB,IAAY,MAAM,IAAA,CAAI;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAG3E,CAACA,KACA,gBAAA5kB,EAAC,OAAA,EAAI,OAAO,EAAE,WAAW,KACvB,UAAA;AAAA,YAAA,gBAAAlB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,cAAc;AAAA,kBACd,eAAe;AAAA,kBACf,cAAc;AAAA,gBAAA;AAAA,gBAGhB,UAAA,gBAAAA,EAAC,YAAO,UAAA,iBAAA,CAAc;AAAA,cAAA;AAAA,YAAA;AAAA,YAEvB2kB,EAAM,IAAI,CAAC7c,wBACT,OAAA,EAA0B,OAAO,EAAE,cAAc,GAAG,SAAS,QAAQ,KAAK,KACzE,UAAA;AAAA,cAAA,gBAAA9H,EAAC,QAAA,EAAK,OAAO,EAAE,MAAM,GAAG,UAAU,UAAU,cAAc,WAAA,GACvD,UAAA8H,EAAE,cAAA,CACL;AAAA,cACA,gBAAA9H;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,OACE8H,EAAE,gBAAgB,KACd,kCACA;AAAA,kBAAA;AAAA,kBAGP,UAAAqa,EAAera,EAAE,aAAa;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEjC,gBAAA5G;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO,EAAE,OAAO,8BAA8B,UAAU,IAAI,WAAW,QAAA;AAAA,kBACxE,UAAA;AAAA,oBAAA;AAAA,oBACG4G,EAAE;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACN,KAlBQA,EAAE,aAmBZ,CACD;AAAA,YAED,gBAAA5G,EAAC,OAAA,EAAI,OAAO,EAAE,WAAW,GAAG,SAAS,QAAQ,KAAK,EAAA,GAChD,UAAA;AAAA,cAAA,gBAAAlB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAASilB;AAAA,kBACT,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,UAAU;AAAA,kBAAA;AAAA,kBAEb,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGD,gBAAAjlB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS4hB;AAAA,kBACT,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,UAAU;AAAA,kBAAA;AAAA,kBAEb,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED,EAAA,CACF;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA+D,GAAgB,cAAc;AASvB,SAASY,KAAsC;AACpD,EAAKtF,OAMJ,OAAe,wBAAwB;AAAA,IACtC,UAAUO;AAAA,IACV,mBAAAC;AAAA,IACA,gBAAAI;AAAA,IACA,aAAaoD;AAAA,IACb,OAAOrD;AAAA,IACP,cAAAwD;AAAA,IACA,iBAAAC;AAAA,IACA,WAAW9D;AAAA,EAAA,GAGb,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,EAAA;AAEJ;ACx2BA,MAAMN,KAAS,QAAQ,IAAI,aAAa;AAExC,IAAIC,IAAmC;AAAA,EACrC,SAASD;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,sBAAsB,OAAO;AAAA;AAC/B;AAEA,MAAMuF,KAA4B,CAAA,GAC5BC,yBAAoB,IAAA,GACpBC,yBAAuB,IAAA,GACvBC,yBAAwB,QAAA;AAE9B,IAAIC,KAAe;AAMnB,SAAS7E,KAAwB;AAC/B,SAAO,KAAK,OAAA,KAAYb,EAAa,gBAAgB;AACvD;AAEA,SAAS2F,KAAmB;;AAC1B,MAAI;AACF,UAAM,IAAI,MAAA;AAAA,EACZ,SAAS9mB,GAAG;AACV,aAAQ8D,IAAA9D,EAAY,UAAZ,gBAAA8D,EAAmB,MAAM;AAAA,GAAM,MAAM,GAAG,KAAK;AAAA,OAAS;AAAA,EAChE;AACF;AAEA,SAASijB,GAAmBlP,GAAqBrD,GAAcnR,GAAiC;AAC9F,SAAO,GAAIwU,EAA0C,YAAY,KAAK,QAAQ,IAAIrD,CAAI,IAAInR,EAAS,SAAA,EAAW,MAAM,GAAG,EAAE,CAAC;AAC5H;AAEA,SAAS2jB,EACPxS,GACAyB,GACAgR,IAAyB,WACzBhtB,GACAymB,GACM;;AAIN,MAHI,CAACS,EAAa,WAAW,CAACa,QAG1B/nB,OAAiB6J,IAAAqd,EAAa,qBAAb,QAAArd,EAA+B,SAAS7J;AAC3D;AAGF,QAAMkrB,IAAqB;AAAA,IACzB,IAAI,QAAQ0B,IAAc;AAAA,IAC1B,MAAArS;AAAA,IACA,UAAAyS;AAAA,IACA,eAAAhtB;AAAA,IACA,SAAAgc;AAAA,IACA,OAAO6Q,GAAA;AAAA,IACP,WAAW,KAAK,IAAA;AAAA,IAChB,MAAApG;AAAA,EAAA;AAGF,EAAA+F,GAAY,KAAKtB,CAAM,GAEnBhE,EAAa,gBAGf,QAFe8F,MAAa,aAAa,UAAUA,MAAa,YAAY,SAAS,MAEvE;AAAA,IACZ,yBAAyBzS,CAAI;AAAA,IAC7B,UACEyS,MAAa,aACT,gCACAA,MAAa,YACX,kCACA,+BACR;AAAA,IACAhR;AAAA,IACAhc,IAAgB,IAAIA,CAAa,MAAM;AAAA,IAC/B;AAAA,EAAA,IAIZmU,IAAA+S,EAAa,WAAb,QAAA/S,EAAA,KAAA+S,GAAsBgE;AACxB;AAmBO,SAAS+B,GAAsBtrB,GAA2C;AAC/E,EAAAulB,IAAe,EAAE,GAAGA,GAAc,GAAGvlB,EAAA;AACvC;AAKO,SAASurB,KAA+B;AAC7C,SAAO,CAAC,GAAGV,EAAW;AACxB;AAKO,SAASW,KAAyB;AACvC,EAAAX,GAAY,SAAS;AACvB;AAKO,SAASY,KAA2C;AACzD,SAAOZ,GAAY;AAAA,IACjB,CAACa,GAAKnC,OACJmC,EAAInC,EAAO,IAAI,KAAKmC,EAAInC,EAAO,IAAI,KAAK,KAAK,GACtCmC;AAAA,IAET,CAAA;AAAA,EAAC;AAEL;AAmBO,SAASC,GACdC,GACAvtB,GAC8C;AAC9C,QAAM,CAACoS,GAAOC,CAAQ,IAAItN,EAASwoB,CAAY,GACzCC,IAAavoB,EAAO,EAAI,GACxBwoB,IAAUxoB,EAAOjF,CAAa;AAEpC,EAAAuF,EAAU,OACRioB,EAAW,UAAU,IAEd,MAAM;AACX,IAAAA,EAAW,UAAU;AAAA,EACvB,IACC,CAAA,CAAE;AAEL,QAAME,IAAevoB,EAAY,CAACjD,MAAmC;AACnE,IAAIsrB,EAAW,UACbnb,EAASnQ,CAAK,IACLglB,EAAa,WACtB6F;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACAU,EAAQ;AAAA,IAAA;AAAA,EAGd,GAAG,CAAA,CAAE;AAEL,SAAO,CAACrb,GAAOsb,CAAY;AAC7B;AAkBO,SAASC,GACd3tB,GAC6D;AAC7D,QAAM4tB,IAAa3oB,EAA8B,IAAI,GAC/CwoB,IAAUxoB,EAAOjF,CAAa,GAE9BwI,IAAQrD,EAAY,MAAM;AAC9B,IAAIyoB,EAAW,YACb,aAAaA,EAAW,OAAO,GAC3B1G,EAAa,WACfuF,GAAc,OAAOmB,EAAW,OAA4B,GAE9DA,EAAW,UAAU;AAAA,EAEzB,GAAG,CAAA,CAAE,GAECnN,IAAQtb;AAAA,IACZ,CAACkD,GAAsBqe,MAAkB;AACvC,MAAAle,EAAA,GACAolB,EAAW,UAAU,WAAWvlB,GAAUqe,CAAK,GAE3CQ,EAAa,WACfuF,GAAc,IAAImB,EAAW,SAA8B;AAAA,QACzD,IAAIA,EAAW;AAAA,QACf,MAAM;AAAA,QACN,eAAeH,EAAQ;AAAA,QACvB,OAAOZ,GAAA;AAAA,QACP,WAAW,KAAK,IAAA;AAAA,MAAI,CACrB;AAAA,IAEL;AAAA,IACA,CAACrkB,CAAK;AAAA,EAAA;AAGR,SAAAjD,EAAU,MACD,MAAM;AACX,IAAIqoB,EAAW,YACT1G,EAAa,WACf6F;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACAU,EAAQ;AAAA,IAAA,GAGZjlB,EAAA;AAAA,EAEJ,GACC,CAACA,CAAK,CAAC,GAEH,CAACiY,GAAOjY,CAAK;AACtB;AAgBO,SAASqlB,GACd7tB,GAC6D;AAC7D,QAAM8tB,IAAc7oB,EAA8C,IAAI,GAChEwoB,IAAUxoB,EAAOjF,CAAa,GAE9BwI,IAAQrD,EAAY,MAAM;AAC9B,IAAI2oB,EAAY,YACd,cAAcA,EAAY,OAAyC,GAC/D5G,EAAa,WACfuF,GAAc,OAAOqB,EAAY,OAA4B,GAE/DA,EAAY,UAAU;AAAA,EAE1B,GAAG,CAAA,CAAE,GAECrN,IAAQtb;AAAA,IACZ,CAACkD,GAAsBqe,MAAkB;AACvC,MAAAle,EAAA,GACAslB,EAAY,UAAU,YAAYzlB,GAAUqe,CAAK,GAE7CQ,EAAa,WACfuF,GAAc,IAAIqB,EAAY,SAA8B;AAAA,QAC1D,IAAIA,EAAY;AAAA,QAChB,MAAM;AAAA,QACN,eAAeL,EAAQ;AAAA,QACvB,OAAOZ,GAAA;AAAA,QACP,WAAW,KAAK,IAAA;AAAA,MAAI,CACrB;AAAA,IAEL;AAAA,IACA,CAACrkB,CAAK;AAAA,EAAA;AAGR,SAAAjD,EAAU,MACD,MAAM;AACX,IAAIuoB,EAAY,YACV5G,EAAa,WACf6F;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACAU,EAAQ;AAAA,IAAA,GAGZjlB,EAAA;AAAA,EAEJ,GACC,CAACA,CAAK,CAAC,GAEH,CAACiY,GAAOjY,CAAK;AACtB;AAmBO,SAASulB,GACd/tB,GAMc;AACd,QAAMguB,IAAe/oB,EAOnB,EAAE,GACEwoB,IAAUxoB,EAAOjF,CAAa;AAEpC,SAAAuF,EAAU,MACD,MAAM;AAEX,eAAW,EAAE,QAAAqY,GAAQ,MAAArD,GAAM,UAAAnR,GAAU,SAAAW,EAAA,KAAaikB,EAAa;AAG7D,UAFApQ,EAAO,oBAAoBrD,GAAMnR,GAAUW,CAAO,GAE9Cmd,EAAa,SAAS;AACxB,cAAMrB,IAAKiH,GAAmBlP,GAAQrD,GAAMnR,CAAQ;AACpD,QAAAsjB,GAAiB,OAAO7G,CAAE;AAAA,MAC5B;AAGF,IAAImI,EAAa,QAAQ,SAAS,KAAK9G,EAAa,WAClD6F;AAAA,MACE;AAAA,MACA,GAAGiB,EAAa,QAAQ,MAAM;AAAA,MAC9B;AAAA,MACAP,EAAQ;AAAA,IAAA,GAIZO,EAAa,UAAU,CAAA;AAAA,EACzB,GACC,CAAA,CAAE,GAEE7oB;AAAA,IACL,CACEyY,GACArD,GACAnR,GACAW,MACG;AAIH,UAHA6T,EAAO,iBAAiBrD,GAAgBnR,GAAUW,CAAO,GACzDikB,EAAa,QAAQ,KAAK,EAAE,QAAApQ,GAAQ,MAAArD,GAAsB,UAAAnR,GAAU,SAAAW,GAAS,GAEzEmd,EAAa,SAAS;AACxB,cAAMrB,IAAKiH,GAAmBlP,GAAQrD,GAAgBnR,CAAQ;AAC9D,QAAAsjB,GAAiB,IAAI7G,GAAI;AAAA,UACvB,QAAAjI;AAAA,UACA,MAAArD;AAAA,UACA,UAAAnR;AAAA,UACA,eAAeqkB,EAAQ;AAAA,UACvB,OAAOZ,GAAA;AAAA,UACP,WAAW,KAAK,IAAA;AAAA,QAAI,CACrB;AAAA,MACH;AAEA,aAAO,MAAM;AAMX,YALAjP,EAAO,oBAAoBrD,GAAgBnR,GAAUW,CAAO,GAC5DikB,EAAa,UAAUA,EAAa,QAAQ;AAAA,UAC1C,CAAChgB,MAAMA,EAAE,WAAW4P,KAAU5P,EAAE,SAASuM,KAAQvM,EAAE,aAAa5E;AAAA,QAAA,GAG9D8d,EAAa,SAAS;AACxB,gBAAMrB,IAAKiH,GAAmBlP,GAAQrD,GAAgBnR,CAAQ;AAC9D,UAAAsjB,GAAiB,OAAO7G,CAAE;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAA;AAAA,EAAC;AAEL;AAmBO,SAASoI,GAAuBjuB,GAA2C;AAChF,QAAMkuB,IAAgBjpB,EAA+B,IAAI,GACnDwoB,IAAUxoB,EAAOjF,CAAa;AAEpC,SAAAuF,EAAU,MACD,MAAM;AACX,IAAI2oB,EAAc,WAAW,CAACA,EAAc,QAAQ,OAAO,YACzDA,EAAc,QAAQ,MAAA,GAElBhH,EAAa,WACf6F;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACAU,EAAQ;AAAA,IAAA;AAAA,EAIhB,GACC,CAAA,CAAE,GAEEtoB,EAAY,OAEb+oB,EAAc,WAChBA,EAAc,QAAQ,MAAA,GAGxBA,EAAc,UAAU,IAAI,gBAAA,GACrBA,EAAc,QAAQ,SAC5B,CAAA,CAAE;AACP;AAyBO,SAASC,GACdnuB,GACqE;AACrE,QAAMouB,IAAiBH,GAAuBjuB,CAAa;AAE3D,SAAOmF;AAAA,IACL,CAAC4hB,GAA0BsH,MAAuB;AAChD,YAAMC,IAASF,EAAA;AACf,aAAO,MAAMrH,GAAO,EAAE,GAAGsH,GAAM,QAAAC,GAAQ;AAAA,IACzC;AAAA,IACA,CAACF,CAAc;AAAA,EAAA;AAEnB;AAoBO,SAASG,GACdvuB,GAC+D;AAC/D,QAAMwuB,IAAcvpB,EAA0B,EAAE,GAC1CwoB,IAAUxoB,EAAOjF,CAAa;AAEpC,SAAAuF,EAAU,MACD,MAAM;AACX,eAAWklB,KAAW+D,EAAY;AAChC,UAAI;AACF,QAAA/D,EAAA;AAAA,MACF,SAAS1kB,GAAG;AACV,gBAAQ,MAAM,sCAAsCA,CAAC;AAAA,MACvD;AAGF,IAAIyoB,EAAY,QAAQ,SAAS,KAAKtH,EAAa,WACjD6F;AAAA,MACE;AAAA,MACA,GAAGyB,EAAY,QAAQ,MAAM;AAAA,MAC7B;AAAA,MACAf,EAAQ;AAAA,IAAA,GAIZe,EAAY,UAAU,CAAA;AAAA,EACxB,GACC,CAAA,CAAE,GAEErpB,EAAY,CAACslB,MAAwD;AAC1E,IAAI,OAAOA,KAAY,aACrB+D,EAAY,QAAQ,KAAK/D,CAAO,IACvBA,KAAW,OAAOA,EAAQ,eAAgB,cACnD+D,EAAY,QAAQ,KAAK,MAAM/D,EAAQ,aAAa;AAAA,EAExD,GAAG,CAAA,CAAE;AACP;AAoBO,SAASgE,GACdpoB,GACAqoB,GACA1uB,GAMA;AACA,QAAM,CAAC2uB,GAAQC,CAAS,IAAI7pB,EAA2B,IAAI,GACrD,CAAC8pB,GAAYC,CAAa,IAAI/pB,EAAiB,UAAU,MAAM,GAC/D0oB,IAAUxoB,EAAOjF,CAAa;AAEpC,EAAAuF,EAAU,MAAM;AACd,QAAI,CAACc;AACH;AAGF,UAAM0oB,IAAK,IAAI,UAAU1oB,GAAKqoB,CAAS;AACvC,WAAAE,EAAUG,CAAE,GAEZA,EAAG,SAAS,MAAMD,EAAcC,EAAG,UAAoB,GACvDA,EAAG,UAAU,MAAMD,EAAcC,EAAG,UAAoB,GACxDA,EAAG,UAAU,MAAMD,EAAcC,EAAG,UAAoB,GAEjD,MAAM;AACX,OAAIA,EAAG,eAAe,UAAU,QAAQA,EAAG,eAAe,UAAU,gBAClEA,EAAG,MAAA,GAEC7H,EAAa,WACf6F;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACAU,EAAQ;AAAA,MAAA;AAAA,IAIhB;AAAA,EACF,GAAG,CAACpnB,GAAKqoB,CAAS,CAAC;AAEnB,QAAMM,IAAO7pB;AAAA,IACX,CAACshB,MAA4D;AAC3D,OAAIkI,KAAA,gBAAAA,EAAQ,gBAAe,UAAU,QACnCA,EAAO,KAAKlI,CAAI;AAAA,IAEpB;AAAA,IACA,CAACkI,CAAM;AAAA,EAAA,GAGHzU,IAAQ/U;AAAA,IACZ,CAAC8pB,GAAeC,MAAoB;AAClC,MAAAP,KAAA,QAAAA,EAAQ,MAAMM,GAAMC;AAAA,IACtB;AAAA,IACA,CAACP,CAAM;AAAA,EAAA;AAGT,SAAO,EAAE,QAAAA,GAAQ,YAAAE,GAAY,MAAAG,GAAM,OAAA9U,EAAA;AACrC;AAeO,SAASiV,GACdzF,GACAC,GACa;AACb,QAAMviB,IAAOuiB,KAAeD,EAAU,eAAeA,EAAU,QAAQ,WAEjE0F,IAAgC,CAAC5S,MAAU;AAC/C,UAAM6S,IAAcpqB,EAAe,EAAE;AAErC,WAAAM,EAAU,MAAM;AACd,UAAK2hB,EAAa;AAIlB,eAAAyF,GAAkB,IAAI0C,EAAY,SAAS;AAAA,UACzC,MAAAjoB;AAAA,UACA,WAAW,KAAK,IAAA;AAAA,QAAI,CACrB,GAEM,MAAM;AAGX,UAAAulB,GAAkB,OAAO0C,EAAY,OAAO;AAAA,QAC9C;AAAA,IACF,GAAG,CAAA,CAAE,GAEE,gBAAArpB,EAAC0jB,GAAA,EAAW,GAAGlN,EAAA,CAAO;AAAA,EAC/B;AAEA,SAAA4S,EAAiB,cAAc,eAAehoB,CAAI,KAE3CgoB;AACT;AAcO,SAASE,GAActvB,GAA6B;AACzD,QAAMuvB,IAAetqB,EAAO,KAAK,IAAA,CAAK;AAEtC,EAAAM,EAAU,OACJ2hB,EAAa,WAAWA,EAAa,gBACvC,QAAQ,IAAI,WAAWlnB,CAAa,YAAY,gBAAgB,GAG3D,MAAM;AACX,QAAIknB,EAAa,WAAWA,EAAa,cAAc;AACrD,YAAMsI,IAAW,KAAK,IAAA,IAAQD,EAAa;AAC3C,cAAQ;AAAA,QACN,WAAWvvB,CAAa,yBAAyBwvB,CAAQ;AAAA,QACzD;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF,IACC,CAACxvB,CAAa,CAAC;AACpB;AAUA,eAAsByvB,GAAmBC,GAA+B;AACtE,MAAI,CAACzI;AACH;AAGF,QAAM0I,IAAc,OAAO;AAI3B,MAAIA,EAAY,QAAQ;AACtB,UAAM1D,IAAS0D,EAAY;AAC3B,YAAQ;AAAA,MACN,qBAAqBD,IAAQ,KAAKA,CAAK,KAAK,EAAE;AAAA,MAC9C;AAAA,MACA;AAAA,QACE,gBAAgB,IAAIzD,EAAO,iBAAiB,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,QACnE,iBAAiB,IAAIA,EAAO,kBAAkB,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,QACrE,iBAAiB,IAAIA,EAAO,kBAAkB,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,MAAA;AAAA,IACvE;AAAA,EAEJ;AAGA,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,EAAA;AAEJ;AAKO,SAAS2D,KAAgB;AAC9B,EAAK3I,OAIA,OAAwC,MAC1C,OAAwC,GAAA,GACzC,QAAQ,IAAI,oCAAoC,gBAAgB,KAEhE,QAAQ,IAAI,+DAA+D,gBAAgB;AAE/F;AAKO,SAAS4I,GACdC,IAAqB,KACrBC,IAA0B,KAM1B;AACA,QAAM,CAAC9D,GAAQC,CAAS,IAAInnB,EAAS;AAAA,IACnC,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EAAA,CACZ;AAED,SAAAQ,EAAU,MAAM;AACd,UAAMoqB,IAAc,OAAO;AAI3B,QAAI,CAACA,EAAY;AACf;AAGF,UAAMxD,IAAS,MAAM;AACnB,YAAM6D,IAAML,EAAY;AACxB,UAAI,CAACK;AACH;AAEF,YAAMC,IAASD,EAAI,iBAAiB,OAAO,MACrCE,IAAUF,EAAI,kBAAkB,OAAO,MACvCG,IAAUH,EAAI,kBAAkB,OAAO,MACvCI,IAAYH,IAASF;AAE3B,MAAA7D,EAAU,EAAE,QAAA+D,GAAQ,SAAAC,GAAS,SAAAC,GAAS,WAAAC,GAAW,GAE7CA,KAAalJ,EAAa,WAC5B6F;AAAA,QACE;AAAA,QACA,yBAAyBgD,CAAe,OAAOE,EAAO,QAAQ,CAAC,CAAC;AAAA,QAChE;AAAA,MAAA;AAAA,IAGN;AAEA,IAAA9D,EAAA;AACA,UAAMnZ,IAAW,YAAYmZ,GAAQ2D,CAAU;AAE/C,WAAO,MAAM,cAAc9c,CAAQ;AAAA,EACrC,GAAG,CAAC8c,GAAYC,CAAe,CAAC,GAEzB9D;AACT;AASO,MAAMoE,KAA+B,MAAM;AAChD,QAAMC,IAAQthB,EAAQ,MAAMoe,GAAA,GAAkB,CAAA,CAAE,GAC1CmD,IAAa,OAAO,OAAOD,CAAK,EAAE,OAAO,CAAChsB,GAAGtB,MAAMsB,IAAItB,GAAG,CAAC;AAEjE,SAAI,CAACkkB,EAAa,WAAWqJ,MAAe,GACnC;AAKX;AAECF,GAA2D,cAAc;ACt5BnE,SAASG,GACd7uB,GACyB;AACzB,QAAM8uB,IAAa,MAAM;;AACvB,KAAA5mB,IAAAlI,EAAO,gBAAP,QAAAkI,EAAoB,kBAAkB,EAAE,UAAUlI,EAAO;EAC3D;AAEA,SAAO;AAAA,IACL,MAAM,CAAC+uB,MAAW/uB,EAAO,QAAQ+uB,CAAM;AAAA,IACvC,QAAQ/uB,EAAO,aACX,OAAO0b,MAAY;AACjB,YAAMlX,IAAS,MAAMxE,EAAO,WAAY0b,CAAI;AAC5C,aAAAoT,EAAA,GACOtqB;AAAA,IACT,IACA;AAAA,IACJ,QAAQxE,EAAO,mBACX,OAAOzB,GAAc0mB,MAAuB;AAC1C,YAAMzgB,IAAS,MAAMxE,EAAO,iBAAkB,EAAE,KAAAzB,GAAK,QAAA0mB,GAAQ;AAC7D,aAAA6J,EAAA,GACOtqB;AAAA,IACT,IACA;AAAA,IACJ,QAAQxE,EAAO,mBACX,OAAOzB,MAAiB;AACtB,YAAMyB,EAAO,iBAAkBzB,CAAG,GAClCuwB,EAAA;AAAA,IACF,IACA;AAAA,EAAA;AAER;AAsBO,SAASE,GACdC,GACAjvB,GACyB;AACzB,SAAO;AAAA,IACL,MAAM,YAAYA,EAAO,QAAQivB,EAAS,UAAU;AAAA,IACpD,QAAQjvB,EAAO,UACX,OAAO0b,MAAY;AACjB,YAAMjL,IAAQwe,EAAS,SAAA;AACvB,aAAAjvB,EAAO,QAASyQ,CAAK,EAAEiL,CAAI,GACpBA;AAAA,IACT,IACA;AAAA,IACJ,QAAQ1b,EAAO,aACX,OAAOzB,GAAc0mB,MAAuB;AAC1C,YAAMxU,IAAQwe,EAAS,SAAA;AACvB,aAAAjvB,EAAO,WAAYyQ,CAAK,EAAElS,GAAK0mB,CAAM,GAC9B,EAAE,GAAGA,EAAA;AAAA,IACd,IACA;AAAA,IACJ,QAAQjlB,EAAO,aACX,OAAOzB,MAAiB;AACtB,YAAMkS,IAAQwe,EAAS,SAAA;AACvB,MAAAjvB,EAAO,WAAYyQ,CAAK,EAAElS,CAAG;AAAA,IAC/B,IACA;AAAA,EAAA;AAER;AA+BO,SAAS2wB,GAA0BlvB,IAAoC,IAAqB;AACjG,QAAMmvB,IAASnvB,EAAO,gBAAgB;AAEtC,SAAO,CAACovB,MAAU,CAAC7T,MAAS,CAACjD,MAAW;AACtC,UAAM9T,IAAS+W,EAAKjD,CAAM;AAE1B,QAAIA,EAAO,KAAK,WAAW,GAAG6W,CAAM,QAAQ,GAAG;AAE7C,YAAME,IADQ/W,EAAO,KAAK,MAAM,GAAG,EACd,CAAC;AACtB,MAAI+W,KAAUrvB,EAAO,qBACnBA,EAAO,kBAAkBqvB,GAAQ/W,EAAO,OAAkC;AAAA,IAE9E;AAEA,QAAIA,EAAO,KAAK,WAAW,GAAG6W,CAAM,QAAQ,GAAG;AAE7C,YAAMG,IADQhX,EAAO,KAAK,MAAM,GAAG,EACd,CAAC;AACtB,MAAIgX,KAAUtvB,EAAO,qBACnBA,EAAO,kBAAkBsvB,GAAQhX,EAAO,OAAkC;AAAA,IAE9E;AAEA,WAAO9T;AAAA,EACT;AACF;AAGO,SAAS+qB,GAAiBJ,IAAS,QAAQ;AAChD,SAAO;AAAA,IACL,cAAc,CAACE,GAAgB5e,OAAiD;AAAA,MAC9E,MAAM,GAAG0e,CAAM,SAASE,CAAM;AAAA,MAC9B,SAAS5e;AAAA,IAAA;AAAA,IAEX,eAAe,CAAC4e,GAAgBlN,OAAkC;AAAA,MAChE,MAAM,GAAGgN,CAAM,SAASE,CAAM;AAAA,MAC9B,SAASlN;AAAA,IAAA;AAAA,IAEX,aAAa,CAACkN,GAAgBG,OAAgC;AAAA,MAC5D,MAAM,GAAGL,CAAM,SAASE,CAAM;AAAA,MAC9B,SAASG;AAAA,IAAA;AAAA,IAEX,eAAe,CAACF,GAAgBrK,OAAkD;AAAA,MAChF,MAAM,GAAGkK,CAAM,SAASG,CAAM;AAAA,MAC9B,SAASrK;AAAA,IAAA;AAAA,IAEX,WAAW,CAACqK,OAAiC;AAAA,MAC3C,MAAM,GAAGH,CAAM,SAASG,CAAM;AAAA,IAAA;AAAA,EAChC;AAEJ;AAGO,SAASG,GAAiBN,IAAS,QAAQ;AAEhD,SAAO,CAAC1e,IAAe,CAAA,GAAI6H,MAA+B;AACxD,QAAI,CAACA,EAAO,KAAK,WAAW,GAAG6W,CAAM,GAAG;AACtC,aAAO1e;AAET,UAAM4L,IAAQ/D,EAAO,KAAK,MAAM,GAAG,GAC7B,GAAGoX,GAAMxL,GAAIyL,CAAE,IAAItT;AACzB,QAAI,CAACqT,KAAQ,CAACxL;AACZ,aAAOzT;AAGT,UAAMlS,IAAM,GAAGmxB,CAAI,IAAIxL,CAAE;AACzB,YAAQyL,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,UACL,GAAGlf;AAAA,UACH,CAAClS,CAAG,GAAG,EAAE,GAAIkS,EAAMlS,CAAG,KAAK,CAAA,GAAK,GAAI+Z,EAAO,QAAA;AAAA,QAAoC;AAAA,MAEnF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,GAAG7H,GAAO,CAAClS,CAAG,GAAG,EAAE,GAAIkS,EAAMlS,CAAG,KAAK,CAAA,GAAK,CAACoxB,CAAE,GAAGrX,EAAO,UAAQ;AAAA,MAC1E,KAAK;AACH,eAAO,EAAE,GAAG7H,GAAO,CAAClS,CAAG,GAAG,CAAA,EAAC;AAAA,MAC7B;AACE,eAAOkS;AAAA,IAAA;AAAA,EAEb;AACF;AA6BO,SAASmf,GACd5vB,GAC8B;AAC9B,MAAIotB,IAAuB,MACvByC,IAAkB,CAAA;AAsDtB,SAAO;AAAA,IACL,MAAM,YAAY;AAChB,UAAIA,EAAW,SAAS;AACtB,eAAOA;AAET,YAAM/K,IAAO,MAAM9kB,EAAO,QAAA;AAC1B,aAAA6vB,IAAa/K,GACNA;AAAA,IACT;AAAA,IACA,WA7DgB,OAChBsI,IAAK,IAAI,UAAUptB,EAAO,KAAK,YAAY,GAE3CotB,EAAG,SAAS,MAAM;AAChB,MAAAA,EAAI;AAAA,QACF,KAAK,UAAU;AAAA,UACb,MAAM;AAAA,UACN,SAASptB,EAAO,oBAAoB,CAAA;AAAA,QAAC,CACtC;AAAA,MAAA,GAEHotB,EAAI;AAAA,QACF,KAAK,UAAU;AAAA,UACb,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,SAAS;AAAA,YACP,OAAOptB,EAAO;AAAA,YACd,WAAWA,EAAO;AAAA,UAAA;AAAA,QACpB,CACD;AAAA,MAAA;AAAA,IAEL,GAEAotB,EAAG,YAAY,CAACnO,MAAU;;AACxB,UAAI;AACF,cAAM6Q,IAAM,KAAK,MAAM7Q,EAAM,IAAI;AACjC,QAAI6Q,EAAI,SAAS,YAAU5nB,IAAA4nB,EAAI,YAAJ,QAAA5nB,EAAa,UAQtC2nB,KANE7vB,EAAO,gBACN,CAAC6L,MAAe;AACf,gBAAMkkB,IAAMlkB,GACNmkB,IAAW,OAAO,KAAKD,CAAG,EAAE,CAAC;AACnC,iBAAQC,IAAWD,EAAIC,CAAQ,IAAI,CAAA;AAAA,QACrC,IACmBF,EAAI,QAAQ,IAAI,IACrCtd,IAAAxS,EAAO,WAAP,QAAAwS,EAAA,KAAAxS,GAAgB6vB;AAAA,MAEpB,QAAQ;AAAA,MAER;AAAA,IACF,GAEO,MAAM;AACX,MAAAzC,KAAA,QAAAA,EAAI,SACJA,IAAK;AAAA,IACP;AAAA,IAkBA,aAfkB,MAAM;AACxB,MAAAA,KAAA,QAAAA,EAAI,SACJA,IAAK;AAAA,IACP;AAAA,EAYE;AAEJ;AA4DA,eAAsB6C,GACpBC,GACAC,GAC6B;;AAC7B,QAAMC,IAAW,MAAM,MAAMF,CAAU;AACvC,MAAI,CAACE,EAAS;AACZ,UAAM,IAAI,MAAM,yBAAyBA,EAAS,MAAM,EAAE;AAE5D,QAAMC,IAAO,MAAMD,EAAS,KAAA,GAGtBE,OADUpoB,IAAAmoB,EAAK,eAAL,gBAAAnoB,EAAiB,YAAWmoB,EAAK,eAAe,CAAA,GAC1BF,CAAU;AAChD,MAAI,CAACG;AACH,UAAM,IAAI,MAAM,WAAWH,CAAU,6BAA6B;AAGpE,QAAMI,IAAW,IAAI,IAAID,EAAO,YAAY,CAAA,CAAE,GACxCE,IAA2B,CAAA,GAC3BC,IAA6B,CAAA;AAEnC,aAAW,CAAChrB,GAAMirB,CAAI,KAAK,OAAO,QAAQJ,EAAO,cAAc,CAAA,CAAE,GAAG;AAClE,UAAMK,IAAWC,GAAeF,CAAI,GAC9BG,IAAUH,EAAK,SAASI,GAASrrB,CAAI;AAE3C,IAAA+qB,EAAQ,KAAK;AAAA,MACX,WAAW/qB;AAAA,MACX,SAAAorB;AAAA,MACA,UAAAF;AAAA,MACA,cAAc,CAACD,EAAK;AAAA,MACpB,SAAS,CAACjrB,EAAK,YAAA,EAAc,SAAS,IAAI,KAAKA,MAAS;AAAA,MACxD,GAAIirB,EAAK,OACL,EAAE,QAAQ,EAAE,YAAYA,EAAK,MAAM,WAAW,QAAQ,aAAa,OAAA,EAAO,IAC1E,CAAA;AAAA,IAAC,CACN,GAEDD,EAAW,KAAK;AAAA,MACd,WAAWhrB;AAAA,MACX,OAAOorB;AAAA,MACP,YAAYE,GAAgBL,GAAMC,CAAQ;AAAA,MAC1C,YAAYJ,EAAS,IAAI9qB,CAAI;AAAA,MAC7B,eAAeurB,GAAmBN,CAAI;AAAA,MACtC,GAAIH,EAAS,IAAI9qB,CAAI,IACjB,EAAE,iBAAiB,CAAC,EAAE,MAAM,YAAY,SAAS,GAAGorB,CAAO,kBAAkB,EAAA,IAC7E,CAAA;AAAA,IAAC,CACN;AAAA,EACH;AAEA,SAAO,EAAE,SAAAL,GAAS,YAAAC,GAAY,QAAAH,EAAA;AAChC;AAGO,SAASW,GAA0BX,GAAwC;AAChF,QAAME,IAA2B,CAAA;AACjC,aAAW,CAAC/qB,GAAMirB,CAAI,KAAK,OAAO,QAAQJ,EAAO,cAAc,CAAA,CAAE;AAC/D,IAAAE,EAAQ,KAAK;AAAA,MACX,WAAW/qB;AAAA,MACX,SAASirB,EAAK,SAASI,GAASrrB,CAAI;AAAA,MACpC,UAAUmrB,GAAeF,CAAI;AAAA,MAC7B,cAAc,CAACA,EAAK;AAAA,IAAA,CACrB;AAEH,SAAOF;AACT;AAGO,SAASU,GAA6BZ,GAAuC;AAClF,QAAMC,IAAW,IAAI,IAAID,EAAO,YAAY,CAAA,CAAE,GACxCa,IAAyB,CAAA;AAC/B,aAAW,CAAC1rB,GAAMirB,CAAI,KAAK,OAAO,QAAQJ,EAAO,cAAc,CAAA,CAAE,GAAG;AAClE,UAAMK,IAAWC,GAAeF,CAAI;AACpC,IAAAS,EAAO,KAAK;AAAA,MACV,WAAW1rB;AAAA,MACX,OAAOirB,EAAK,SAASI,GAASrrB,CAAI;AAAA,MAClC,YAAYsrB,GAAgBL,GAAMC,CAAQ;AAAA,MAC1C,YAAYJ,EAAS,IAAI9qB,CAAI;AAAA,MAC7B,eAAeurB,GAAmBN,CAAI;AAAA,IAAA,CACvC;AAAA,EACH;AACA,SAAOS;AACT;AAIA,SAASP,GAAeF,GAAkD;AACxE,SAAIA,EAAK,SAAS,aAAaA,EAAK,SAAS,WACpC,WAELA,EAAK,SAAS,YACT,YAELA,EAAK,WAAW,SACX,SAELA,EAAK,WAAW,cACX,aAELA,EAAK,SAAS,YAAYA,EAAK,SAAS,UACnC,WAEF;AACT;AAEA,SAASK,GAAgBL,GAAuBC,GAA0B;AACxE,SAAID,EAAK,OACA,eAELA,EAAK,WAAW,WAGhBA,EAAK,WAAW,SAASA,EAAK,WAAW,QACpC,kBAELA,EAAK,WAAW,aACX,sBAELC,MAAa,WACR,oBAELA,MAAa,YACR,eAELA,MAAa,SACR,mBAELA,MAAa,aACR,uBAELD,EAAK,aAAaA,EAAK,YAAY,MAC9B,iBAEF;AACT;AAEA,SAASM,GAAmBN,GAAgD;AAC1E,QAAMU,IAAgC,CAAA;AACtC,SAAIV,EAAK,YAAY,WACnBU,EAAK,MAAMV,EAAK,UAEdA,EAAK,YAAY,WACnBU,EAAK,MAAMV,EAAK,UAEdA,EAAK,cAAc,WACrBU,EAAK,YAAYV,EAAK,YAEpBA,EAAK,cAAc,WACrBU,EAAK,YAAYV,EAAK,YAEpBA,EAAK,YACPU,EAAK,UAAUV,EAAK,UAElBA,EAAK,SACPU,EAAK,QAAQV,EAAK,KAAK,IAAI,CAAChf,OAAO,EAAE,OAAOA,GAAG,OAAOA,EAAA,EAAI,IAExDgf,EAAK,gBACPU,EAAK,OAAOV,EAAK,cAEZ,OAAO,KAAKU,CAAI,EAAE,SAAS,IAAIA,IAAO,CAAA;AAC/C;AAEA,SAASN,GAASrrB,GAAsB;AACtC,SAAOA,EACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,CAACoF,MAAMA,EAAE,YAAA,CAAa,EACvC,KAAA;AACL;ACjdA,MAAMwmB,KAAgC;AAAA,EACpC,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,QAAQ;AACV,GAIMC,KAAuB,OAC3BjzB,GACAkzB,MACgC;AAGhC,MAAI;AAEF,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAIMC,KAAc3vB,EAAuC,IAAI,GAYlD4vB,KAAoD,CAAC;AAAA,EAChE,UAAAxsB;AAAA,EACA,QAAQysB;AAAA,EACR,aAAaC;AACf,MAAM;AACJ,QAAM,CAAC3xB,GAAQ4xB,CAAc,IAAIxuB,EAAqB;AAAA,IACpD,GAAGiuB;AAAA,IACH,GAAGK;AAAA,EAAA,CACJ,GAEK,CAACG,GAAoBC,CAAqB,IAAI1uB,EAAsB,oBAAI,KAAK,GAC7E,CAAC2uB,GAAWC,CAAY,IAAI5uB;AAAA,IAChC,MAAM,IAAI,IAAI,OAAO,QAAQuuB,KAAoB,CAAA,CAAE,CAAC;AAAA,EAAA,GAGhDM,IAAYzuB,EAAY,CAAC0uB,MAAmC;AAChE,IAAAN,EAAe,CAAC1oB,OAAU,EAAE,GAAGA,GAAM,GAAGgpB,IAAY;AAAA,EACtD,GAAG,CAAA,CAAE,GAECC,IAAmB3uB,EAAY,MAAM;AACzC,IAAAouB,EAAe,CAAC1oB,OAAU,EAAE,GAAGA,GAAM,SAAS,CAACA,EAAK,QAAA,EAAU;AAAA,EAChE,GAAG,CAAA,CAAE,GAECkpB,IAAuB5uB,EAAY,CAACnF,MAA0B;AAClE,IAAAyzB,EAAsB,CAAC5oB,MAAS,IAAI,IAAIA,CAAI,EAAE,IAAI7K,CAAa,CAAC;AAAA,EAClE,GAAG,CAAA,CAAE,GAECg0B,IAAsB7uB,EAAY,CAACnF,MAA0B;AACjE,IAAAyzB,EAAsB,CAAC5oB,MAAS;AAC9B,YAAMqS,IAAO,IAAI,IAAIrS,CAAI;AACzB,aAAAqS,EAAK,OAAOld,CAAa,GAClBkd;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAEC+W,IAAgB9uB;AAAA,IACpB,CAACnF,MACQ2B,EAAO,WAAW,CAAC6xB,EAAmB,IAAIxzB,CAAa;AAAA,IAEhE,CAAC2B,EAAO,SAAS6xB,CAAkB;AAAA,EAAA,GAG/BU,IAAiB/uB;AAAA,IACrB,OAAOnF,MAAuD;AAE5D,UAAI0zB,EAAU,IAAI1zB,CAAa;AAC7B,eAAO0zB,EAAU,IAAI1zB,CAAa,KAAK;AAKzC,YAAMm0B,IAAU,OADDxyB,EAAO,iBAAiBsxB,IACVjzB,GAAe2B,EAAO,MAAM;AAEzD,aAAIwyB,KACFR,EAAa,CAAC9oB,MAAS,IAAI,IAAIA,CAAI,EAAE,IAAI7K,GAAem0B,CAAO,CAAC,GAG3DA;AAAA,IACT;AAAA,IACA,CAACT,GAAW/xB,EAAO,eAAeA,EAAO,MAAM;AAAA,EAAA,GAG3CO,IAAQ8M;AAAA,IACZ,OAAO;AAAA,MACL,QAAArN;AAAA,MACA,WAAAiyB;AAAA,MACA,kBAAAE;AAAA,MACA,oBAAAN;AAAA,MACA,sBAAAO;AAAA,MACA,qBAAAC;AAAA,MACA,eAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,WAAAR;AAAA,IAAA;AAAA,IAEF;AAAA,MACE/xB;AAAA,MACAiyB;AAAA,MACAE;AAAA,MACAN;AAAA,MACAO;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAR;AAAA,IAAA;AAAA,EACF;AAGF,SAAO,gBAAA1tB,EAACmtB,GAAY,UAAZ,EAAqB,OAAAjxB,GAAe,UAAA0E,EAAA,CAAS;AACvD;AAEAwsB,GAAiB,cAAc;AAOxB,SAASgB,KAAgC;AAC9C,QAAMvwB,IAAMH,EAAWyvB,EAAW;AAClC,SAAKtvB,KAEI;AAAA,IACL,QAAQmvB;AAAA,IACR,WAAW,MAAM;AAAA,IAAC;AAAA,IAClB,kBAAkB,MAAM;AAAA,IAAC;AAAA,IACzB,wCAAwB,IAAA;AAAA,IACxB,sBAAsB,MAAM;AAAA,IAAC;AAAA,IAC7B,qBAAqB,MAAM;AAAA,IAAC;AAAA,IAC5B,eAAe,MAAM;AAAA,IACrB,gBAAgB,YAAY;AAAA,IAC5B,+BAAe,IAAA;AAAA,EAAI;AAIzB;AAKO,SAASqB,GAAiBr0B,GAAuB;AACtD,QAAM,EAAE,eAAAi0B,GAAe,gBAAAC,GAAgB,WAAAR,GAAW,QAAA/xB,EAAA,IAAWyyB,GAAA,GACvD,CAACD,GAASG,CAAU,IAAIvvB,EAA6B2uB,EAAU,IAAI1zB,CAAa,KAAK,IAAI,GACzF,CAACoL,GAASC,CAAU,IAAItG,EAAS,EAAK,GAEtCL,IAAUuvB,EAAcj0B,CAAa,GAErCu0B,IAAcpvB,EAAY,YAAY;AAC1C,QAAI,CAACT;AACH;AAEF,IAAA2G,EAAW,EAAI;AACf,UAAMmpB,IAAc,MAAMN,EAAel0B,CAAa;AACtD,IAAAs0B,EAAWE,CAAW,GACtBnpB,EAAW,EAAK;AAAA,EAClB,GAAG,CAAC3G,GAAS1E,GAAek0B,CAAc,CAAC;AAE3C,SAAO;AAAA,IACL,SAAAC;AAAA,IACA,SAAA/oB;AAAA,IACA,SAAA1G;AAAA,IACA,aAAA6vB;AAAA,IACA,UAAU5yB,EAAO;AAAA,IACjB,iBAAiBA,EAAO;AAAA,IACxB,cAAcA,EAAO;AAAA,EAAA;AAEzB;AC5NA,MAAM8yB,KAAwC,CAAC,EAAE,OAAAjY,GAAO,SAAAkY,QAAc;AACpE,QAAM,EAAE,GAAAvmB,EAAA,IAAMwmB,GAAA;AAEd,SAAI,CAACnY,KAASA,EAAM,WAAW,IACtB,OAGLkY,IAEA,gBAAAxtB,EAAC,OAAA,EAAI,WAAU,4BACZ,UAAA;AAAA,IAAAsV,EAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC6V,MACtB,gBAAAnrB,EAAC,OAAA,EAAoB,WAAU,wBAC7B,UAAA;AAAA,MAAA,gBAAAlB,EAAC,QAAA,EAAM,YAAK,KAAA,CAAK;AAAA,MAChBqsB,EAAK,YAAY,gBAAArsB,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA,IAAA,CAAC;AAAA,IAAA,KAFjDqsB,EAAK,IAGf,CACD;AAAA,IACA7V,EAAM,SAAS,KACd,gBAAAtV,EAAC,QAAA,EAAK,WAAU,mBAAkB,UAAA;AAAA,MAAA;AAAA,MAC9BsV,EAAM,SAAS;AAAA,MAAE;AAAA,MAAErO,EAAE,kBAAkB,MAAM;AAAA,IAAA,EAAA,CACjD;AAAA,EAAA,GAEJ,IAKF,gBAAAjH,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAlB,EAAC,QAAG,WAAU,4BAA4B,UAAAmI,EAAE,cAAc,YAAY,GAAE;AAAA,IACxE,gBAAAjH,EAAC,SAAA,EAAM,WAAU,0BACf,UAAA;AAAA,MAAA,gBAAAlB,EAAC,SAAA,EACC,4BAAC,MAAA,EACC,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAI,UAAAmI,EAAE,iBAAiB,MAAM,GAAE;AAAA,QAChC,gBAAAnI,EAAC,MAAA,EAAI,UAAAmI,EAAE,iBAAiB,MAAM,GAAE;AAAA,QAChC,gBAAAnI,EAAC,MAAA,EAAI,UAAAmI,EAAE,oBAAoB,SAAS,GAAE;AAAA,QACtC,gBAAAnI,EAAC,MAAA,EAAI,UAAAmI,EAAE,wBAAwB,aAAa,EAAA,CAAE;AAAA,MAAA,EAAA,CAChD,EAAA,CACF;AAAA,wBACC,SAAA,EACE,UAAAqO,EAAM,IAAI,CAAC6V,wBACT,MAAA,EACC,UAAA;AAAA,QAAA,gBAAAnrB,EAAC,MAAA,EACC,UAAA;AAAA,UAAA,gBAAAlB,EAAC,QAAA,EAAM,YAAK,KAAA,CAAK;AAAA,UAChBqsB,EAAK,YACJ,gBAAArsB,EAAC,QAAA,EAAK,WAAU,uBAAsB,OAAOmI,EAAE,iBAAiB,UAAU,GAAG,UAAA,IAAA,CAE7E;AAAA,QAAA,GAEJ;AAAA,QACA,gBAAAnI,EAAC,QACC,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,mBAAmB,UAAAqsB,EAAK,MAAK,EAAA,CAC/C;AAAA,QACA,gBAAArsB,EAAC,MAAA,EAAI,UAAAqsB,EAAK,YAAY,SAAY,gBAAArsB,EAAC,QAAA,EAAM,UAAA,OAAOqsB,EAAK,OAAO,EAAA,CAAE,IAAU,KAAI;AAAA,QAC5E,gBAAArsB,EAAC,MAAA,EAAI,UAAAqsB,EAAK,YAAA,CAAY;AAAA,MAAA,KAbfA,EAAK,IAcd,CACD,EAAA,CACH;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GAMMuC,KAAoC,CAAC,EAAE,MAAAC,QAAW;AACtD,QAAM,EAAE,EAAA,IAAMF,GAAA;AAEd,SAAI,CAACE,KAAQA,EAAK,WAAW,IACpB,OAIP,gBAAA3tB,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,IAAA,gBAAAlB,EAAC,QAAG,WAAU,4BAA4B,UAAA,EAAE,aAAa,MAAM,GAAE;AAAA,IACjE,gBAAAA,EAAC,QACE,UAAA6uB,EAAK,IAAI,CAACC,GAAK/nB,wBACb,MAAA,EACC,UAAA;AAAA,MAAA,gBAAA/G,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA,MAAE;AAAA,MACvC8uB;AAAA,IAAA,EAAA,GAFM/nB,CAGT,CACD,EAAA,CACH;AAAA,EAAA,GACF;AAEJ,GAMMgoB,KAA4C,CAAC,EAAE,UAAAC,QAAe;;AAClE,QAAM,EAAE,EAAA,IAAML,GAAA,GACR,CAACM,GAAiBC,CAAkB,IAAInwB,EAAS,CAAC;AAExD,SAAI,CAACiwB,KAAYA,EAAS,WAAW,IAC5B,OAIP,gBAAA9tB,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,gBAAAlB,EAAC,QAAG,WAAU,4BAA4B,UAAA,EAAE,iBAAiB,UAAU,GAAE;AAAA,IACxEgvB,EAAS,SAAS,KACjB,gBAAAhvB,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAAgvB,EAAS,IAAI,CAACG,GAAIpoB,MACjB,gBAAA/G;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW,0BAA0BivB,MAAoBloB,IAAM,mCAAmC,EAAE;AAAA,QACpG,SAAS,MAAMmoB,EAAmBnoB,CAAG;AAAA,QAEpC,UAAAooB,EAAG;AAAA,MAAA;AAAA,MAJCpoB;AAAA,IAAA,CAMR,GACH;AAAA,sBAED,OAAA,EAAI,WAAU,mBACb,UAAA,gBAAA/G,EAAC,QAAA,EAAK,WAAW,cAAY6D,IAAAmrB,EAASC,CAAe,MAAxB,gBAAAprB,EAA2B,aAAY,KAAK,IACtE,iBAASorB,CAAe,wBAAG,MAC9B,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GAIaG,KAAgD,CAAC;AAAA,EAC5D,eAAAp1B;AAAA,EACA,SAASq1B;AAAA,EACT,UAAAzuB;AAAA,EACA,UAAU0uB;AAAA,EACV,iBAAiBC;AAAA,EACjB,UAAA3wB,IAAW;AAAA,EACX,WAAAe;AAAA,EACA,MAAA6B;AAAA,EACA,OAAAR;AAAA,EACA,WAAAwuB,IAAY;AAAA,EACZ,cAAAC,IAAe;AAAA,EACf,UAAAC,IAAW;AAAA,EACX,SAAAhB,IAAU;AACZ,MAAM;AACJ,QAAM,EAAE,GAAAvmB,EAAA,IAAMwmB,GAAA,GACR;AAAA,IACJ,SAASgB;AAAA,IACT,SAAAvqB;AAAA,IACA,SAAA1G;AAAA,IACA,aAAA6vB;AAAA,IACA,UAAUqB;AAAA,IACV,iBAAiBC;AAAA,IACjB,cAAAC;AAAA,EAAA,IACEzB,GAAiBr0B,CAAa,GAE5Bm0B,IAAUkB,KAAmBM,GAC7BpX,IAAW+W,KAAoBM,GAC/BG,IAAaR,KAAoBM,GAEjC,CAACjjB,GAAUojB,CAAW,IAAIjxB,EAASgxB,CAAU;AAUnD,SAPAxwB,EAAU,MAAM;AACd,IAAIb,KAAW,CAAC2wB,KAAmB,CAACM,KAClCpB,EAAA;AAAA,EAEJ,GAAG,CAAC7vB,GAAS2wB,GAAiBM,GAAepB,CAAW,CAAC,GAGrD3vB,KAAY,CAACF,4BACL,UAAAkC,GAAS,IAIjB2X,MAAa,8BAEZ,OAAA,EAAI,WAAW,6BAA6B5Y,KAAa,EAAE,IACzD,UAAA;AAAA,IAAAiB;AAAA,IACAkvB,KAAgB3B,KACf,gBAAAnuB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAMgwB,EAAY,CAACpjB,CAAQ;AAAA,QACpC,cAAYzE,EAAE,eAAe,aAAa;AAAA,QAC1C,iBAAeyE;AAAA,QAEd,UAAApL,KACC,gBAAAxB,EAAC,OAAA,EAAI,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,MAAK,gBACnD,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,gRAA+Q,EAAA,CACzR;AAAA,MAAA;AAAA,IAAA;AAAA,IAIL4M,KAAYuhB,KACX,gBAAAnuB,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA,gBAAAkB,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,MAAA,gBAAAlB,EAAC,MAAA,EAAG,WAAU,oBAAoB,UAAAgB,KAASmtB,EAAQ,MAAK;AAAA,MACxD,gBAAAnuB,EAAC,KAAA,EAAE,WAAU,0BAA0B,YAAQ,aAAY;AAAA,MAC1D0vB,KAAYvB,EAAQ,0BAASS,IAAA,EAAS,MAAMT,EAAQ,MAAM;AAAA,MAC1DqB,KAAarB,EAAQ,SAAS,gBAAAnuB,EAACyuB,MAAW,OAAON,EAAQ,OAAO,SAAO,GAAA,CAAC;AAAA,IAAA,EAAA,CAC3E,EAAA,CACF;AAAA,EAAA,GAEJ,IAMF,gBAAAjtB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,aAAaqX,MAAa,WAAW,sBAAsB,EAAE,IAAI5Y,KAAa,EAAE;AAAA,MAE1F,UAAA;AAAA,QAAA4Y,MAAa,SAAS4V,KACrB,gBAAAnuB;AAAA,UAACiwB;AAAA,UAAA;AAAA,YACC,SAAA9B;AAAA,YACA,UAAAvhB;AAAA,YACA,UAAU,MAAMojB,EAAY,CAACpjB,CAAQ;AAAA,YACrC,SAAAxH;AAAA,YACA,OAAApE;AAAA,YACA,WAAAwuB;AAAA,YACA,cAAAC;AAAA,YACA,UAAAC;AAAA,YACA,SAAAhB;AAAA,UAAA;AAAA,QAAA;AAAA,QAGH9tB;AAAA,QACA2X,MAAa,YAAY4V,KACxB,gBAAAnuB;AAAA,UAACiwB;AAAA,UAAA;AAAA,YACC,SAAA9B;AAAA,YACA,UAAAvhB;AAAA,YACA,UAAU,MAAMojB,EAAY,CAACpjB,CAAQ;AAAA,YACrC,SAAAxH;AAAA,YACA,OAAApE;AAAA,YACA,WAAAwuB;AAAA,YACA,cAAAC;AAAA,YACA,UAAAC;AAAA,YACA,SAAAhB;AAAA,UAAA;AAAA,QAAA;AAAA,QAGHnW,MAAa,YAAY4V,KAAWvhB,KACnC,gBAAA1L,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,UAAA,gBAAAlB,EAAC,KAAA,EAAE,WAAU,0BAA0B,UAAAmuB,EAAQ,aAAY;AAAA,UAC1DuB,KAAYvB,EAAQ,0BAASS,IAAA,EAAS,MAAMT,EAAQ,KAAA,CAAM;AAAA,QAAA,EAAA,CAC7D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAiB,GAAe,cAAc;AAgB7B,MAAMa,KAAsC,CAAC;AAAA,EAC3C,SAAA9B;AAAA,EACA,UAAAvhB;AAAA,EACA,UAAAsjB;AAAA,EACA,SAAA9qB;AAAA,EACA,OAAApE;AAAA,EACA,WAAAwuB;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAhB;AACF,MAAM;AACJ,QAAM,EAAE,GAAAvmB,EAAA,IAAMwmB,GAAA;AAEd,SAAIvpB,IAEA,gBAAApF,EAAC,SAAI,WAAU,8CACb,4BAAC,OAAA,EAAI,WAAU,iCAAgC,EAAA,CACjD,sBAKD,OAAA,EAAI,WAAW,oBAAoB4M,IAAW,+BAA+B,EAAE,IAC9E,UAAA;AAAA,IAAA,gBAAA1L,EAAC,YAAO,WAAU,2BAA0B,SAASgvB,GAAU,iBAAetjB,GAC5E,UAAA;AAAA,MAAA,gBAAA5M,EAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA4M,IAAW,MAAM,KAAI;AAAA,MAC9D,gBAAA1L,EAAC,QAAA,EAAK,WAAU,0BACb,UAAA;AAAA,QAAAF,KAASmH,EAAE,cAAc,OAAO;AAAA,QAAE;AAAA,QAAEgmB,EAAQ;AAAA,MAAA,GAC/C;AAAA,MACCA,EAAQ,UACP,gBAAAnuB,EAAC,QAAA,EAAK,WAAW,wCAAwCmuB,EAAQ,MAAM,IACpE,UAAAA,EAAQ,OAAA,CACX;AAAA,IAAA,GAEJ;AAAA,IACCvhB,KACC,gBAAA1L,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,MAAA,gBAAAlB,EAAC,KAAA,EAAE,WAAU,0BAA0B,UAAAmuB,EAAQ,aAAY;AAAA,MAC1DuB,KAAYvB,EAAQ,0BAASS,IAAA,EAAS,MAAMT,EAAQ,MAAM;AAAA,MAC1DqB,KAAarB,EAAQ,SAAS,gBAAAnuB,EAACyuB,MAAW,OAAON,EAAQ,OAAO,SAAAO,GAAkB;AAAA,MAClFe,KAAgBtB,EAAQ,8BAAaY,IAAA,EAAa,UAAUZ,EAAQ,UAAU;AAAA,MAC9EA,EAAQ,WAAWA,EAAQ,QAAQ,SAAS,KAC3C,gBAAAjtB,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,QAAA,gBAAAlB,EAAC,QAAG,WAAU,4BAA4B,UAAAmI,EAAE,gBAAgB,UAAU,GAAE;AAAA,0BACvE,MAAA,EACE,UAAAgmB,EAAQ,QAAQ,IAAI,CAAChrB,GAAK4D,MACzB,gBAAA/G,EAAC,MAAA,EACC,4BAAC,QAAA,EAAM,UAAAmD,GAAI,EAAA,GADJ4D,CAET,CACD,EAAA,CACH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ,GAkBaopB,KAA8C,CAAC;AAAA,EAC1D,MAAA7V;AAAA,EACA,UAAA/B,IAAW;AAAA,EACX,WAAA5Y;AAAA,EACA,UAAAiB;AACF,MAAM;AACJ,QAAM,CAACwvB,GAAMC,CAAO,IAAItxB,EAAS,EAAK;AAEtC,SACE,gBAAAmC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,oCAAoCqX,CAAQ,IAAI5Y,KAAa,EAAE;AAAA,MAC1E,cAAc,MAAM0wB,EAAQ,EAAI;AAAA,MAChC,cAAc,MAAMA,EAAQ,EAAK;AAAA,MACjC,SAAS,MAAMA,EAAQ,EAAI;AAAA,MAC3B,QAAQ,MAAMA,EAAQ,EAAK;AAAA,MAE1B,UAAA;AAAA,QAAAzvB;AAAA,QACAwvB,KACC,gBAAApwB,EAAC,QAAA,EAAK,WAAU,0BAAyB,MAAK,WAC3C,UAAAsa,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA6V,GAAc,cAAc;AAkBrB,MAAMG,KAA4C,CAAC;AAAA,EACxD,SAAAnC;AAAA,EACA,MAAAp0B,IAAO;AAAA,EACP,WAAA4F;AAAA,EACA,QAAA4wB;AACF,MAAM;AACJ,QAAM,EAAE,GAAApoB,EAAA,IAAMwmB,GAAA,GACR,CAACyB,GAAMC,CAAO,IAAItxB,EAAS,EAAK,GAEhC6a,IAAcza,EAAY,MAAM;AACpC,IAAAkxB,EAAQ,CAACD,CAAI,GACT,CAACA,KAAQG,KACXA,EAAA;AAAA,EAEJ,GAAG,CAACH,GAAMG,CAAM,CAAC,GAEXC,IAAW,OAAOrC,KAAY,WAAWA,IAAUA,EAAQ,aAC3DsC,IAAY,OAAOtC,KAAY,WAAW,SAAYA,EAAQ;AAEpE,SACE,gBAAAjtB,EAAC,UAAK,WAAW,kCAAkCnH,CAAI,IAAI4F,KAAa,EAAE,IACxE,UAAA;AAAA,IAAA,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS4Z;AAAA,QACT,cAAYzR,EAAE,iBAAiB,WAAW;AAAA,QAC1C,iBAAeioB;AAAA,QAEf,UAAA,gBAAApwB,EAAC,OAAA,EAAI,SAAQ,aAAY,MAAK,gBAC5B,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,+QAAA,CAA+Q,EAAA,CACzR;AAAA,MAAA;AAAA,IAAA;AAAA,IAEDowB,KACC,gBAAAlvB,EAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,MAAAuvB,KAAa,gBAAAzwB,EAAC,YAAQ,UAAAywB,EAAA,CAAU;AAAA,MACjC,gBAAAzwB,EAAC,OAAG,UAAAwwB,EAAA,CAAS;AAAA,MACb,gBAAAxwB,EAAC,YAAO,WAAU,yBAAwB,SAAS,MAAMqwB,EAAQ,EAAK,GAAG,UAAA,IAAA,CAEzE;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEAC,GAAa,cAAc;AC3PpB,MAAMI,GAAyD;AAAA,EACpE,YAAoBx2B,IAAc,wBAAwB;AAAtC,SAAA,MAAAA;AAAA,EAAuC;AAAA,EAE3D,MAAM,OAA6C;AACjD,QAAI;AACF,YAAMoK,IAAS,aAAa,QAAQ,KAAK,GAAG;AAC5C,aAAOA,IAAS,KAAK,MAAMA,CAAM,IAAI;AAAA,IACvC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,KAAKqsB,GAAkD;AAC3D,iBAAa,QAAQ,KAAK,KAAK,KAAK,UAAUA,CAAW,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,QAAuB;AAC3B,iBAAa,WAAW,KAAK,GAAG;AAAA,EAClC;AACF;AAKO,MAAMC,GAAsD;AAAA,EAKjE,YAAYC,IAAiB,mBAAmBC,IAAoB,eAAe;AAFnF,SAAQ,KAAyB,MAG/B,KAAK,SAASD,GACd,KAAK,YAAYC;AAAA,EACnB;AAAA,EAEA,MAAc,QAA8B;AAC1C,WAAI,KAAK,KACA,KAAK,KAGP,IAAI,QAAQ,CAACrrB,GAASC,MAAW;AACtC,YAAMqrB,IAAU,UAAU,KAAK,KAAK,QAAQ,CAAC;AAE7C,MAAAA,EAAQ,UAAU,MAAMrrB,EAAOqrB,EAAQ,KAAK,GAC5CA,EAAQ,YAAY,MAAM;AACxB,aAAK,KAAKA,EAAQ,QAClBtrB,EAAQ,KAAK,EAAE;AAAA,MACjB,GAEAsrB,EAAQ,kBAAkB,CAACnW,MAAU;AACnC,cAAMoW,IAAMpW,EAAM,OAA4B;AAC9C,QAAKoW,EAAG,iBAAiB,SAAS,KAAK,SAAS,KAC9CA,EAAG,kBAAkB,KAAK,WAAW,EAAE,SAAS,MAAM;AAAA,MAE1D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAA6C;AACjD,UAAMA,IAAK,MAAM,KAAK,MAAA;AACtB,WAAO,IAAI,QAAQ,CAACvrB,GAASC,MAAW;AAGtC,YAAMqrB,IAFcC,EAAG,YAAY,KAAK,WAAW,UAAU,EACnC,YAAY,KAAK,SAAS,EAC9B,IAAI,kBAAkB;AAE5C,MAAAD,EAAQ,UAAU,MAAMrrB,EAAOqrB,EAAQ,KAAK,GAC5CA,EAAQ,YAAY;;AAAM,eAAAtrB,IAAQ5B,IAAAktB,EAAQ,WAAR,gBAAAltB,EAAgB,SAAQ,IAAI;AAAA;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK8sB,GAAkD;AAC3D,UAAMK,IAAK,MAAM,KAAK,MAAA;AACtB,WAAO,IAAI,QAAQ,CAACvrB,GAASC,MAAW;AAGtC,YAAMqrB,IAFcC,EAAG,YAAY,KAAK,WAAW,WAAW,EACpC,YAAY,KAAK,SAAS,EAC9B,IAAI,EAAE,IAAI,oBAAoB,MAAML,GAAa;AAEvE,MAAAI,EAAQ,UAAU,MAAMrrB,EAAOqrB,EAAQ,KAAK,GAC5CA,EAAQ,YAAY,MAAMtrB,EAAA;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAMurB,IAAK,MAAM,KAAK,MAAA;AACtB,WAAO,IAAI,QAAQ,CAACvrB,GAASC,MAAW;AAGtC,YAAMqrB,IAFcC,EAAG,YAAY,KAAK,WAAW,WAAW,EACpC,YAAY,KAAK,SAAS,EAC9B,OAAO,kBAAkB;AAE/C,MAAAD,EAAQ,UAAU,MAAMrrB,EAAOqrB,EAAQ,KAAK,GAC5CA,EAAQ,YAAY,MAAMtrB,EAAA;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAKO,MAAMwrB,GAAqD;AAAA,EAChE,YACUC,GACAC,GACR;AAFQ,SAAA,UAAAD,GACA,KAAA,iBAAAC;AAAA,EACP;AAAA,EAEK,aAAqC;;AAC3C,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,KAAIttB,IAAA,KAAK,mBAAL,gBAAAA,EAAA,eAA2B,CAAA;AAAA,IAAC;AAAA,EAEpC;AAAA,EAEA,MAAM,QAA8C;AAClD,UAAMkoB,IAAW,MAAM,MAAM,GAAG,KAAK,OAAO,gBAAgB;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS,KAAK,WAAA;AAAA,IAAW,CAC1B;AAED,QAAI,CAACA,EAAS,IAAI;AAChB,UAAIA,EAAS,WAAW;AACtB,eAAO;AAET,YAAM,IAAI,MAAM,gCAAgCA,EAAS,UAAU,EAAE;AAAA,IACvE;AAEA,WAAOA,EAAS,KAAA;AAAA,EAClB;AAAA,EAEA,MAAM,KAAK4E,GAAkD;AAC3D,UAAM5E,IAAW,MAAM,MAAM,GAAG,KAAK,OAAO,gBAAgB;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS,KAAK,WAAA;AAAA,MACd,MAAM,KAAK,UAAU4E,CAAW;AAAA,IAAA,CACjC;AAED,QAAI,CAAC5E,EAAS;AACZ,YAAM,IAAI,MAAM,+BAA+BA,EAAS,UAAU,EAAE;AAAA,EAExE;AAAA,EAEA,MAAM,qBAAsC;AAC1C,UAAMA,IAAW,MAAM,MAAM,GAAG,KAAK,OAAO,0BAA0B;AAAA,MACpE,QAAQ;AAAA,MACR,SAAS,KAAK,WAAA;AAAA,IAAW,CAC1B;AAED,WAAKA,EAAS,OAGD,MAAMA,EAAS,KAAA,GAChB,aAAa;AAAA,EAC3B;AACF;AAiDA,MAAMqF,KAAyB5zB,EAAkD,IAAI;AAK9E,SAAS6zB,KAAkD;AAChE,QAAMxzB,IAAMH,EAAW0zB,EAAsB;AAC7C,MAAI,CAACvzB;AACH,UAAM,IAAI,MAAM,oEAAoE;AAEtF,SAAOA;AACT;AAKO,SAASyzB,GACdC,GACAhd,GAKA;AACA,QAAM,EAAE,uBAAAid,GAAuB,uBAAAC,GAAuB,0BAAAC,EAAA,IACpDL,GAAA,GAEIM,IAAQH,EAAsBD,GAAWhd,CAAI,GAC7C2K,IAAM/f;AAAA,IACV,CAACqI,MAA6BiqB,EAAsBF,GAAWhd,GAAM/M,CAAC;AAAA,IACtE,CAAC+pB,GAAWhd,GAAMkd,CAAqB;AAAA,EAAA,GAEnCtL,IAAShnB;AAAA,IACb,CAACyyB,MACCF,EAAyBH,GAAWhd,GAAMqd,CAAC;AAAA,IAC7C,CAACL,GAAWhd,GAAMmd,CAAwB;AAAA,EAAA;AAG5C,SAAO,CAACC,GAAOzS,GAAKiH,CAAM;AAC5B;AAKO,SAAS0L,GAAmB7G,GAAgB;AACjD,SAAOsG,GAAsBtG,GAAQ,MAAM;AAC7C;AAKO,SAAS8G,GAAoBC,GAAiB;AACnD,SAAOT,GAAsBS,GAAS,OAAO;AAC/C;AAmBA,MAAMC,KAAoC;AAAA,EACxC,SAAS;AAAA,EACT,QAAQ,CAAA;AAAA,EACR,UAAU,CAAA;AACZ;AAEO,SAASC,GAA4B;AAAA,EAC1C,SAAAtT,IAAU,IAAI+R,GAAA;AAAA,EACd,aAAAwB;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,cAAAC,IAAe;AAAA,EACf,UAAAxxB;AACF,GAAkD;AAChD,QAAM,CAAC+vB,GAAa0B,CAAc,IAAItzB,EAA+BizB,EAAW,GAC1E,CAACM,GAAWC,CAAY,IAAIxzB,EAAS,EAAI,GACzC,CAACyzB,GAAWC,CAAY,IAAI1zB,EAAS,EAAK,GAC1C,CAACuG,GAAOC,CAAQ,IAAIxG,EAAuB,IAAI,GAE/C2zB,IAAiBzzB,EAAA,GACjB0zB,IAAkB1zB,EAAA;AAGxB,EAAAM,EAAU,MAAM;AACd,QAAIqzB,IAAU;AAmBd,YAjBa,YAAY;AACvB,UAAI;AACF,cAAMtuB,IAAS,MAAMqa,EAAQ,KAAA;AAC7B,QAAIiU,KAAWtuB,KACb+tB,EAAe/tB,CAAM;AAAA,MAEzB,SAAS0b,GAAK;AACZ,QAAI4S,KACFrtB,EAASya,aAAe,QAAQA,IAAM,IAAI,MAAM,4BAA4B,CAAC;AAAA,MAEjF,UAAA;AACE,QAAI4S,KACFL,EAAa,EAAK;AAAA,MAEtB;AAAA,IACF,GAEA,GAEO,MAAM;AACX,MAAAK,IAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAACjU,CAAO,CAAC;AAGZ,QAAMkU,IAAgB1zB;AAAA,IACpB,CAACwyB,MAAgC;AAC/B,MAAIe,EAAe,WACjB,aAAaA,EAAe,OAAO,GAGrCA,EAAe,UAAU,WAAW,YAAY;AAC9C,YAAI;AACF,gBAAM/T,EAAQ,KAAKgT,CAAK;AAAA,QAC1B,SAAS3R,GAAK;AACZ,UAAAza,EAASya,aAAe,QAAQA,IAAM,IAAI,MAAM,4BAA4B,CAAC;AAAA,QAC/E;AAAA,MACF,GAAGoS,CAAY;AAAA,IACjB;AAAA,IACA,CAACzT,GAASyT,CAAY;AAAA,EAAA;AAIxB,EAAA7yB,EAAU,MAAM;AACd,IAAK+yB,KACHO,EAAclC,CAAW;AAAA,EAE7B,GAAG,CAACA,GAAa2B,GAAWO,CAAa,CAAC,GAG1CtzB,EAAU,MAAM;AACd,QAAI2yB,KAAeC,IAAmB;AACpC,aAAAQ,EAAgB,UAAU,YAAY,MAAM;AAC1C,QAAAG,EAAA;AAAA,MACF,GAAGX,CAAgB,GAEZ,MAAM;AACX,QAAIQ,EAAgB,WAClB,cAAcA,EAAgB,OAAO;AAAA,MAEzC;AAAA,EAEJ,GAAG,CAACT,GAAaC,CAAgB,CAAC,GAGlC5yB,EAAU,MACD,MAAM;AACX,IAAImzB,EAAe,WACjB,aAAaA,EAAe,OAAO,GAEjCC,EAAgB,WAClB,cAAcA,EAAgB,OAAO;AAAA,EAEzC,GACC,CAAA,CAAE;AAGL,QAAMnB,IAAwBryB;AAAA,IAC5B,CACEoyB,GACAhd,MACsC;;AACtC,cAAO1Q,IAAA8sB,EAAY,SAASY,CAAS,MAA9B,gBAAA1tB,EAAkC0Q;AAAA,IAC3C;AAAA,IACA,CAACoc,CAAW;AAAA,EAAA,GAGRc,IAAwBtyB;AAAA,IAC5B,CACEoyB,GACAhd,GACAod,MACG;AACH,MAAAU,EAAe,CAACxtB,OAAU;AAAA,QACxB,GAAGA;AAAA,QACH,UAAU;AAAA,UACR,GAAGA,EAAK;AAAA,UACR,CAAC0sB,CAAS,GAAG;AAAA,YACX,GAAG1sB,EAAK,SAAS0sB,CAAS;AAAA,YAC1B,CAAChd,CAAI,GAAGod;AAAA,YACR,cAAc,KAAK,IAAA;AAAA,UAAI;AAAA,QACzB;AAAA,MACF,EACA;AAAA,IACJ;AAAA,IACA,CAAA;AAAA,EAAC,GAGGD,IAA2BvyB;AAAA,IAC/B,CACEoyB,GACAhd,GACAwe,MACG;AACH,MAAAV,EAAe,CAACxtB,MAAS;;AACvB,cAAMmuB,KAAgBnvB,IAAAgB,EAAK,SAAS0sB,CAAS,MAAvB,gBAAA1tB,EAA2B0Q,IAC3C0e,IACJ,OAAOD,KAAkB,YAAYA,MAAkB,OACnD,EAAE,GAAGA,GAAe,GAAGD,EAAA,IACvBA;AAEN,eAAO;AAAA,UACL,GAAGluB;AAAA,UACH,UAAU;AAAA,YACR,GAAGA,EAAK;AAAA,YACR,CAAC0sB,CAAS,GAAG;AAAA,cACX,GAAG1sB,EAAK,SAAS0sB,CAAS;AAAA,cAC1B,CAAChd,CAAI,GAAG0e;AAAA,cACR,cAAc,KAAK,IAAA;AAAA,YAAI;AAAA,UACzB;AAAA,QACF;AAAA,MAEJ,CAAC;AAAA,IACH;AAAA,IACA,CAAA;AAAA,EAAC,GAGGC,IAA0B/zB;AAAA,IAC9B,CAACoyB,GAAmBhd,MAAoC;AACtD,MAAA8d,EAAe,CAACxtB,MAAS;AACvB,YAAI0P,GAAM;AACR,gBAAM,EAAE,CAACA,CAAI,GAAG4e,GAAG,GAAGC,EAAAA,IAASvuB,EAAK,SAAS0sB,CAAS,KAAK,CAAA;AAC3D,iBAAO;AAAA,YACL,GAAG1sB;AAAA,YACH,UAAU;AAAA,cACR,GAAGA,EAAK;AAAA,cACR,CAAC0sB,CAAS,GAAG6B;AAAAA,YAAA;AAAA,UACf;AAAA,QAEJ;AAEA,cAAM,EAAE,CAAC7B,CAAS,GAAG4B,GAAG,GAAGC,EAAA,IAASvuB,EAAK;AACzC,eAAO;AAAA,UACL,GAAGA;AAAA,UACH,UAAUuuB;AAAA,QAAA;AAAA,MAEd,CAAC;AAAA,IACH;AAAA,IACA,CAAA;AAAA,EAAC,GAIGC,IAAuBl0B;AAAA,IAC3B,CAA4CoV,MACnCoc,EAAY,OAAOpc,CAAI;AAAA,IAEhC,CAACoc,CAAW;AAAA,EAAA,GAGR2C,IAAuBn0B;AAAA,IAC3B,CACEoV,GACAod,MACG;AACH,MAAAU,EAAe,CAACxtB,OAAU;AAAA,QACxB,GAAGA;AAAA,QACH,QAAQ;AAAA,UACN,GAAGA,EAAK;AAAA,UACR,CAAC0P,CAAI,GAAGod;AAAA,QAAA;AAAA,MACV,EACA;AAAA,IACJ;AAAA,IACA,CAAA;AAAA,EAAC,GAIGmB,IAAO3zB,EAAY,YAAY;AACnC,QAAK+yB,GAIL;AAAA,MAAAO,EAAa,EAAI,GACjBltB,EAAS,IAAI;AAEb,UAAI;AACF,cAAMguB,IAAkB,MAAMrB,EAAY,mBAAA,GACpCsB,IAAiB7C,EAAY,YAAY;AAE/C,YAAI4C,IAAkBC,GAAgB;AAEpC,gBAAMC,IAAc,MAAMvB,EAAY,MAAA;AACtC,UAAIuB,MACFpB,EAAe;AAAA,YACb,GAAGoB;AAAA,YACH,UAAU,KAAK,IAAA;AAAA,UAAI,CACpB,GACD,MAAM9U,EAAQ,KAAK8U,CAAW;AAAA,QAElC,OAAO;AAEL,gBAAMC,IAAS,EAAE,GAAG/C,GAAa,UAAU,KAAK,MAAI;AACpD,gBAAMuB,EAAY,KAAKwB,CAAM,GAC7BrB,EAAeqB,CAAM;AAAA,QACvB;AAAA,MACF,SAAS1T,GAAK;AACZ,QAAAza,EAASya,aAAe,QAAQA,IAAM,IAAI,MAAM,aAAa,CAAC;AAAA,MAChE,UAAA;AACE,QAAAyS,EAAa,EAAK;AAAA,MACpB;AAAA;AAAA,EACF,GAAG,CAACP,GAAavB,GAAahS,CAAO,CAAC,GAGhCgV,IAAoBx0B,EAAY,MAC7B,KAAK,UAAUwxB,GAAa,MAAM,CAAC,GACzC,CAACA,CAAW,CAAC,GAEViD,IAAoBz0B,EAAY,CAAC00B,MAAiB;AACtD,QAAI;AACF,YAAMC,IAAW,KAAK,MAAMD,CAAI;AAChC,UAAI,OAAOC,EAAS,WAAY,YAAY,CAACA,EAAS;AACpD,cAAM,IAAI,MAAM,4BAA4B;AAE9C,MAAAzB,EAAeyB,CAAQ;AAAA,IACzB,SAAS9T,GAAK;AACZ,MAAAza,EAASya,aAAe,QAAQA,IAAM,IAAI,MAAM,eAAe,CAAC;AAAA,IAClE;AAAA,EACF,GAAG,CAAA,CAAE,GAEC+T,IAAsB50B,EAAY,MAAM;AAC5C,IAAAkzB,EAAeL,EAAW,GAC1BrT,EAAQ,MAAA;AAAA,EACV,GAAG,CAACA,CAAO,CAAC,GAENziB,IAAQ8M;AAAA,IACZ,OAAO;AAAA,MACL,aAAA2nB;AAAA,MACA,WAAA2B;AAAA,MACA,WAAAE;AAAA,MACA,OAAAltB;AAAA,MACA,uBAAAksB;AAAA,MACA,uBAAAC;AAAA,MACA,0BAAAC;AAAA,MACA,yBAAAwB;AAAA,MACA,sBAAAG;AAAA,MACA,sBAAAC;AAAA,MACA,MAAAR;AAAA,MACA,mBAAAa;AAAA,MACA,mBAAAC;AAAA,MACA,qBAAAG;AAAA,IAAA;AAAA,IAEF;AAAA,MACEpD;AAAA,MACA2B;AAAA,MACAE;AAAA,MACAltB;AAAA,MACAksB;AAAA,MACAC;AAAA,MACAC;AAAA,MACAwB;AAAA,MACAG;AAAA,MACAC;AAAA,MACAR;AAAA,MACAa;AAAA,MACAC;AAAA,MACAG;AAAA,IAAA;AAAA,EACF;AAGF,SACE,gBAAA/zB,EAACoxB,GAAuB,UAAvB,EAAgC,OAAAl1B,GAAe,UAAA0E,EAAA,CAAS;AAE7D;AAwBO,SAASozB,GAAqB;AAAA,EACnC,YAAAC,IAAa;AAAA,EACb,cAAAC,IAAe;AAAA,EACf,kBAAAC,IAAmB;AAAA,EACnB,UAAAC,IAAW;AAAA,EACX,WAAAz0B;AAAA,EACA,OAAArC;AACF,GAA2C;;AACzC,QAAM;AAAA,IACJ,aAAAqzB;AAAA,IACA,WAAA2B;AAAA,IACA,WAAAE;AAAA,IACA,OAAAltB;AAAA,IACA,MAAAwtB;AAAA,IACA,mBAAAa;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAG;AAAA,IACA,sBAAAT;AAAA,IACA,yBAAAJ;AAAA,EAAA,IACE7B,GAAA,GAEEgD,IAAep1B,EAAyB,IAAI,GAE5Cq1B,IAAe,MAAM;AACzB,UAAMT,IAAOF,EAAA,GACPY,IAAO,IAAI,KAAK,CAACV,CAAI,GAAG,EAAE,MAAM,oBAAoB,GACpDxzB,IAAM,IAAI,gBAAgBk0B,CAAI,GAC9Bj2B,IAAI,SAAS,cAAc,GAAG;AACpC,IAAAA,EAAE,OAAO+B,GACT/B,EAAE,WAAW,6BACbA,EAAE,MAAA,GACF,IAAI,gBAAgB+B,CAAG;AAAA,EACzB,GAEMm0B,IAAe,CAACz0B,MAA2C;;AAC/D,UAAM00B,KAAO5wB,IAAA9D,EAAE,OAAO,UAAT,gBAAA8D,EAAiB;AAC9B,QAAI,CAAC4wB;AACH;AAGF,UAAMC,IAAS,IAAI,WAAA;AACnB,IAAAA,EAAO,SAAS,MAAM;AACpB,MAAAd,EAAkBc,EAAO,MAAgB;AAAA,IAC3C,GACAA,EAAO,WAAWD,CAAI;AAAA,EACxB;AAEA,MAAInC;AACF,WACE,gBAAAtyB,EAAC,OAAA,EAAI,WAAAL,GAAsB,OAAArC,GAAc,UAAA,0BAEzC;AAIJ,QAAMq3B,IAAa,OAAO,KAAKhE,EAAY,QAAQ;AAEnD,SACE,gBAAAzvB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,yBAAyBvB,KAAa,EAAE;AAAA,MACnD,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,GAAGrC;AAAA,MAAA;AAAA,MAGJ,UAAA;AAAA,QAAAgI,KACC,gBAAAtF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,YAAA;AAAA,YAGR,UAAAsF,EAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAKX,gBAAApE,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,cAAc,QAAQ,UAAU,OAAA,GACxE,UAAA;AAAA,UAAAkzB,KACC,gBAAAp0B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS8yB;AAAA,cACT,UAAUN;AAAA,cACV,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,QAAQA,IAAY,SAAS;AAAA,cAAA;AAAA,cAG9B,cAAY,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,UAI/B2B,KACC,gBAAAjzB,EAAAgY,IAAA,EACE,UAAA;AAAA,YAAA,gBAAAlZ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAASs0B;AAAA,gBACT,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,QAAQ;AAAA,gBAAA;AAAA,gBAEX,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,gBAAAt0B;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAA;;AAAM,0BAAA6D,IAAAwwB,EAAa,YAAb,gBAAAxwB,EAAsB;AAAA;AAAA,gBACrC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,QAAQ;AAAA,gBAAA;AAAA,gBAEX,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,gBAAA7D;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAKq0B;AAAA,gBACL,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,UAAUG;AAAA,gBACV,OAAO,EAAE,SAAS,OAAA;AAAA,cAAO;AAAA,YAAA;AAAA,UAC3B,GACF;AAAA,UAGF,gBAAAx0B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS+zB;AAAA,cACT,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,YAAY;AAAA,cAAA;AAAA,cAEf,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,GACF;AAAA,QAGCE,KACC,gBAAA/yB,EAAC,OAAA,EAAI,OAAO,EAAE,cAAc,UAC1B,UAAA;AAAA,UAAA,gBAAAlB,EAAC,MAAA,EAAG,OAAO,EAAE,QAAQ,YAAY,UAAU,QAAQ,YAAY,IAAA,GAAO,UAAA,qBAAA,CAEtE;AAAA,UAEA,gBAAAkB,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,UAClC,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAA,GAC1D,UAAA;AAAA,cAAA,gBAAAlB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAS6D,IAAA8sB,EAAY,OAAO,YAAnB,gBAAA9sB,EAA4B,kBAAiB;AAAA,kBACtD,UAAU,CAAC9D,MACTuzB,EAAqB,WAAW;AAAA,oBAC9B,GAAG3C,EAAY,OAAO;AAAA,oBACtB,eAAe5wB,EAAE,OAAO;AAAA,kBAAA,CACzB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEH;AAAA,YAAA,GAEJ;AAAA,YAEA,gBAAAmB,EAAC,SAAA,EAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAA,GAC1D,UAAA;AAAA,cAAA,gBAAAlB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAASmO,IAAAwiB,EAAY,OAAO,YAAnB,gBAAAxiB,EAA4B,iBAAgB;AAAA,kBACrD,UAAU,CAACpO,MACTuzB,EAAqB,WAAW;AAAA,oBAC9B,GAAG3C,EAAY,OAAO;AAAA,oBACtB,cAAc5wB,EAAE,OAAO;AAAA,kBAAA,CACxB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEH;AAAA,YAAA,GAEJ;AAAA,YAEA,gBAAAmB,EAAC,SAAA,EAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAA,GAAS,UAAA;AAAA,cAAA;AAAA,cAEnE,gBAAAlB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,KAAI;AAAA,kBACJ,KAAI;AAAA,kBACJ,MAAK;AAAA,kBACL,SAAOiY,IAAA0Y,EAAY,OAAO,YAAnB,gBAAA1Y,EAA4B,cAAa;AAAA,kBAChD,UAAU,CAAClY,MACTuzB,EAAqB,WAAW;AAAA,oBAC9B,GAAG3C,EAAY,OAAO;AAAA,oBACtB,WAAW,WAAW5wB,EAAE,OAAO,KAAK;AAAA,kBAAA,CACrC;AAAA,kBAEH,OAAO,EAAE,MAAM,EAAA;AAAA,gBAAE;AAAA,cAAA;AAAA,gCAElB,QAAA,EAAQ,UAAA;AAAA,oBAAAmY,IAAAyY,EAAY,OAAO,YAAnB,gBAAAzY,EAA4B,cAAa,KAAK,KAAK,QAAQ,CAAC;AAAA,gBAAE;AAAA,cAAA,EAAA,CAAC;AAAA,YAAA,EAAA,CAC1E;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAIDgc,KAAgBS,EAAW,SAAS,uBAClC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAzzB,EAAC,MAAA,EAAG,OAAO,EAAE,QAAQ,YAAY,UAAU,QAAQ,YAAY,IAAA,GAAO,UAAA;AAAA,YAAA;AAAA,YAC9CyzB,EAAW;AAAA,YAAO;AAAA,UAAA,GAC1C;AAAA,UAEA,gBAAA30B,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAA,GACjC,UAAA20B,EAAW,IAAI,CAAC9U,MAAO;AACtB,kBAAM+U,IAAOjE,EAAY,SAAS9Q,CAAE,GAC9BgV,IAAQ,OAAO,KAAKD,CAAI,EAAE,OAAO,CAACjuB,MAAMA,MAAM,cAAc;AAElE,mBACE,gBAAAzF;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,cAAc;AAAA,gBAAA;AAAA,gBAGhB,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,oBAAA,gBAAAlB,EAAC,SAAI,OAAO,EAAE,YAAY,IAAA,GAAQ,UAAA6f,GAAG;AAAA,oBACrC,gBAAA7f,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,6BAAA,GACpC,UAAA60B,EAAM,KAAK,IAAI,EAAA,CAClB;AAAA,kBAAA,GACF;AAAA,kBACA,gBAAA70B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,SAAS,MAAMkzB,EAAwBrT,CAAE;AAAA,sBACzC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,UAAU;AAAA,sBAAA;AAAA,sBAEb,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAED;AAAA,cAAA;AAAA,cA5BKA;AAAA,YAAA;AAAA,UA+BX,CAAC,EAAA,CACH;AAAA,QAAA,GACF;AAAA,QAGDqU,KAAgBS,EAAW,WAAW,KACrC,gBAAA30B,EAAC,OAAA,EAAI,OAAO,EAAE,OAAO,8BAA8B,WAAW,SAAA,GAAY,UAAA,oCAAA,CAE1E;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;ACp3BO,MAAM80B,KAA6C;AAAA,EACxD,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,uBAAuB;AAAA,EACvB,YAAY,KAAK,IAAA;AAAA,EACjB,SAAS;AACX,GAKaC,KAGT;AAAA,EACF,WAAW;AAAA,IACT,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,uBAAuB;AAAA,EAAA;AAAA,EAEzB,WAAW;AAAA,IACT,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,uBAAuB;AAAA,EAAA;AAAA,EAEzB,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,uBAAuB;AAAA,EAAA;AAAA,EAEzB,UAAU;AAAA,IACR,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,uBAAuB;AAAA;AAAA,EAAA;AAAA,EAEzB,MAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,uBAAuB;AAAA,EAAA;AAAA,EAEzB,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,uBAAuB;AAAA,EAAA;AAE3B,GAKaC,KAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,SAASC,GAAmB32B,GAAkBtB,GAAiC;AACpF,QAAMk4B,IAASF,GAAoB,QAAQ12B,CAAC,GACtC62B,IAASH,GAAoB,QAAQh4B,CAAC;AAE5C,SAAOk4B,KAAUC,IAAS72B,IAAItB;AAChC;AAKO,SAASo4B,GAAmB92B,GAAkBtB,GAA2B;AAC9E,QAAMk4B,IAASF,GAAoB,QAAQ12B,CAAC,GACtC62B,IAASH,GAAoB,QAAQh4B,CAAC;AAC5C,SAAOk4B,KAAUC;AACnB;AAMO,SAASE,GACdC,GACAC,GACAC,GACAC,GACkB;AAElB,MAAIC,IAAgBJ,EAAgB,aAChCK,IAAgC;AAGpC,EAAIJ,KAAgBD,EAAgB,uBAC9BF,GAAmBG,EAAa,MAAMG,CAAa,MACrDA,IAAgBH,EAAa,MAC7BI,IAAS,WAKTH,MAAeD,KAAA,QAAAA,EAAc,uBAC3BH,GAAmBI,EAAY,MAAME,CAAa,MACpDA,IAAgBF,EAAY,MAC5BG,IAAS,UAKTF,MAAmBF,KAAA,QAAAA,EAAc,qBAAqBC,KAAA,QAAAA,EAAa,sBACjEJ,GAAmBK,EAAe,eAAeC,CAAa,MAChEA,IAAgBD,EAAe,eAC/BE,IAAS;AAKb,QAAMzoB,IAAS6nB,GAAuBW,CAAa,GAG7ChX,IAA2B;AAAA,IAC/B,GAAGxR;AAAA,IACH,gBAAgBA,EAAO,kBAAkBooB,EAAgB;AAAA,IACzD,qBAAqBpoB,EAAO,uBAAuBooB,EAAgB;AAAA,IACnE,uBAAuBpoB,EAAO,yBAAyBooB,EAAgB;AAAA,IACvE,QAAAK;AAAA,IACA,YAAY,KAAK,IAAA;AAAA,IACjB,SAAS;AAAA,EAAA;AAIX,SAAIF,MACEA,EAAe,oBACjB/W,EAAO,iBAAiB,KAEtB+W,EAAe,yBACjB/W,EAAO,sBAAsB,KAE3B+W,EAAe,2BACjB/W,EAAO,wBAAwB,MAKnCA,EAAO,gBAAgBkX,GAAWlX,CAAM,GACxCA,EAAO,wBAAwBmX,GAAwBnX,CAAM,GAEtDA;AACT;AAKO,SAASkX,GACdlX,GAIe;AACf,QAAM,EAAE,gBAAAoX,GAAgB,qBAAAC,GAAqB,uBAAAC,GAAuB,sBAAAC,MAClEvX;AAEF,SAAI,CAACoX,KAAkB,CAACC,KAAuB,CAACC,IACvC,cAEL,CAACF,KAAkB,CAACC,KAAuBC,KAAyB,CAACC,IAChE,cAEL,CAACH,KAAkB,CAACC,KAAuBC,KAAyBC,IAC/D,YAEL,CAACH,KAAkBC,KAAuBC,IACrC,aAELF,KAAkBC,KAAuBC,IACpC,SAEF;AACT;AAKO,SAASH,GAAwBnX,GAAmC;AAEzE,SAAI,CAACA,EAAO,kBAAkB,CAACA,EAAO,sBAC7B,KAGLA,EAAO,kBAAkB,UAIzBA,EAAO,kBAAkB;AAI/B;AASA,MAAMwX,yBAAoB,IAAA;AAWnB,MAAMC,GAAe;AAAA,EAK1B,YACEzX,GACA0X,IAAoB,YACpBC,IAAqC,SACrC;AACA,SAAK,SAAS3X,GACd,KAAK,YAAY0X,GACjB,KAAK,iBAAiBC;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAWC,GAAsE;AACvF,UAAMC,IAAUD,KAAoB,KAAK;AAGzC,QAAIC,MAAY,WAAW,KAAK,OAAO;AACrC,UAAI;AACF,YAAI,OAAO,eAAiB;AAC1B,iBAAO;AAAA,MAEX,QAAQ;AAAA,MAER;AAGF,SAAKA,MAAY,aAAaA,MAAY,YAAY,KAAK,OAAO;AAChE,UAAI;AACF,YAAI,OAAO,iBAAmB;AAC5B,iBAAO;AAAA,MAEX,QAAQ;AAAA,MAER;AAIF,WAAOL;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAOh8B,GAAqB;AAClC,WAAO,GAAG,KAAK,SAAS,IAAIA,CAAG;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAgBA,GAAao8B,GAAiD;AAC5E,UAAMC,IAAU,KAAK,WAAWD,CAAgB,GAC1CE,IAAU,KAAK,OAAOt8B,CAAG;AAE/B,QAAI;AACF,YAAMgC,IAAQq6B,aAAmB,MAAMA,EAAQ,IAAIC,CAAO,IAAID,EAAQ,QAAQC,CAAO;AACrF,UAAIt6B,KAAU;AACZ,eAAO;AAET,UAAI;AACF,eAAO,KAAK,MAAMA,CAAK;AAAA,MACzB,QAAQ;AACN,eAAOA;AAAA,MACT;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAIhC,GAAagC,GAAgBo6B,GAAgD;AAC/E,UAAMC,IAAU,KAAK,WAAWD,CAAgB,GAC1CE,IAAU,KAAK,OAAOt8B,CAAG;AAE/B,QAAI;AACF,YAAMu8B,IAAa,OAAOv6B,KAAU,WAAWA,IAAQ,KAAK,UAAUA,CAAK;AAC3E,aAAIq6B,aAAmB,MACrBA,EAAQ,IAAIC,GAASC,CAAU,IAE/BF,EAAQ,QAAQC,GAASC,CAAU,GAE9B;AAAA,IACT,QAAQ;AAEN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOv8B,GAAao8B,GAAgD;AAClE,UAAMC,IAAU,KAAK,WAAWD,CAAgB,GAC1CE,IAAU,KAAK,OAAOt8B,CAAG;AAE/B,QAAI;AACF,aAAIq8B,aAAmB,MACdA,EAAQ,OAAOC,CAAO,KAE7BD,EAAQ,WAAWC,CAAO,GACnB;AAAA,IAEX,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMF,GAA6C;AACjD,UAAMC,IAAU,KAAK,WAAWD,CAAgB,GAC1CxL,IAAS,GAAG,KAAK,SAAS;AAEhC,QAAI;AACF,UAAIyL,aAAmB;AACrB,mBAAWr8B,KAAOq8B,EAAQ;AACxB,UAAIr8B,EAAI,WAAW4wB,CAAM,KACvByL,EAAQ,OAAOr8B,CAAG;AAAA,WAGjB;AACL,cAAMw8B,IAAyB,CAAA;AAC/B,iBAASzwB,IAAI,GAAGA,IAAIswB,EAAQ,QAAQtwB,KAAK;AACvC,gBAAM/L,IAAMq8B,EAAQ,IAAItwB,CAAC;AACzB,UAAI/L,KAAOA,EAAI,WAAW4wB,CAAM,KAC9B4L,EAAa,KAAKx8B,CAAG;AAAA,QAEzB;AACA,QAAAw8B,EAAa,QAAQ,CAACx8B,MAAQq8B,EAAQ,WAAWr8B,CAAG,CAAC;AAAA,MACvD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAKo8B,GAAiD;AACpD,UAAMC,IAAU,KAAK,WAAWD,CAAgB,GAC1CxL,IAAS,GAAG,KAAK,SAAS,KAC1B3qB,IAAmB,CAAA;AAEzB,QAAI;AACF,UAAIo2B,aAAmB;AACrB,mBAAWr8B,KAAOq8B,EAAQ;AACxB,UAAIr8B,EAAI,WAAW4wB,CAAM,KACvB3qB,EAAO,KAAKjG,EAAI,MAAM4wB,EAAO,MAAM,CAAC;AAAA;AAIxC,iBAAS7kB,IAAI,GAAGA,IAAIswB,EAAQ,QAAQtwB,KAAK;AACvC,gBAAM/L,IAAMq8B,EAAQ,IAAItwB,CAAC;AACzB,UAAI/L,KAAOA,EAAI,WAAW4wB,CAAM,KAC9B3qB,EAAO,KAAKjG,EAAI,MAAM4wB,EAAO,MAAM,CAAC;AAAA,QAExC;AAAA,IAEJ,QAAQ;AAAA,IAER;AAEA,WAAO3qB;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIjG,GAAao8B,GAAgD;AAC/D,WAAO,KAAK,IAAIp8B,GAAKo8B,CAAgB,MAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAuC;AACrC,WAAO;AAAA,MACL,eAAe,KAAK,OAAO;AAAA,MAC3B,oBAAoB,KAAK,OAAO;AAAA,MAChC,sBAAsB,KAAK,OAAO;AAAA,MAClC,YAAY,KAAK,OAAO;AAAA,MACxB,eAAe,KAAK,OAAO;AAAA,MAC3B,eAAe,KAAK,qBAAA;AAAA,IAAqB;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA2C;AACjD,UAAMC,IAAU,KAAK,WAAA;AACrB,WAAIA,aAAmB,MACd,WAELA,MAAY,iBACP,YAEF;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa7X,GAAgC;AAC3C,SAAK,SAASA;AAAA,EAChB;AACF;AAkDO,SAASiY,GACdC,GACAC,GACkB;AAClB,QAAM,EAAE,SAAAC,GAAS,cAAAC,GAAc,aAAAC,MAAgBH,GAGzCv1B,IAAW,EAAE,GAAGs1B,EAAA;AAGtB,MAAII,KAAeA,MAAgB;AACjC,YAAQA,GAAA;AAAA,MACN,KAAK;AACH,QAAA11B,EAAS,iBAAiB,IAC1BA,EAAS,sBAAsB,IAC/BA,EAAS,wBAAwB;AACjC;AAAA,MACF,KAAK;AACH,QAAAA,EAAS,iBAAiB,IAC1BA,EAAS,sBAAsB;AAE/B;AAAA,IAGA;AAKN,SAAIw1B,MAAY,OACdx1B,EAAS,iBAAiB,KAExBy1B,MAAiB,OACnBz1B,EAAS,sBAAsB,KAIjCA,EAAS,gBAAgBs0B,GAAWt0B,CAAQ,GAC5CA,EAAS,SAAS,WAEXA;AACT;AASO,SAAS21B,GACdvY,GACAwY,GACAC,GAC2B;AAG3B,SAAO;AAAA,IACL,kCAHc,KAAA,GAGG,YAAA;AAAA,IACjB,YAAAD;AAAA,IACA,UAAAC;AAAA,IACA,eAAezY,EAAO;AAAA,IACtB,SAAS;AAAA,MACP,OAAO;AAAA;AAAA,MACP,SAASA,EAAO;AAAA,MAChB,gBAAgBA,EAAO;AAAA,MACvB,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,IAEZ,cAAc;AAAA,MACZ,WAAW;AAAA,MACX,SAASA,EAAO;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,IAEb,gBAAgB;AAAA,MACd,WAAW;AAAA,MACX,SAASA,EAAO;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,IAEb,eAAe;AAAA,MACb,UAAUA,EAAO;AAAA,MACjB,OAAOA,EAAO;AAAA,IAAA;AAAA,IAEhB,YAAY;AAAA,MACV,mBAAmB,CAACA,EAAO,kBAAkBA,EAAO;AAAA,MACpD,eAAe;AAAA,MACf,eAAe,CAACA,EAAO,kBAAkBA,EAAO;AAAA,IAAA;AAAA,IAElD,WAAW0Y,GAA4B1Y,CAAM;AAAA,EAAA;AAEjD;AA0CA,SAAS0Y,GAA4B1Y,GAAkC;AACrE,SAAIA,EAAO,kBAAkB,cAEzB,0QAMAA,EAAO,kBAAkB,cAEzB,qPAOAA,EAAO,kBAAkB,YAEzB,uPAOAA,EAAO,kBAAkB,aAEzB,wNAOF;AAIJ;AAqBO,SAAS2Y,GAAsB3Y,GAA8C;AAClF,QAAM,EAAE,eAAAgX,MAAkBhX;AAE1B,UAAQgX,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,OAAO;AAAA,QACP,SACE;AAAA,QACF,UAAU;AAAA,MAAA;AAAA,IAEd,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,IAEd,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,IAEd,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,IAEd,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,IAEd,KAAK;AAAA,IACL;AACE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,EACZ;AAEN;AAmBO,SAAS4B,GACd5Y,GACA6Y,GACyB;AACzB,QAAMC,IAAa9Y,EAAO,qBACpB+Y,IAAa/Y,EAAO,uBAyBpBzU,IAvB6D;AAAA,IACjE,aAAa;AAAA,MACX,SAAS;AAAA,MACT,KAAK;AAAA,IAAA;AAAA,IAEP,OAAO;AAAA,MACL,SAAS;AAAA,MACT,KAAK;AAAA,IAAA;AAAA,IAEP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,KAAK;AAAA,IAAA;AAAA,IAEP,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,KAAK;AAAA,IAAA;AAAA,EACP,EAGqBstB,CAAO;AAE9B,SAAI,CAACC,KAAc,CAACC,IACX;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgBxtB,EAAM;AAAA,IACtB,YAAYA,EAAM;AAAA,EAAA,IAIlB,CAACutB,KAAcC,IACV;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgBF,MAAY,SAASttB,EAAM,UAAU;AAAA,IACrD,YAAYstB,MAAY,SAASttB,EAAM,MAAM;AAAA,EAAA,IAI1C;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAEhB;AASO,MAAMytB,KAA0B;AAKhC,SAASC,GAAsBC,GAA2C;AAC/E,QAAMC,IAAaD,EAAY,YAAA,EAAc,KAAA;AAC7C,SAAI5C,GAAoB,SAAS6C,CAA2B,IACnDA,IAEF;AACT;AAKO,SAASC,GAAmBpZ,GAAkC;AACnE,SAAOA,EAAO;AAChB;AASO,SAASqZ,GAAqBrZ,GAA0B0X,GAAoC;AACjG,SAAO,IAAID,GAAezX,GAAQ0X,CAAS;AAC7C;AAKO,SAAS4B,GAAiCd,GAA8C;AAC7F,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,mBAAmB;AAAA;AAAA,IACnB,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,YAAAA;AAAA,EAAA;AAEJ;AAKO,SAASe,GAAgCf,GAA8C;AAC5F,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,YAAAA;AAAA,EAAA;AAEJ;AAMO,SAASgB,KAA8B;AAE5C,MAAI,OAAO,WAAa,KAAa;AACnC,UAAMpB,IAAU,SAAS,OAAO,MAAM,GAAG;AACzC,eAAWqB,KAAUrB,GAAS;AAC5B,YAAM11B,IAAO+2B,EAAO,MAAM,GAAG,EAAE,CAAC,EAAE,KAAA;AAClC,eAAS,SAAS,GAAG/2B,CAAI;AAAA,IAC3B;AAAA,EACF;AAGA,MAAI;AACF,IAAI,OAAO,eAAiB,OAC1B,aAAa,MAAA;AAAA,EAEjB,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,IAAI,OAAO,iBAAmB,OAC5B,eAAe,MAAA;AAAA,EAEnB,QAAQ;AAAA,EAER;AAGA,EAAA80B,GAAc,MAAA;AAChB;AAMO,SAASkC,GAAuB1Z,GAA8C;AACnF,QAAMoC,IAAiC,CAAA;AAGvC,MAAI,CAACpC,EAAO,kBAAkB,OAAO,WAAa,KAAa;AAC7D,UAAMoY,IAAU,SAAS;AACzB,IAAIA,KAAWA,EAAQ,SAAS,KAC9BhW,EAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,kCAAkCgW,EAAQ,MAAM,GAAG,EAAE,MAAM;AAAA,MACpE,MAAMA;AAAA,IAAA,CACP;AAAA,EAEL;AAGA,MAAI,CAACpY,EAAO;AACV,QAAI;AACF,MAAI,OAAO,eAAiB,OAAe,aAAa,SAAS,KAC/DoC,EAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,oBAAoB,aAAa,MAAM;AAAA,MAAA,CACjD;AAAA,IAEL,QAAQ;AAAA,IAER;AAIF,MAAI,CAACpC,EAAO;AACV,QAAI;AACF,MAAI,OAAO,iBAAmB,OAAe,eAAe,SAAS,KACnEoC,EAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,sBAAsB,eAAe,MAAM;AAAA,MAAA,CACrD;AAAA,IAEL,QAAQ;AAAA,IAER;AAGF,SAAO;AAAA,IACL,WAAWA,EAAW,WAAW;AAAA,IACjC,YAAAA;AAAA,IACA,WAAW,KAAK,IAAA;AAAA,IAChB,QAAQpC,EAAO;AAAA,EAAA;AAEnB;ACnjCA,MAAM2Z,KAAgB76B,EAAyC,IAAI,GAMtD86B,KAAgD,CAAC,EAAE,QAAA38B,GAAQ,UAAAiF,QAAe;AACrF,QAAM,CAAC0xB,GAAWC,CAAY,IAAIxzB,EAAS,EAAK,GAC1C,CAACuG,GAAOC,CAAQ,IAAIxG,EAAuB,IAAI,GAC/Cw5B,IAAqBt5B,EAA+B,IAAI;AAG9D,EAAAM,EAAU,MACD,MAAM;;AACX,KAAAsE,IAAA00B,EAAmB,YAAnB,QAAA10B,EAA4B;AAAA,EAC9B,GACC,CAAA,CAAE;AAEL,QAAM20B,IAASr5B,EAAY,MAAM;;AAC/B,KAAA0E,IAAA00B,EAAmB,YAAnB,QAAA10B,EAA4B,SAC5B00B,EAAmB,UAAU,MAC7BhG,EAAa,EAAK;AAAA,EACpB,GAAG,CAAA,CAAE,GAGCkG,IAAiB,OACrB/D,GACAgE,GACAC,MACG;;AACH,UAAMC,IAAU,IAAI,YAAA;AACpB,QAAIC,IAAS;AAEb,eAAa;AACX,YAAM,EAAE,MAAAC,GAAM,OAAA58B,MAAU,MAAMw4B,EAAO,KAAA;AACrC,UAAIoE;AACF;AAGF,MAAAD,KAAUD,EAAQ,OAAO18B,GAAO,EAAE,QAAQ,IAAM;AAChD,YAAMD,IAAQ48B,EAAO,MAAM;AAAA,CAAI;AAC/B,MAAAA,IAAS58B,EAAM,SAAS;AAExB,iBAAW88B,KAAQ98B;AACjB,YAAI88B,EAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAMtY,IAAOsY,EAAK,MAAM,CAAC,EAAE,KAAA;AAC3B,cAAItY,MAAS,UAAU;AACrB,YAAAiY,EAAQ,EAAE,SAAS,IAAI,MAAM,IAAM;AACnC;AAAA,UACF;AAEA,cAAI;AACF,kBAAM7E,IAAO,KAAK,MAAMpT,CAAI;AAC5B,gBAAI0N,IAAU,IACV2K,IAAO;AAEX,YAAIH,MAAa,YAAYA,MAAa,kBACxCxK,MAAUlW,KAAA9J,KAAAtK,IAAAgwB,EAAK,YAAL,gBAAAhwB,EAAe,OAAf,gBAAAsK,EAAmB,UAAnB,gBAAA8J,EAA0B,YAAW,IAC/C6gB,MAAOE,KAAA9gB,IAAA2b,EAAK,YAAL,gBAAA3b,EAAe,OAAf,gBAAA8gB,EAAmB,mBAAkB,UACnCL,MAAa,gBAClB9E,EAAK,SAAS,wBAChB1F,MAAU8K,IAAApF,EAAK,UAAL,gBAAAoF,EAAY,SAAQ,KACrBpF,EAAK,SAAS,mBACvBiF,IAAO,OAIP3K,KAAW2K,MACbJ,EAAQ,EAAE,SAAAvK,GAAS,MAAA2K,EAAAA,CAAM;AAAA,UAE7B,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,IAEJ;AAEA,IAAAJ,EAAQ,EAAE,SAAS,IAAI,MAAM,IAAM;AAAA,EACrC,GAGMQ,IAAqB,CAACC,GAAuBp1B,MAAA;;AAAkC;AAAA,MACnF,OAAOA,EAAQ,SAASpI,EAAO,gBAAgB;AAAA,MAC/C,UAAUoI,EAAQ,eACd,CAAC,EAAE,MAAM,UAAmB,SAASA,EAAQ,aAAA,GAAgB,GAAGo1B,CAAQ,IACxEA;AAAA,MACJ,aAAap1B,EAAQ,eAAe;AAAA,MACpC,YAAYA,EAAQ;AAAA,MACpB,MAAMA,EAAQ;AAAA,MACd,QAAQA,EAAQ,UAAU;AAAA,MAC1B,QAAOF,IAAAE,EAAQ,UAAR,gBAAAF,EAAe,IAAI,CAACsE,OAAO;AAAA,QAChC,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAMA,EAAE;AAAA,UACR,aAAaA,EAAE;AAAA,UACf,YAAYA,EAAE;AAAA,QAAA;AAAA,MAChB;AAAA,IACA;AAAA,KAIEixB,IAAwB,CAACD,GAAuBp1B,MAAiC;;AACrF,UAAMs1B,IACJt1B,EAAQ,kBAAgBF,IAAAs1B,EAAS,KAAK,CAACnb,MAAMA,EAAE,SAAS,QAAQ,MAAxC,gBAAAna,EAA2C,UAC/Dy1B,IAAoBH,EAAS,OAAO,CAACnb,MAAMA,EAAE,SAAS,QAAQ;AAEpE,WAAO;AAAA,MACL,OAAOja,EAAQ,SAASpI,EAAO,gBAAgB;AAAA,MAC/C,YAAYoI,EAAQ,aAAa;AAAA,MACjC,QAAQs1B;AAAA,MACR,UAAUC,EAAkB,IAAI,CAACtb,OAAO;AAAA,QACtC,MAAMA,EAAE,SAAS,cAAc,cAAc;AAAA,QAC7C,SAASA,EAAE;AAAA,MAAA,EACX;AAAA,MACF,aAAaja,EAAQ,eAAe;AAAA,MACpC,gBAAgBA,EAAQ;AAAA,MACxB,QAAQA,EAAQ,UAAU;AAAA,IAAA;AAAA,EAE9B,GAGMw1B,IAAWp6B;AAAA,IACf,OACEg6B,GACAp1B,IAA+B,OACG;;AAClC,UAAIpI,EAAO,aAAa,YAAYA,EAAO;AACzC,eAAOA,EAAO,cAAcw9B,GAAUp1B,CAAO;AAG/C,MAAAwuB,EAAa,EAAI,GACjBhtB,EAAS,IAAI,GACbgzB,EAAmB,UAAU,IAAI,gBAAA;AAEjC,UAAI;AACF,YAAIl4B,GACAm5B,GACAC;AAEJ,YAAI99B,EAAO,aAAa;AACtB,UAAA0E,IAAM1E,EAAO,YAAY,8CACzB69B,IAAU;AAAA,YACR,gBAAgB;AAAA,YAChB,eAAe,UAAU79B,EAAO,MAAM;AAAA,YACtC,GAAIA,EAAO,kBAAkB,EAAE,uBAAuBA,EAAO,eAAA;AAAA,YAC7D,GAAGA,EAAO;AAAA,UAAA,GAEZ89B,IAAOP,EAAmBC,GAAU,EAAE,GAAGp1B,GAAS,QAAQ,IAAO;AAAA,iBACxDpI,EAAO,aAAa;AAC7B,UAAA0E,IAAM1E,EAAO,YAAY,IACzB69B,IAAU;AAAA,YACR,gBAAgB;AAAA,YAChB,WAAW79B,EAAO,UAAU;AAAA,YAC5B,GAAGA,EAAO;AAAA,UAAA,GAEZ89B,IAAOP,EAAmBC,GAAU,EAAE,GAAGp1B,GAAS,QAAQ,IAAO;AAAA,iBACxDpI,EAAO,aAAa;AAC7B,UAAA0E,IAAM1E,EAAO,YAAY,yCACzB69B,IAAU;AAAA,YACR,gBAAgB;AAAA,YAChB,aAAa79B,EAAO,UAAU;AAAA,YAC9B,qBAAqB;AAAA,YACrB,GAAGA,EAAO;AAAA,UAAA,GAEZ89B,IAAOL,EAAsBD,GAAU,EAAE,GAAGp1B,GAAS,QAAQ,IAAO;AAAA;AAEpE,gBAAM,IAAI,MAAM,yBAAyBpI,EAAO,QAAQ,EAAE;AAG5D,cAAMowB,IAAW,MAAM,MAAM1rB,GAAK;AAAA,UAChC,QAAQ;AAAA,UACR,SAAAm5B;AAAA,UACA,MAAM,KAAK,UAAUC,CAAI;AAAA,UACzB,QAAQlB,EAAmB,QAAQ;AAAA,QAAA,CACpC;AAED,YAAI,CAACxM,EAAS,IAAI;AAChB,gBAAM2N,IAAY,MAAM3N,EAAS,KAAA;AACjC,gBAAM,IAAI,MAAM,sBAAsBA,EAAS,MAAM,IAAI2N,CAAS,EAAE;AAAA,QACtE;AAEA,cAAM7F,IAAO,MAAM9H,EAAS,KAAA;AAC5B,YAAI5rB;AAEJ,YAAIxE,EAAO,aAAa,YAAYA,EAAO,aAAa,gBAAgB;AACtE,gBAAMg+B,KAAS91B,IAAAgwB,EAAK,YAAL,gBAAAhwB,EAAe;AAC9B,UAAA1D,IAAS;AAAA,YACP,WAASgO,IAAAwrB,KAAA,gBAAAA,EAAQ,YAAR,gBAAAxrB,EAAiB,YAAW;AAAA,YACrC,eAAcwrB,KAAA,gBAAAA,EAAQ,kBAAiB;AAAA,YACvC,YAAWzhB,KAAAD,IAAA0hB,KAAA,gBAAAA,EAAQ,YAAR,gBAAA1hB,EAAiB,eAAjB,gBAAAC,EAA6B;AAAA,cACtC,CAAC0hB,OAAuE;AAAA,gBACtE,IAAIA,EAAG;AAAA,gBACP,MAAMA,EAAG,SAAS;AAAA,gBAClB,WAAW,KAAK,MAAMA,EAAG,SAAS,SAAS;AAAA,cAAA;AAAA;AAAA,YAG/C,OAAO/F,EAAK,SAAS;AAAA,cACnB,cAAcA,EAAK,MAAM;AAAA,cACzB,kBAAkBA,EAAK,MAAM;AAAA,cAC7B,aAAaA,EAAK,MAAM;AAAA,YAAA;AAAA,UAC1B;AAAA,QAEJ,MAAA,CAAWl4B,EAAO,aAAa,cAC7BwE,IAAS;AAAA,UACP,WAAS84B,KAAAD,IAAAnF,EAAK,YAAL,gBAAAmF,EAAe,OAAf,gBAAAC,EAAmB,SAAQ;AAAA,UACpC,cAAcpF,EAAK,eAAe;AAAA,UAClC,OAAOA,EAAK,SAAS;AAAA,YACnB,cAAcA,EAAK,MAAM;AAAA,YACzB,kBAAkBA,EAAK,MAAM;AAAA,YAC7B,aAAaA,EAAK,MAAM,eAAeA,EAAK,MAAM;AAAA,UAAA;AAAA,QACpD,IAGF1zB,IAAS,EAAE,SAAS,IAAI,cAAc,OAAA;AAGxC,eAAOA;AAAA,MACT,SAAS6f,GAAK;AACZ,cAAKA,EAAc,SAAS,eACpB,IAAI,MAAM,mBAAmB,KAErCza,EAASya,CAAY,GACfA;AAAA,MACR,UAAA;AACE,QAAAuS,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC52B,CAAM;AAAA,EAAA,GAIHk+B,IAAS16B;AAAA,IACb,OACEg6B,GACAT,GACA30B,IAA+B,OACb;AAClB,UAAIpI,EAAO,aAAa,YAAYA,EAAO;AACzC,eAAOA,EAAO,oBAAoBw9B,GAAUp1B,GAAS20B,CAAO;AAG9D,MAAAnG,EAAa,EAAI,GACjBhtB,EAAS,IAAI,GACbgzB,EAAmB,UAAU,IAAI,gBAAA;AAEjC,UAAI;AACF,YAAIl4B,GACAm5B,GACAC;AAEJ,YAAI99B,EAAO,aAAa;AACtB,UAAA0E,IAAM1E,EAAO,YAAY,8CACzB69B,IAAU;AAAA,YACR,gBAAgB;AAAA,YAChB,eAAe,UAAU79B,EAAO,MAAM;AAAA,YACtC,GAAIA,EAAO,kBAAkB,EAAE,uBAAuBA,EAAO,eAAA;AAAA,YAC7D,GAAGA,EAAO;AAAA,UAAA,GAEZ89B,IAAOP,EAAmBC,GAAU,EAAE,GAAGp1B,GAAS,QAAQ,IAAM;AAAA,iBACvDpI,EAAO,aAAa;AAC7B,UAAA0E,IAAM1E,EAAO,YAAY,IACzB69B,IAAU;AAAA,YACR,gBAAgB;AAAA,YAChB,WAAW79B,EAAO,UAAU;AAAA,YAC5B,GAAGA,EAAO;AAAA,UAAA,GAEZ89B,IAAOP,EAAmBC,GAAU,EAAE,GAAGp1B,GAAS,QAAQ,IAAM;AAAA,iBACvDpI,EAAO,aAAa;AAC7B,UAAA0E,IAAM1E,EAAO,YAAY,yCACzB69B,IAAU;AAAA,YACR,gBAAgB;AAAA,YAChB,aAAa79B,EAAO,UAAU;AAAA,YAC9B,qBAAqB;AAAA,YACrB,GAAGA,EAAO;AAAA,UAAA,GAEZ89B,IAAOL,EAAsBD,GAAU,EAAE,GAAGp1B,GAAS,QAAQ,IAAM;AAAA;AAEnE,gBAAM,IAAI,MAAM,yBAAyBpI,EAAO,QAAQ,EAAE;AAG5D,cAAMowB,IAAW,MAAM,MAAM1rB,GAAK;AAAA,UAChC,QAAQ;AAAA,UACR,SAAAm5B;AAAA,UACA,MAAM,KAAK,UAAUC,CAAI;AAAA,UACzB,QAAQlB,EAAmB,QAAQ;AAAA,QAAA,CACpC;AAED,YAAI,CAACxM,EAAS,IAAI;AAChB,gBAAM2N,IAAY,MAAM3N,EAAS,KAAA;AACjC,gBAAM,IAAI,MAAM,sBAAsBA,EAAS,MAAM,IAAI2N,CAAS,EAAE;AAAA,QACtE;AAEA,YAAI,CAAC3N,EAAS;AACZ,gBAAM,IAAI,MAAM,uBAAuB;AAGzC,cAAM2I,IAAS3I,EAAS,KAAK,UAAA;AAC7B,cAAM0M,EAAe/D,GAAQgE,GAAS/8B,EAAO,QAAQ;AAAA,MACvD,SAASqkB,GAAK;AACZ,YAAKA,EAAc,SAAS,cAAc;AACxC,UAAA0Y,EAAQ,EAAE,SAAS,IAAI,MAAM,IAAM;AACnC;AAAA,QACF;AACA,cAAAnzB,EAASya,CAAY,GACfA;AAAA,MACR,UAAA;AACE,QAAAuS,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC52B,CAAM;AAAA,EAAA,GAGHO,IAA4B;AAAA,IAChC,cAAc,CAAC,CAACP,EAAO,UAAUA,EAAO,aAAa,YAAYA,EAAO,aAAa;AAAA,IACrF,UAAUA,EAAO;AAAA,IACjB,cAAcA,EAAO,gBAAgB;AAAA,IACrC,UAAA49B;AAAA,IACA,QAAAM;AAAA,IACA,QAAArB;AAAA,IACA,WAAAlG;AAAA,IACA,OAAAhtB;AAAA,EAAA;AAGF,SAAO,gBAAAtF,EAACq4B,GAAc,UAAd,EAAuB,OAAAn8B,GAAe,UAAA0E,EAAA,CAAS;AACzD;AAMO,SAASk5B,KAAgC;AAC9C,QAAMC,IAAUr8B,EAAW26B,EAAa;AACxC,MAAI,CAAC0B;AACH,UAAM,IAAI,MAAM,gDAAgD;AAElE,SAAOA;AACT;AAsCO,SAASC,GAAgBj2B,IAAkC,IAA2B;AAC3F,QAAMk2B,IAAKH,GAAA,GACL,CAAC/N,GAAUmO,CAAW,IAAIn7B,EAAS,EAAE,GACrC,CAACo7B,GAASC,CAAU,IAAIr7B,EAAsB,CAAA,CAAE,GAChD,CAACuzB,GAAWC,CAAY,IAAIxzB,EAAS,EAAK,GAC1C,CAACuG,GAAOC,CAAQ,IAAIxG,EAAuB,IAAI,GAE/CiqB,IAAO7pB;AAAA,IACX,OAAO6W,MAAqC;AAC1C,MAAAuc,EAAa,EAAI,GACjBhtB,EAAS,IAAI,GACb20B,EAAY,EAAE;AAEd,YAAMf,IAAwB,CAAC,GAAGgB,GAAS,EAAE,MAAM,QAAQ,SAASnkB,GAAS;AAE7E,UAAI;AACF,cAAM7V,IAAS,MAAM85B,EAAG,SAASd,GAAU;AAAA,UACzC,cAAcp1B,EAAQ;AAAA,UACtB,OAAOA,EAAQ;AAAA,UACf,aAAaA,EAAQ;AAAA,QAAA,CACtB;AAED,eAAAq2B,EAAW,CAAC,GAAGjB,GAAU,EAAE,MAAM,aAAa,SAASh5B,EAAO,QAAA,CAAS,CAAC,GACxE+5B,EAAY/5B,EAAO,OAAO,GACnBA,EAAO;AAAA,MAChB,SAAS6f,GAAK;AACZ,cAAAza,EAASya,CAAY,GACfA;AAAA,MACR,UAAA;AACE,QAAAuS,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,GAAIE,GAASp2B,CAAO;AAAA,EAAA,GAGjBs2B,IAAgBl7B;AAAA,IACpB,OAAO6W,GAAiB0iB,MAAyD;AAC/E,MAAAnG,EAAa,EAAI,GACjBhtB,EAAS,IAAI,GACb20B,EAAY,EAAE;AAEd,YAAMf,IAAwB,CAAC,GAAGgB,GAAS,EAAE,MAAM,QAAQ,SAASnkB,GAAS;AAE7E,UAAI;AACF,YAAIskB,IAAe;AACnB,qBAAML,EAAG;AAAA,UACPd;AAAA,UACA,CAACoB,MAAU;AACT,YAAKA,EAAM,SACTD,KAAgBC,EAAM,SACtBL,EAAYI,CAAY,GACxB5B,KAAA,QAAAA,EAAU6B,EAAM;AAAA,UAEpB;AAAA,UACA;AAAA,YACE,cAAcx2B,EAAQ;AAAA,YACtB,OAAOA,EAAQ;AAAA,YACf,aAAaA,EAAQ;AAAA,UAAA;AAAA,QACvB,GAGFq2B,EAAW,CAAC,GAAGjB,GAAU,EAAE,MAAM,aAAa,SAASmB,EAAA,CAAc,CAAC,GAC/DA;AAAA,MACT,SAASta,GAAK;AACZ,cAAAza,EAASya,CAAY,GACfA;AAAA,MACR,UAAA;AACE,QAAAuS,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,GAAIE,GAASp2B,CAAO;AAAA,EAAA,GAGjBvB,IAAQrD,EAAY,MAAM;AAC9B,IAAA+6B,EAAY,EAAE,GACd30B,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAECi1B,IAAer7B,EAAY,MAAM;AACrC,IAAAi7B,EAAW,CAAA,CAAE,GACbF,EAAY,EAAE,GACd30B,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAECizB,IAASr5B,EAAY,MAAM;AAC/B,IAAA86B,EAAG,OAAA,GACH1H,EAAa,EAAK;AAAA,EACpB,GAAG,CAAC0H,CAAE,CAAC;AAEP,SAAO;AAAA,IACL,UAAAlO;AAAA,IACA,WAAAuG;AAAA,IACA,OAAAhtB;AAAA,IACA,MAAA0jB;AAAA,IACA,eAAAqR;AAAA,IACA,OAAA73B;AAAA,IACA,QAAAg2B;AAAA,IACA,SAAA2B;AAAA,IACA,cAAAK;AAAA,EAAA;AAEJ;AAeO,SAASC,GAAkB12B,IAAoC,IAAI;AACxE,QAAMk2B,IAAKH,GAAA,GACL,CAACY,GAAYC,CAAa,IAAI57B,EAAS,EAAE,GACzC,CAACuzB,GAAWC,CAAY,IAAIxzB,EAAS,EAAK,GAE1Cw6B,IAAWp6B;AAAA,IACf,OAAO2rB,GAAgB8P,IAAiB,OAAwB;AAC9D,MAAArI,EAAa,EAAI,GACjBoI,EAAc,EAAE;AAEhB,UAAI;AA2BF,cAAME,KA1BS,MAAMZ,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,0BAA0Bl2B,EAAQ,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA,EAIrE+mB,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKN8P,CAAM;AAAA;AAAA;AAAA;AAAA,YAAA;AAAA,UAII;AAAA,UAEF;AAAA,YACE,OAAO72B,EAAQ;AAAA,YACf,aAAa;AAAA,YACb,WAAW;AAAA,UAAA;AAAA,QACb,GAGwB,QAAQ,KAAA;AAClC,eAAA42B,EAAcE,CAAU,GACjBA;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT,UAAA;AACE,QAAAtI,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,GAAIl2B,CAAO;AAAA,EAAA,GAGR+2B,IAAU37B;AAAA,IACd,OAAO8pB,MAAkC;AACvC,MAAAsJ,EAAa,EAAI;AAEjB,UAAI;AAcF,gBAbe,MAAM0H,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,yBAAyBl2B,EAAQ,YAAY,EAAE;AAAA;AAAA;AAAA,EAA+BklB,CAAI;AAAA;AAAA,YAAA;AAAA,UAC7F;AAAA,UAEF;AAAA,YACE,OAAOllB,EAAQ;AAAA,YACf,aAAa;AAAA,UAAA;AAAA,QACf,GAGY;AAAA,MAChB,UAAA;AACE,QAAAwuB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,GAAIl2B,CAAO;AAAA,EAAA,GAGRg3B,IAAW57B;AAAA,IACf,OAAO8pB,GAAc+R,MAAyC;AAC5D,MAAAzI,EAAa,EAAI;AAEjB,UAAI;AACF,cAAMpyB,IAAS,MAAM85B,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,0BAA0Bl2B,EAAQ,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA,EAIrEklB,CAAI;AAAA;AAAA;AAAA,eAGS+R,CAAW;AAAA;AAAA;AAAA,YAAA;AAAA,UAGd;AAAA,UAEF;AAAA,YACE,OAAOj3B,EAAQ;AAAA,YACf,aAAa;AAAA,UAAA;AAAA,QACf,GAIIyW,IAAQra,EAAO,QAAQ,MAAM,0BAA0B;AAC7D,eAAOqa,IAAQA,EAAM,CAAC,EAAE,SAASra,EAAO,QAAQ,KAAA;AAAA,MAClD,UAAA;AACE,QAAAoyB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,GAAIl2B,CAAO;AAAA,EAAA,GAGRk3B,IAAsB97B;AAAA,IAC1B,OAAO+7B,MAAqC;AAC1C,MAAA3I,EAAa,EAAI;AAEjB,UAAI;AACF,cAAMpyB,IAAS,MAAM85B,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,YAAYl2B,EAAQ,YAAY,EAAE;AAAA;AAAA,eAE1Cm3B,CAAO;AAAA;AAAA;AAAA,YAAA;AAAA,UAGV;AAAA,UAEF;AAAA,YACE,OAAOn3B,EAAQ;AAAA,YACf,aAAa;AAAA,UAAA;AAAA,QACf,GAGIyW,IAAQra,EAAO,QAAQ,MAAM,0BAA0B;AAC7D,eAAOqa,IAAQA,EAAM,CAAC,EAAE,SAASra,EAAO,QAAQ,KAAA;AAAA,MAClD,UAAA;AACE,QAAAoyB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,GAAIl2B,CAAO;AAAA,EAAA;AAGd,SAAO;AAAA,IACL,YAAA22B;AAAA,IACA,WAAApI;AAAA,IACA,UAAAiH;AAAA,IACA,SAAAuB;AAAA,IACA,UAAAC;AAAA,IACA,qBAAAE;AAAA,EAAA;AAEJ;AAGO,SAASE,KAA2B;AACzC,QAAMlB,IAAKH,GAAA,GACL,CAACxH,GAAWC,CAAY,IAAIxzB,EAAS,EAAK;AAyChD,SAAO,EAAE,aAvCWI;AAAA,IAClB,OACEqK,GACA2iB,MACmE;AACnE,MAAAoG,EAAa,EAAI;AAEjB,UAAI;AACF,cAAMpyB,IAAS,MAAM85B,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,gFAAgF,KAAK,UAAU9N,CAAO,CAAC;AAAA;AAAA,UAEpH3iB,CAAK;AAAA;AAAA;AAAA;AAAA,YAAA;AAAA,UAIH;AAAA,UAEF;AAAA,YACE,aAAa;AAAA,YACb,WAAW;AAAA,UAAA;AAAA,QACb;AAGF,YAAI;AACF,gBAAM4xB,IAAU,KAAK,MAAMj7B,EAAO,OAAO;AACzC,iBAAO,MAAM,QAAQi7B,CAAO,IAAIA,IAAU,CAAA;AAAA,QAC5C,QAAQ;AACN,iBAAO,CAAA;AAAA,QACT;AAAA,MACF,UAAA;AACE,QAAA7I,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,CAAE;AAAA,EAAA,GAGiB,WAAA3H,EAAA;AACxB;AAGO,SAAS+I,KAAqB;AACnC,QAAMpB,IAAKH,GAAA,GACL,CAACxH,GAAWC,CAAY,IAAIxzB,EAAS,EAAK,GAE1Cu8B,IAAmBn8B;AAAA,IACvB,OACEshB,GACA8a,MAC+E;AAC/E,MAAAhJ,EAAa,EAAI;AAEjB,UAAI;AACF,cAAMiJ,IAAa/a,EAAK,MAAM,GAAG,CAAC,GAC5BtgB,IAAS,MAAM85B,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,mEAAmE,KAAK,UAAUuB,CAAU,CAAC;AAAA,EAClHD,IAAc,YAAYA,CAAW,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA,YAAA;AAAA,UAIlC;AAAA,UAEF;AAAA,YACE,aAAa;AAAA,YACb,WAAW;AAAA,UAAA;AAAA,QACb;AAGF,YAAI;AACF,iBAAO,KAAK,MAAMp7B,EAAO,OAAO;AAAA,QAClC,QAAQ;AACN,iBAAO,EAAE,MAAM,OAAO,QAAQ,sBAAsB,QAAQ,GAAC;AAAA,QAC/D;AAAA,MACF,UAAA;AACE,QAAAoyB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,CAAE;AAAA,EAAA,GAGCwB,IAAmBt8B;AAAA,IACvB,OAAOshB,GAAiBib,MAAyC;AAC/D,MAAAnJ,EAAa,EAAI;AAEjB,UAAI;AACF,cAAMpyB,IAAS,MAAM85B,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,gBAAgByB,CAAS,mDAAmD,KAAK,UAAUjb,EAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA;AAAA,YAAA;AAAA,UAGxH;AAAA,UAEF;AAAA,YACE,aAAa;AAAA,YACb,WAAW;AAAA,UAAA;AAAA,QACb;AAGF,YAAI;AACF,iBAAO,KAAK,MAAMtgB,EAAO,OAAO;AAAA,QAClC,QAAQ;AACN,iBAAO,CAAA;AAAA,QACT;AAAA,MACF,UAAA;AACE,QAAAoyB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,CAAE;AAAA,EAAA;AAGL,SAAO,EAAE,kBAAAqB,GAAkB,kBAAAG,GAAkB,WAAAnJ,EAAA;AAC/C;AAGO,SAASqJ,KAAoB;AAClC,QAAM1B,IAAKH,GAAA,GACL,CAACxH,GAAWC,CAAY,IAAIxzB,EAAS,EAAK;AAuChD,SAAO,EAAE,cArCYI;AAAA,IACnB,OACEo8B,MAGG;AACH,MAAAhJ,EAAa,EAAI;AAEjB,UAAI;AACF,cAAMpyB,IAAS,MAAM85B,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,sDAAsDsB,CAAW;AAAA;AAAA;AAAA;AAAA,YAAA;AAAA,UAI5E;AAAA,UAEF;AAAA,YACE,aAAa;AAAA,YACb,WAAW;AAAA,UAAA;AAAA,QACb;AAGF,YAAI;AACF,iBAAO,KAAK,MAAMp7B,EAAO,OAAO;AAAA,QAClC,QAAQ;AACN,iBAAO,CAAA;AAAA,QACT;AAAA,MACF,UAAA;AACE,QAAAoyB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,CAAE;AAAA,EAAA,GAGkB,WAAA3H,EAAA;AACzB;AAGO,SAASsJ,KAAqB;AACnC,QAAM3B,IAAKH,GAAA,GACL,CAACxH,GAAWC,CAAY,IAAIxzB,EAAS,EAAK,GAE1C88B,IAAc18B;AAAA,IAClB,OACEmb,GACAhd,MACoB;AACpB,MAAAi1B,EAAa,EAAI;AAEjB,UAAI;AAiBF,gBAhBe,MAAM0H,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,gCAAgC38B,KAAS,cAAc;AAAA;AAAA,QAEtEgd,CAAI;AAAA;AAAA;AAAA,YAAA;AAAA,UAGA;AAAA,UAEF;AAAA,YACE,aAAa;AAAA,UAAA;AAAA,QACf,GAGY,QAAQ,KAAA;AAAA,MACxB,UAAA;AACE,QAAAiY,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,CAAE;AAAA,EAAA,GAGC6B,IAAY38B;AAAA,IAChB,OAAOmb,GAAcyhB,MAA4C;AAC/D,MAAAxJ,EAAa,EAAI;AAEjB,UAAI;AAiBF,gBAhBe,MAAM0H,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS,0BAA0B8B,CAAc;AAAA;AAAA,QAEvDzhB,CAAI;AAAA;AAAA;AAAA,YAAA;AAAA,UAGA;AAAA,UAEF;AAAA,YACE,aAAa;AAAA,UAAA;AAAA,QACf,GAGY,QAAQ,KAAA;AAAA,MACxB,UAAA;AACE,QAAAiY,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,CAAE;AAAA,EAAA,GAGC+B,IAAe78B;AAAA,IACnB,OAAO88B,MAAoC;AACzC,MAAA1J,EAAa,EAAI;AAEjB,UAAI;AACF,cAAMpyB,IAAS,MAAM85B,EAAG;AAAA,UACtB;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA;AAAA,UAEbgC,CAAM;AAAA;AAAA;AAAA,YAAA;AAAA,UAGJ;AAAA,UAEF;AAAA,YACE,aAAa;AAAA,UAAA;AAAA,QACf,GAIIzhB,IAAQra,EAAO,QAAQ,MAAM,0BAA0B;AAC7D,eAAOqa,IAAQA,EAAM,CAAC,EAAE,SAASra,EAAO,QAAQ,KAAA;AAAA,MAClD,UAAA;AACE,QAAAoyB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC0H,CAAE;AAAA,EAAA;AAGL,SAAO,EAAE,aAAA4B,GAAa,WAAAC,GAAW,cAAAE,GAAc,WAAA1J,EAAA;AACjD;ACr7BA,MAAM4J,GAAiB;AAAA,EAAvB,cAAA;AAEE,SAAQ,iCAAiB,IAAA;AAAA,EAAgC;AAAA,EAEzD,GACEthB,GACA9Y,GACY;AACZ,WAAK,KAAK,WAAW,IAAI8Y,CAAK,KAC5B,KAAK,WAAW,IAAIA,GAAO,oBAAI,KAAK,GAEtC,KAAK,WAAW,IAAIA,CAAK,EAAG,IAAI9Y,CAAO,GAChC,MAAM;;AACX,OAAA+B,IAAA,KAAK,WAAW,IAAI+W,CAAK,MAAzB,QAAA/W,EAA4B,OAAO/B;AAAA,IACrC;AAAA,EACF;AAAA,EAEU,KACR8Y,MACG6E,GACG;;AACN,KAAA5b,IAAA,KAAK,WAAW,IAAI+W,CAAK,MAAzB,QAAA/W,EAA4B,QAAQ,CAACs4B,MAAO;AAC1C,UAAI;AACF,QAAAA,EAAG,GAAG1c,CAAI;AAAA,MACZ,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAuCA,SAAS2c,GAAiBC,GAA8BC,GAAoC;AAC1F,QAAMzyB,IAAMwyB,EAAIC,EAAK,KAAK,GACpB1kB,IAAS0kB,EAAK;AACpB,UAAQA,EAAK,UAAA;AAAA,IACX,KAAK;AACH,aAAOzyB,KAAO+N;AAAA;AAAA,IAChB,KAAK;AACH,aAAO/N,KAAO+N;AAAA;AAAA,IAChB,KAAK;AACH,aAAQ/N,IAAkB+N;AAAA,IAC5B,KAAK;AACH,aAAQ/N,KAAmB+N;AAAA,IAC7B,KAAK;AACH,aAAQ/N,IAAkB+N;AAAA,IAC5B,KAAK;AACH,aAAQ/N,KAAmB+N;AAAA,IAC7B,KAAK;AACH,aAAO,OAAO/N,KAAO,EAAE,EACpB,YAAA,EACA,SAAS,OAAO+N,KAAU,EAAE,EAAE,YAAA,CAAa;AAAA,IAChD,KAAK;AACH,aAAO,CAAC,OAAO/N,KAAO,EAAE,EACrB,YAAA,EACA,SAAS,OAAO+N,KAAU,EAAE,EAAE,aAAa;AAAA,IAChD,KAAK;AACH,aAAO,OAAO/N,KAAO,EAAE,EACpB,YAAA,EACA,WAAW,OAAO+N,KAAU,EAAE,EAAE,YAAA,CAAa;AAAA,IAClD,KAAK;AACH,aAAO,OAAO/N,KAAO,EAAE,EACpB,YAAA,EACA,SAAS,OAAO+N,KAAU,EAAE,EAAE,YAAA,CAAa;AAAA,IAChD,KAAK;AACH,aAAO/N,KAAO,QAAQA,MAAQ;AAAA,IAChC,KAAK;AACH,aAAOA,KAAO,QAAQA,MAAQ;AAAA,IAChC;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS0yB,GAAcF,GAA8BG,GAAiC;AACpF,MAAIA,EAAM,MAAM,WAAW;AACzB,WAAO;AAET,QAAMC,IAAO,CAACplB,MACZA,EAAK,SAAS,cAAc+kB,GAAiBC,GAAKhlB,CAAI,IAAIklB,GAAcF,GAAKhlB,CAAI;AACnF,SAAOmlB,EAAM,UAAU,QAAQA,EAAM,MAAM,MAAMC,CAAI,IAAID,EAAM,MAAM,KAAKC,CAAI;AAChF;AAEA,SAASC,GACPjc,GACA1c,GACmB;;AACnB,MAAI5D,IAAS,CAAC,GAAGsgB,CAAI;AAQrB,MALI1c,EAAQ,WACV5D,IAASA,EAAO,OAAO,CAACrD,MAAMy/B,GAAcz/B,GAAGiH,EAAQ,MAAO,CAAC,IAI7DA,EAAQ,QAAQ;AAClB,UAAMmE,IAAInE,EAAQ,OAAO,YAAA,GACnB+oB,IAAS/oB,EAAQ;AACvB,IAAA5D,IAASA,EAAO,OAAO,CAACrD,OACTgwB,IAASA,EAAO,IAAI,CAAC6P,MAAM7/B,EAAE6/B,CAAC,CAAC,IAAI,OAAO,OAAO7/B,CAAC,GACnD;AAAA,MAAK,CAACuQ,MAChB,OAAOA,KAAK,EAAE,EACX,YAAA,EACA,SAASnF,CAAC;AAAA,IAAA,CAEhB;AAAA,EACH;AAEA,QAAM00B,IAAaz8B,EAAO;AAqB1B,OAlBI0D,IAAAE,EAAQ,SAAR,QAAAF,EAAc,UAChB1D,EAAO,KAAK,CAAC7B,GAAGtB,MAAM;AACpB,eAAW,KAAK+G,EAAQ,MAAO;AAC7B,YAAM84B,IAAKv+B,EAAE,EAAE,KAAK,KAAK,IACnBw+B,IAAK9/B,EAAE,EAAE,KAAK,KAAK,IACnB+/B,IACJ,OAAOF,KAAO,YAAY,OAAOC,KAAO,WACpCD,IAAKC,IACL,OAAOD,CAAE,EAAE,cAAc,OAAOC,CAAE,CAAC;AACzC,UAAIC,MAAQ;AACV,eAAO,EAAE,cAAc,SAAS,CAACA,IAAMA;AAAA,IAE3C;AACA,WAAO;AAAA,EACT,CAAC,GAICh5B,EAAQ,QAAQ,QAAQA,EAAQ,QAAQ,MAAM;AAChD,UAAMi5B,IAAOj5B,EAAQ,QAAQ,GACvBk5B,IAAOl5B,EAAQ,QAAQ5D,EAAO;AACpC,IAAAA,IAASA,EAAO,MAAM68B,GAAMA,IAAOC,CAAI;AAAA,EACzC;AAEA,SAAO,EAAE,MAAM98B,GAAQ,YAAAy8B,EAAA;AACzB;AAgBO,SAASM,GACdvhC,GACmB;AACnB,QAAMglB,IAAWhlB,EAAO,YAAY;AACpC,MAAIovB,IAAQ,CAAC,GAAGpvB,EAAO,IAAI;AAE3B,QAAMwhC,IAAU,IAAKjB,GAAA;AAoDrB,SAhDkC;AAAA,IAChC,UAAAvb;AAAA,IACA,UAAU;AAAA,IAEV,MAAM,KAAK5c,IAA2B,IAAI;AACxC,MAAAo5B,EAAQ,KAAK,WAAW,EAAI;AAC5B,UAAI;AACF,cAAMh9B,IAASu8B,GAAe3R,GAAOhnB,CAAO;AAC5C,eAAAo5B,EAAQ,KAAK,UAAUh9B,CAAiC,GACxDg9B,EAAQ,KAAK,WAAW,EAAK,GACtBh9B;AAAA,MACT,SAASJ,GAAG;AACV,cAAAo9B,EAAQ,KAAK,SAASp9B,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC,CAAC,GACnEo9B,EAAQ,KAAK,WAAW,EAAK,GACvBp9B;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM7F,GAAc;AACxB,aAAO6wB,EAAM,KAAK,CAACjuB,MAAOA,EAA8B6jB,CAAQ,MAAMzmB,CAAG;AAAA,IAC3E;AAAA,IAEA,MAAM,OAAOmd,GAAkB;AAC7B,YAAMglB,IAAM,EAAE,GAAGhlB,EAAA;AACjB,aAAA0T,IAAQ,CAAC,GAAGA,GAAOsR,CAAG,GACtBc,EAAQ,KAAK,SAAS,GACfd;AAAA,IACT;AAAA,IAEA,MAAM,OAAOniC,GAAcmpB,GAAqB;AAC9C,YAAMtc,IAAMgkB,EAAM,UAAU,CAACjuB,MAAOA,EAA8B6jB,CAAQ,MAAMzmB,CAAG;AACnF,UAAI6M,MAAQ;AACV,cAAM,IAAI,MAAM,qBAAqB7M,CAAG,EAAE;AAE5C,YAAMkjC,IAAU,EAAE,GAAGrS,EAAMhkB,CAAG,GAAG,GAAGsc,EAAA;AACpC,aAAA0H,IAAQA,EAAM,IAAI,CAACjuB,GAAGmJ,MAAOA,MAAMc,IAAMq2B,IAAUtgC,CAAE,GACrDqgC,EAAQ,KAAK,SAAS,GACfC;AAAA,IACT;AAAA,IAEA,MAAM,OAAOljC,GAAc;AACzB,MAAA6wB,IAAQA,EAAM,OAAO,CAACjuB,MAAOA,EAA8B6jB,CAAQ,MAAMzmB,CAAG,GAC5EijC,EAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,IAEA,IAAIA,EAAQ,GAAG,KAAKA,CAAO;AAAA,EAAA;AAI/B;AAiDA,eAAeE,GAAeC,GAAsD;AAClF,QAAMviC,IAA+B,EAAE,gBAAgB,mBAAA;AACvD,MAAI,CAACuiC,EAAI;AACP,WAAOviC;AAET,QAAM8M,IAAI,OAAOy1B,EAAI,WAAY,aAAa,MAAMA,EAAI,YAAYA,EAAI;AACxE,SAAO,EAAE,GAAGviC,GAAM,GAAG8M,EAAA;AACvB;AAEA,SAAS01B,GACPC,GACAziC,GACAb,GACQ;AACR,SAAI,OAAOsjC,KAAY,aACdA,EAAQtjC,CAAG,IAEhBsjC,KAGG,GAAGziC,CAAI,IAAI,mBAAmB,OAAOb,CAAG,CAAC,CAAC;AACnD;AAEA,SAASujC,GAAkB15B,GAAkD;;AAC3E,QAAM2mB,IAAiC,CAAA;AACvC,SAAI3mB,EAAQ,QAAQ,SAClB2mB,EAAO,OAAU,OAAO3mB,EAAQ,IAAI,IAElCA,EAAQ,QAAQ,SAClB2mB,EAAO,OAAU,OAAO3mB,EAAQ,IAAI,IAElCA,EAAQ,WACV2mB,EAAO,SAAY3mB,EAAQ,UAEzBF,IAAAE,EAAQ,SAAR,QAAAF,EAAc,WAChB6mB,EAAO,OAAU3mB,EAAQ,KAAK,IAAI,CAAC+D,MAAM,GAAGA,EAAE,KAAK,IAAIA,EAAE,SAAS,EAAE,EAAE,KAAK,GAAG,IAE5E/D,EAAQ,WACV2mB,EAAO,SAAY,KAAK,UAAU3mB,EAAQ,MAAM,KAE9CoK,IAAApK,EAAQ,WAAR,QAAAoK,EAAgB,WAClBuc,EAAO,SAAY3mB,EAAQ,OAAO,KAAK,GAAG,KAExCkU,IAAAlU,EAAQ,WAAR,QAAAkU,EAAgB,WAClByS,EAAO,SAAY3mB,EAAQ,OAAO,KAAK,GAAG,IAErC2mB;AACT;AAEA,SAASgT,GAA4B7J,GAAkC;AACrE,MAAI,MAAM,QAAQA,CAAI;AACpB,WAAO,EAAE,MAAMA,GAAM,YAAYA,EAAK,OAAA;AAExC,QAAMnI,IAAMmI,GACNpT,IAAQiL,EAAI,QAAWA,EAAI,SAAYA,EAAI,SAAYA,EAAI,WAAc,CAAA,GACzEkR,IAAclR,EAAI,cACtBA,EAAI,SACJA,EAAI,SACJA,EAAI,cAAc,KAClBjL,EAAK;AACP,SAAO,EAAE,MAAAA,GAAM,YAAAmc,EAAA;AACjB;AAOO,SAASe,GACdhiC,GACmB;AACnB,QAAMglB,IAAWhlB,EAAO,YAAY,MAE9BwhC,IAAU,IAAKjB,GAAA;AAIrB,iBAAe0B,EAAQv9B,GAAagoB,GAAsC;AACxE,UAAMmR,IAAU,MAAM6D,GAAe1hC,CAAM,GACrCkiC,IAAO,MAAM,MAAMx9B,GAAK;AAAA,MAC5B,GAAG1E,EAAO;AAAA,MACV,GAAG0sB;AAAA,MACH,SAAS,EAAE,GAAGmR,GAAS,GAAGnR,KAAA,gBAAAA,EAAM,QAAA;AAAA,IAAQ,CACzC;AACD,QAAI,CAACwV,EAAK,IAAI;AACZ,YAAMvjB,IAAO,MAAMujB,EAAK,KAAA,EAAO,MAAM,MAAMA,EAAK,UAAU;AAC1D,YAAM,IAAI,MAAM,QAAQA,EAAK,MAAM,KAAKvjB,CAAI,EAAE;AAAA,IAChD;AAEA,YADWujB,EAAK,QAAQ,IAAI,cAAc,KAAK,IACrC,SAAS,MAAM,IAAIA,EAAK,KAAA,IAASA,EAAK,KAAA;AAAA,EAClD;AAmEA,SAjEkC;AAAA,IAChC,UAAAld;AAAA,IACA,UAAU;AAAA,IAEV,MAAM,KAAK5c,IAA2B,IAAI;;AACxC,MAAAo5B,EAAQ,KAAK,WAAW,EAAI;AAC5B,UAAI;AACF,cAAMpiC,IAAOY,EAAO,WAAWA,EAAO,KAChC+uB,IAAS/uB,EAAO,gBAClBA,EAAO,cAAcoI,CAAO,IAC5B05B,GAAkB15B,CAAO,GACvB+5B,IAAK,IAAI,gBAAgBpT,CAAM,EAAE,SAAA,GACjCrqB,IAAMy9B,IAAK,GAAG/iC,CAAI,IAAI+iC,CAAE,KAAK/iC,GAC7B84B,IAAO,MAAM+J,EAAQv9B,CAAG,GACxBF,IAASxE,EAAO,oBAClBA,EAAO,kBAAkBk4B,CAAI,IAC7B6J,GAA4B7J,CAAI;AACpC,eAAAsJ,EAAQ,KAAK,UAAUh9B,CAAiC,GACxDg9B,EAAQ,KAAK,WAAW,EAAK,GACtBh9B;AAAA,MACT,SAASJ,GAAG;AACV,cAAMigB,IAAMjgB,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC;AACxD,cAAAo9B,EAAQ,KAAK,SAASnd,CAAG,GACzBmd,EAAQ,KAAK,WAAW,EAAK,IAC7Bt5B,IAAAlI,EAAO,YAAP,QAAAkI,EAAA,KAAAlI,GAAiBqkB,GAAK,SAChBA;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM9lB,GAAc;AACxB,YAAMmG,IAAMk9B,GAAc5hC,EAAO,UAAUA,EAAO,KAAKzB,CAAG,GACpD25B,IAAO,MAAM+J,EAAQv9B,CAAG;AAC9B,aAAO1E,EAAO,cAAcA,EAAO,YAAYk4B,CAAI,IAAKA;AAAA,IAC1D;AAAA,IAEA,MAAM,OAAOxc,GAAkB;AAC7B,YAAMhX,IAAM1E,EAAO,aAAaA,EAAO,KACjC89B,IAAO99B,EAAO,oBAAoBA,EAAO,kBAAkB0b,CAAI,IAAIA,GACnEwc,IAAO,MAAM+J,EAAQv9B,GAAK,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAUo5B,CAAI,EAAA,CAAG,GACxEt5B,IAASxE,EAAO,cAAcA,EAAO,YAAYk4B,CAAI,IAAKA;AAChE,aAAAsJ,EAAQ,KAAK,SAAS,GACfh9B;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAcmpB,GAAqB;AAC9C,YAAMhjB,IAAMk9B,GAAc5hC,EAAO,WAAWA,EAAO,KAAKzB,CAAG,GACrDu/B,IAAO99B,EAAO,oBAAoBA,EAAO,kBAAkBzB,GAAKmpB,CAAO,IAAIA,GAC3EwQ,IAAO,MAAM+J,EAAQv9B,GAAK;AAAA,QAC9B,QAAQ1E,EAAO,gBAAgB;AAAA,QAC/B,MAAM,KAAK,UAAU89B,CAAI;AAAA,MAAA,CAC1B,GACKt5B,IAASxE,EAAO,cAAcA,EAAO,YAAYk4B,CAAI,IAAKA;AAChE,aAAAsJ,EAAQ,KAAK,SAAS,GACfh9B;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAc;AACzB,YAAMmG,IAAMk9B,GAAc5hC,EAAO,WAAWA,EAAO,KAAKzB,CAAG;AAC3D,YAAM0jC,EAAQv9B,GAAK,EAAE,QAAQ,UAAU,GACvC88B,EAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,IAEA,IAAIA,EAAQ,GAAG,KAAKA,CAAO;AAAA,EAAA;AAI/B;AAmBA,SAASY,GAAiBv3B,GAAwBw3B,GAAyB;AACzE,QAAMrB,IAAIn2B,EAAE,OACN6G,IACJ,OAAO7G,EAAE,SAAU,WAAW,IAAIA,EAAE,MAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,OAAOA,EAAE,SAAS,MAAM;AAC7F,UAAQA,EAAE,UAAA;AAAA,IACR,KAAK;AACH,aAAO,GAAGm2B,CAAC,OAAOtvB,CAAC;AAAA,IACrB,KAAK;AACH,aAAO,GAAGsvB,CAAC,OAAOtvB,CAAC;AAAA,IACrB,KAAK;AACH,aAAO,GAAGsvB,CAAC,OAAOtvB,CAAC;AAAA,IACrB,KAAK;AACH,aAAO,GAAGsvB,CAAC,OAAOtvB,CAAC;AAAA,IACrB,KAAK;AACH,aAAO,GAAGsvB,CAAC,OAAOtvB,CAAC;AAAA,IACrB,KAAK;AACH,aAAO,GAAGsvB,CAAC,OAAOtvB,CAAC;AAAA,IACrB,KAAK;AACH,aAAO2wB,KAAW,IAAI,YAAYrB,CAAC,IAAItvB,CAAC,MAAM,eAAeA,CAAC,IAAIsvB,CAAC;AAAA,IACrE,KAAK;AACH,aAAOqB,KAAW,IAAI,gBAAgBrB,CAAC,IAAItvB,CAAC,MAAM,mBAAmBA,CAAC,IAAIsvB,CAAC;AAAA,IAC7E,KAAK;AACH,aAAO,cAAcA,CAAC,IAAItvB,CAAC;AAAA,IAC7B,KAAK;AACH,aAAO,YAAYsvB,CAAC,IAAItvB,CAAC;AAAA,IAC3B,KAAK;AACH,aAAO,GAAGsvB,CAAC;AAAA,IACb,KAAK;AACH,aAAO,GAAGA,CAAC;AAAA,IACb;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAASsB,GAAczB,GAAwBwB,GAAyB;AACtE,SAAIxB,EAAM,MAAM,WAAW,IAClB,KAEKA,EAAM,MAAM;AAAA,IAAI,CAACnlB,MAC7BA,EAAK,SAAS,cACV0mB,GAAiB1mB,GAAM2mB,CAAO,IAC9B,IAAIC,GAAc5mB,GAAM2mB,CAAO,CAAC;AAAA,EAAA,EAEzB,KAAKxB,EAAM,UAAU,QAAQ,UAAU,MAAM;AAC5D;AAEO,SAAS0B,GACdviC,GACmB;AACnB,QAAMqiC,IAAUriC,EAAO,WAAW,GAE5BwiC,IAA6B;AAAA,IACjC,KAAKxiC,EAAO;AAAA,IACZ,UAAUA,EAAO;AAAA,IACjB,SAASA,EAAO;AAAA,IAChB,cAAcA,EAAO;AAAA,IACrB,SAASA,EAAO;AAAA,IAChB,cAAc;AAAA,IAEd,cAAcoI,GAAS;;AACrB,YAAM2mB,IAAiC,CAAA;AAavC,UAZIsT,KAAW,MACbtT,EAAO,SAAY,SAEjB3mB,EAAQ,QAAQ,SAClB2mB,EAAO,QAAW,OAAO3mB,EAAQ,IAAI,IAEnCA,EAAQ,QAAQ,SAClB2mB,EAAO,OAAU,OAAO3mB,EAAQ,IAAI,KAElCF,IAAAE,EAAQ,SAAR,QAAAF,EAAc,WAChB6mB,EAAO,WAAc3mB,EAAQ,KAAK,IAAI,CAAC+D,MAAM,GAAGA,EAAE,KAAK,IAAIA,EAAE,SAAS,EAAE,EAAE,KAAK,GAAG,IAEhF/D,EAAQ,QAAQ;AAClB,cAAMq6B,IAAQH,GAAcl6B,EAAQ,QAAQi6B,CAAO;AACnD,QAAII,MACF1T,EAAO,UAAa0T;AAAA,MAExB;AACA,aAAIr6B,EAAQ,WACV2mB,EAAO,UAAa,IAAI3mB,EAAQ,MAAM,OAEpCoK,IAAApK,EAAQ,WAAR,QAAAoK,EAAgB,WAClBuc,EAAO,UAAa3mB,EAAQ,OAAO,KAAK,GAAG,KAEzCkU,IAAAlU,EAAQ,WAAR,QAAAkU,EAAgB,WAClByS,EAAO,UAAa3mB,EAAQ,OAAO,KAAK,GAAG,IAEtC2mB;AAAA,IACT;AAAA,IAEA,kBAAkBmJ,GAAM;;AACtB,YAAMnI,IAAMmI,GACNpT,IAAQiL,EAAI,WAAY7nB,IAAA6nB,EAAI,MAAJ,gBAAA7nB,EAAW,YAAyC,CAAA,GAC5E+4B,IAAclR,EAAI,cAAc,OACpCvd,IAAAud,EAAI,MAAJ,gBAAAvd,EAAW,YACXsS,EAAK;AACP,aAAO,EAAE,MAAAA,GAAM,YAAAmc,EAAA;AAAA,IACjB;AAAA,IAEA,UAAU,CAAC1iC,MAAQ;AACjB,YAAMyM,IAAI,OAAOzM,KAAQ,WAAWA,IAAM,IAAI,OAAOA,CAAG,EAAE,QAAQ,MAAM,IAAI,CAAC;AAC7E,aAAO,GAAGyB,EAAO,GAAG,IAAIgL,CAAC;AAAA,IAC3B;AAAA,EAAA;AAGF,SAAOg3B,GAAqBQ,CAAO;AACrC;AAuCO,SAASE,GACd1iC,GACmB;AACnB,QAAMglB,IAAWhlB,EAAO,YAAY,MAE9BwhC,IAAU,IAAKjB,GAAA;AAIrB,iBAAeoC,EAAI90B,GAAe+0B,GAAuD;;AACvF,UAAMxjC,IAA+B,EAAE,gBAAgB,mBAAA,GACjDyjC,IAAQ7iC,EAAO,UACjB,OAAOA,EAAO,WAAY,aACxB,MAAMA,EAAO,QAAA,IACbA,EAAO,UACT,CAAA,GACEkiC,IAAO,MAAM,MAAMliC,EAAO,KAAK;AAAA,MACnC,QAAQ;AAAA,MACR,SAAS,EAAE,GAAGZ,GAAM,GAAGyjC,EAAA;AAAA,MACvB,MAAM,KAAK,UAAU,EAAE,OAAAh1B,GAAO,WAAA+0B,GAAW;AAAA,IAAA,CAC1C;AACD,QAAI,CAACV,EAAK,IAAI;AACZ,YAAMvjB,IAAO,MAAMujB,EAAK,KAAA,EAAO,MAAM,MAAMA,EAAK,UAAU;AAC1D,YAAM,IAAI,MAAM,gBAAgBA,EAAK,MAAM,KAAKvjB,CAAI,EAAE;AAAA,IACxD;AACA,UAAMuZ,IAAQ,MAAMgK,EAAK,KAAA;AACzB,SAAIh6B,IAAAgwB,EAAK,WAAL,QAAAhwB,EAAa;AACf,YAAM,IAAI,MAAMgwB,EAAK,OAAO,IAAI,CAAC9zB,MAAMA,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAE9D,WAAO8zB,EAAK;AAAA,EACd;AAEA,WAAS4K,EAAoB16B,GAAmD;;AAC9E,UAAM26B,IAAgC,CAAA;AACtC,WAAI36B,EAAQ,QAAQ,SAClB26B,EAAK,OAAU36B,EAAQ,OAErBA,EAAQ,QAAQ,SAClB26B,EAAK,OAAU36B,EAAQ,OAErBA,EAAQ,WACV26B,EAAK,SAAY36B,EAAQ,UAEvBF,IAAAE,EAAQ,SAAR,QAAAF,EAAc,WAChB66B,EAAK,OAAU36B,EAAQ,OAErBA,EAAQ,WACV26B,EAAK,SAAY36B,EAAQ,SAEpB26B;AAAA,EACT;AAEA,WAASC,EAAmBle,GAAkC;AAC5D,QAAI,CAACA,KAAQ,OAAOA,KAAS;AAC3B,aAAO,EAAE,MAAM,IAAI,YAAY,EAAA;AAEjC,UAAMjc,IAAO,OAAO,OAAOic,CAA+B,EAAE,CAAC;AAG7D,QAAI,CAACjc;AACH,aAAO,EAAE,MAAM,IAAI,YAAY,EAAA;AAEjC,QAAI,MAAM,QAAQA,CAAI;AACpB,aAAO,EAAE,MAAMA,GAAa,YAAYA,EAAK,OAAA;AAE/C,UAAMyS,IAASzS,EAAK,SAAYA,EAAK,SAAYA,EAAK,SAAYA,EAAK,QAAW,CAAA,GAC5Eo6B,IAASp6B,EAAK,cAAiBA,EAAK,SAAYA,EAAK,SAAYyS,EAAM;AAC7E,WAAO,EAAE,MAAMA,GAAO,YAAY2nB,EAAA;AAAA,EACpC;AAEA,WAASC,EAAmBpe,GAAkB;AAC5C,WAAI,CAACA,KAAQ,OAAOA,KAAS,WACpBA,IAEF,OAAO,OAAOA,CAA+B,EAAE,CAAC;AAAA,EACzD;AAgEA,SA9DkC;AAAA,IAChC,UAAAE;AAAA,IACA,UAAU,CAAC,EAAEhlB,EAAO,QAAQ,UAAUA,EAAO,QAAQ,UAAUA,EAAO,QAAQ;AAAA,IAE9E,MAAM,KAAKoI,IAA2B,IAAI;;AACxC,MAAAo5B,EAAQ,KAAK,WAAW,EAAI;AAC5B,UAAI;AACF,cAAMuB,IAAO/iC,EAAO,eAChBA,EAAO,aAAaoI,CAAO,IAC3B06B,EAAoB16B,CAAO,GACzB0c,IAAO,MAAM6d,EAAI3iC,EAAO,QAAQ,MAAM+iC,CAAI,GAC1Cv+B,IAASxE,EAAO,oBAClBA,EAAO,kBAAkB8kB,CAAI,IAC7Bke,EAAmBle,CAAI;AAC3B,eAAA0c,EAAQ,KAAK,UAAUh9B,CAAiC,GACxDg9B,EAAQ,KAAK,WAAW,EAAK,GACtBh9B;AAAA,MACT,SAASJ,GAAG;AACV,cAAMigB,IAAMjgB,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC;AACxD,cAAAo9B,EAAQ,KAAK,SAASnd,CAAG,GACzBmd,EAAQ,KAAK,WAAW,EAAK,IAC7Bt5B,IAAAlI,EAAO,YAAP,QAAAkI,EAAA,KAAAlI,GAAiBqkB,GAAK,SAChBA;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM9lB,GAAc;AACxB,UAAI,CAACyB,EAAO,QAAQ;AAClB,cAAM,IAAI,MAAM,4BAA4B;AAE9C,YAAM8kB,IAAO,MAAM6d,EAAI3iC,EAAO,QAAQ,OAAO,EAAE,CAACglB,CAAQ,GAAGzmB,GAAK;AAChE,aAAOyB,EAAO,cAAcA,EAAO,YAAY8kB,CAAI,IAAIoe,EAAmBpe,CAAI;AAAA,IAChF;AAAA,IAEA,QAAQ9kB,EAAO,QAAQ,SACnB,OAAO0b,MAAqB;AAC1B,YAAMoJ,IAAO,MAAM6d,EAAI3iC,EAAO,QAAQ,QAAS,EAAE,OAAO0b,GAAM,GACxDlX,IAASxE,EAAO,cAAcA,EAAO,YAAY8kB,CAAI,IAAIoe,EAAmBpe,CAAI;AACtF,aAAA0c,EAAQ,KAAK,SAAS,GACfh9B;AAAA,IACT,IACA;AAAA,IAEJ,QAAQxE,EAAO,QAAQ,SACnB,OAAOzB,GAAcmpB,MAAwB;AAC3C,YAAM5C,IAAO,MAAM6d,EAAI3iC,EAAO,QAAQ,QAAS,EAAE,CAACglB,CAAQ,GAAGzmB,GAAK,OAAOmpB,GAAS,GAC5EljB,IAASxE,EAAO,cAAcA,EAAO,YAAY8kB,CAAI,IAAIoe,EAAmBpe,CAAI;AACtF,aAAA0c,EAAQ,KAAK,SAAS,GACfh9B;AAAA,IACT,IACA;AAAA,IAEJ,QAAQxE,EAAO,QAAQ,SACnB,OAAOzB,MAAiB;AACtB,YAAMokC,EAAI3iC,EAAO,QAAQ,QAAS,EAAE,CAACglB,CAAQ,GAAGzmB,GAAK,GACrDijC,EAAQ,KAAK,SAAS;AAAA,IACxB,IACA;AAAA,IAEJ,IAAIA,EAAQ,GAAG,KAAKA,CAAO;AAAA,EAAA;AAI/B;AAuBO,SAAS2B,GACdC,GACmB;AACnB,QAAMpe,IAAWoe,EAAS,YAAY,MAEhC5B,IAAU,IAAKjB,GAAA;AAwDrB,SApDkC;AAAA,IAChC,UAAAvb;AAAA,IACA,UAAU,CAAC,EAAEoe,EAAS,UAAUA,EAAS,UAAUA,EAAS;AAAA,IAE5D,MAAM,KAAKh7B,IAA2B,IAAI;AACxC,MAAAo5B,EAAQ,KAAK,WAAW,EAAI;AAC5B,UAAI;AACF,cAAMh9B,IAAS,MAAM4+B,EAAS,KAAKh7B,CAAO;AAC1C,eAAAo5B,EAAQ,KAAK,UAAUh9B,CAAiC,GACxDg9B,EAAQ,KAAK,WAAW,EAAK,GACtBh9B;AAAA,MACT,SAASJ,GAAG;AACV,cAAMigB,IAAMjgB,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC;AACxD,cAAAo9B,EAAQ,KAAK,SAASnd,CAAG,GACzBmd,EAAQ,KAAK,WAAW,EAAK,GACvBnd;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM9lB,GAAc;AACxB,UAAI,CAAC6kC,EAAS;AACZ,cAAM,IAAI,MAAM,8BAA8B;AAEhD,aAAOA,EAAS,MAAM7kC,CAAG;AAAA,IAC3B;AAAA,IAEA,QAAQ6kC,EAAS,SACb,OAAO1nB,MAAqB;AAC1B,YAAMlX,IAAS,MAAM4+B,EAAS,OAAQ1nB,CAAI;AAC1C,aAAA8lB,EAAQ,KAAK,SAAS,GACfh9B;AAAA,IACT,IACA;AAAA,IAEJ,QAAQ4+B,EAAS,SACb,OAAO7kC,GAAcmpB,MAAwB;AAC3C,YAAMljB,IAAS,MAAM4+B,EAAS,OAAQ7kC,GAAKmpB,CAAO;AAClD,aAAA8Z,EAAQ,KAAK,SAAS,GACfh9B;AAAA,IACT,IACA;AAAA,IAEJ,QAAQ4+B,EAAS,SACb,OAAO7kC,MAAiB;AACtB,YAAM6kC,EAAS,OAAQ7kC,CAAG,GAC1BijC,EAAQ,KAAK,SAAS;AAAA,IACxB,IACA;AAAA,IAEJ,IAAIA,EAAQ,GAAG,KAAKA,CAAO;AAAA,EAAA;AAI/B;AC/3BO,MAAM6B,GAA2B;AAAA,EAKtC,YAAYrjC,IAA0B,IAAI;AAJ1C,SAAQ,4BAAY,IAAA,GAKlB,KAAK,MAAMA,EAAO,OAAO,KACzB,KAAK,UAAUA,EAAO,WAAW;AAAA,EACnC;AAAA,EAEA,IAAIzB,GAA4B;AAC9B,UAAM+P,IAAQ,KAAK,MAAM,IAAI/P,CAAG;AAChC,QAAK+P,GAIL;AAAA,UAAI,KAAK,QAAQA,EAAM,WAAW;AAChC,aAAK,MAAM,OAAO/P,CAAG;AACrB;AAAA,MACF;AAGA,kBAAK,MAAM,OAAOA,CAAG,GACrB,KAAK,MAAM,IAAIA,GAAK+P,CAAK,GAClBA,EAAM;AAAA;AAAA,EACf;AAAA,EAEA,IAAI/P,GAAaumB,GAASwe,GAAoB;AAE5C,QAAI,KAAK,MAAM,QAAQ,KAAK,SAAS;AACnC,YAAMC,IAAS,KAAK,MAAM,KAAA,EAAO,OAAO;AACxC,MAAIA,KACF,KAAK,MAAM,OAAOA,CAAM;AAAA,IAE5B;AAEA,SAAK,MAAM,IAAIhlC,GAAK;AAAA,MAClB,MAAAumB;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,MAChB,WAAW,KAAK,IAAA,KAASwe,KAAO,KAAK;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EAEA,IAAI/kC,GAAsB;AACxB,WAAO,KAAK,IAAIA,CAAG,MAAM;AAAA,EAC3B;AAAA,EAEA,WAAWA,GAAmB;AAC5B,SAAK,MAAM,OAAOA,CAAG;AAAA,EACvB;AAAA,EAEA,gBAAsB;AACpB,SAAK,MAAM,MAAA;AAAA,EACb;AAAA,EAEA,mBAAmBsjC,GAAuB;AACxC,eAAWtjC,KAAO,KAAK,MAAM,KAAA;AAC3B,MAAIsjC,EAAQ,KAAKtjC,CAAG,KAClB,KAAK,MAAM,OAAOA,CAAG;AAAA,EAG3B;AACF;AAKO,MAAMilC,GAAwB;AAAA,EAA9B,cAAA;AACL,SAAQ,8BAAc,IAAA;AAAA,EAA8B;AAAA,EAEpD,MAAM,OAAUjlC,GAAaklC,GAAuC;AAClE,UAAMld,IAAW,KAAK,QAAQ,IAAIhoB,CAAG;AACrC,QAAIgoB;AACF,aAAOA;AAGT,UAAMmd,IAAUD,IAAU,QAAQ,MAAM;AACtC,WAAK,QAAQ,OAAOllC,CAAG;AAAA,IACzB,CAAC;AAED,gBAAK,QAAQ,IAAIA,GAAKmlC,CAAO,GACtBA;AAAA,EACT;AAAA,EAEA,WAAWnlC,GAAsB;AAC/B,WAAO,KAAK,QAAQ,IAAIA,CAAG;AAAA,EAC7B;AAAA,EAEA,YAAkB;AAChB,SAAK,QAAQ,MAAA;AAAA,EACf;AACF;AAKO,SAASolC,GACd3J,GACAh6B,IAA0B,IAC6C;AACvE,QAAM4jC,IAAQ,IAAIP,GAAiCrjC,CAAM,GACnD6jC,IAAa,IAAIR,GAAiBrjC,CAAM,GACxC8jC,IAAe,IAAIN,GAAA,GAEnBO,IAAc/jC,EAAO,gBAAgB,CAACoxB,MAA0B,KAAK,UAAUA,CAAI,IACnF4S,IAAahkC,EAAO,eAAe,IACnCikC,IAAajkC,EAAO,eAAe;AAEzC,SAAO;AAAA,IACL,GAAGg6B;AAAA,IACH,OAAA4J;AAAA,IAEA,MAAM,KAAKx7B,IAA2B,IAAI;AACxC,YAAM87B,IAAW,QAAQH,EAAY37B,CAAO,CAAC;AAE7C,UAAI47B,GAAY;AACd,cAAMG,IAASP,EAAM,IAAIM,CAAQ;AACjC,YAAIC;AACF,iBAAOA;AAAA,MAEX;AAEA,aAAOL,EAAa,OAAOI,GAAU,YAAY;AAC/C,cAAM1/B,IAAS,MAAMw1B,EAAO,KAAK5xB,CAAO;AACxC,eAAI47B,KACFJ,EAAM,IAAIM,GAAU1/B,CAAM,GAErBA;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,MAAMjG,GAAc;AACxB,YAAM2lC,IAAW,SAAS,OAAO3lC,CAAG,CAAC;AAErC,UAAI0lC,GAAY;AACd,cAAME,IAASN,EAAW,IAAIK,CAAQ;AACtC,YAAIC;AACF,iBAAOA;AAAA,MAEX;AAEA,aAAOL,EAAa,OAAOI,GAAU,YAAY;AAC/C,cAAM1/B,IAAS,MAAMw1B,EAAO,MAAMz7B,CAAG;AACrC,eAAI0lC,KAAcz/B,KAChBq/B,EAAW,IAAIK,GAAU1/B,CAAM,GAE1BA;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,OAAOkX,GAAkB;AAC7B,YAAMlX,IAAS,MAAMw1B,EAAO,OAAQte,CAAI;AACxC,aAAAkoB,EAAM,cAAA,GACCp/B;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAcmpB,GAAqB;AAC9C,YAAMljB,IAAS,MAAMw1B,EAAO,OAAQz7B,GAAKmpB,CAAO;AAChD,aAAAkc,EAAM,cAAA,GACNC,EAAW,WAAW,SAAS,OAAOtlC,CAAG,CAAC,EAAE,GACrCiG;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAc;AACzB,YAAMy7B,EAAO,OAAQz7B,CAAG,GACxBqlC,EAAM,cAAA,GACNC,EAAW,WAAW,SAAS,OAAOtlC,CAAG,CAAC,EAAE;AAAA,IAC9C;AAAA,IAEA,kBAAkB;AAChB,MAAAqlC,EAAM,cAAA,GACNC,EAAW,cAAA;AAAA,IACb;AAAA,EAAA;AAEJ;AA+BO,SAASO,GACdpK,GACAh6B,GAIA;AACA,QAAM,EAAE,aAAAqkC,GAAa,UAAAC,IAAW,IAAI,WAAA1yB,IAAY,UAAU5R;AAE1D,SAAO;AAAA,IACL,MAAM,SAASoI,IAAiC,IAAI;;AAClD,YAAMk5B,IAAOl5B,EAAQ,YAAYk8B,GAC3BC,IAAgBn8B,EAAQ,aAAa,WAGrCo8B,IAAep8B,EAAQ,SACzB;AAAA,QACE,MAAM;AAAA,QACN,OAAOi8B;AAAA,QAEP,UAAWE,MAAkB,YACzB3yB,MAAc,QACZ,MACA,MACFA,MAAc,QACZ,MACA;AAAA,QACN,OAAO6yB,GAAar8B,EAAQ,MAAM;AAAA,MAAA,IAEpC,MAEE+Z,IAASqiB,IACX;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,CAAC,KAAIt8B,IAAAE,EAAQ,WAAR,gBAAAF,EAAgB,UAAS,CAAA,GAAKs8B,CAAY;AAAA,MAAA,IAExDp8B,EAAQ,QAENonB,IAA6B;AAAA,QACjC;AAAA,UACE,OAAO6U;AAAA,UACP,WAAWE,MAAkB,YAAY3yB,IAAYA,MAAc,QAAQ,SAAS;AAAA,QAAA;AAAA,QAEtF,GAAIxJ,EAAQ,QAAQ,CAAA;AAAA,MAAC,GAGjB5D,IAAS,MAAMw1B,EAAO,KAAK;AAAA,QAC/B,GAAG5xB;AAAA,QACH,QAAA+Z;AAAA,QACA,MAAAqN;AAAA,QACA,MAAM8R,IAAO;AAAA;AAAA,MAAA,CACd,GAEKoD,IAAUlgC,EAAO,KAAK,SAAS88B,GAC/Bxc,IAAO4f,IAAUlgC,EAAO,KAAK,MAAM,GAAG88B,CAAI,IAAI98B,EAAO;AAG3D,MAAI+/B,MAAkB,cACpBzf,EAAK,QAAA;AAGP,YAAM6f,IAAW7f,EAAKA,EAAK,SAAS,CAAC,GAC/B8f,IAAY9f,EAAK,CAAC;AAExB,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,YAAY4f,KAAWC,IAAWE,GAAaF,EAASN,CAAW,CAAC,IAAI;AAAA,QACxE,YAAYO,KAAax8B,EAAQ,SAASy8B,GAAaD,EAAUP,CAAW,CAAC,IAAI;AAAA,QACjF,SAAAK;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEA,OAAO,QAAQt8B,IAAiD,IAAI;AAClE,UAAI08B,IAAwB;AAE5B,SAAG;AACD,cAAMC,IAAO,MAAM/K,EAAO,KAAK;AAAA,UAC7B,GAAG5xB;AAAA,UACH,GAAI08B,IAAS,EAAE,QAAAA,MAAW,CAAA;AAAA;AAAA,QAAC,CAErB;AAER,YAAIC,EAAK,KAAK,WAAW;AACvB;AAGF,cAAMA,EAAK;AAEX,cAAMJ,IAAWI,EAAK,KAAKA,EAAK,KAAK,SAAS,CAAC;AAC/C,QAAAD,IAASH,IAAWE,GAAaF,EAASN,CAAW,CAAC,IAAI;AAAA,MAC5D,SAASS;AAAA,IACX;AAAA,EAAA;AAEJ;AAEA,SAASD,GAAatkC,GAAwB;AAC5C,SAAO,KAAK,KAAK,UAAUA,CAAK,CAAC;AACnC;AAEA,SAASkkC,GAAaK,GAAyB;AAC7C,MAAI;AACF,WAAO,KAAK,MAAM,KAAKA,CAAM,CAAC;AAAA,EAChC,QAAQ;AACN,WAAOA;AAAA,EACT;AACF;AA2BO,SAASE,GACdhL,GACAh6B,IAAmC,IACnC;AACA,QAAM,EAAE,UAAAskC,IAAW,IAAI,WAAAzxB,IAAY,KAAK,aAAAoyB,IAAc,MAAMjlC;AAE5D,MAAIyQ,IAAoC;AAAA,IACtC,OAAO,CAAA;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAMw0B;AAAA,IACN,YAAY;AAAA,EAAA;AAGd,QAAMC,wBAAgB,IAAA;AAEtB,WAASC,IAAS;AAChB,IAAAD,EAAU,QAAQ,CAAC1E,MAAOA,EAAG/vB,CAAK,CAAC;AAAA,EACrC;AAEA,WAASC,EAAS00B,GAA8C;AAC9D,IAAA30B,IAAQ,EAAE,GAAGA,GAAO,GAAG20B,EAAA,GACvBD,EAAA;AAAA,EACF;AAEA,MAAIE,IAA+B,CAAA;AAEnC,iBAAeC,IAAW;AACxB,QAAI,EAAA70B,EAAM,aAAa,CAACA,EAAM,UAI9B;AAAA,MAAAC,EAAS,EAAE,WAAW,IAAM,OAAO,MAAM;AAEzC,UAAI;AACF,cAAMlM,IAAS,MAAMw1B,EAAO,KAAK;AAAA,UAC/B,GAAGqL;AAAA,UACH,MAAM50B,EAAM,OAAO6zB;AAAA,UACnB,MAAMA;AAAA,QAAA,CACP,GAEKiB,IAAW,CAAC,GAAG90B,EAAM,OAAO,GAAGjM,EAAO,IAAI,GAC1CkgC,IAAUa,EAAS,SAAS/gC,EAAO;AAEzC,QAAAkM,EAAS;AAAA,UACP,OAAO60B;AAAA,UACP,MAAM90B,EAAM,OAAO;AAAA,UACnB,YAAYjM,EAAO;AAAA,UACnB,SAAAkgC;AAAA,UACA,WAAW;AAAA,QAAA,CACZ;AAAA,MACH,SAAStgC,GAAG;AACV,QAAAsM,EAAS;AAAA,UACP,OAAOtM,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC;AAAA,UACnD,WAAW;AAAA,QAAA,CACZ;AAAA,MACH;AAAA;AAAA,EACF;AAEA,WAASohC,EAAMp9B,IAA2B,IAAI;AAC5C,IAAAi9B,IAAcj9B,GACdqI,IAAQ;AAAA,MACN,OAAO,CAAA;AAAA,MACP,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,YAAY;AAAA,IAAA,GAEd00B,EAAA;AAAA,EACF;AAEA,WAASM,EAAaxmB,GAAc;AAClC,UAAMhD,IAASgD,EAAM;AACrB,QAAI,CAAChD;AACH;AAIF,IADqBA,EAAO,eAAeA,EAAO,YAAYA,EAAO,eAClDpJ,KACjByyB,EAAA;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,IAAI,QAAQ;AACV,aAAO70B;AAAA,IACT;AAAA,IACA,UAAA60B;AAAA,IACA,OAAAE;AAAA,IACA,cAAAC;AAAA,IACA,UAAUh+B,GAAuD;AAC/D,aAAAy9B,EAAU,IAAIz9B,CAAQ,GACf,MAAMy9B,EAAU,OAAOz9B,CAAQ;AAAA,IACxC;AAAA,IACA,WAAWW,GAA0B;AACnC,MAAAi9B,IAAcj9B;AAAA,IAChB;AAAA,EAAA;AAEJ;AA6CO,SAASs9B,GACd1lC,GAC4B;AAC5B,QAAM;AAAA,IACJ,KAAA0E;AAAA,IACA,YAAAihC;AAAA,IACA,UAAA3gB,IAAW2gB,EAAW;AAAA,IACtB,gBAAAC,IAAiB;AAAA,IACjB,eAAAC,IAAgB;AAAA,IAChB,mBAAAC,IAAoB;AAAA,EAAA,IAClB9lC;AAEJ,MAAIotB,IAAuB,MACvB2Y,IAAoB,GACpBC,IAAgC,MAChCC,IAAiB,CAAA;AAIrB,QAAMf,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAEA,WAASqiB,EAAalnB,GAAqD;AACzE,QAAIjf,EAAO;AACT,aAAOA,EAAO,aAAaif,CAAK;AAElC,QAAI;AACF,aAAO,KAAK,MAAMA,EAAM,IAAI;AAAA,IAC9B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAASmnB,EAAiBtW,GAAsC;AAC9D,WAAI9vB,EAAO,mBACFA,EAAO,iBAAiB8vB,CAAG,IAE7B,KAAK,UAAUA,CAAG;AAAA,EAC3B;AAEA,WAASuW,EAAavW,GAA8B;AAClD,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SACNmW,IAAY,CAAC,GAAGA,GAAWnW,EAAI,IAAS,GACxCoW,EAAK,SAAS;AAEhB;AAAA,MACF,KAAK;AACH,QAAIpW,EAAI,OAAOA,EAAI,YACjBmW,IAAYA,EAAU;AAAA,UAAI,CAACvqB,MACxBA,EAAiCsJ,CAAQ,MAAM8K,EAAI,MAChD,EAAE,GAAGpU,GAAM,GAAGoU,EAAI,YAClBpU;AAAA,QAAA,GAENwqB,EAAK,SAAS;AAEhB;AAAA,MACF,KAAK;AACH,QAAIpW,EAAI,QACNmW,IAAYA,EAAU;AAAA,UACpB,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAM8K,EAAI;AAAA,QAAA,GAEhEoW,EAAK,SAAS;AAEhB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAEH,QAAAlM,EAAO,OAAO,MAAM,MAAM;AAAA,QAAC,CAAC;AAC5B;AAAA,IAAA;AAAA,EAEN;AAEA,WAASsM,IAAU;AACjB,KAAIlZ,KAAA,gBAAAA,EAAI,gBAAe,UAAU,SAIjCA,IAAK,IAAI,UAAU1oB,CAAG,GAEtB0oB,EAAG,SAAS,MAAM;AAChB,MAAA2Y,IAAoB,GACpBG,EAAK,WAAW,GAChBK,EAAA;AAAA,IACF,GAEAnZ,EAAG,YAAY,CAACnO,MAAU;AACxB,YAAM6Q,IAAMqW,EAAalnB,CAAK;AAC9B,MAAI6Q,MACFuW,EAAavW,CAAG,GAChBoW,EAAK,WAAWpW,CAAG;AAAA,IAEvB,GAEA1C,EAAG,UAAU,CAACnO,MAAU;AACtB,MAAAinB,EAAK,SAAS,IAAI,MAAM,iBAAiB,CAAC;AAAA,IAC5C,GAEA9Y,EAAG,UAAU,MAAM;AACjB,MAAAoZ,EAAA,GACAN,EAAK,cAAc,GAEfH,IAAoBF,MACtBE,KACA,WAAWO,GAASV,IAAiB,KAAK,IAAIG,GAAmB,CAAC,CAAC;AAAA,IAEvE;AAAA,EACF;AAEA,WAASU,IAAa;AACpB,IAAAD,EAAA,GACIpZ,MACFA,EAAG,MAAA,GACHA,IAAK;AAAA,EAET;AAEA,WAASmZ,IAAiB;AACxB,IAAAC,EAAA,GACAR,IAAiB,OAAO,YAAY,MAAM;AACxC,OAAI5Y,KAAA,gBAAAA,EAAI,gBAAe,UAAU,QAC/BA,EAAG,KAAK,KAAK,UAAU,EAAE,MAAM,OAAA,CAAQ,CAAC;AAAA,IAE5C,GAAG0Y,CAAiB;AAAA,EACtB;AAEA,WAASU,IAAgB;AACvB,IAAIR,MACF,cAAcA,CAAc,GAC5BA,IAAiB;AAAA,EAErB;AAEA,WAASU,EAAY5W,GAA8B;AACjD,KAAI1C,KAAA,gBAAAA,EAAI,gBAAe,UAAU,QAC/BA,EAAG,KAAKgZ,EAAiBtW,CAAG,CAAC;AAAA,EAEjC;AAEA,QAAMkK,IAAqC;AAAA,IACzC,UAAAhV;AAAA,IACA,UAAU2gB,EAAW;AAAA,IAErB,MAAM,KAAKv9B,IAA2B,IAAI;AACxC,MAAA89B,EAAK,WAAW,EAAI;AACpB,UAAI;AACF,cAAM1hC,IAAS,MAAMmhC,EAAW,KAAKv9B,CAAO;AAC5C,eAAA69B,IAAYzhC,EAAO,MACnB0hC,EAAK,UAAU1hC,CAAM,GACrB0hC,EAAK,WAAW,EAAK,GACd1hC;AAAA,MACT,SAASJ,GAAG;AACV,cAAA8hC,EAAK,SAAS9hC,CAAC,GACf8hC,EAAK,WAAW,EAAK,GACf9hC;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM7F,GAAc;AAExB,YAAMooC,IAAQV,EAAU,KAAK,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAMzmB,CAAG;AAC1F,aAAIooC,KAGGhB,EAAW,MAAMpnC,CAAG;AAAA,IAC7B;AAAA,IAEA,MAAM,OAAOmd,GAAkB;AAC7B,YAAMlX,IAAS,MAAMmhC,EAAW,OAAQjqB,CAAI;AAC5C,aAAAgrB,EAAY,EAAE,MAAM,UAAU,MAAMliC,GAAQ,GACrCA;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAcmpB,GAAqB;AAC9C,YAAMljB,IAAS,MAAMmhC,EAAW,OAAQpnC,GAAKmpB,CAAO;AACpD,aAAAgf,EAAY,EAAE,MAAM,UAAU,KAAAnoC,GAAK,SAAAmpB,GAAS,GACrCljB;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAc;AACzB,YAAMonC,EAAW,OAAQpnC,CAAG,GAC5BmoC,EAAY,EAAE,MAAM,UAAU,KAAAnoC,EAAA,CAAK;AAAA,IACrC;AAAA,IAEA,GAAG0gB,GAAe9Y,GAAmB;AACnC,aAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO,GAC1B,MAAA;;AAAM,gBAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,gBAAA/W,EAAsB,OAAO/B;AAAA;AAAA,IAC5C;AAAA,IAEA,SAAAmgC;AAAA,IACA,YAAAG;AAAA,IACA,aAAa,OAAMrZ,KAAA,gBAAAA,EAAI,gBAAe,UAAU;AAAA,IAChD,aAAAsZ;AAAA,EAAA;AAGF,SAAO1M;AACT;AAmCO,SAAS4M,GACd5mC,GAC+E;AAC/E,QAAM,EAAE,YAAA6mC,GAAY,YAAAlB,EAAA,IAAe3lC,GAC7B8mC,IAAU;AAAA,IACd,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,GAAG9mC,EAAO;AAAA,EAAA,GAGNglB,IAAW2gB,EAAW;AAC5B,MAAIM,IAAiB,CAAA;AAIrB,QAAMf,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAGA,QAAMijB,IAAe,CAACjiB,MAAY;AAChC,IAAAmhB,IAAY,CAAC,GAAGA,GAAWnhB,CAAI,GAC/BohB,EAAK,SAAS;AAAA,EAChB,GAEMc,IAAe,CAACzoC,GAAcmpB,MAAwB;AAC1D,IAAAue,IAAYA,EAAU;AAAA,MAAI,CAACvqB,MACxBA,EAAiCsJ,CAAQ,MAAMzmB,IAAM,EAAE,GAAGmd,GAAM,GAAGgM,MAAYhM;AAAA,IAAA,GAElFwqB,EAAK,SAAS;AAAA,EAChB,GAEMe,IAAe,CAAC1oC,MAAiB;AACrC,IAAA0nC,IAAYA,EAAU,OAAO,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAMzmB,CAAG,GAC1F2nC,EAAK,SAAS;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,UAAAlhB;AAAA,IACA,UAAU2gB,EAAW;AAAA,IAErB,MAAM,KAAKv9B,IAA2B,IAAI;AACxC,MAAA89B,EAAK,WAAW,EAAI;AACpB,UAAI;AACF,cAAM1hC,IAAS,MAAMmhC,EAAW,KAAKv9B,CAAO;AAC5C,eAAA69B,IAAYzhC,EAAO,MACnB0hC,EAAK,UAAU1hC,CAAM,GACrB0hC,EAAK,WAAW,EAAK,GACd1hC;AAAA,MACT,SAASJ,GAAG;AACV,cAAA8hC,EAAK,SAAS9hC,CAAC,GACf8hC,EAAK,WAAW,EAAK,GACf9hC;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM7F,GAAc;AACxB,YAAMooC,IAAQV,EAAU,KAAK,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAMzmB,CAAG;AAC1F,aAAIooC,KAGGhB,EAAW,MAAMpnC,CAAG;AAAA,IAC7B;AAAA,IAEA,MAAM,OAAOmd,GAAkB;AAE7B,aADe,MAAMmrB,EAAW,OAAOC,EAAQ,QAAQprB,CAAI;AAAA,IAE7D;AAAA,IAEA,MAAM,OAAOnd,GAAcmpB,GAAqB;AAE9C,aADe,MAAMmf,EAAW,OAAOC,EAAQ,QAAQvoC,GAAKmpB,CAAO;AAAA,IAErE;AAAA,IAEA,MAAM,OAAOnpB,GAAc;AACzB,YAAMsoC,EAAW,OAAOC,EAAQ,QAAQvoC,CAAG;AAAA,IAC7C;AAAA,IAEA,GAAG0gB,GAAe9Y,GAAmB;AACnC,aAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO,GAC1B,MAAA;;AAAM,gBAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,gBAAA/W,EAAsB,OAAO/B;AAAA;AAAA,IAC5C;AAAA,IAEA,MAAM,UAAU;AACd,MAAA0gC,EAAW,GAAGC,EAAQ,UAAUC,CAAY,GAC5CF,EAAW,GAAGC,EAAQ,UAAUE,CAAY,GAC5CH,EAAW,GAAGC,EAAQ,UAAUG,CAAY,GAC5CJ,EAAW,GAAGC,EAAQ,WAAW,MAAM,KAAK,MAAM,GAClD,MAAMD,EAAW,MAAA;AAAA,IACnB;AAAA,IAEA,MAAM,aAAa;AACjB,MAAAA,EAAW,IAAIC,EAAQ,UAAUC,CAAY,GAC7CF,EAAW,IAAIC,EAAQ,UAAUE,CAAY,GAC7CH,EAAW,IAAIC,EAAQ,UAAUG,CAAY,GAC7CJ,EAAW,IAAIC,EAAQ,WAAW,MAAM;AAAA,MAAC,CAAC,GAC1C,MAAMD,EAAW,KAAA;AAAA,IACnB;AAAA,EAAA;AAEJ;AA6BO,SAASK,GACdlN,GACAh6B,IAAkC,IAIlC;AACA,QAAMglB,IAAWgV,EAAO;AACxB,MAAIiM,IAAiB,CAAA;AACrB,QAAMkB,wBAAc,IAAA;AACpB,MAAIC,IAAO;AAIX,QAAMlC,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAEA,WAASujB,IAAuB;AAC9B,WAAO,MAAM,EAAED,CAAI,IAAI,KAAK,KAAK;AAAA,EACnC;AAEA,SAAO;AAAA,IACL,UAAApiB;AAAA,IACA,UAAU;AAAA,IAEV,MAAM,KAAK5c,IAA2B,IAAI;AACxC,YAAM5D,IAAS,MAAMw1B,EAAO,KAAK5xB,CAAO;AACxC,aAAA69B,IAAYzhC,EAAO,MACZA;AAAA,IACT;AAAA,IAEA,MAAM,MAAMjG,GAAc;AACxB,aACE0nC,EAAU,KAAK,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAMzmB,CAAG,KAC5Ey7B,EAAO,MAAMz7B,CAAG;AAAA,IAEpB;AAAA,IAEA,MAAM,OAAOmd,GAAkB;;AAC7B,YAAMwI,IAAKmjB,EAAA,GACLC,IAAW,EAAE,GAAG5rB,EAAA;AAGtB,MAAAuqB,IAAY,CAAC,GAAGA,GAAWqB,CAAQ,GACnCH,EAAQ,IAAIjjB,GAAI,EAAE,IAAAA,GAAI,QAAQ,UAAU,MAAMojB,GAAU,IACxDp/B,IAAAlI,EAAO,sBAAP,QAAAkI,EAAA,KAAAlI,GAA2BsnC,GAAU,WACrCpB,EAAK,SAAS;AAEd,UAAI;AACF,cAAM1hC,IAAS,MAAMw1B,EAAO,OAAQte,CAAI;AAExC,eAAAuqB,IAAYA,EAAU,IAAI,CAAC37B,MAAOA,MAAMg9B,IAAW9iC,IAAS8F,CAAE,GAC9D68B,EAAQ,OAAOjjB,CAAE,IACjB1R,IAAAxS,EAAO,cAAP,QAAAwS,EAAA,KAAAxS,GAAmBwE,GAAQ,WAC3B0hC,EAAK,SAAS,GACP1hC;AAAA,MACT,SAASJ,GAAG;AAEV,cAAA6hC,IAAYA,EAAU,OAAO,CAAC37B,MAAMA,MAAMg9B,CAAQ,GAClDH,EAAQ,OAAOjjB,CAAE,IACjB5H,IAAAtc,EAAO,eAAP,QAAAsc,EAAA,KAAAtc,GAAoBsnC,GAAU,UAAUljC,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC,IACpF8hC,EAAK,SAAS,GACR9hC;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,OAAO7F,GAAcmpB,GAAqB;;AAC9C,YAAMxD,IAAKmjB,EAAA,GACLj8B,IAAM66B,EAAU;AAAA,QACpB,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAMzmB;AAAA,MAAA;AAG5D,UAAI6M,MAAQ;AACV,eAAO4uB,EAAO,OAAQz7B,GAAKmpB,CAAO;AAGpC,YAAM6f,IAAWtB,EAAU76B,CAAG,GACxBq2B,IAAU,EAAE,GAAG8F,GAAU,GAAG7f,EAAA;AAGlC,MAAAue,IAAYA,EAAU,IAAI,CAACvqB,GAAMpR,MAAOA,MAAMc,IAAMq2B,IAAU/lB,CAAK,GACnEyrB,EAAQ,IAAIjjB,GAAI,EAAE,IAAAA,GAAI,QAAQ,UAAU,KAAA3lB,GAAK,cAAcgpC,GAAU,IACrEr/B,IAAAlI,EAAO,sBAAP,QAAAkI,EAAA,KAAAlI,GAA2ByhC,GAAS,WACpCyE,EAAK,SAAS;AAEd,UAAI;AACF,cAAM1hC,IAAS,MAAMw1B,EAAO,OAAQz7B,GAAKmpB,CAAO;AAChD,eAAAue,IAAYA,EAAU,IAAI,CAACvqB,GAAMpR,MAAOA,MAAMc,IAAM5G,IAASkX,CAAK,GAClEyrB,EAAQ,OAAOjjB,CAAE,IACjB1R,IAAAxS,EAAO,cAAP,QAAAwS,EAAA,KAAAxS,GAAmBwE,GAAQ,WAC3B0hC,EAAK,SAAS,GACP1hC;AAAA,MACT,SAASJ,GAAG;AAEV,cAAA6hC,IAAYA,EAAU,IAAI,CAACvqB,GAAMpR,MAAOA,MAAMc,IAAMm8B,IAAW7rB,CAAK,GACpEyrB,EAAQ,OAAOjjB,CAAE,IACjB5H,IAAAtc,EAAO,eAAP,QAAAsc,EAAA,KAAAtc,GAAoBunC,GAAU,UAAUnjC,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC,IACpF8hC,EAAK,SAAS,GACR9hC;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,OAAO7F,GAAc;;AACzB,YAAM2lB,IAAKmjB,EAAA,GACL3rB,IAAOuqB,EAAU,KAAK,CAAC37B,MAAOA,EAA8B0a,CAAQ,MAAMzmB,CAAG;AAEnF,UAAI,CAACmd;AACH,eAAOse,EAAO,OAAQz7B,CAAG;AAI3B,MAAA0nC,IAAYA,EAAU,OAAO,CAAC37B,MAAMA,MAAMoR,CAAI,GAC9CyrB,EAAQ,IAAIjjB,GAAI,EAAE,IAAAA,GAAI,QAAQ,UAAU,KAAA3lB,GAAK,cAAcmd,GAAM,IACjExT,IAAAlI,EAAO,sBAAP,QAAAkI,EAAA,KAAAlI,GAA2B0b,GAAM,WACjCwqB,EAAK,SAAS;AAEd,UAAI;AACF,cAAMlM,EAAO,OAAQz7B,CAAG,GACxB4oC,EAAQ,OAAOjjB,CAAE,IACjB1R,IAAAxS,EAAO,cAAP,QAAAwS,EAAA,KAAAxS,GAAmB0b,GAAM;AAAA,MAC3B,SAAStX,GAAG;AAEV,cAAA6hC,IAAY,CAAC,GAAGA,GAAWvqB,CAAI,GAC/ByrB,EAAQ,OAAOjjB,CAAE,IACjB5H,IAAAtc,EAAO,eAAP,QAAAsc,EAAA,KAAAtc,GAAoB0b,GAAM,UAAUtX,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC,IAChF8hC,EAAK,SAAS,GACR9hC;AAAA,MACR;AAAA,IACF;AAAA,IAEA,GAAG6a,GAAe9Y,GAAmB;AACnC,aAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO,GAC1B,MAAA;;AAAM,gBAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,gBAAA/W,EAAsB,OAAO/B;AAAA;AAAA,IAC5C;AAAA,IAEA,mBAAmB,MAAMghC,EAAQ,OAAO;AAAA,IACxC,iBAAiB,MAAMA,EAAQ;AAAA,EAAA;AAEnC;AAgBO,SAASK,GACdC,GACAC,GACA1iB,GACiB;AACjB,QAAM2iB,IAAS,IAAI,IAAIF,EAAQ,IAAI,CAAC/rB,MAAS,CAACA,EAAKsJ,CAAQ,GAAGtJ,CAAI,CAAC,CAAC,GAC9DksB,IAAS,IAAI,IAAIF,EAAQ,IAAI,CAAChsB,MAAS,CAACA,EAAKsJ,CAAQ,GAAGtJ,CAAI,CAAC,CAAC,GAE9DmsB,IAAgB,CAAA,GAChBpG,IAAsC,CAAA,GACtCqG,IAAe,CAAA,GACfC,IAAiB,CAAA;AAGvB,aAAW,CAACxpC,GAAKypC,CAAO,KAAKJ,GAAQ;AACnC,UAAMK,IAAUN,EAAO,IAAIppC,CAAG;AAC9B,QAAI,CAAC0pC;AACH,MAAAJ,EAAS,KAAKG,CAAO;AAAA,aACXE,GAAUD,GAASD,CAAO;AASpC,MAAAD,EAAU,KAAKC,CAAO;AAAA,SATiB;AACvC,YAAMtgB,IAAsB,CAAA;AAC5B,iBAAW1c,KAAK,OAAO,KAAKg9B,CAAO;AACjC,QAAIC,EAAQj9B,CAAC,MAAMg9B,EAAQh9B,CAAC,MAC1B0c,EAAQ1c,CAAY,IAAIg9B,EAAQh9B,CAAC;AAGrC,MAAAy2B,EAAQ,KAAK,EAAE,KAAAljC,GAAK,SAAAmpB,GAAS,SAAAugB,GAAS,SAAAD,GAAS;AAAA,IACjD;AAAA,EAGF;AAGA,aAAW,CAACzpC,GAAK0pC,CAAO,KAAKN;AAC3B,IAAKC,EAAO,IAAIrpC,CAAG,KACjBupC,EAAQ,KAAKG,CAAO;AAIxB,SAAO,EAAE,UAAAJ,GAAU,SAAApG,GAAS,SAAAqG,GAAS,WAAAC,EAAA;AACvC;AAEA,SAASG,GAAUvlC,GAAYtB,GAAqB;AAClD,MAAIsB,MAAMtB;AACR,WAAO;AAET,MAAI,OAAOsB,KAAM,OAAOtB;AACtB,WAAO;AAKT,MAHIsB,MAAM,QAAQtB,MAAM,QAGpB,OAAOsB,KAAM;AACf,WAAOA,MAAMtB;AAGf,QAAM8mC,IAAOxlC,GACPylC,IAAO/mC,GACPgnC,IAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAKF,CAAI,GAAG,GAAG,OAAO,KAAKC,CAAI,CAAC,CAAC;AAEjE,aAAW7pC,KAAO8pC;AAChB,QAAI,CAACH,GAAUC,EAAK5pC,CAAG,GAAG6pC,EAAK7pC,CAAG,CAAC;AACjC,aAAO;AAIX,SAAO;AACT;AAoBO,SAAS+pC,GACdtO,GACAh6B,IAA4B,IAM5B;AACA,QAAM,EAAE,UAAAqR,IAAW,KAAM,WAAAk3B,IAAY,IAAO,iBAAAC,IAAkB,IAAM,cAAAC,MAAiBzoC;AAErF,MAAI0oC,IAAer3B,GACf/J,IAAuB,MACvBqhC,IAAgB,CAAA,GAChBC,IAAkC,CAAA;AAItC,QAAM1D,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAEA,iBAAe+kB,IAAO;AACpB,QAAI,EAAAL,KAAmB,SAAS;AAIhC,UAAI;AACF,cAAMhkC,IAAS,MAAMw1B,EAAO,KAAK4O,CAAc,GACzCE,IAAOtB,GAAkBmB,GAAUnkC,EAAO,MAAMw1B,EAAO,QAAQ;AAErE,SAAI8O,EAAK,SAAS,UAAUA,EAAK,QAAQ,UAAUA,EAAK,QAAQ,YAC9DH,IAAWnkC,EAAO,MAClB0hC,EAAK,SAAS,GACduC,KAAA,QAAAA,EAAeK;AAAA,MAEnB,QAAQ;AAAA,MAER;AAAA,EACF;AAEA,WAASC,IAAe;AACtB,IAAIzhC,MAGJA,IAAQ,OAAO,YAAYuhC,GAAMH,CAAY;AAAA,EAC/C;AAEA,WAASM,IAAc;AACrB,IAAI1hC,MACF,cAAcA,CAAK,GACnBA,IAAQ;AAAA,EAEZ;AAGA,EAAIkhC,KACF,SAAS,iBAAiB,oBAAoB,MAAM;AAClD,IAAI,SAAS,UAEFlhC,KACTuhC,EAAA;AAAA,EAEJ,CAAC;AAGH,QAAMI,IAKF;AAAA,IACF,GAAGjP;AAAA,IAEH,MAAM,KAAK5xB,IAA2B,IAAI;AACxC,MAAAwgC,IAAiBxgC;AACjB,YAAM5D,IAAS,MAAMw1B,EAAO,KAAK5xB,CAAO;AACxC,aAAAugC,IAAWnkC,EAAO,MACXA;AAAA,IACT;AAAA,IAEA,GAAGya,GAAe9Y,GAAmB;AACnC,MAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO;AAIjC,YAAM+iC,IAAQlP,EAAO,GAAG/a,GAAc9Y,CAAO;AAC7C,aAAO,MAAM;;AACX,SAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,OAAO/B,IAC7B+iC,EAAA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,cAAAH;AAAA,IACA,aAAAC;AAAA,IACA,WAAW,MAAM1hC,MAAU;AAAA,IAC3B,YAAYuJ,GAAY;AACtB,MAAA63B,IAAe73B,GACXvJ,MACF0hC,EAAA,GACAD,EAAA;AAAA,IAEJ;AAAA,EAAA;AAGF,SAAIR,KACFQ,EAAA,GAGKE;AACT;AAkDO,SAASE,GACdnpC,GACsB;AACtB,QAAM;AAAA,IACJ,KAAA0E;AAAA,IACA,YAAAihC;AAAA,IACA,UAAA3gB,IAAW2gB,EAAW;AAAA,IACtB,gBAAAC,IAAiB;AAAA,IACjB,eAAAC,IAAgB;AAAA,IAChB,iBAAAuD,IAAkB;AAAA,EAAA,IAChBppC;AAEJ,MAAIqpC,IAAkC,MAClCtD,IAAoB,GACpBuD,IAAuD,MACvDrD,IAAiB,CAAA;AAIrB,QAAMf,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAEA,WAASylB,EAAWtqB,GAA+C;AACjE,QAAIjf,EAAO;AACT,aAAOA,EAAO,WAAWif,CAAK;AAEhC,QAAI;AACF,aAAO,KAAK,MAAMA,EAAM,IAAI;AAAA,IAC9B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAASonB,EAAavW,GAAwB;AAC5C,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SACNmW,IAAY,CAAC,GAAGA,GAAWnW,EAAI,IAAS,GACxCoW,EAAK,SAAS;AAEhB;AAAA,MACF,KAAK;AACH,QAAIpW,EAAI,OAAOA,EAAI,YACjBmW,IAAYA,EAAU;AAAA,UAAI,CAACvqB,MACxBA,EAAiCsJ,CAAQ,MAAM8K,EAAI,MAChD,EAAE,GAAGpU,GAAM,GAAGoU,EAAI,YAClBpU;AAAA,QAAA,GAENwqB,EAAK,SAAS;AAEhB;AAAA,MACF,KAAK;AACH,QAAIpW,EAAI,QACNmW,IAAYA,EAAU;AAAA,UACpB,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAM8K,EAAI;AAAA,QAAA,GAEhEoW,EAAK,SAAS;AAEhB;AAAA,MACF,KAAK;AACH,QAAI,MAAM,QAAQpW,EAAI,IAAI,MACxBmW,IAAYnW,EAAI,MAChBoW,EAAK,SAAS;AAEhB;AAAA,MACF,KAAK;AACH,QAAAlM,EAAO,OAAO,MAAM,MAAM;AAAA,QAAC,CAAC;AAC5B;AAAA,IAAA;AAAA,EAEN;AAEA,WAASsM,IAAU;AACjB,KAAI+C,KAAA,gBAAAA,EAAa,gBAAe,YAAY,SAI5C5C,EAAA,GACA4C,IAAc,IAAI,YAAY3kC,GAAK,EAAE,iBAAA0kC,GAAiB,GAEtDC,EAAY,SAAS,MAAM;AACzB,MAAAtD,IAAoB,GACpBG,EAAK,WAAW;AAAA,IAClB,GAEAmD,EAAY,YAAY,CAACpqB,MAAU;AACjC,YAAM6Q,IAAMyZ,EAAWtqB,CAAK;AAC5B,MAAI6Q,MACFuW,EAAavW,CAAG,GAChBoW,EAAK,WAAWpW,CAAG;AAAA,IAEvB,GAEAuZ,EAAY,UAAU,MAAM;AAI1B,UAHAnD,EAAK,SAAS,IAAI,MAAM,sBAAsB,CAAC,IAG3CmD,KAAA,gBAAAA,EAAa,gBAAe,YAAY,WAC1CnD,EAAK,cAAc,GACnBmD,IAAc,MAEVtD,IAAoBF,IAAe;AACrC,QAAAE;AACA,cAAMhhB,IAAQ6gB,IAAiB,KAAK,IAAIG,GAAmB,CAAC;AAC5D,QAAAuD,IAAiB,WAAWhD,GAASvhB,CAAK;AAAA,MAC5C;AAAA,IAEJ;AAAA,EACF;AAEA,WAAS0hB,IAAa;AACpB,IAAI6C,MACF,aAAaA,CAAc,GAC3BA,IAAiB,OAEfD,MACFA,EAAY,MAAA,GACZA,IAAc;AAAA,EAElB;AAEA,QAAMrP,IAA+B;AAAA,IACnC,UAAAhV;AAAA,IACA,UAAU2gB,EAAW;AAAA,IAErB,MAAM,KAAKv9B,IAA2B,IAAI;AACxC,MAAA89B,EAAK,WAAW,EAAI;AACpB,UAAI;AACF,cAAM1hC,IAAS,MAAMmhC,EAAW,KAAKv9B,CAAO;AAC5C,eAAA69B,IAAYzhC,EAAO,MACnB0hC,EAAK,UAAU1hC,CAAM,GACrB0hC,EAAK,WAAW,EAAK,GACd1hC;AAAA,MACT,SAASJ,GAAG;AACV,cAAA8hC,EAAK,SAAS9hC,CAAC,GACf8hC,EAAK,WAAW,EAAK,GACf9hC;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM7F,GAAc;AACxB,YAAMooC,IAAQV,EAAU,KAAK,CAACvqB,MAAUA,EAAiCsJ,CAAQ,MAAMzmB,CAAG;AAC1F,aAAIooC,KAGGhB,EAAW,MAAMpnC,CAAG;AAAA,IAC7B;AAAA,IAEA,MAAM,OAAOmd,GAAkB;AAC7B,aAAOiqB,EAAW,OAAQjqB,CAAI;AAAA,IAChC;AAAA,IAEA,MAAM,OAAOnd,GAAcmpB,GAAqB;AAC9C,aAAOie,EAAW,OAAQpnC,GAAKmpB,CAAO;AAAA,IACxC;AAAA,IAEA,MAAM,OAAOnpB,GAAc;AACzB,aAAOonC,EAAW,OAAQpnC,CAAG;AAAA,IAC/B;AAAA,IAEA,GAAG0gB,GAAe9Y,GAAmB;AACnC,aAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO,GAC1B,MAAA;;AAAM,gBAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,gBAAA/W,EAAsB,OAAO/B;AAAA;AAAA,IAC5C;AAAA,IAEA,SAAAmgC;AAAA,IACA,YAAAG;AAAA,IACA,aAAa,OAAM4C,KAAA,gBAAAA,EAAa,gBAAe,YAAY;AAAA,EAAA;AAG7D,SAAOrP;AACT;ACh7CO,SAASwP,GACd1kB,GACA2kB,GACyB;AACzB,QAAMjlC,IAAkC,CAAA;AAExC,aAAW6rB,KAAQoZ,GAAO;AACxB,UAAMxkB,IAASH,EAAK,IAAI,CAACpJ,MAASA,EAAK2U,EAAK,KAAK,CAAC,EAAE,OAAO,CAAC3e,MAAMA,KAAK,IAAI,GACrEnT,IAAM8xB,EAAK,SAAS,GAAGA,EAAK,EAAE,IAAIA,EAAK,KAAK;AAElD,YAAQA,EAAK,IAAA;AAAA,MACX,KAAK;AACH,QAAA7rB,EAAOjG,CAAG,IAAI0mB,EAAO,OAAO,CAACtiB,GAAGtB,MAAM,OAAOsB,CAAC,IAAI,OAAOtB,CAAC,GAAG,CAAC;AAC9D;AAAA,MACF,KAAK;AACH,QAAAmD,EAAOjG,CAAG,IAAI0mB,EAAO,SACjBA,EAAO,OAAO,CAACtiB,GAAGtB,MAAM,OAAOsB,CAAC,IAAI,OAAOtB,CAAC,GAAG,CAAC,IAAI4jB,EAAO,SAC3D;AACJ;AAAA,MACF,KAAK;AACH,QAAAzgB,EAAOjG,CAAG,IAAI0mB,EAAO,SAAS,KAAK,IAAI,GAAGA,EAAO,IAAI,MAAM,CAAC,IAAI;AAChE;AAAA,MACF,KAAK;AACH,QAAAzgB,EAAOjG,CAAG,IAAI0mB,EAAO,SAAS,KAAK,IAAI,GAAGA,EAAO,IAAI,MAAM,CAAC,IAAI;AAChE;AAAA,MACF,KAAK;AACH,QAAAzgB,EAAOjG,CAAG,IAAI0mB,EAAO;AACrB;AAAA,MACF,KAAK;AACH,QAAAzgB,EAAOjG,CAAG,IAAI0mB,EAAO,CAAC,KAAK;AAC3B;AAAA,MACF,KAAK;AACH,QAAAzgB,EAAOjG,CAAG,IAAI0mB,EAAOA,EAAO,SAAS,CAAC,KAAK;AAC3C;AAAA,MACF,KAAK;AACH,QAAAzgB,EAAOjG,CAAG,IAAI,CAAC,GAAG,IAAI,IAAI0mB,CAAM,CAAC;AACjC;AAAA,IAAA;AAAA,EAEN;AAEA,SAAOzgB;AACT;AAiCO,SAASklC,GACd5kB,GACA1c,GACoB;AACpB,QAAM,EAAE,SAAS+oB,GAAQ,YAAAwY,IAAa,CAAA,GAAI,cAAAC,IAAe,IAAO,YAAAC,EAAA,IAAezhC;AAE/E,MAAI+oB,EAAO,WAAW;AACpB,WAAO;AAAA,MACL;AAAA,QACE,KAAK,CAAA;AAAA,QACL,OAAOrM,EAAK;AAAA,QACZ,YAAY0kB,GAAU1kB,GAAM6kB,CAAU;AAAA,QACtC,OAAOC,IAAe9kB,IAAO;AAAA,MAAA;AAAA,IAC/B;AAKJ,QAAMglB,wBAAgB,IAAA;AAEtB,aAAWpuB,KAAQoJ,GAAM;AACvB,UAAMilB,IAAqC,CAAA;AAC3C,eAAWC,KAAS7Y;AAClB,MAAA4Y,EAAUC,CAAK,IAAItuB,EAAKsuB,CAAK;AAE/B,UAAMC,IAAS,KAAK,UAAUF,CAAS;AAEvC,IAAKD,EAAU,IAAIG,CAAM,KACvBH,EAAU,IAAIG,GAAQ,EAAE,KAAKF,GAAW,OAAO,CAAA,GAAI,GAErDD,EAAU,IAAIG,CAAM,EAAG,MAAM,KAAKvuB,CAAI;AAAA,EACxC;AAGA,QAAMuF,IAA8B,CAAA;AACpC,aAAW,CAAA,EAAG4f,CAAK,KAAKiJ;AACtB,IAAA7oB,EAAQ,KAAK;AAAA,MACX,KAAK4f,EAAM;AAAA,MACX,OAAOA,EAAM,MAAM;AAAA,MACnB,YAAY2I,GAAU3I,EAAM,OAAO8I,CAAU;AAAA,MAC7C,OAAOC,IAAe/I,EAAM,QAAQ;AAAA,IAAA,CACrC;AAIH,SAAIgJ,KAAA,QAAAA,EAAY,UACd5oB,EAAQ,KAAK,CAACte,GAAGtB,MAAM;AACrB,eAAWmuB,KAAQqa,GAAY;AAC7B,YAAMK,IAAOvnC,EAAE,IAAI6sB,EAAK,KAAK,KAAK7sB,EAAE,WAAW6sB,EAAK,KAAK,GACnD2a,IAAO9oC,EAAE,IAAImuB,EAAK,KAAK,KAAKnuB,EAAE,WAAWmuB,EAAK,KAAK,GACnD4R,IACJ,OAAO8I,KAAS,YAAY,OAAOC,KAAS,WACxCD,IAAOC,IACP,OAAOD,KAAQ,EAAE,EAAE,cAAc,OAAOC,KAAQ,EAAE,CAAC;AACzD,UAAI/I,MAAQ;AACV,eAAO5R,EAAK,cAAc,SAAS,CAAC4R,IAAMA;AAAA,IAE9C;AACA,WAAO;AAAA,EACT,CAAC,GAGIngB;AACT;AAKO,SAASmpB,GACdtlB,GACAulB,GACAV,IAA8B,CAAA,GACV;AACpB,MAAIU,EAAY,WAAW;AACzB,WAAO;AAAA,MACL;AAAA,QACE,KAAK,CAAA;AAAA,QACL,OAAOvlB,EAAK;AAAA,QACZ,YAAY0kB,GAAU1kB,GAAM6kB,CAAU;AAAA,QACtC,OAAO7kB;AAAA,MAAA;AAAA,IACT;AAIJ,QAAM,CAACwlB,GAAY,GAAGC,CAAU,IAAIF,GAC9BG,IAASd,GAAQ5kB,GAAM,EAAE,SAAS,CAACwlB,CAAU,GAAG,YAAAX,GAAY,cAAc,IAAM;AAEtF,MAAIY,EAAW,SAAS;AACtB,eAAW1J,KAAS2J;AAClB,MAAA3J,EAAM,SAASuJ,GAAoBvJ,EAAM,OAAQ0J,GAAYZ,CAAU,GACvE,OAAO9I,EAAM;AAIjB,SAAO2J;AACT;AAyCO,SAASC,GAAqC3lB,GAAW9kB,GAAkC;AAChG,QAAM;AAAA,IACJ,MAAM0qC;AAAA,IACN,SAASC;AAAA,IACT,QAAQC;AAAA,IACR,mBAAAC,IAAoB;AAAA,IACpB,WAAAC,IAAY;AAAA,IACZ,cAAAC,IAAe;AAAA,IACf,YAAAC,IAAa;AAAA,EAAA,IACXhrC,GAGEirC,IAAgB,CAAC,GAAG,IAAI,IAAInmB,EAAK,IAAI,CAACpJ,MAAS,OAAOA,EAAKivB,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,KAAA,GAG5EO,IAAYxB,GAAQ5kB,GAAM,EAAE,SAAS4lB,GAAW,cAAc,IAAM,GAGpES,IAAiC,CAAA;AAEvC,aAAWtK,KAASqK,GAAW;AAC7B,UAAMxK,IAA8B;AAAA,MAClC,QAAQG,EAAM;AAAA,MACd,QAAQ,CAAA;AAAA,IAAC;AAIX,eAAWuK,KAAaH,GAAe;AACrC,YAAMI,IAAWxK,EAAM,MAAO,OAAO,CAACnlB,MAAS,OAAOA,EAAKivB,CAAW,CAAC,MAAMS,CAAS,GAChFE,IAAY9B,GAAU6B,GAAU,CAAC,EAAE,OAAOT,GAAY,IAAIC,EAAA,CAAmB,CAAC;AACpF,MAAAnK,EAAI,OAAO0K,CAAS,IAAKE,EAAU,GAAGT,CAAiB,IAAID,CAAU,EAAE,KAAgB;AAAA,IACzF;AAGA,QAAIE,GAAW;AACb,YAAMS,IAAS/B,GAAU3I,EAAM,OAAQ,CAAC,EAAE,OAAO+J,GAAY,IAAIC,EAAA,CAAmB,CAAC;AACrF,MAAAnK,EAAI,WAAW6K,EAAO,GAAGV,CAAiB,IAAID,CAAU,EAAE;AAAA,IAC5D;AAEA,IAAAO,EAAU,KAAKzK,CAAG;AAAA,EACpB;AAGA,MAAI8K;AACJ,MAAIT,GAAc;AAChB,IAAAS,IAAY,CAAA;AACZ,eAAWJ,KAAaH,GAAe;AACrC,YAAMI,IAAWvmB,EAAK,OAAO,CAACpJ,MAAS,OAAOA,EAAKivB,CAAW,CAAC,MAAMS,CAAS,GACxEE,IAAY9B,GAAU6B,GAAU,CAAC,EAAE,OAAOT,GAAY,IAAIC,EAAA,CAAmB,CAAC;AACpF,MAAAW,EAAUJ,CAAS,IAAIE,EAAU,GAAGT,CAAiB,IAAID,CAAU,EAAE;AAAA,IACvE;AAAA,EACF;AAGA,MAAIa;AACJ,SAAIT,MAEFS,IADkBjC,GAAU1kB,GAAM,CAAC,EAAE,OAAO8lB,GAAY,IAAIC,EAAA,CAAmB,CAAC,EAC9D,GAAGA,CAAiB,IAAID,CAAU,EAAE,IAGjD;AAAA,IACL,eAAAK;AAAA,IACA,MAAME;AAAA,IACN,cAAcK;AAAA,IACd,YAAYC;AAAA,EAAA;AAEhB;AAgBO,SAASC,GACd5mB,GACA0L,GACoC;AACpC,SAAO1L,EAAK,IAAI,CAACpJ,GAAMtK,MAAU;AAC/B,UAAM5M,IAAS,EAAE,GAAGkX,EAAA;AACpB,eAAWiwB,KAAOnb;AACf,MAAAhsB,EAAmCmnC,EAAI,IAAI,IAAIA,EAAI,QAAQjwB,GAAMtK,GAAO0T,CAAI;AAE/E,WAAOtgB;AAAA,EACT,CAAC;AACH;AAKO,MAAMonC,KAAiB;AAAA;AAAA,EAE5B,YACE,CAAI5B,MACJ,CAACtuB,GAAStK,GAAey6B,MACvBA,EAAI,MAAM,GAAGz6B,IAAQ,CAAC,EAAE,OAAO,CAAC+X,GAAK7e,MAAM6e,IAAM,OAAO7e,EAAE0/B,CAAK,KAAK,CAAC,GAAG,CAAC;AAAA;AAAA,EAG7E,YACE,CAAIA,MACJ,CAACtuB,GAAStK,GAAey6B,MAAa;AACpC,UAAMC,IAAQD,EAAI,MAAM,GAAGz6B,IAAQ,CAAC;AACpC,WAAO06B,EAAM,OAAO,CAAC3iB,GAAK,MAAMA,IAAM,OAAO,EAAE6gB,CAAK,KAAK,CAAC,GAAG,CAAC,IAAI8B,EAAM;AAAA,EAC1E;AAAA;AAAA,EAGF,gBACE,CAAI9B,MACJ,CAACtuB,GAAS8b,GAAWqU,MAAa;AAChC,UAAM5I,IAAQ4I,EAAI,OAAO,CAAC1iB,GAAK,MAAMA,IAAM,OAAO,EAAE6gB,CAAK,KAAK,CAAC,GAAG,CAAC;AACnE,WAAO/G,IAAS,OAAOvnB,EAAKsuB,CAAK,KAAK,CAAC,IAAI/G,IAAS,MAAM;AAAA,EAC5D;AAAA;AAAA,EAGF,MACE,CAAI+G,GAAgBp4B,IAA4B,WAChD,CAAC8J,GAAS8b,GAAWqU,MACJ,CAAC,GAAGA,CAAG,EAAE,KAAK,CAAClpC,GAAGtB,MAAM;AACrC,UAAMynC,IAAO,OAAOnmC,EAAEqnC,CAAK,KAAK,CAAC,IAAI,OAAO3oC,EAAE2oC,CAAK,KAAK,CAAC;AACzD,WAAOp4B,MAAc,SAAS,CAACk3B,IAAOA;AAAA,EACxC,CAAC,EACa,UAAU,CAAC,MAAM,MAAMptB,CAAI,IAAI;AAAA;AAAA,EAIjD,kBACE,CAAIsuB,MACJ,CAACtuB,GAAStK,GAAey6B,MACnBz6B,MAAU,IACL,OAEF,OAAOsK,EAAKsuB,CAAK,KAAK,CAAC,IAAI,OAAO6B,EAAIz6B,IAAQ,CAAC,EAAE44B,CAAK,KAAK,CAAC;AAAA;AAAA,EAIvE,eACE,CAAIA,MACJ,CAACtuB,GAAStK,GAAey6B,MAAa;AACpC,QAAIz6B,MAAU;AACZ,aAAO;AAET,UAAMlI,IAAO,OAAO2iC,EAAIz6B,IAAQ,CAAC,EAAE44B,CAAK,KAAK,CAAC;AAC9C,WAAI9gC,MAAS,IACJ,QAEA,OAAOwS,EAAKsuB,CAAK,KAAK,CAAC,IAAI9gC,KAAQA,IAAQ;AAAA,EACtD;AAAA;AAAA,EAGF,eACE,CAAI8gC,GAAgB+B,MACpB,CAACrwB,GAAStK,GAAey6B,MAAa;AACpC,UAAM/sB,IAAQ,KAAK,IAAI,GAAG1N,IAAQ26B,IAAS,CAAC,GACtCD,IAAQD,EAAI,MAAM/sB,GAAO1N,IAAQ,CAAC;AACxC,WAAO06B,EAAM,OAAO,CAAC3iB,GAAK7e,MAAM6e,IAAM,OAAO7e,EAAE0/B,CAAK,KAAK,CAAC,GAAG,CAAC,IAAI8B,EAAM;AAAA,EAC1E;AAAA;AAAA,EAGF,aACE,CAAOE,GAAiCC,GAAcC,MACtD,CAACxwB,MACCswB,EAAUtwB,CAAI,IAAIuwB,IAAYC;AAAA;AAAA,EAGlC,QACE,IAAO/a,MACP,CAACzV,MACCyV,EAAO,IAAI,CAAC6P,MAAMtlB,EAAKslB,CAAC,KAAK,EAAE,EAAE,KAAK,GAAG;AAAA;AAAA,EAG7C,YACE,CAAIgJ,GAAgBmC,IAAsC,aAC1D,CAACzwB,MAAY;AACX,UAAM0wB,IAAY1wB,EAAKsuB,CAAK;AAC5B,WAAKoC,IAGQ,IAAI,KAAKA,CAA4B,EACtC,mBAAmB,QAAW;AAAA,MACxC,WAAWD;AAAA,IAAA,CACZ,IALQ;AAAA,EAMX;AACJ;AAsDO,SAASE,GAAgBvnB,GAAWzE,GAA8C;AACvF,QAAMisB,IAA4B,CAAA,GAC5BC,wBAAc,IAAA,GACdC,wBAAc,IAAA;AAEpB,WAASliC,IAAI,GAAGA,IAAIwa,EAAK,QAAQxa,KAAK;AACpC,UAAMoR,IAAOoJ,EAAKxa,CAAC;AAEnB,eAAWmiC,KAAQpsB;AACjB,UAAI,CAACosB,EAAK,SAAS/wB,GAAMpR,GAAGwa,CAAI,GAAG;AACjC,cAAMzK,IAAU,OAAOoyB,EAAK,WAAY,aAAaA,EAAK,QAAQ/wB,CAAI,IAAI+wB,EAAK,SACzE9iC,IAAyB;AAAA,UAC7B,OAAOW;AAAA,UACP,MAAMmiC,EAAK;AAAA,UACX,SAAApyB;AAAA,UACA,UAAUoyB,EAAK,YAAY;AAAA,UAC3B,QAAQA,EAAK,UAAU,CAAA;AAAA,UACvB,MAAA/wB;AAAA,QAAA;AAGF,QAAA4wB,EAAO,KAAK3iC,CAAK,GAGZ4iC,EAAQ,IAAIjiC,CAAC,KAChBiiC,EAAQ,IAAIjiC,GAAG,EAAE,GAEnBiiC,EAAQ,IAAIjiC,CAAC,EAAG,KAAKX,CAAK;AAG1B,mBAAWqgC,KAASrgC,EAAM;AACxB,UAAK6iC,EAAQ,IAAIxC,CAAK,KACpBwC,EAAQ,IAAIxC,GAAO,EAAE,GAEvBwC,EAAQ,IAAIxC,CAAK,EAAG,KAAKrgC,CAAK;AAAA,MAElC;AAAA,EAEJ;AAEA,QAAM+iC,IAAaJ,EAAO,OAAO,CAACloC,MAAMA,EAAE,aAAa,OAAO,EAAE,QAC1DuoC,IAAeL,EAAO,OAAO,CAACloC,MAAMA,EAAE,aAAa,SAAS,EAAE;AAEpE,SAAO;AAAA,IACL,SAASsoC,MAAe;AAAA,IACxB,YAAAA;AAAA,IACA,cAAAC;AAAA,IACA,QAAAL;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,EAAA;AAEJ;AAKO,MAAMI,KAAkB;AAAA,EAC7B,UAAU,CAAI5C,OAAuC;AAAA,IACnD,MAAM,YAAY,OAAOA,CAAK,CAAC;AAAA,IAC/B,UAAU,CAACtuB,MAASA,EAAKsuB,CAAK,KAAK,QAAQtuB,EAAKsuB,CAAK,MAAM;AAAA,IAC3D,SAAS,GAAG,OAAOA,CAAK,CAAC;AAAA,IACzB,QAAQ,CAAC,OAAOA,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,WAAW,CAAIA,GAAgB/9B,OAAoC;AAAA,IACjE,MAAM,aAAa,OAAO+9B,CAAK,CAAC;AAAA,IAChC,UAAU,CAACtuB,MAAS,OAAOA,EAAKsuB,CAAK,KAAK,EAAE,EAAE,UAAU/9B;AAAA,IACxD,SAAS,GAAG,OAAO+9B,CAAK,CAAC,qBAAqB/9B,CAAG;AAAA,IACjD,QAAQ,CAAC,OAAO+9B,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,WAAW,CAAIA,GAAgBh+B,OAAoC;AAAA,IACjE,MAAM,aAAa,OAAOg+B,CAAK,CAAC;AAAA,IAChC,UAAU,CAACtuB,MAAS,OAAOA,EAAKsuB,CAAK,KAAK,EAAE,EAAE,UAAUh+B;AAAA,IACxD,SAAS,GAAG,OAAOg+B,CAAK,CAAC,oBAAoBh+B,CAAG;AAAA,IAChD,QAAQ,CAAC,OAAOg+B,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,KAAK,CAAIA,GAAgB/9B,OAAoC;AAAA,IAC3D,MAAM,OAAO,OAAO+9B,CAAK,CAAC;AAAA,IAC1B,UAAU,CAACtuB,MAAS,OAAOA,EAAKsuB,CAAK,CAAC,KAAK/9B;AAAA,IAC3C,SAAS,GAAG,OAAO+9B,CAAK,CAAC,qBAAqB/9B,CAAG;AAAA,IACjD,QAAQ,CAAC,OAAO+9B,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,KAAK,CAAIA,GAAgBh+B,OAAoC;AAAA,IAC3D,MAAM,OAAO,OAAOg+B,CAAK,CAAC;AAAA,IAC1B,UAAU,CAACtuB,MAAS,OAAOA,EAAKsuB,CAAK,CAAC,KAAKh+B;AAAA,IAC3C,SAAS,GAAG,OAAOg+B,CAAK,CAAC,oBAAoBh+B,CAAG;AAAA,IAChD,QAAQ,CAAC,OAAOg+B,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,OAAO,CAAIA,OAAuC;AAAA,IAChD,MAAM,SAAS,OAAOA,CAAK,CAAC;AAAA,IAC5B,UAAU,CAACtuB,MAAS,6BAA6B,KAAK,OAAOA,EAAKsuB,CAAK,KAAK,EAAE,CAAC;AAAA,IAC/E,SAAS,GAAG,OAAOA,CAAK,CAAC;AAAA,IACzB,QAAQ,CAAC,OAAOA,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,SAAS,CAAIA,GAAgB6C,GAAexyB,OAAyC;AAAA,IACnF,MAAM,WAAW,OAAO2vB,CAAK,CAAC;AAAA,IAC9B,UAAU,CAACtuB,MAASmxB,EAAM,KAAK,OAAOnxB,EAAKsuB,CAAK,KAAK,EAAE,CAAC;AAAA,IACxD,SAAS3vB,KAAW,GAAG,OAAO2vB,CAAK,CAAC;AAAA,IACpC,QAAQ,CAAC,OAAOA,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,QAAQ,CAAIA,OAAuC;AAAA,IACjD,MAAM,UAAU,OAAOA,CAAK,CAAC;AAAA,IAC7B,UAAU,CAACtuB,GAAMtK,GAAOy6B,MAAQ;AAC9B,YAAMtrC,IAAQmb,EAAKsuB,CAAK;AACxB,aAAO6B,EAAI,UAAU,CAACvhC,MAAMA,EAAE0/B,CAAK,MAAMzpC,CAAK,MAAM6Q;AAAA,IACtD;AAAA,IACA,SAAS,GAAG,OAAO44B,CAAK,CAAC;AAAA,IACzB,QAAQ,CAAC,OAAOA,CAAK,CAAC;AAAA,EAAA;AAAA,EAGxB,QAAQ,CACNvkC,GACAqnC,GACAzyB,GACA8W,OACuB;AAAA,IACvB,MAAA1rB;AAAA,IACA,UAAAqnC;AAAA,IACA,SAAAzyB;AAAA,IACA,QAAA8W;AAAA,EAAA;AAEJ,GAea4b,KAAkB;AAAA;AAAA;AAAA;AAAA,EAI7B,MAAM,YACJzxB,GACA0wB,GACAtkB,GACc;AACd,WAAOpM,EAAM,IAAI,CAACI,MAAS;AACzB,UAAI,CAACswB,EAAUtwB,CAAI;AACjB,eAAOA;AAET,YAAMsxB,IAAc,OAAOtlB,KAAY,aAAaA,EAAQhM,CAAI,IAAIgM;AACpE,aAAO,EAAE,GAAGhM,GAAM,GAAGsxB,EAAA;AAAA,IACvB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ1xB,GACA0wB,GAC2C;AAC3C,UAAMiB,IAAiB,CAAA,GACjBnF,IAAe,CAAA;AAErB,eAAWpsB,KAAQJ;AACjB,MAAI0wB,EAAUtwB,CAAI,IAChBosB,EAAQ,KAAKpsB,CAAI,IAEjBuxB,EAAU,KAAKvxB,CAAI;AAIvB,WAAO,EAAE,WAAAuxB,GAAW,SAAAnF,EAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJxsB,GACA4xB,GACA9kC,IAAsD,CAAA,GACD;AACrD,UAAM,EAAE,UAAA+kC,IAAW,IAAO,WAAAC,IAAY,OAAOhlC,GACvC6Y,IAAe,CAAA,GACfqrB,IAA4C,CAAA;AAClD,QAAIe,IAAY;AAEhB,QAAIF;AAEF,eAAS7iC,IAAI,GAAGA,IAAIgR,EAAM,QAAQhR,KAAK8iC,GAAW;AAChD,cAAME,IAAQhyB,EAAM,MAAMhR,GAAGA,IAAI8iC,CAAS,GACpCG,IAAe,MAAM,QAAQ;AAAA,UACjCD,EAAM,IAAI,CAAC5xB,GAAMtQ,MAAQ8hC,EAAYxxB,GAAMpR,IAAIc,CAAG,CAAC;AAAA,QAAA;AAGrD,iBAASoiC,IAAI,GAAGA,IAAID,EAAa,QAAQC,KAAK;AAC5C,gBAAMhpC,IAAS+oC,EAAaC,CAAC;AAC7B,UAAIhpC,EAAO,WAAW,eACpByc,EAAQ,KAAKzc,EAAO,KAAK,GACzB6oC,OAEAf,EAAO,KAAK;AAAA,YACV,OAAOhiC,IAAIkjC;AAAA,YACX,MAAMF,EAAME,CAAC;AAAA,YACb,OAAOhpC,EAAO;AAAA,UAAA,CACf;AAAA,QAEL;AAAA,MACF;AAAA;AAGA,eAAS8F,IAAI,GAAGA,IAAIgR,EAAM,QAAQhR;AAChC,YAAI;AACF,gBAAM9F,IAAS,MAAM0oC,EAAY5xB,EAAMhR,CAAC,GAAGA,CAAC;AAC5C,UAAA2W,EAAQ,KAAKzc,CAAM,GACnB6oC;AAAA,QACF,SAASjpC,GAAG;AACV,UAAAkoC,EAAO,KAAK;AAAA,YACV,OAAOhiC;AAAA,YACP,MAAMgR,EAAMhR,CAAC;AAAA,YACb,OAAOlG,aAAa,QAAQA,IAAI,IAAI,MAAM,OAAOA,CAAC,CAAC;AAAA,UAAA,CACpD;AAAA,QACH;AAIJ,WAAO;AAAA,MACL,WAAAipC;AAAA,MACA,QAAQf,EAAO;AAAA,MACf,QAAAA;AAAA,MACA,SAAArrB;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAe3F,GAAY0J,GAAwB;AACjD,UAAMyoB,wBAAW,IAAA;AACjB,WAAOnyB,EAAM,OAAO,CAACI,MAAS;AAC5B,YAAMnd,IAAMmd,EAAKsJ,CAAQ;AACzB,aAAIyoB,EAAK,IAAIlvC,CAAG,IACP,MAETkvC,EAAK,IAAIlvC,CAAG,GACL;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MACEgoB,GACAmnB,GACA1oB,GACA5c,IAA0D,CAAA,GACrD;AACL,UAAM,EAAE,gBAAAulC,IAAiB,IAAM,QAAAC,IAAS,OAASxlC,GAC3CylC,IAAc,IAAI,IAAItnB,EAAS,IAAI,CAAC7K,MAAS,CAACA,EAAKsJ,CAAQ,GAAGtJ,CAAI,CAAC,CAAC,GACpElX,IAAc,CAAC,GAAG+hB,CAAQ;AAEhC,eAAW7K,KAAQgyB,GAAU;AAC3B,YAAMnvC,IAAMmd,EAAKsJ,CAAQ,GACnB8oB,IAAeD,EAAY,IAAItvC,CAAG;AAExC,UAAIuvC;AACF,YAAIH,GAAgB;AAClB,gBAAMviC,IAAM5G,EAAO,QAAQspC,CAAY;AACvC,UAAAtpC,EAAO4G,CAAG,IAAI,EAAE,GAAG0iC,GAAc,GAAGpyB,EAAA;AAAA,QACtC;AAAA,aACSkyB,KACTppC,EAAO,KAAKkX,CAAI;AAAA,IAEpB;AAEA,WAAOlX;AAAA,EACT;AACF;AC9rBO,SAASupC,GACd/T,GACA5xB,GACwB;AACxB,QAAM4lC,KAAW5lC,KAAA,gBAAAA,EAAS,aAAY,IAChC6lC,KAAc7lC,KAAA,gBAAAA,EAAS,oBAAmB,IAE1C,CAAC0c,GAAMopB,CAAO,IAAI9qC,EAAc,CAAA,CAAE,GAClC,CAAC69B,GAAYkN,CAAa,IAAI/qC,EAAS,CAAC,GACxC,CAACqG,GAASC,CAAU,IAAItG,EAAS,EAAK,GACtC,CAACuG,GAAOC,CAAQ,IAAIxG,EAAwB,IAAI,GAEhD,CAAC2hC,GAAMqJ,CAAO,IAAIhrC,EAAS,CAAC,GAC5B,CAACkhC,GAAU+J,CAAW,IAAIjrC,EAAS6qC,CAAW,GAC9C,CAACze,GAAM8e,CAAO,IAAIlrC,GAA+BgF,KAAA,gBAAAA,EAAS,gBAAe,EAAE,GAC3E,CAAC+Z,GAAQosB,CAAS,IAAInrC,EAAsCgF,KAAA,gBAAAA,EAAS,aAAa,GAClF,CAAComC,GAAQC,CAAS,IAAIrrC,GAASgF,KAAA,gBAAAA,EAAS,kBAAiB,EAAE,GAE3DsmC,IAAcprC,EAAO,CAAC,GACtBqrC,IAAYvmC,KAAA,gBAAAA,EAAS,aAErBwmC,IAASprC,EAAY,YAAY;AACrC,QAAI,CAACw2B;AACH;AAEF,UAAM9V,IAAK,EAAEwqB,EAAY;AACzB,IAAAhlC,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,QAAI;AACF,YAAMpF,IAAS,MAAMw1B,EAAO,KAAK;AAAA,QAC/B,OAAO+K,IAAO,KAAKT;AAAA,QACnB,MAAMA;AAAA,QACN,MAAM9U,EAAK,SAASA,IAAO;AAAA,QAC3B,QAAArN;AAAA,QACA,QAAQqsB,KAAU;AAAA,QAClB,GAAGG;AAAA,MAAA,CACJ;AACD,UAAIzqB,MAAOwqB,EAAY;AACrB;AAEF,MAAAR,EAAQ1pC,EAAO,IAAI,GACnB2pC,EAAc3pC,EAAO,UAAU;AAAA,IACjC,SAASJ,GAAG;AACV,UAAI8f,MAAOwqB,EAAY;AACrB;AAEF,MAAA9kC,EAASxF,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC;AAAA,IACrD,UAAA;AACE,MAAI8f,MAAOwqB,EAAY,WACrBhlC,EAAW,EAAK;AAAA,IAEpB;AAAA,EACF,GAAG,CAACswB,GAAQ+K,GAAMT,GAAU9U,GAAMrN,GAAQqsB,GAAQG,CAAS,CAAC;AAG5D,EAAA/qC,EAAU,MAAM;AACd,IAAIoqC,KACFY,EAAA;AAAA,EAEJ,GAAG,CAACA,GAAQZ,CAAQ,CAAC,GAGrBpqC,EAAU,MAAM;AACd,QAAKo2B;AAGL,aAAOA,EAAO,GAAG,WAAW,MAAM;AAChC,QAAA4U,EAAA;AAAA,MACF,CAAC;AAAA,EACH,GAAG,CAAC5U,GAAQ4U,CAAM,CAAC;AAEnB,QAAMC,IAAerrC,EAAY,CAACwmC,GAAep4B,MAAiC;AAChF,IAAA08B,EAAQ,CAAC,EAAE,OAAAtE,GAAO,WAAAp4B,EAAA,CAAW,CAAC,GAC9Bw8B,EAAQ,CAAC;AAAA,EACX,GAAG,CAAA,CAAE,GAECU,IAAkBtrC,EAAY,CAACw9B,MAAmC;AACtE,IAAAuN,EAAUvN,CAAC,GACXoN,EAAQ,CAAC;AAAA,EACX,GAAG,CAAA,CAAE,GAECW,IAAkBvrC,EAAY,CAAC2I,MAAc;AACjD,IAAAsiC,EAAUtiC,CAAC,GACXiiC,EAAQ,CAAC;AAAA,EACX,GAAG,CAAA,CAAE,GAECY,IAAoBxrC,EAAY,CAAC2I,MAAc;AACnD,IAAAkiC,EAAYliC,CAAC,GACbiiC,EAAQ,CAAC;AAAA,EACX,GAAG,CAAA,CAAE,GAECa,IAASzrC;AAAA,IACb,OAAOkY,MAAqB;AAC1B,UAAI,EAACse,KAAA,QAAAA,EAAQ;AACX,cAAM,IAAI,MAAM,4BAA4B;AAE9C,YAAMA,EAAO,OAAOte,CAAI;AAAA,IAE1B;AAAA,IACA,CAACse,CAAM;AAAA,EAAA,GAGHxP,IAAShnB;AAAA,IACb,OAAOjF,GAAcmpB,MAAwB;AAC3C,UAAI,EAACsS,KAAA,QAAAA,EAAQ;AACX,cAAM,IAAI,MAAM,4BAA4B;AAE9C,YAAMA,EAAO,OAAOz7B,GAAKmpB,CAAO;AAAA,IAClC;AAAA,IACA,CAACsS,CAAM;AAAA,EAAA,GAGHkV,IAAS1rC;AAAA,IACb,OAAOjF,MAAiB;AACtB,UAAI,EAACy7B,KAAA,QAAAA,EAAQ;AACX,cAAM,IAAI,MAAM,4BAA4B;AAE9C,YAAMA,EAAO,OAAOz7B,CAAG;AAAA,IACzB;AAAA,IACA,CAACy7B,CAAM;AAAA,EAAA;AAGT,SAAO;AAAA,IACL,MAAAlV;AAAA,IACA,YAAAmc;AAAA,IACA,SAAAx3B;AAAA,IACA,OAAAE;AAAA,IACA,MAAAo7B;AAAA,IACA,UAAAT;AAAA,IACA,MAAA9U;AAAA,IACA,QAAArN;AAAA,IACA,QAAAqsB;AAAA,IACA,SAAAJ;AAAA,IACA,aAAaY;AAAA,IACb,SAAAV;AAAA,IACA,cAAAO;AAAA,IACA,WAAWC;AAAA,IACX,WAAWC;AAAA,IACX,QAAQH;AAAA,IACR,QAAAK;AAAA,IACA,QAAAzkB;AAAA,IACA,QAAA0kB;AAAA,EAAA;AAEJ;AA6BO,SAASC,GACdnV,GACAz7B,GACoB;AACpB,QAAM,CAACumB,GAAMopB,CAAO,IAAI9qC,EAAwB,MAAS,GACnD,CAACskB,GAAS0nB,CAAU,IAAIhsC,EAAqB,CAAA,CAAE,GAC/C,CAACqG,GAASC,CAAU,IAAItG,EAAS,EAAK,GACtC,CAACuG,GAAOC,CAAQ,IAAIxG,EAAwB,IAAI,GAChDisC,IAAS/rC,EAAO,CAAC,GAEjBsrC,IAASprC,EAAY,YAAY;AACrC,QAAI,CAACw2B,KAAUz7B,KAAO,MAAM;AAC1B,MAAA2vC,EAAQ,MAAS;AACjB;AAAA,IACF;AACA,UAAMhqB,IAAK,EAAEmrB,EAAO;AACpB,IAAA3lC,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,QAAI;AACF,YAAM0Z,IAAS,MAAM0W,EAAO,MAAMz7B,CAAG;AACrC,UAAI2lB,MAAOmrB,EAAO;AAChB;AAEF,MAAAnB,EAAQ5qB,CAAM,GACd8rB,EAAW,CAAA,CAAE;AAAA,IACf,SAAShrC,GAAG;AACV,UAAI8f,MAAOmrB,EAAO;AAChB;AAEF,MAAAzlC,EAASxF,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC;AAAA,IACrD,UAAA;AACE,MAAI8f,MAAOmrB,EAAO,WAChB3lC,EAAW,EAAK;AAAA,IAEpB;AAAA,EACF,GAAG,CAACswB,GAAQz7B,CAAG,CAAC;AAEhB,EAAAqF,EAAU,MAAM;AACd,IAAAgrC,EAAA;AAAA,EACF,GAAG,CAACA,CAAM,CAAC,GAGXhrC,EAAU,MAAM;AACd,QAAKo2B;AAGL,aAAOA,EAAO,GAAG,WAAW,MAAM;AAChC,QAAA4U,EAAA;AAAA,MACF,CAAC;AAAA,EACH,GAAG,CAAC5U,GAAQ4U,CAAM,CAAC;AAEnB,QAAMU,IAAWjiC;AAAA,IACf,OAAO,EAAE,GAAKyX,KAAoC,IAAK,GAAG4C,EAAA;AAAA,IAC1D,CAAC5C,GAAM4C,CAAO;AAAA,EAAA,GAGV6nB,IAAU,OAAO,KAAK7nB,CAAO,EAAE,SAAS,GAExCnE,IAAM/f,EAAY,CAACwmC,GAAezpC,MAAmB;AACzD,IAAA6uC,EAAW,CAAClmC,OAAU,EAAE,GAAGA,GAAM,CAAC8gC,CAAK,GAAGzpC,EAAA,EAAQ;AAAA,EACpD,GAAG,CAAA,CAAE,GAECivC,IAAUhsC,EAAY,CAACisC,MAAmB;AAC9C,IAAAL,EAAW,CAAClmC,OAAU,EAAE,GAAGA,GAAM,GAAGumC,IAAK;AAAA,EAC3C,GAAG,CAAA,CAAE,GAECC,IAAOlsC,EAAY,YAAY;AACnC,QAAI,EAACw2B,KAAA,QAAAA,EAAQ;AACX,YAAM,IAAI,MAAM,4BAA4B;AAE9C,IAAKuV,KAGL,MAAMvV,EAAO,OAAOz7B,GAAKmpB,CAAO;AAAA,EAElC,GAAG,CAACsS,GAAQz7B,GAAKmpB,GAAS6nB,CAAO,CAAC,GAE5B/J,IAAQhiC,EAAY,MAAM;AAC9B,IAAA4rC,EAAW,CAAA,CAAE;AAAA,EACf,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,MAAAtqB;AAAA,IACA,UAAAwqB;AAAA,IACA,SAAA7lC;AAAA,IACA,OAAAE;AAAA,IACA,SAAA+d;AAAA,IACA,SAAA6nB;AAAA,IACA,KAAAhsB;AAAA,IACA,SAAAisB;AAAA,IACA,MAAAE;AAAA,IACA,QAAQd;AAAA,IACR,OAAApJ;AAAA,EAAA;AAEJ;AAgBO,SAASmK,GACd3V,GACAz7B,GACAyrC,GACgB;AAChB,QAAM1mB,IAAS6rB,GAAcnV,GAAQz7B,CAAG,GAElCgC,IAAQ+iB,EAAO,SAAS0mB,CAAK,GAC7B4F,IAAWpsC;AAAA,IACf,CAACkO,MAAe;AACd,MAAA4R,EAAO,IAAI0mB,GAAOt4B,CAAC;AAAA,IACrB;AAAA,IACA,CAAC4R,GAAQ0mB,CAAK;AAAA,EAAA,GAGV0F,IAAOlsC,EAAY,YAAY;AACnC,QAAI,EAACw2B,KAAA,QAAAA,EAAQ;AACX,YAAM,IAAI,MAAM,4BAA4B;AAE9C,UAAM6V,IAAe,EAAE,CAAC7F,CAAK,GAAG1mB,EAAO,SAAS0mB,CAAK,EAAA;AACrD,UAAMhQ,EAAO,OAAOz7B,GAAKsxC,CAAY;AAAA,EACvC,GAAG,CAAC7V,GAAQz7B,GAAKyrC,GAAO1mB,EAAO,QAAQ,CAAC;AAExC,SAAO;AAAA,IACL,OAAA/iB;AAAA,IACA,UAAAqvC;AAAA,IACA,SAAStsB,EAAO;AAAA,IAChB,OAAOA,EAAO;AAAA,IACd,SAAS0mB,KAAS1mB,EAAO;AAAA,IACzB,MAAAosB;AAAA,EAAA;AAEJ;AAyBO,SAASI,GACd9V,GACA4Q,GACAmF,GACA3e,GACuB;AACvB,QAAM4c,KAAW5c,KAAA,gBAAAA,EAAM,aAAY,IAC7BkQ,KAAOlQ,KAAA,gBAAAA,EAAM,SAAQ,KAErB,CAAC4e,GAASC,CAAU,IAAI7sC,EAAc,CAAA,CAAE,GACxC,CAACqG,GAASC,CAAU,IAAItG,EAAS,EAAK,GACtC,CAACuG,GAAOC,CAAQ,IAAIxG,EAAwB,IAAI,GAChDisC,IAAS/rC,EAAO,CAAC,GAEjBsrC,IAASprC;AAAA,IACb,OAAO0sC,MAAyB;AAC9B,UAAI,CAAClW;AACH;AAEF,YAAM9V,IAAK,EAAEmrB,EAAO;AACpB,MAAA3lC,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,UAAI;AACF,cAAMpF,IAAS,MAAMw1B,EAAO,KAAK;AAAA,UAC/B,MAAAsH;AAAA,UACA,QAAQ4O,KAAe;AAAA,UACvB,cAAc9e,KAAA,gBAAAA,EAAM;AAAA,QAAA,CACrB;AACD,YAAIlN,MAAOmrB,EAAO;AAChB;AAEF,QAAAY,EAAWzrC,EAAO,IAAI;AAAA,MACxB,SAASJ,GAAG;AACV,YAAI8f,MAAOmrB,EAAO;AAChB;AAEF,QAAAzlC,EAASxF,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC;AAAA,MACrD,UAAA;AACE,QAAI8f,MAAOmrB,EAAO,WAChB3lC,EAAW,EAAK;AAAA,MAEpB;AAAA,IACF;AAAA,IACA,CAACswB,GAAQsH,GAAMlQ,KAAA,gBAAAA,EAAM,YAAY;AAAA,EAAA;AAGnC,EAAAxtB,EAAU,MAAM;AACd,IAAIoqC,KACFY,EAAA;AAAA,EAEJ,GAAG,CAACA,GAAQZ,CAAQ,CAAC;AAErB,QAAM5lC,IAAwBiF,EAAQ,MAC7B2iC,EAAQ,IAAI,CAACt0B,MAAS;AAC3B,UAAMy0B,IAAMz0B,GACN00B,IAAkB;AAAA,MACtB,OAAO,OAAOD,EAAIvF,CAAU,KAAK,EAAE;AAAA,MACnC,OAAO,OAAOuF,EAAIJ,CAAU,KAAK,EAAE;AAAA,IAAA;AAErC,WAAI3e,KAAA,QAAAA,EAAM,aAAa+e,EAAI/e,EAAK,SAAS,KAAK,SAC5Cgf,EAAI,OAAOD,EAAI/e,EAAK,SAAS,IAE3BA,KAAA,QAAAA,EAAM,oBAAoB+e,EAAI/e,EAAK,gBAAgB,KAAK,SAC1Dgf,EAAI,cAAc,OAAOD,EAAI/e,EAAK,gBAAgB,CAAC,IAEjDA,KAAA,QAAAA,EAAM,cAAc+e,EAAI/e,EAAK,UAAU,KAAK,SAC9Cgf,EAAI,QAAQ,OAAOD,EAAI/e,EAAK,UAAU,CAAC,IAElCgf;AAAA,EACT,CAAC,GACA,CAACJ,GAASpF,GAAYmF,GAAY3e,KAAA,gBAAAA,EAAM,WAAWA,KAAA,gBAAAA,EAAM,kBAAkBA,KAAA,gBAAAA,EAAM,UAAU,CAAC,GAEzFod,IAAShrC;AAAA,IACb,CAACqK,MAAkB;AACjB,MAAA+gC,EAAO/gC,CAAK;AAAA,IACd;AAAA,IACA,CAAC+gC,CAAM;AAAA,EAAA;AAGT,SAAO,EAAE,SAAAxmC,GAAS,SAAAqB,GAAS,OAAAE,GAAO,QAAA6kC,GAAQ,QAAQ,MAAMI,IAAO;AACjE;AC5bO,SAASyB,GACdrwC,GASA;AACA,QAAM,EAAE,QAAAk1B,GAAQ,WAAAC,GAAW,UAAAnQ,IAAW,MAAM,SAAAqd,IAAU,GAAG,SAAAiO,IAAU,CAAA,EAAC,IAAMtwC;AAE1E,MAAIq1B,IAAyB;AAG7B,QAAM6P,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAEA,iBAAeysB,IAA8B;AAC3C,WAAIlb,KAIG,IAAI,QAAQ,CAACvrB,GAASC,MAAW;AACtC,YAAMqrB,IAAU,UAAU,KAAKF,GAAQmN,CAAO;AAE9C,MAAAjN,EAAQ,UAAU,MAAMrrB,EAAOqrB,EAAQ,KAAK,GAE5CA,EAAQ,YAAY,MAAM;AACxB,QAAAC,IAAKD,EAAQ,QACbtrB,EAAQurB,CAAE;AAAA,MACZ,GAEAD,EAAQ,kBAAkB,CAACnW,MAAU;AACnC,cAAMuxB,IAAYvxB,EAAM,OAA4B;AAEpD,YAAI,CAACuxB,EAAS,iBAAiB,SAASrb,CAAS,GAAG;AAClD,gBAAM/F,IAAQohB,EAAS,kBAAkBrb,GAAW,EAAE,SAASnQ,GAAU;AAGzE,qBAAW5Z,KAAOklC;AAChB,YAAAlhB,EAAM,YAAYhkB,EAAI,MAAMA,EAAI,SAAS,EAAE,QAAQA,EAAI,UAAU,GAAA,CAAO;AAAA,QAE5E;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,iBAAeqlC,EACbpqC,GACAK,GACY;AACZ,UAAM8pC,IAAW,MAAMD,EAAA;AACvB,WAAO,IAAI,QAAQ,CAACzmC,GAASC,MAAW;AAEtC,YAAMqlB,IADKohB,EAAS,YAAYrb,GAAW9uB,CAAI,EAC9B,YAAY8uB,CAAS,GAChCC,IAAU1uB,EAAS0oB,CAAK;AAE9B,MAAAgG,EAAQ,YAAY,MAAMtrB,EAAQsrB,EAAQ,MAAM,GAChDA,EAAQ,UAAU,MAAMrrB,EAAOqrB,EAAQ,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,iBAAesb,EACbrqC,GACA+B,GACA1B,GACc;AACd,UAAM8pC,IAAW,MAAMD,EAAA;AAEvB,WAAO,IAAI,QAAQ,CAACzmC,GAASC,MAAW;;AAEtC,YAAMqlB,IADKohB,EAAS,YAAYrb,GAAW9uB,CAAI,EAC9B,YAAY8uB,CAAS,GAChClU,IAAe,CAAA;AAGrB,UAAI+Y,IAAoC5K,GACpCxd,IAAgC;AAEpC,WAAI1J,IAAAE,EAAQ,SAAR,QAAAF,EAAc,QAAQ;AACxB,cAAMyoC,IAAYvoC,EAAQ,KAAK,CAAC,EAAE,OAC5BwoC,IAAUxoC,EAAQ,KAAK,CAAC,EAAE;AAGhC,QAAIgnB,EAAM,WAAW,SAASuhB,CAAS,MACrC3W,IAAS5K,EAAM,MAAMuhB,CAAS,IAEhC/+B,IAAYg/B,MAAY,SAAS,SAAS;AAAA,MAC5C;AAEA,YAAMxb,IAAU4E,EAAO,WAAW,MAAMpoB,CAAS;AACjD,UAAIi/B,IAAU,GACVC,IAAQ;AACZ,YAAMzP,IAAOj5B,EAAQ,QAAQ,GACvBk5B,IAAOl5B,EAAQ,QAAQ;AAE7B,MAAAgtB,EAAQ,YAAY,MAAM;AACxB,cAAM0P,IAAS1P,EAAQ;AAEvB,YAAI,CAAC0P,KAAUgM,KAASxP,GAAM;AAC5B,UAAAx3B,EAAQmX,CAAO;AACf;AAAA,QACF;AAEA,cAAMvF,IAAOopB,EAAO;AAGpB,YAAI18B,EAAQ,UAAU,CAACw4B,EAAcllB,GAAMtT,EAAQ,MAAM,GAAG;AAC1D,UAAA08B,EAAO,SAAA;AACP;AAAA,QACF;AAGA,YAAI18B,EAAQ,UAAU,CAAC2oC,EAAcr1B,GAAMtT,EAAQ,QAAQA,EAAQ,YAAY,GAAG;AAChF,UAAA08B,EAAO,SAAA;AACP;AAAA,QACF;AAGA,YAAI+L,IAAUxP,GAAM;AAClB,UAAAwP,KACA/L,EAAO,SAAA;AACP;AAAA,QACF;AAEA,QAAA7jB,EAAQ,KAAKvF,CAAI,GACjBo1B,KACAhM,EAAO,SAAA;AAAA,MACT,GAEA1P,EAAQ,UAAU,MAAMrrB,EAAOqrB,EAAQ,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,WAASwL,EAAcllB,GAA+ByG,GAAkC;AACtF,QAAI,CAACA,EAAO,MAAM;AAChB,aAAO;AAGT,UAAM2e,IAAO,CAACH,MAAyD;AACrE,UAAIA,EAAK,SAAS;AAChB,eAAOC,EAAcllB,GAAMilB,CAAI;AAGjC,YAAMzyB,IAAMwN,EAAKilB,EAAK,KAAK,GACrB1kB,IAAS0kB,EAAK;AAEpB,cAAQA,EAAK,UAAA;AAAA,QACX,KAAK;AACH,iBAAOzyB,KAAO+N;AAAA,QAChB,KAAK;AACH,iBAAO/N,KAAO+N;AAAA,QAChB,KAAK;AACH,iBAAQ/N,IAAkB+N;AAAA,QAC5B,KAAK;AACH,iBAAQ/N,KAAmB+N;AAAA,QAC7B,KAAK;AACH,iBAAQ/N,IAAkB+N;AAAA,QAC5B,KAAK;AACH,iBAAQ/N,KAAmB+N;AAAA,QAC7B,KAAK;AACH,iBAAO,OAAO/N,KAAO,EAAE,EACpB,YAAA,EACA,SAAS,OAAO+N,KAAU,EAAE,EAAE,YAAA,CAAa;AAAA,QAChD,KAAK;AACH,iBAAO,CAAC,OAAO/N,KAAO,EAAE,EACrB,YAAA,EACA,SAAS,OAAO+N,KAAU,EAAE,EAAE,aAAa;AAAA,QAChD,KAAK;AACH,iBAAO,OAAO/N,KAAO,EAAE,EACpB,YAAA,EACA,WAAW,OAAO+N,KAAU,EAAE,EAAE,YAAA,CAAa;AAAA,QAClD,KAAK;AACH,iBAAO,OAAO/N,KAAO,EAAE,EACpB,YAAA,EACA,SAAS,OAAO+N,KAAU,EAAE,EAAE,YAAA,CAAa;AAAA,QAChD,KAAK;AACH,iBAAO/N,KAAO,QAAQA,MAAQ;AAAA,QAChC,KAAK;AACH,iBAAOA,KAAO,QAAQA,MAAQ;AAAA,QAChC;AACE,iBAAO;AAAA,MAAA;AAAA,IAEb;AAEA,WAAIiU,EAAO,UAAU,QACZA,EAAO,MAAM,MAAM2e,CAAI,IAEzB3e,EAAO,MAAM,KAAK2e,CAAI;AAAA,EAC/B;AAEA,WAASiQ,EACPr1B,GACA8yB,GACArd,GACS;AACT,UAAM5kB,IAAIiiC,EAAO,YAAA;AAEjB,YADard,IAASA,EAAO,IAAI,CAAC6P,MAAMtlB,EAAKslB,CAAC,CAAC,IAAI,OAAO,OAAOtlB,CAAI,GACzD;AAAA,MAAK,CAAChK,MAChB,OAAOA,KAAK,EAAE,EACX,YAAA,EACA,SAASnF,CAAC;AAAA,IAAA;AAAA,EAEjB;AAEA,SAAO;AAAA,IACL,UAAAyY;AAAA,IACA,UAAU;AAAA,IAEV,MAAM,KAAK5c,IAA2B,IAAI;;AACxC,MAAA89B,EAAK,WAAW,EAAI;AACpB,UAAI;AACF,cAAMphB,IAAO,MAAM4rB,EAAgB,YAAYtoC,GAAS,MAAM;AAAA,QAAC,CAAC;AAGhE,SAAIF,IAAAE,EAAQ,SAAR,QAAAF,EAAc,UAChB4c,EAAK,KAAK,CAACniB,GAAGtB,MAAM;AAClB,qBAAW8K,KAAK/D,EAAQ,MAAO;AAC7B,kBAAM84B,IAAKv+B,EAAEwJ,EAAE,KAAK,KAAK,IACnBg1B,IAAK9/B,EAAE8K,EAAE,KAAK,KAAK,IACnBi1B,IACJ,OAAOF,KAAO,YAAY,OAAOC,KAAO,WACpCD,IAAKC,IACL,OAAOD,CAAE,EAAE,cAAc,OAAOC,CAAE,CAAC;AACzC,gBAAIC,MAAQ;AACV,qBAAOj1B,EAAE,cAAc,SAAS,CAACi1B,IAAMA;AAAA,UAE3C;AACA,iBAAO;AAAA,QACT,CAAC;AAGH,cAAM4P,IAAQ,MAAM,KAAK,MAAA,GACnBxsC,IAA4B,EAAE,MAAAsgB,GAAM,YAAYksB,EAAA;AAEtD,eAAA9K,EAAK,UAAU1hC,CAAM,GACrB0hC,EAAK,WAAW,EAAK,GACd1hC;AAAA,MACT,SAASJ,GAAG;AACV,cAAA8hC,EAAK,SAAS9hC,CAAC,GACf8hC,EAAK,WAAW,EAAK,GACf9hC;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,MAAM7F,GAAc;AACxB,aAAOkyC,EAAU,YAAY,CAACrhB,MAAUA,EAAM,IAAI7wB,CAAkB,CAAC;AAAA,IAGvE;AAAA,IAEA,MAAM,OAAOmd,GAAkB;AACd,mBAAM+0B,EAAU,aAAa,CAACrhB,MAAUA,EAAM,IAAI1T,CAAI,CAAC,GACtEwqB,EAAK,SAAS,GACPxqB;AAAA,IACT;AAAA,IAEA,MAAM,OAAOnd,GAAcmpB,GAAqB;AAC9C,YAAMnB,IAAW,MAAM,KAAK,MAAMhoB,CAAG;AACrC,UAAI,CAACgoB;AACH,cAAM,IAAI,MAAM,qBAAqBhoB,CAAG,EAAE;AAG5C,YAAMkjC,IAAU,EAAE,GAAGlb,GAAU,GAAGmB,EAAA;AAClC,mBAAM+oB,EAAU,aAAa,CAACrhB,MAAUA,EAAM,IAAIqS,CAAO,CAAC,GAC1DyE,EAAK,SAAS,GACPzE;AAAA,IACT;AAAA,IAEA,MAAM,OAAOljC,GAAc;AACzB,YAAMkyC,EAAU,aAAa,CAACrhB,MAAUA,EAAM,OAAO7wB,CAAkB,CAAC,GACxE2nC,EAAK,SAAS;AAAA,IAChB;AAAA,IAEA,GAAGjnB,GAAe9Y,GAAmB;AACnC,aAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO,GAC1B,MAAA;;AAAM,gBAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,gBAAA/W,EAAsB,OAAO/B;AAAA;AAAA,IAC5C;AAAA,IAEA,MAAM,QAAQ;AACZ,YAAMsqC,EAAU,aAAa,CAACrhB,MAAUA,EAAM,OAAO,GACrD8W,EAAK,SAAS;AAAA,IAChB;AAAA,IAEA,MAAM,QAAQ;AACZ,aAAOuK,EAAU,YAAY,CAACrhB,MAAUA,EAAM,OAAO;AAAA,IACvD;AAAA,IAEA,MAAM,SAAS;AACb,aAAOqhB,EAAU,YAAY,CAACrhB,MAAUA,EAAM,QAAQ;AAAA,IACxD;AAAA,IAEA,MAAM,WAAW9T,GAAY;AAC3B,YAAMk1B,IAAW,MAAMD,EAAA;AACvB,aAAO,IAAI,QAAQ,CAACzmC,GAASC,MAAW;AACtC,cAAMknC,IAAKT,EAAS,YAAYrb,GAAW,WAAW,GAChD/F,IAAQ6hB,EAAG,YAAY9b,CAAS;AAEtC,mBAAWzZ,KAAQJ;AACjB,UAAA8T,EAAM,IAAI1T,CAAI;AAGhB,QAAAu1B,EAAG,aAAa,MAAM;AACpB,UAAA/K,EAAK,SAAS,GACdp8B,EAAA;AAAA,QACF,GACAmnC,EAAG,UAAU,MAAMlnC,EAAOknC,EAAG,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,WAAW5I,GAAiB;AAChC,YAAMmI,IAAW,MAAMD,EAAA;AACvB,aAAO,IAAI,QAAQ,CAACzmC,GAASC,MAAW;AACtC,cAAMknC,IAAKT,EAAS,YAAYrb,GAAW,WAAW,GAChD/F,IAAQ6hB,EAAG,YAAY9b,CAAS;AAEtC,mBAAW52B,KAAO8pC;AAChB,UAAAjZ,EAAM,OAAO7wB,CAAkB;AAGjC,QAAA0yC,EAAG,aAAa,MAAM;AACpB,UAAA/K,EAAK,SAAS,GACdp8B,EAAA;AAAA,QACF,GACAmnC,EAAG,UAAU,MAAMlnC,EAAOknC,EAAG,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,aAAa;AACjB,aAAO,KAAK,OAAA;AAAA,IACd;AAAA,IAEA,MAAM,WAAW31B,GAAY;AAC3B,YAAM,KAAK,MAAA,GACX,MAAM,KAAK,WAAWA,CAAK;AAAA,IAC7B;AAAA,EAAA;AAEJ;AAkCO,SAAS41B,GACdlxC,GAMA;AACA,QAAM;AAAA,IACJ,cAAAmxC;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,YAAAC;AAAA,IACA,QAAAC;AAAA,IACA,kBAAA/a,IAAmB;AAAA,EAAA,IACjBx2B,GAEEglB,IAAWosB,EAAc,YAAYD,EAAa,UAClDK,IAAcnB,GAA6B,EAAE,GAAGe,GAAe,UAAApsB,GAAU,GAGzEysB,IAAepB,GAAgD;AAAA,IACnE,QAAQe,EAAc;AAAA,IACtB,WAAW,GAAGA,EAAc,SAAS;AAAA,IACrC,UAAU;AAAA,EAAA,CACX;AAED,MAAIM,IAAW,UAAU,QAErBC,IAAY;AAIhB,QAAMzM,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAGA,SAAO,iBAAiB,UAAU,MAAM;AACtC,IAAA4tB,IAAW,IACXxL,EAAK,QAAQ,GACb/O,EAAA;AAAA,EACF,CAAC,GAED,OAAO,iBAAiB,WAAW,MAAM;AACvC,IAAAua,IAAW,IACXxL,EAAK,SAAS;AAAA,EAChB,CAAC;AAED,iBAAe0L,EACbt5B,GACA/Z,GACAumB,GACe;AACf,UAAM+sB,IAA+B;AAAA,MACnC,IAAI,WAAW,EAAEF,CAAS,IAAI,KAAK,KAAK;AAAA,MACxC,QAAAr5B;AAAA,MACA,KAAA/Z;AAAA,MACA,MAAAumB;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,MAChB,SAAS;AAAA,IAAA;AAEX,UAAM2sB,EAAa,OAAQI,CAAM;AAAA,EACnC;AAEA,iBAAe1a,IAAsB;AACnC,QAAKua,GAIL;AAAA,MAAAxL,EAAK,WAAW,EAAI;AAEpB,UAAI;AACF,YAAI4L,IAAQ,GACVrQ,IAAU,GACVqG,IAAU;AAGZ,cAAMX,IAAU,MAAMsK,EAAa,KAAA;AAEnC,mBAAWI,KAAU1K,EAAQ;AAC3B,cAAI;AACF,oBAAQ0K,EAAO,QAAA;AAAA,cACb,KAAK;AACH,sBAAMV,EAAa,OAAQU,EAAO,IAAkB,GACpDC;AACA;AAAA,cACF,KAAK;AACH,sBAAMX,EAAa,OAAQU,EAAO,KAAKA,EAAO,IAAkB,GAChEpQ;AACA;AAAA,cACF,KAAK;AACH,sBAAM0P,EAAa,OAAQU,EAAO,GAAG,GACrC/J;AACA;AAAA,YAAA;AAEJ,kBAAM2J,EAAa,OAAQI,EAAO,EAAE;AAAA,UACtC,QAAY;AAEV,YAAIA,EAAO,UAAU,KACnB,MAAMJ,EAAa,OAAQI,EAAO,IAAI,EAAE,SAASA,EAAO,UAAU,GAAG;AAAA,UAEzE;AAIF,YAAIR,MAAiB,eAAe;AAClC,gBAAMU,IAAe,MAAMZ,EAAa,KAAA;AAExC,cAAIE,MAAiB;AACnB,kBAAMG,EAAY,WAAWO,EAAa,IAAI;AAAA,mBACrCV,MAAiB,WAAWC,GAAY;AACjD,kBAAMU,IAAc,MAAMR,EAAY,KAAA,GAChCS,IAAW,IAAI,IAAID,EAAY,KAAK,IAAI,CAACt2B,MAAS,CAACA,EAAKsJ,CAAQ,GAAGtJ,CAAI,CAAC,CAAC,GAEzE4b,IAAc,CAAA;AACpB,uBAAW4a,KAAcH,EAAa,MAAM;AAC1C,oBAAMI,IAAYF,EAAS,IAAIC,EAAWltB,CAAQ,CAAC;AACnD,cAAImtB,IACF7a,EAAO,KAAKga,EAAWa,GAAWD,CAAU,CAAC,IAE7C5a,EAAO,KAAK4a,CAAU;AAAA,YAE1B;AAEA,kBAAMV,EAAY,WAAWla,CAAM;AAAA,UACrC;AAAA,QACF;AAEA,QAAA4O,EAAK,UAAU,EAAE,OAAA4L,GAAO,SAAArQ,GAAS,SAAAqG,GAAS,GAC1CyJ,KAAA,QAAAA,EAAS,EAAE,OAAAO,GAAO,SAAArQ,GAAS,SAAAqG,EAAA;AAAA,MAC7B,SAAS1jC,GAAG;AACV,QAAA8hC,EAAK,aAAa9hC,CAAC;AAAA,MACrB,UAAA;AACE,QAAA8hC,EAAK,WAAW,EAAK;AAAA,MACvB;AAAA;AAAA,EACF;AAGA,SAAI1P,IAAmB,KACT,OAAO,YAAYW,GAAMX,CAAgB,GAGhD;AAAA,IACL,UAAAxR;AAAA,IACA,UAAU;AAAA,IAEV,MAAM,KAAK5c,IAA2B,IAAI;AAExC,UAAIspC,KAAYL,MAAiB;AAC/B,YAAI;AACF,gBAAM7sC,IAAS,MAAM2sC,EAAa,KAAK/oC,CAAO;AAE9C,uBAAMopC,EAAY,WAAWhtC,EAAO,IAAI,GACjCA;AAAA,QACT,QAAQ;AAAA,QAER;AAGF,aAAOgtC,EAAY,KAAKppC,CAAO;AAAA,IACjC;AAAA,IAEA,MAAM,MAAM7J,GAAc;AACxB,UAAImzC;AACF,YAAI;AACF,gBAAMltC,IAAS,MAAM2sC,EAAa,MAAM5yC,CAAG;AAC3C,iBAAIiG,KACF,MAAMgtC,EAAY,OAAQjzC,GAAKiG,CAAM,EAAE,MAAM,MAAMgtC,EAAY,OAAQhtC,CAAM,CAAC,GAEzEA;AAAA,QACT,QAAQ;AAAA,QAER;AAGF,aAAOgtC,EAAY,MAAMjzC,CAAG;AAAA,IAC9B;AAAA,IAEA,MAAM,OAAOmd,GAAkB;AAE7B,YAAMs2B,IAAc,MAAMR,EAAY,OAAQ91B,CAAI;AAElD,UAAIg2B;AACF,YAAI;AACF,iBAAO,MAAMP,EAAa,OAAQz1B,CAAI;AAAA,QACxC,QAAQ;AACN,gBAAMk2B,EAAiB,UAAU,QAAWl2B,CAAI;AAAA,QAClD;AAAA;AAEA,cAAMk2B,EAAiB,UAAU,QAAWl2B,CAAI;AAGlD,aAAAwqB,EAAK,SAAS,GACP8L;AAAA,IACT;AAAA,IAEA,MAAM,OAAOzzC,GAAcmpB,GAAqB;AAC9C,YAAMsqB,IAAc,MAAMR,EAAY,OAAQjzC,GAAKmpB,CAAO;AAE1D,UAAIgqB;AACF,YAAI;AACF,iBAAO,MAAMP,EAAa,OAAQ5yC,GAAKmpB,CAAO;AAAA,QAChD,QAAQ;AACN,gBAAMkqB,EAAiB,UAAUrzC,GAAKmpB,CAAO;AAAA,QAC/C;AAAA;AAEA,cAAMkqB,EAAiB,UAAUrzC,GAAKmpB,CAAO;AAG/C,aAAAwe,EAAK,SAAS,GACP8L;AAAA,IACT;AAAA,IAEA,MAAM,OAAOzzC,GAAc;AAGzB,UAFA,MAAMizC,EAAY,OAAQjzC,CAAG,GAEzBmzC;AACF,YAAI;AACF,gBAAMP,EAAa,OAAQ5yC,CAAG;AAAA,QAChC,QAAQ;AACN,gBAAMqzC,EAAiB,UAAUrzC,CAAG;AAAA,QACtC;AAAA;AAEA,cAAMqzC,EAAiB,UAAUrzC,CAAG;AAGtC,MAAA2nC,EAAK,SAAS;AAAA,IAChB;AAAA,IAEA,GAAGjnB,GAAe9Y,GAAmB;AACnC,aAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO,GAC1B,MAAA;;AAAM,gBAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,gBAAA/W,EAAsB,OAAO/B;AAAA;AAAA,IAC5C;AAAA,IAEA,MAAAgxB;AAAA,IACA,UAAU,MAAMua;AAAA,IAEhB,MAAM,oBAAoB;AAExB,cADe,MAAMD,EAAa,KAAA,GACpB;AAAA,IAChB;AAAA,IAEA,MAAM,sBAAsB;AAC1B,YAAMA,EAAa,MAAA;AAAA,IACrB;AAAA,EAAA;AAEJ;AAwBO,SAASW,GACdpyC,GAIA;AACA,QAAM,EAAE,aAAAqyC,GAAa,QAAArY,EAAA,IAAWh6B,GAC1BsyC,IAAU,IAAI,iBAAiBD,CAAW,GAI1CnN,wBAAgB,IAAA;AAEtB,WAASgB,EAAKjnB,MAAkB6E,GAAa;;AAC3C,KAAA5b,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,QAAQ,CAACs4B,MAAOA,EAAG,GAAG1c,CAAI;AAAA,EAClD;AAGA,EAAAwuB,EAAQ,YAAY,CAACrzB,MAAU;AAC7B,UAAM6Q,IAAM7Q,EAAM;AAElB,YAAQ6Q,EAAI,MAAA;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,QAAAoW,EAAK,SAAS,GACdA,EAAK,kBAAkBpW,CAAG;AAC1B;AAAA,MACF,KAAK;AACH,QAAAoW,EAAK,SAAS;AACd;AAAA,MACF,KAAK;AAEH,QAAAlM,EAAO,KAAA,EAAO,KAAK,CAACx1B,MAAW;AAC7B,UAAA8tC,EAAQ,YAAY,EAAE,MAAM,aAAa,MAAM9tC,EAAO,MAAM;AAAA,QAC9D,CAAC;AACD;AAAA,IAAA;AAAA,EAEN;AAEA,WAAS+tC,EAAUziB,GAA+B;AAChD,IAAAwiB,EAAQ,YAAYxiB,CAAG;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,GAAGkK;AAAA,IAEH,MAAM,OAAOte,GAAkB;AAC7B,YAAMlX,IAAS,MAAMw1B,EAAO,OAAQte,CAAI;AACxC,aAAA62B,EAAU,EAAE,MAAM,UAAU,MAAM/tC,GAAQ,GACnCA;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAcmpB,GAAqB;AAC9C,YAAMljB,IAAS,MAAMw1B,EAAO,OAAQz7B,GAAKmpB,CAAO;AAChD,aAAA6qB,EAAU,EAAE,MAAM,UAAU,KAAAh0C,GAAK,SAAAmpB,GAAS,GACnCljB;AAAA,IACT;AAAA,IAEA,MAAM,OAAOjG,GAAc;AACzB,YAAMy7B,EAAO,OAAQz7B,CAAG,GACxBg0C,EAAU,EAAE,MAAM,UAAU,KAAAh0C,EAAA,CAAK;AAAA,IACnC;AAAA,IAEA,GAAG0gB,GAAe9Y,GAAmB;AACnC,MAAK++B,EAAU,IAAIjmB,CAAK,KACtBimB,EAAU,IAAIjmB,GAAO,oBAAI,IAAA,CAAK,GAEhCimB,EAAU,IAAIjmB,CAAK,EAAG,IAAI9Y,CAAO;AAGjC,YAAM+iC,IAAQlP,EAAO,GAAG/a,GAAc9Y,CAAO;AAC7C,aAAO,MAAM;;AACX,SAAA+B,IAAAg9B,EAAU,IAAIjmB,CAAK,MAAnB,QAAA/W,EAAsB,OAAO/B,IAC7B+iC,EAAA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAAqJ;AAAA,IAEA,cAAc;AAEZ,MAAAA,EAAU,EAAE,MAAM,gBAAuB;AAAA,IAC3C;AAAA,EAAA;AAEJ;AA+BO,SAASC,GAAsBxyC,IAA6B,IAAI;AACrE,QAAM;AAAA,IACJ,QAAAmvB,IAAS;AAAA,IACT,SAAAsjB,IAAU,EAAE,QAAQ,IAAM,MAAM,IAAM,MAAM,IAAM,QAAQ,GAAA;AAAA,IAC1D,SAAAC,IAAU;AAAA,EAAA,IACR1yC;AAEJ,WAAS2yC,IAA6B;AACpC,WAAID,IACK,IAAI,gBAAgB,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,IAEnD,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAAA,EACnD;AAEA,WAASE,EAAU7jB,GAA+B;AAChD,QAAI2jB;AACF,aAAO,SAAS,OAAO3jB,EAAO,SAAA;AAAA,SACzB;AACL,YAAMrqB,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,MAAAA,EAAI,SAASqqB,EAAO,SAAA,GACpB,OAAO,QAAQ,aAAa,CAAA,GAAI,IAAIrqB,EAAI,UAAU;AAAA,IACpD;AAAA,EACF;AAEA,WAASnG,EAAIkH,GAAsB;AACjC,WAAO0pB,IAAS,GAAGA,CAAM,IAAI1pB,CAAI,KAAKA;AAAA,EACxC;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,OAAqB;AACnB,YAAMspB,IAAS4jB,EAAA,GACTliC,IAAsB,CAAA;AAE5B,UAAIgiC,EAAQ,QAAQ;AAClB,cAAMI,IAAY9jB,EAAO,IAAIxwB,EAAI,QAAQ,CAAC;AAC1C,YAAIs0C;AACF,cAAI;AACF,YAAApiC,EAAM,SAAS,KAAK,MAAMoiC,CAAS;AAAA,UACrC,QAAQ;AAAA,UAAC;AAAA,MAEb;AAEA,UAAIJ,EAAQ,MAAM;AAChB,cAAMK,IAAU/jB,EAAO,IAAIxwB,EAAI,MAAM,CAAC;AACtC,YAAIu0C;AACF,cAAI;AACF,YAAAriC,EAAM,OAAO,KAAK,MAAMqiC,CAAO;AAAA,UACjC,QAAQ;AAAA,UAAC;AAAA,MAEb;AAEA,UAAIL,EAAQ,MAAM;AAChB,cAAMpR,IAAOtS,EAAO,IAAIxwB,EAAI,MAAM,CAAC,GAC7B+iC,IAAOvS,EAAO,IAAIxwB,EAAI,MAAM,CAAC;AACnC,QAAI8iC,MACF5wB,EAAM,OAAO,SAAS4wB,GAAM,EAAE,IAE5BC,MACF7wB,EAAM,OAAO,SAAS6wB,GAAM,EAAE;AAAA,MAElC;AAEA,UAAImR,EAAQ,QAAQ;AAClB,cAAMjE,IAASzf,EAAO,IAAIxwB,EAAI,QAAQ,CAAC;AACvC,QAAIiwC,MACF/9B,EAAM,SAAS+9B;AAAA,MAEnB;AAEA,aAAO/9B;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,MAAMA,GAA2B;AAC/B,YAAMse,IAAS4jB,EAAA;AAEf,MAAIF,EAAQ,WACNhiC,EAAM,UAAUA,EAAM,OAAO,MAAM,SAAS,IAC9Cse,EAAO,IAAIxwB,EAAI,QAAQ,GAAG,KAAK,UAAUkS,EAAM,MAAM,CAAC,IAEtDse,EAAO,OAAOxwB,EAAI,QAAQ,CAAC,IAI3Bk0C,EAAQ,SACNhiC,EAAM,QAAQA,EAAM,KAAK,SAAS,IACpCse,EAAO,IAAIxwB,EAAI,MAAM,GAAG,KAAK,UAAUkS,EAAM,IAAI,CAAC,IAElDse,EAAO,OAAOxwB,EAAI,MAAM,CAAC,IAIzBk0C,EAAQ,SACNhiC,EAAM,OACRse,EAAO,IAAIxwB,EAAI,MAAM,GAAG,OAAOkS,EAAM,IAAI,CAAC,IAE1Cse,EAAO,OAAOxwB,EAAI,MAAM,CAAC,GAEvBkS,EAAM,OACRse,EAAO,IAAIxwB,EAAI,MAAM,GAAG,OAAOkS,EAAM,IAAI,CAAC,IAE1Cse,EAAO,OAAOxwB,EAAI,MAAM,CAAC,IAIzBk0C,EAAQ,WACNhiC,EAAM,SACRse,EAAO,IAAIxwB,EAAI,QAAQ,GAAGkS,EAAM,MAAM,IAEtCse,EAAO,OAAOxwB,EAAI,QAAQ,CAAC,IAI/Bq0C,EAAU7jB,CAAM;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA,IAKA,QAAc;AACZ,YAAMA,IAAS4jB,EAAA;AACf,MAAA5jB,EAAO,OAAOxwB,EAAI,QAAQ,CAAC,GAC3BwwB,EAAO,OAAOxwB,EAAI,MAAM,CAAC,GACzBwwB,EAAO,OAAOxwB,EAAI,MAAM,CAAC,GACzBwwB,EAAO,OAAOxwB,EAAI,MAAM,CAAC,GACzBwwB,EAAO,OAAOxwB,EAAI,QAAQ,CAAC,GAC3Bq0C,EAAU7jB,CAAM;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA,IAKA,gBAAiC;AAC/B,YAAMte,IAAQ,KAAK,KAAA;AACnB,aAAO;AAAA,QACL,QAAQA,EAAM;AAAA,QACd,MAAMA,EAAM;AAAA,QACZ,MAAMA,EAAM;AAAA,QACZ,MAAMA,EAAM;AAAA,QACZ,QAAQA,EAAM;AAAA,MAAA;AAAA,IAElB;AAAA,EAAA;AAEJ;AAgBO,MAAMsiC,KAAc;AAAA;AAAA;AAAA;AAAA,EAIzB,MAAM,aACJ/Y,GACAgZ,GACiB;AACjB,UAAMxuC,IAAS,MAAMw1B,EAAO,KAAA,GACtBiZ,IAA8B;AAAA,MAClC,SAAS;AAAA,MACT,WAAW,KAAK,IAAA;AAAA,MAChB,MAAMzuC,EAAO;AAAA,MACb,UAAAwuC;AAAA,IAAA;AAEF,WAAO,KAAK,UAAUC,GAAU,MAAM,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJjZ,GACA9B,GACA9vB,IAAkE,CAAA,GAClB;AAEhD,UAAMkT,IAD8B,KAAK,MAAM4c,CAAI,EAC5B;AAEvB,QAAIC,IAAW,GACX0Y,IAAU;AAEd,IAAIzoC,EAAQ,WAAW,WAAW4xB,KAEhC,MAAOA,EAAe,MAAA;AAGxB,eAAWte,KAAQJ,GAAO;AACxB,UAAIlT,EAAQ,YAAY,CAACA,EAAQ,SAASsT,CAAI,GAAG;AAC/C,QAAAm1B;AACA;AAAA,MACF;AAEA,UAAI;AACF,cAAM7W,EAAO,OAAQte,CAAI,GACzByc;AAAA,MACF,QAAQ;AACN,QAAA0Y;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,UAAA1Y,GAAU,SAAA0Y,EAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ7W,GACAkZ,IAAmB,eACJ;AACf,UAAMhb,IAAO,MAAM,KAAK,aAAa8B,CAAM,GACrCpB,IAAO,IAAI,KAAK,CAACV,CAAI,GAAG,EAAE,MAAM,oBAAoB,GACpDxzB,IAAM,IAAI,gBAAgBk0B,CAAI,GAE9Bj2B,IAAI,SAAS,cAAc,GAAG;AACpC,IAAAA,EAAE,OAAO+B,GACT/B,EAAE,WAAWuwC,GACbvwC,EAAE,MAAA,GAEF,IAAI,gBAAgB+B,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJs1B,GACAlB,GACA1wB,GACgD;AAChD,UAAM8vB,IAAO,MAAMY,EAAK,KAAA;AACxB,WAAO,KAAK,eAAekB,GAAQ9B,GAAM9vB,CAAO;AAAA,EAClD;AACF;AAaO,SAAS+qC,GAA2B7qC,IAAqB,mBAAmB;AACjF,MAAIs7B,IAAoC;AAExC,WAASwP,IAA4B;AACnC,QAAIxP;AACF,aAAOA;AAGT,QAAI;AACF,YAAMj7B,IAAS,aAAa,QAAQL,CAAU;AAC9C,MAAAs7B,IAAQj7B,IAAS,KAAK,MAAMA,CAAM,IAAI,CAAA;AAAA,IACxC,QAAQ;AACN,MAAAi7B,IAAQ,CAAA;AAAA,IACV;AAEA,WAAOA;AAAA,EACT;AAEA,WAAS8L,EAAK1Z,GAAkC;AAC9C,IAAA4N,IAAQ5N,GACR,aAAa,QAAQ1tB,GAAY,KAAK,UAAU0tB,CAAK,CAAC;AAAA,EACxD;AAEA,SAAO;AAAA,IACL,IAAOz3B,GAAa80C,GAAiC;AAEnD,aADcD,EAAA,EACA70C,CAAG,KAAW80C;AAAA,IAC9B;AAAA,IAEA,IAAO90C,GAAagC,GAAgB;AAClC,YAAMy1B,IAAQod,EAAA;AACd,MAAApd,EAAMz3B,CAAG,IAAIgC,GACbmvC,EAAK1Z,CAAK;AAAA,IACZ;AAAA,IAEA,OAAOz3B,GAAmB;AACxB,YAAMy3B,IAAQod,EAAA;AACd,aAAOpd,EAAMz3B,CAAG,GAChBmxC,EAAK1Z,CAAK;AAAA,IACZ;AAAA,IAEA,SAA8B;AAC5B,aAAO,EAAE,GAAGod,IAAK;AAAA,IACnB;AAAA,IAEA,OAAOpd,GAAkC;AACvC,MAAA0Z,EAAK1Z,CAAK;AAAA,IACZ;AAAA,IAEA,QAAc;AACZ,MAAA4N,IAAQ,CAAA,GACR,aAAa,WAAWt7B,CAAU;AAAA,IACpC;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM0tB,GAA2C;AAC/C,MAAA0Z,EAAK,EAAE,GAAG0D,KAAQ,GAAGpd,GAAO;AAAA,IAC9B;AAAA,EAAA;AAEJ;AC75BA,MAAMsd,KAAuC;AAAA;AAAA,EAE3C,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA;AAAA,EAEvB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA;AAAA,EAEtB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA;AAAA,EAEjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA;AAAA,EAEnB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA;AAAA,EAEhB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA;AAAA,EAEnB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,iCAAiC;AAAA,EACjC,6BAA6B;AAAA,EAC7B,yBAAyB;AAAA,EACzB,gCAAgC;AAAA,EAChC,6BAA6B;AAAA,EAC7B,4BAA4B;AAAA,EAC5B,mCAAmC;AAAA;AAAA,EAEnC,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,oBAAoB;AACtB;AAIA,SAASC,GAAexjB,GAA8B3qB,GAAuB;AAC3E,SAAOA,EAAK,MAAM,GAAG,EAAE,OAAgB,CAACsmB,GAAKntB,MAAQ;AACnD,QAAImtB,KAAO,OAAOA,KAAQ;AACxB,aAAQA,EAAgCntB,CAAG;AAAA,EAG/C,GAAGwxB,CAAG;AACR;AAGO,SAASyjB,GAAejyC,GAA0C;AACvE,QAAMwhC,IAA+B,CAAA;AACrC,aAAW,CAAC39B,GAAMquC,CAAM,KAAK,OAAO,QAAQH,EAAY,GAAG;AACzD,UAAMplC,IAAMqlC,GAAehyC,GAA6C6D,CAAI;AAC5E,IAAI8I,MAAQ,WACV60B,EAAK0Q,CAAM,IAAI,OAAOvlC,CAAG;AAAA,EAE7B;AACA,SAAO60B;AACT;AAGO,SAAS2Q,GAAWnyC,GAAkBb,GAA6B;AACxE,QAAMub,IAASvb,KAAW,SAAS,iBAC7BqiC,IAAOyQ,GAAejyC,CAAK;AACjC,aAAW,CAACmvB,GAAMnwB,CAAK,KAAK,OAAO,QAAQwiC,CAAI;AAC7C,IAAA9mB,EAAO,MAAM,YAAYyU,GAAMnwB,CAAK;AAGtC,EAAAozC,GAAqBpyC,EAAM,iBAAiB0a,CAAM,GAE9C1a,EAAM,aACR0a,EAAO,QAAQ,iBAAiB1a,EAAM;AAE1C;AAIA,MAAMqyC,KAAuC;AAAA,EAC3C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,eAAe;AAAA,EACf,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AACT;AAGA,SAASD,GAAqBE,GAA0C53B,GAA2B;AAUjG,MARAA,EAAO,MAAM,eAAe,gBAAgB,GAC5CA,EAAO,MAAM,eAAe,qBAAqB,GACjDA,EAAO,MAAM,eAAe,yBAAyB,GACrDA,EAAO,MAAM,eAAe,2BAA2B,GACvDA,EAAO,MAAM,eAAe,uBAAuB,GACnDA,EAAO,MAAM,eAAe,wBAAwB,GACpDA,EAAO,MAAM,eAAe,sBAAsB,GAE9C,GAAC43B,KAAMA,EAAG,SAAS,SAIvB;AAAA,QAAIA,EAAG,SAAS,cAAcA,EAAG;AAC/B,MAAA53B,EAAO,MAAM,YAAY,kBAAkB43B,EAAG,QAAQ;AAAA,aAC7CA,EAAG,SAAS,WAAWA,EAAG;AACnC,MAAA53B,EAAO,MAAM,YAAY,kBAAkB,QAAQ43B,EAAG,QAAQ,IAAI,GAC9DA,EAAG,aACL53B,EAAO,MAAM,YAAY,uBAAuB43B,EAAG,SAAS,GAE1DA,EAAG,iBACL53B,EAAO,MAAM,YAAY,2BAA2B43B,EAAG,aAAa,GAElEA,EAAG,mBACL53B,EAAO,MAAM,YAAY,6BAA6B43B,EAAG,eAAe,GAEtEA,EAAG,eACL53B,EAAO,MAAM,YAAY,yBAAyB43B,EAAG,WAAW;AAAA,aAEzDA,EAAG,SAAS,aAAaA,EAAG,SAAS;AAC9C,YAAM7xB,IAAM4xB,GAAaC,EAAG,OAAO;AACnC,UAAI7xB,GAAK;AACP,cAAM8xB,IAAU,2BAA2B,mBAAmB9xB,CAAG,CAAC;AAClE,QAAA/F,EAAO,MAAM,YAAY,kBAAkB63B,CAAO,GAClD73B,EAAO,MAAM,YAAY,yBAAyB,QAAQ;AAAA,MAC5D;AAAA,IACF;AAEA,IAAI43B,EAAG,YAAY,UACjB53B,EAAO,MAAM,YAAY,0BAA0B,OAAO43B,EAAG,OAAO,CAAC,GAEnEA,EAAG,aACL53B,EAAO,MAAM,YAAY,wBAAwB43B,EAAG,SAAS;AAAA;AAEjE;AAGO,SAASE,GAAYrzC,GAA6B;AACvD,QAAMub,IAASvb,KAAW,SAAS;AACnC,aAAW+yC,KAAU,OAAO,OAAOH,EAAY;AAC7C,IAAAr3B,EAAO,MAAM,eAAew3B,CAAM;AAGpC,aAAW/iB,KAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEA,IAAAzU,EAAO,MAAM,eAAeyU,CAAI;AAElC,SAAOzU,EAAO,QAAQ,gBACtB,OAAOA,EAAO,QAAQ,OACtBA,EAAO,UAAU,OAAO,WAAW;AACrC;AAKO,SAAS+3B,GAAiBtzC,GAAkC;AACjE,QAAMub,IAASvb,KAAW,SAAS,iBAC7BuzC,IAAK,iBAAiBh4B,CAAM,GAC5B7a,IAAI,CAACsQ,MAAcuiC,EAAG,iBAAiBviC,CAAC,EAAE,KAAA,GAC1C,IAAI,CAACA,MAAc,WAAWuiC,EAAG,iBAAiBviC,CAAC,CAAC,KAAK,GACzD0+B,IAAM,CAAC1+B,MACDtQ,EAAEsQ,CAAC,KACD;AAGd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,SAAStQ,EAAE,iBAAiB;AAAA,MAC5B,cAAcA,EAAE,uBAAuB;AAAA,MACvC,SAASA,EAAE,iBAAiB;AAAA,MAC5B,SAASA,EAAE,iBAAiB;AAAA,MAC5B,OAAOA,EAAE,eAAe;AAAA,MACxB,MAAMA,EAAE,cAAc;AAAA,MACtB,QAAQgvC,EAAI,gBAAgB;AAAA,MAC5B,aAAaA,EAAI,sBAAsB;AAAA,MACvC,MAAMA,EAAI,cAAc;AAAA,MACxB,WAAWA,EAAI,oBAAoB;AAAA,MACnC,OAAOA,EAAI,eAAe;AAAA,MAC1B,SAASA,EAAI,iBAAiB;AAAA,MAC9B,SAASA,EAAI,iBAAiB;AAAA,MAC9B,cAAcA,EAAI,uBAAuB;AAAA,MACzC,UAAUA,EAAI,kBAAkB;AAAA,MAChC,cAAcA,EAAI,uBAAuB;AAAA,IAAA;AAAA,IAE3C,aAAa;AAAA,MACX,SAAShvC,EAAE,cAAc;AAAA,MACzB,WAAWA,EAAE,gBAAgB;AAAA,MAC7B,UAAUA,EAAE,eAAe;AAAA,MAC3B,OAAOA,EAAE,YAAY;AAAA,MACrB,UAAUgvC,EAAI,eAAe;AAAA,MAC7B,OAAOA,EAAI,YAAY;AAAA,MACvB,QAAQA,EAAI,aAAa;AAAA,IAAA;AAAA,IAE3B,MAAM;AAAA,MACJ,SAAShvC,EAAE,gBAAgB;AAAA,MAC3B,WAAWA,EAAE,kBAAkB;AAAA,MAC/B,OAAOA,EAAE,cAAc;AAAA,MACvB,SAASgvC,EAAI,gBAAgB;AAAA,MAC7B,WAAWA,EAAI,mBAAmB;AAAA,MAClC,UAAUA,EAAI,kBAAkB;AAAA,IAAA;AAAA,IAElC,SAAS;AAAA,MACP,OAAOhvC,EAAE,gBAAgB;AAAA,MACzB,UAAUA,EAAE,kBAAkB;AAAA,MAC9B,UAAUA,EAAE,kBAAkB;AAAA,MAC9B,UAAUA,EAAE,kBAAkB;AAAA,MAC9B,UAAUA,EAAE,kBAAkB;AAAA,MAC9B,YAAYA,EAAE,oBAAoB;AAAA,MAClC,OAAOgvC,EAAI,gBAAgB;AAAA,MAC3B,YAAYA,EAAI,sBAAsB;AAAA,MACtC,SAASA,EAAI,kBAAkB;AAAA,IAAA;AAAA,IAEjC,SAAS;AAAA,MACP,IAAIhvC,EAAE,aAAa;AAAA,MACnB,IAAIA,EAAE,aAAa;AAAA,MACnB,IAAIA,EAAE,aAAa;AAAA,MACnB,IAAIA,EAAE,aAAa;AAAA,MACnB,OAAOgvC,EAAI,gBAAgB;AAAA,MAC3B,MAAMA,EAAI,eAAe;AAAA,IAAA;AAAA,IAE3B,SAAS;AAAA,MACP,QAAQhvC,EAAE,gBAAgB;AAAA,MAC1B,QAAQA,EAAE,gBAAgB;AAAA,MAC1B,QAAQA,EAAE,gBAAgB;AAAA,MAC1B,QAAQA,EAAE,gBAAgB;AAAA,MAC1B,QAAQA,EAAE,gBAAgB;AAAA,MAC1B,QAAQA,EAAE,gBAAgB;AAAA,MAC1B,QAAQA,EAAE,gBAAgB;AAAA,MAC1B,SAASgvC,EAAI,iBAAiB;AAAA,MAC9B,SAASA,EAAI,iBAAiB;AAAA,MAC9B,SAASA,EAAI,iBAAiB;AAAA,IAAA;AAAA,IAEhC,YAAY;AAAA,MACV,YAAYhvC,EAAE,oBAAoB;AAAA,MAClC,YAAYA,EAAE,qBAAqB;AAAA,MACnC,YAAYA,EAAE,qBAAqB;AAAA,MACnC,YAAYA,EAAE,qBAAqB;AAAA,MACnC,YAAYA,EAAE,qBAAqB;AAAA,MACnC,YAAYA,EAAE,qBAAqB;AAAA,MACnC,kBAAkB,EAAE,2BAA2B;AAAA,MAC/C,kBAAkB,EAAE,2BAA2B;AAAA,MAC/C,oBAAoB,EAAE,6BAA6B;AAAA,MACnD,gBAAgB,EAAE,yBAAyB;AAAA,MAC3C,YAAY,EAAE,oBAAoB;AAAA,MAClC,mBAAmBgvC,EAAI,4BAA4B;AAAA,MACnD,gBAAgBA,EAAI,yBAAyB;AAAA,MAC7C,aAAaA,EAAI,sBAAsB;AAAA,MACvC,aAAaA,EAAI,sBAAsB;AAAA,MACvC,eAAeA,EAAI,uBAAuB;AAAA,MAC1C,sBAAsBA,EAAI,+BAA+B;AAAA,IAAA;AAAA,IAE3D,aAAa;AAAA,MACX,MAAMhvC,EAAE,wBAAwB;AAAA,MAChC,QAAQA,EAAE,mBAAmB;AAAA,MAC7B,MAAMA,EAAE,wBAAwB;AAAA,IAAA;AAAA,IAElC,UAAW6a,EAAO,QAAQ,kBAAwC;AAAA,EAAA;AAEtE;AAKO,SAASi4B,GAAe3yC,GAA0B;AACvD,SAAO,KAAK,UAAUA,GAAO,MAAM,CAAC;AACtC;AAGO,SAAS4yC,GAAiBjc,GAAyB;AACxD,QAAMkc,IAAS,KAAK,MAAMlc,CAAI;AAC9B,MACE,CAACkc,KACD,OAAOA,KAAW,YAClB,CAACA,EAAO,QACR,CAACA,EAAO,UACR,CAACA,EAAO;AAER,UAAM,IAAI,MAAM,2EAA2E;AAE7F,SAAOA;AACT;AAmBO,MAAMC,KAAmBxyC,EAA4C,IAAI;AAEzE,SAASyyC,KAAsC;AACpD,QAAMpyC,IAAMH,EAAWsyC,EAAgB;AACvC,MAAI,CAACnyC;AACH,UAAM,IAAI,MAAM,sDAAsD;AAExE,SAAOA;AACT;ACliBA,MAAMqyC,KAAuB;AAAA,EAC3B,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GAEMC,KAA0B;AAAA,EAC9B,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,YAAY;AACd,GAEMC,KAA2B,EAAE,MAAM,cAAc,QAAQ,cAAc,MAAM,aAAA,GAE7EC,KAAK,CAAC7pC,OAAe;AAAA,EACzB,OAAOA;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AACd,IAEM8pC,KAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,KAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,SAASC,EACPpvC,GACAoF,GACAgpC,GACA5C,GACA6D,GACW;AACX,SAAO;AAAA,IACL,MAAArvC;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAGoF;AAAA,MACH,SAASA,EAAE,WAAWgpC,EAAG;AAAA,MACzB,cAAchpC,EAAE,gBAAgBgpC,EAAG;AAAA,IAAA;AAAA,IAErC,aAAa;AAAA,MACX,GAAGA;AAAA,MACH,UAAUA,EAAG,YAAYA,EAAG;AAAA,MAC5B,OAAOA,EAAG,SAASA,EAAG;AAAA,MACtB,QAAQA,EAAG,UAAUA,EAAG;AAAA,IAAA;AAAA,IAE1B,MAAM,EAAE,GAAG5C,GAAI,SAASA,EAAG,WAAW,UAAA;AAAA,IACtC,SAASyD,GAAGI,CAAE;AAAA,IACd,SAASH;AAAA,IACT,SAASJ;AAAA,IACT,YAAYC;AAAA,IACZ,aAAaC;AAAA,EAAA;AAEjB;AAGA,SAASM,EACPtvC,GACAoF,GACAgpC,GACA5C,GACA6D,GACW;AACX,SAAO;AAAA,IACL,MAAArvC;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAGoF;AAAA,MACH,SAASA,EAAE,WAAWgpC,EAAG;AAAA,MACzB,cAAchpC,EAAE,gBAAgBgpC,EAAG;AAAA,IAAA;AAAA,IAErC,aAAa;AAAA,MACX,GAAGA;AAAA,MACH,UAAUA,EAAG,YAAYA,EAAG;AAAA,MAC5B,OAAOA,EAAG,SAASA,EAAG;AAAA,MACtB,QAAQA,EAAG,UAAUA,EAAG;AAAA,IAAA;AAAA,IAE1B,MAAM,EAAE,GAAG5C,GAAI,SAASA,EAAG,WAAW,UAAA;AAAA,IACtC,SAASyD,GAAGI,CAAE;AAAA,IACd,SAASF;AAAA,IACT,SAASL;AAAA,IACT,YAAYC;AAAA,IACZ,aAAaC;AAAA,EAAA;AAEjB;AAMO,MAAMO,KAAaH;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaI,KAAYJ;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaK,KAAaL;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaM,KAAgBN;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaO,KAAgBP;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaQ,KAAcR;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaS,KAAgBT;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaU,KAAaV;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMaW,KAAYX;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaY,KAAeZ;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaa,KAAab;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEac,KAAcd;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEae,KAAYf;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEagB,KAAchB;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaiB,KAAYjB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEakB,KAAYlB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEamB,KAAYnB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaoB,KAAcpB;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaqB,KAAerB;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEasB,KAAWtB;AAAA,EACtB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEauB,KAAYvB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEawB,KAAaxB;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMayB,KAAgBvB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEawB,KAAgBxB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEayB,KAAezB;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa0B,KAAY1B;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa2B,KAAc3B;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa4B,KAAc5B;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa6B,KAAc7B;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa8B,KAAa9B;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa+B,KAAc/B;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEagC,KAAmBhC;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMaiC,KAAcnC;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaoC,KAAapC;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaqC,KAAcrC;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEasC,KAActC;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEauC,KAAcvC;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEawC,KAAgBxC;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEayC,KAAczC;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa0C,KAAc1C;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa2C,KAAc3C;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa4C,KAAgB5C;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMa6C,KAAkB7C;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa8C,KAAiB9C;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa+C,KAAkB/C;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEagD,KAAmBhD;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaiD,KAAsBjD;AAAA,EACjC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEakD,KAAmBlD;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEamD,KAAkBnD;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaoD,KAAmBpD;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMaqD,KAAerD;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEasD,KAAkBtD;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEauD,KAAavD;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEawD,KAAmBxD;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEayD,KAAkBzD;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa0D,KAAkB1D;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa2D,KAAiB3D;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa4D,KAAkB5D;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMa6D,KAAY7D;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa8D,KAAe5D;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa6D,KAAsB/D;AAAA,EACjC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEagE,KAAqB9D;AAAA,EAChC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa+D,KAAe/D;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEagE,KAAehE;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMaiE,KAAiBjE;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEakE,KAAiBpE;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaqE,KAAqBnE;AAAA,EAChC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaoE,KAAatE;AAAA,EACxB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEauE,KAAevE;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEawE,KAAiBtE;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEauE,KAAYvE;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEawE,KAAiBxE;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMayE,KAAiB3E;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa4E,KAAiB1E;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa2E,KAAiB7E;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa8E,KAAc9E;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa+E,KAAmB/E;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEagF,KAAmBhF;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaiF,KAAqBjF;AAAA,EAChC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEakF,KAAelF;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMamF,KAAmBnF;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaoF,KAAgBpF;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEaqF,KAAoBrF;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEasF,KAAqBtF;AAAA,EAChC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEauF,KAAsBvF;AAAA,EACjC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEawF,KAAqBxF;AAAA,EAChC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEayF,KAAyBzF;AAAA,EACpC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa0F,KAAoB1F;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAMa2F,KAAwBzF;AAAA,EACnC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa0F,KAAkB5F;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa6F,KAAwB7F;AAAA,EACnC;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEa8F,KAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAASjG,GAAG,SAAS;AAAA,EACrB,SAASC;AAAA,EACT,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA;AAAA,EAEV,YAAY;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,YAAY;AAAA,EAAA;AAAA,EAEd,aAAaF;AACf,GAMamG,KAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASrG;AAAA,EACT,YAAYC;AAAA,EACZ,aAAa,EAAE,MAAM,cAAc,QAAQ,cAAc,MAAM,aAAA;AACjE,GAEaqG,KAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAAStG;AAAA,EACT,YAAYC;AAAA,EACZ,aAAaC;AACf,GAEaqG,KAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASvG;AAAA,EACT,YAAYC;AAAA,EACZ,aAAaC;AACf,GAEasG,KAAkBlG;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEamG,KAAgBjG;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEakG,KAAgBlG;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEamG,KAAcrG;AAAA,EACzB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAEasG,KAAYtG;AAAA,EACvB;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,SAAS,WAAW,WAAW,WAAW,UAAU,WAAW,OAAO,UAAA;AAAA,EACxE,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,UAAA;AAAA,EACnD;AACF,GAOauG,KAAkC;AAAA;AAAA,EAE7CpG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA;AAAA,EAEAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,GCt3DME,KAAe;AAAA,EACnB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GAEMC,KAAkB;AAAA,EACtB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,YAAY;AACd,GAEMC,KAAqB;AAAA,EACzB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AACd,GAEMC,KAAmB,EAAE,MAAM,cAAc,QAAQ,cAAc,MAAM,aAAA,GAI9DC,KAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAASF;AAAA,EACT,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASF;AAAA,EACT,YAAYC;AAAA,EACZ,aAAaE;AACf,GAIaE,KAA2B;AAAA,EACtC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS,EAAE,GAAGH,IAAoB,OAAO,UAAA;AAAA,EACzC,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASF;AAAA,EACT,YAAYC;AAAA,EACZ,aAAaE;AACf,GAIaG,KAA2B;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS,EAAE,GAAGJ,IAAoB,OAAO,UAAA;AAAA,EACzC,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASF;AAAA,EACT,YAAYC;AAAA,EACZ,aAAaE;AACf,GAIaI,KAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS,EAAE,GAAGL,IAAoB,OAAO,UAAA;AAAA,EACzC,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASF;AAAA,EACT,YAAYC;AAAA,EACZ,aAAaE;AACf,GAIaK,KAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS;AAAA,IACP,GAAGN;AAAA,IACH,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASF;AAAA,EACT,YAAY;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,YAAY;AAAA,EAAA;AAAA,EAEd,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV,GAIaS,KAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAAST;AAAA,EACT,YAAY;AAAA,IACV,YACE;AAAA,IACF,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,YAAY;AAAA,EAAA;AAAA,EAEd,aAAaG;AACf,GAIaO,KAA6B;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,EAAA;AAAA,EAEhB,aAAa;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM,EAAE,SAAS,WAAW,WAAW,WAAW,OAAO,WAAW,SAAS,UAAA;AAAA,EAC7E,SAAS;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,SAASV;AAAA,EACT,YAAY;AAAA,IACV,YACE;AAAA,IACF,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,YAAY;AAAA,EAAA;AAAA,EAEd,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV,GAIaW,KAAkC;AAAA,EAC7CP;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACA,GAAGX;AACL,GCjUaa,KAAuC;AAAA;AAAA,EAElD;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF,GAIMC,KAAW;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GACMC,KAAY;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GACMC,KAAU;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GAQaC,KAAmC;AAAA,EAC9C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,aAAa,OAAO;AAAA,EAAA;AAAA,EAErC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASD;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,WAAW,SAAS,SAAS,SAAS,MAAM,WAAW,UAAA;AAAA,EAAU;AAAA,EAE5F,cAAc;AAAA,EACd,eAAe,EAAE,SAAS,eAAe,WAAW,SAAA;AACtD,GAQaE,KAA4B;AAAA,EACvC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,SAAS,QAAQ,UAAU;AAAA,EAAA;AAAA,EAE5C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,SAASH;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,WAAW,SAAS,QAAQ,SAAS,KAAA;AAAA,EAAK;AAAA,EAErE,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,WAAW,WAAW,SAAA;AAClF,GAQaI,KAAmC;AAAA,EAC9C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ,SAAS,UAAU;AAAA,EAAA;AAAA,EAE7C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASH;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,SAAS,YAAY,WAAW,SAAA;AACnD,GAQaI,KAA8B;AAAA,EACzC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,aAAa,cAAc;AAAA,EAAA;AAAA,EAE7C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASL;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,MAAM,SAAS,UAAU,WAAW,SAAA;AAC/E,GAQaM,KAA6B;AAAA,EACxC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,UAAU,UAAU;AAAA,EAAA;AAAA,EAE/C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASN;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UACE;AAAA,IAAA;AAAA,EAIJ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,SAAS,UAAU,WAAW,SAAA;AACjD,GAQaO,KAA0B;AAAA,EACrC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,UAAU,MAAM;AAAA,EAAA;AAAA,EAE7C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASP;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,SAAS,eAAe,WAAW,UAAA;AACtE,GAQaQ,KAAqC;AAAA,EAChD,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,aAAa,SAAS,OAAO;AAAA,EAAA;AAAA,EAE/C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAA;AAAA,IACnD,SAASR;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,WAAW,SAAS,SAAS,SAAS,MAAM,WAAW,WAAA;AAAA,EAAW;AAAA,EAE7F,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,SAAA;AAC5D,GAQaS,KAA6B;AAAA,EACxC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,SAAS,QAAQ,KAAK;AAAA,EAAA;AAAA,EAEvC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,SAAST;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UACE;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,WAAW,YAAY,SAAS,SAAA;AACnE,GAQaU,KAA4B;AAAA,EACvC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,MAAM;AAAA,EAAA;AAAA,EAEnC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAST;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,SAAS,YAAY,WAAW,SAAA;AACnD,GAQaU,KAA8B;AAAA,EACzC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,cAAc,IAAI;AAAA,EAAA;AAAA,EAE/C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IACE;AAAA,MAGF,IACE;AAAA,MAGF,IACE;AAAA,MAGF,IACE;AAAA,MAGF,OAAO;AAAA,IAAA;AAAA,IAET,SAASX;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,OAAO,SAAS,eAAe,WAAW,SAAA;AACrE,GAQaY,KAAyB;AAAA,EACpC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,aAAa,WAAW,QAAQ;AAAA,EAAA;AAAA,EAElD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASZ;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,WAAW,SAAS,QAAQ,SAAS,KAAA;AAAA,EAAK;AAAA,EAErE,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,MAAM,SAAS,UAAU,WAAW,SAAA;AAC/E,GAQaa,KAA2B;AAAA,EACtC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,aAAa,SAAS,cAAc;AAAA,EAAA;AAAA,EAEtD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASd;AAAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,UAAU,SAAS,WAAW,WAAW,OAAA;AAClF,GAIae,KAAmB;AAAA,EAC9B,mBAAAZ;AAAA,EACA,YAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AACF,GAEaE,KAAwC,OAAO,OAAOD,EAAgB;AAK5E,SAASE,GAAiBj5B,GAAuC;AACtE,SAAQ+4B,GAAmD/4B,CAAE;AAC/D;AAGO,SAASk5B,GAA0BC,GAA8B;AACtE,SAAOH,GAAqB,OAAO,CAACrxC,MAAMA,EAAE,KAAK,KAAK,SAASwxC,CAAG,CAAC;AACrE;AC/oCO,MAAMC,KAAgD;AAAA;AAAA,EAE3D;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AACF,GAIMpB,KAAW;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GACMC,IAAY;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GACMC,KAAU;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GACMmB,KAAc;AAAA,EAClB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GAQaC,KAA8B;AAAA,EACzC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,UAAU,SAAS,SAAS;AAAA,EAAA;AAAA,EAE9C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA;AAAA,MAET,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASpB;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,WAAW,SAAS,QAAQ,SAAS,KAAA;AAAA,EAAK;AAAA,EAErE,cAAc;AAAA,EACd,eAAe,EAAE,SAAS,YAAY,WAAW,SAAA;AACnD,GAQaqB,KAA4B;AAAA,EACvC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,UAAU,SAAS,MAAM;AAAA,EAAA;AAAA,EAE3C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASrB;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UACE;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,SAAS,eAAe,WAAW,SAAA;AACpE,GAQasB,KAA+B;AAAA,EAC1C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,UAAU,WAAW,MAAM;AAAA,EAAA;AAAA,EAE7C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA;AAAA,MAEP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASH;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,aAAa,QAAQ,cAAc,MAAM,aAAA;AAAA,EAAa;AAAA,EAE7E,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,UAAU,SAAS,YAAY,WAAW,SAAA;AACnF,GAQaI,KAA+B;AAAA,EAC1C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,UAAU,SAAS,MAAM;AAAA,EAAA;AAAA,EAE3C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASxB;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,cAAc,QAAQ,cAAc,MAAM,aAAA;AAAA,EAAa;AAAA,EAE9E,cAAc;AAAA,EACd,eAAe,EAAE,SAAS,eAAe,WAAW,SAAA;AACtD,GAQayB,KAA+B;AAAA,EAC1C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,YAAY,SAAS,SAAS;AAAA,EAAA;AAAA,EAEhD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASL;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,cAAc,QAAQ,cAAc,MAAM,aAAA;AAAA,IAC/D,iBAAiB,EAAE,MAAM,WAAW,SAAS,SAAS,SAAS,MAAM,WAAW,WAAA;AAAA,EAAW;AAAA,EAE7F,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,YAAY,WAAW,SAAA;AACnF,GAQaM,KAAgC;AAAA,EAC3C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,YAAY,aAAa,MAAM;AAAA,EAAA;AAAA,EAEjD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAS1B;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,gBAAgB,QAAQ,gBAAgB,MAAM,eAAA;AAAA,IACnE,iBAAiB,EAAE,MAAM,WAAW,SAAS,YAAY,SAAS,IAAA;AAAA,EAAI;AAAA,EAExE,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,MAAM,SAAS,UAAU,WAAW,SAAA;AAC7E,GAQa2B,KAA+B;AAAA,EAC1C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,YAAY,UAAU,WAAW;AAAA,EAAA;AAAA,EAElD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,SAAS1B;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,MAAM,SAAS,eAAe,WAAW,SAAA;AACpF,GAQa2B,KAAsC;AAAA,EACjD,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,YAAY,aAAa,WAAW;AAAA,EAAA;AAAA,EAEtD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAS5B;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,cAAc,QAAQ,eAAe,MAAM,eAAA;AAAA,EAAe;AAAA,EAEjF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,MAAM,SAAS,UAAU,WAAW,SAAA;AAC/E,GAQa6B,KAA2B;AAAA,EACtC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,aAAa,MAAM;AAAA,EAAA;AAAA,EAE5C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAS7B;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,eAAe,QAAQ,gBAAgB,MAAM,eAAA;AAAA,IAClE,iBAAiB,EAAE,MAAM,WAAW,SAAS,QAAQ,SAAS,IAAA;AAAA,EAAI;AAAA,EAEpE,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,UAAU,SAAS,WAAW,WAAW,SAAA;AAClF,GAQa8B,KAA4B;AAAA,EACvC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,SAAS,MAAM;AAAA,EAAA;AAAA,EAExC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,SAAS9B;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UACE;AAAA,IAAA;AAAA,EAIJ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,SAAS,UAAU,WAAW,SAAA;AACjE,GAQa+B,KAAyB;AAAA,EACpC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,SAAS;AAAA,EAAA;AAAA,EAElC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,SAAS/B;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UACE;AAAA,IAAA;AAAA,EAGJ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,SAAS,eAAe,WAAW,SAAA;AACpE,GAQagC,KAA2B;AAAA,EACtC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,QAAQ,OAAO;AAAA,EAAA;AAAA,EAE1C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAShC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,MAAM,SAAS,eAAe,WAAW,UAAA;AAClF,GAQaiC,KAA6B;AAAA,EACxC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,SAAS,SAAS,cAAc;AAAA,EAAA;AAAA,EAEjD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA;AAAA,MAEP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,SAASjC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,iBAAiB,QAAQ,kBAAkB,MAAM,iBAAA;AAAA,IACtE,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UACE;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,MAAM,SAAS,UAAU,WAAW,SAAA;AAC/E,GAQakC,KAAiC;AAAA,EAC5C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,QAAQ,WAAW;AAAA,EAAA;AAAA,EAE9C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA;AAAA,MAEP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASlC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,eAAe,QAAQ,eAAe,MAAM,eAAA;AAAA,IACjE,iBAAiB,EAAE,MAAM,WAAW,SAAS,SAAS,SAAS,KAAK,WAAW,WAAA;AAAA,EAAW;AAAA,EAE5F,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,UAAU,SAAS,UAAU,WAAW,OAAA;AACnF,GAQamC,KAAyB;AAAA,EACpC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,OAAO;AAAA,EAAA;AAAA,EAElC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA;AAAA,MAEP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASnC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,MAAM,SAAS,UAAU,WAAW,SAAA;AAC7E,GAQaoC,KAA6B;AAAA,EACxC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,aAAa,SAAS,QAAQ;AAAA,EAAA;AAAA,EAEhD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAShB;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,cAAc,QAAQ,cAAc,MAAM,aAAA;AAAA,EAAa;AAAA,EAE9E,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,YAAY,WAAW,SAAA;AACnF,GAQaiB,KAA+B;AAAA,EAC1C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,aAAa,SAAS;AAAA,EAAA;AAAA,EAExC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASrC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,WAAW,SAAS,QAAQ,SAAS,IAAA;AAAA,EAAI;AAAA,EAEpE,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,MAAM,SAAS,UAAU,WAAW,UAAA;AAC7E,GAQasC,KAA0B;AAAA,EACrC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,aAAa,gBAAgB,WAAW;AAAA,EAAA;AAAA,EAE1D,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA;AAAA,MAEP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAStC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,eAAe,QAAQ,eAAe,MAAM,eAAA;AAAA,IACjE,iBAAiB,EAAE,MAAM,WAAW,SAAS,SAAS,SAAS,KAAK,WAAW,WAAA;AAAA,EAAW;AAAA,EAE5F,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,MAAM,SAAS,UAAU,WAAW,OAAA;AAC/E,GAQauC,KAAgC;AAAA,EAC3C,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,YAAY,UAAU,SAAS;AAAA,EAAA;AAAA,EAEjD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA;AAAA,MAEP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAStC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UACE;AAAA,IAAA;AAAA,EAIJ;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,SAAS,eAAe,WAAW,SAAA;AACpE,GAQauC,KAA4B;AAAA,EACvC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,YAAY,SAAS;AAAA,EAAA;AAAA,EAEvC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAASxC;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAER,iBAAiB,EAAE,MAAM,WAAW,SAAS,UAAU,SAAS,IAAA;AAAA,EAAI;AAAA,EAEtE,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,MAAM,SAAS,UAAU,WAAW,UAAA;AAC7E,GAQayC,KAA0B;AAAA,EACrC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,YAAY,SAAS,SAAS;AAAA,EAAA;AAAA,EAEhD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,oBAAA;AAAA,IACnD,SAASrB;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,cAAc,QAAQ,cAAc,MAAM,aAAA;AAAA,EAAa;AAAA,EAE9E,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,YAAY,WAAW,SAAA;AACnF,GAQasB,KAA4B;AAAA,EACvC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,YAAY;AAAA,EAAA;AAAA,EAEzC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAS3C;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,UAAU,SAAS,WAAW,WAAW,SAAA;AAClF,GAQa4C,KAA8B;AAAA,EACzC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,UAAU,OAAO;AAAA,EAAA;AAAA,EAElC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,SAAS1C;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,MAAM,QAAQ,MAAM,SAAS,YAAY,WAAW,SAAA;AAC/E,GAQa2C,KAA2B;AAAA,EACtC,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,WAAW;AAAA,EAAA;AAAA,EAExC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,yBAAyB;AAAA,IACzB,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,IAAA;AAAA,IAEhB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAAA,IAEV,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,SAAS7C;AAAA,IACT,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,sBAAsB;AAAA,IAAA;AAAA,IAExB,aAAa,EAAE,MAAM,eAAe,QAAQ,gBAAgB,MAAM,eAAA;AAAA,EAAe;AAAA,EAEnF,cAAc;AAAA,EACd,eAAe,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,WAAW,WAAW,SAAA;AAClF,GAIa8C,KAA4B;AAAA;AAAA,EAEvC,cAAAxB;AAAA,EACA,YAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA;AAAA,EAEA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,sBAAAC;AAAA;AAAA,EAEA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AAAA;AAAA,EAEA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,SAAAC;AAAA;AAAA,EAEA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC;AAAA;AAAA,EAEA,gBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA;AAAA,EAEA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AACF,GAEaE,KACX,OAAO,OAAOD,EAAyB;AAKlC,SAASE,GAAyBh7B,GAAuC;AAC9E,SAAQ86B,GAA4D96B,CAAE;AACxE;AAGO,SAASi7B,GAAkC9B,GAA8B;AAC9E,SAAO4B,GAA8B,OAAO,CAACpzC,MAAMA,EAAE,KAAK,KAAK,SAASwxC,CAAG,CAAC;AAC9E;AC1rEA,SAAS+B,GACPn9C,GACAV,GACkB;AAClB,SAAOU,KAAaV,EAAM,2BAA2B;AACvD;AAEO,MAAM89C,KAAsD,CAAC;AAAA,EAClE,OAAA99C;AAAA,EACA,WAAA+9C;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAcC;AAAA,EACd,oBAAAC,IAAqB;AAAA,EACrB,UAAAz6C;AACF,MAAM;AAIJ,QAAM06C,IAAQ14C,GAAA,GACRtG,IAAU0M,EAAQ,MAAM,IAAIsyC,EAAM,QAAQ,MAAM,EAAE,CAAC,IAAI,CAACA,CAAK,CAAC,GAE9DnoC,IAAelU,EAAuB,IAAI,GAM1Cs8C,IAAgBt8C,EAA8B,IAAI,GAClD,CAACu8C,GAAYC,CAAa,IAAI18C,EAAgC,IAAI,GAClE,CAAC28C,GAAcC,CAAe,IAAI58C,EAAoB7B,CAAK,GAC3D,CAAC0+C,GAAYC,CAAa,IAAI98C,EAAS,EAAK,GAC5C,CAAC+8C,GAAcC,CAAe,IAAIh9C;AAAA,IAA2B,MACjEg8C,GAAwBK,GAAkBl+C,CAAK;AAAA,EAAA;AAKjD,EAAAqC,EAAU,MAAM;AACd,IAAI67C,MAAqB,SACvBW,EAAgBX,CAAgB,IACvBl+C,EAAM,2BACf6+C,EAAgB7+C,EAAM,uBAAuB;AAAA,EAEjD,GAAG,CAACk+C,GAAkBl+C,EAAM,uBAAuB,CAAC,GAGpDqC,EAAU,MAAM;AACd,UAAMsC,IAAK,OAAO,WAAW,8BAA8B;AAC3D,IAAAg6C,EAAch6C,EAAG,OAAO;AACxB,UAAMC,IAAU,CAAC/B,MAA2B87C,EAAc97C,EAAE,OAAO;AACnE,WAAA8B,EAAG,iBAAiB,UAAUC,CAAO,GAC9B,MAAMD,EAAG,oBAAoB,UAAUC,CAAO;AAAA,EACvD,GAAG,CAAA,CAAE;AAGL,QAAMk6C,IAAmBb,KAAYj+C,EAAM,YAAY,SACjDqH,IAASy3C,MAAqB,UAAWA,MAAqB,UAAUJ;AAG9E,EAAAr8C,EAAU,MAAM;AACd,IACEo8C,EADEp3C,KAAU02C,IACIA,IAEA/9C,CAFS;AAAA,EAI7B,GAAG,CAACA,GAAO+9C,GAAW12C,CAAM,CAAC,GAG7BhF,EAAU,MAAM;AACd,QAAI,OAAO,WAAa;AACtB;AAEF,UAAM08C,IAAO,SAAS,cAAc,KAAK;AACzC,WAAAA,EAAK,YAAY,2CACjBA,EAAK,QAAQ,cAAc3/C,GAK3B2/C,EAAK,MAAM,UAAU,YACrB,SAAS,KAAK,YAAYA,CAAI,GAC9BV,EAAc,UAAUU,GACxBR,EAAcQ,CAAI,GACX,MAAM;AACX,MAAIA,EAAK,cACPA,EAAK,WAAW,YAAYA,CAAI,GAElCV,EAAc,UAAU,MACxBE,EAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAACn/C,CAAO,CAAC,GAGZiD,EAAU,MAAM;AACd,UAAMgE,IAAK4P,EAAa;AACxB,QAAI,CAAC5P;AACH;AAIF,IAAI83C,MACF93C,EAAG,MAAM,aAAa;AAGxB,UAAMm7B,IAAOyQ,GAAeuM,CAAY;AACxC,eAAW,CAACrvB,GAAMnwB,CAAK,KAAK,OAAO,QAAQwiC,CAAI;AAC7C,MAAAn7B,EAAG,MAAM,YAAY8oB,GAAMnwB,CAAK;AAKlC,UAAM+/C,IAAOV,EAAc;AAC3B,QAAIU;AACF,iBAAW,CAAC5vB,GAAMnwB,CAAK,KAAK,OAAO,QAAQwiC,CAAI;AAC7C,QAAAud,EAAK,MAAM,YAAY5vB,GAAMnwB,CAAK;AAKtC,IAAAqH,EAAG,MAAM,cAAcgB,IAAS,SAAS,SACzChB,EAAG,QAAQ,iBAAiBgB,IAAS,SAAS,SAE9ChB,EAAG,QAAQ,QAAQgB,IAAS,SAAS,SACjCA,IACFhB,EAAG,UAAU,IAAI,WAAW,IAE5BA,EAAG,UAAU,OAAO,WAAW,GAE7B04C,MACFA,EAAK,MAAM,cAAc13C,IAAS,SAAS,SAC3C03C,EAAK,QAAQ,iBAAiB13C,IAAS,SAAS,SAChD03C,EAAK,QAAQ,QAAQ13C,IAAS,SAAS,SACnCA,IACF03C,EAAK,UAAU,IAAI,WAAW,IAE9BA,EAAK,UAAU,OAAO,WAAW;AAKrC,UAAMzM,IAAKkM,EAAa;AACxB,WAAIlM,KAAMA,EAAG,SAAS,UAEhBA,EAAG,SAAS,cAAcA,EAAG,YAC/BjsC,EAAG,MAAM,YAAY,kBAAkBisC,EAAG,QAAQ,GAI/C,MAAM;AACX,MAAIjsC,KACFmsC,GAAYnsC,CAAE;AAAA,IAElB;AAAA,EACF,GAAG,CAACm4C,GAAcn3C,GAAQ82C,GAAoBG,CAAU,CAAC,GAMzDj8C,EAAU,MAAM;AACd,UAAMgE,IAAK4P,EAAa;AACxB,QAAI,CAAC5P;AACH;AAEF,UAAMjC,IAAW45C,IACb,EAAE,GAAG1/C,GAAwB,GAAG0/C,EAAA,IAChC79C,GAA0By+C,CAAY;AAC1C,IAAA1/C,GAAmBkF,GAAUiC,GAAIjH,CAAO;AAExC,UAAM4/C,IAAQ39C,GAAyBu9C,CAAY;AACnD,eAAW,CAAC5hD,GAAK2P,CAAG,KAAK,OAAO,QAAQqyC,CAAK;AAC3C,MAAA34C,EAAG,aAAarJ,GAAK2P,CAAG;AAE1B,WAAO,MAAM;AACX,MAAAnN,GAAoBJ,GAASiH,CAAE;AAAA,IACjC;AAAA,EACF,GAAG,CAAC23C,GAAeY,GAAcx/C,CAAO,CAAC;AAEzC,QAAM6/C,IAAiBh9C,EAAY,CAACgJ,MAAiB;AACnD,IAAAwzC,EAAgBxzC,CAAC;AAAA,EACnB,GAAG,CAAA,CAAE,GAECjM,IAAQ8M;AAAA,IACZ,OAAO;AAAA,MACL,OAAO0yC;AAAA,MACP,UAAUS;AAAA,MACV,cAAcX;AAAA,IAAA;AAAA,IAEhB,CAACE,GAAcS,GAAgBX,CAAU;AAAA,EAAA,GAGrCY,IAAoBpzC;AAAA,IACxB,OAAO;AAAA,MACL,cAAA8yC;AAAA,MACA,eAAez+C,GAA0By+C,CAAY;AAAA,MACrD,iBAAAC;AAAA,IAAA;AAAA,IAEF,CAACD,CAAY;AAAA,EAAA;AAGf,SACE,gBAAA97C,EAACgwC,GAAiB,UAAjB,EAA0B,OAAA9zC,GACzB,4BAACqB,GAAwB,UAAxB,EAAiC,OAAO6+C,GACvC,UAAA,gBAAAp8C;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKmT;AAAA,MACL,WAAU;AAAA,MACV,qBAAmB7W;AAAA,MACnB,OAAO,EAAE,SAAS,WAAA;AAAA,MAEjB,UAAAsE;AAAA,IAAA;AAAA,EAAA,GAEL,EAAA,CACF;AAEJ;AAEAo6C,GAAkB,cAAc;ACxNhC,MAAMqB,KAAsB7+C,EAA+C,IAAI;AAKxE,SAAS8+C,KAA6C;AAC3D,QAAMz+C,IAAMH,EAAW2+C,EAAmB;AAC1C,MAAI,CAACx+C;AACH,UAAM,IAAI,MAAM,+DAA+D;AAEjF,SAAOA;AACT;AAoBO,SAAS0+C,GAAyB;AAAA,EACvC,eAAAlvB;AAAA,EACA,YAAAppB,IAAa;AAAA,EACb,WAAAu4C,IAAY;AAAA,EACZ,UAAA57C;AACF,GAA+C;AAC7C,QAAM,CAACjF,GAAQ4xB,CAAc,IAAIxuB,EAA6B,MAAM;AAElE,QAAI,OAAO,SAAW,OAAekF,GAAY;AAC/C,YAAMK,IAAS,aAAa,QAAQL,CAAU;AAC9C,UAAIK;AACF,YAAI;AACF,iBAAO,EAAE,GAAG9I,GAAwB,GAAG,KAAK,MAAM8I,CAAM,EAAA;AAAA,QAC1D,QAAQ;AAAA,QAER;AAAA,IAEJ;AACA,WAAO,EAAE,GAAG9I,GAAwB,GAAG6xB,EAAA;AAAA,EACzC,CAAC;AAGD,EAAA9tB,EAAU,MAAM;AACd,IAAIi9C,KAAa,OAAO,SAAW,OACjCpgD,GAAmBT,CAAM;AAAA,EAE7B,GAAG,CAACA,GAAQ6gD,CAAS,CAAC,GAGtBj9C,EAAU,MAAM;AACd,IAAI,OAAO,SAAW,OAAe0E,KACnC,aAAa,QAAQA,GAAY,KAAK,UAAUtI,CAAM,CAAC;AAAA,EAE3D,GAAG,CAACA,GAAQsI,CAAU,CAAC;AAEvB,QAAM2pB,IAAYzuB,EAAY,CAAC4hC,MAAyC;AACtE,IAAAxT,EAAe,CAAC1oB,OAAU,EAAE,GAAGA,GAAM,GAAGk8B,IAAU;AAAA,EACpD,GAAG,CAAA,CAAE,GAEC0b,IAAct9C,EAAY,CAACu9C,MAAuB;AACtD,UAAMxvC,IAASzR,GAAgBihD,CAAU;AACzC,IAAIxvC,KACFqgB,EAAergB,CAAM;AAAA,EAEzB,GAAG,CAAA,CAAE,GAECi0B,IAAQhiC,EAAY,MAAM;AAC9B,IAAAouB,EAAe/xB,CAAsB;AAAA,EACvC,GAAG,CAAA,CAAE;AAEL,SACE,gBAAAwE,EAACq8C,GAAoB,UAApB,EAA6B,OAAO,EAAE,QAAA1gD,GAAQ,WAAAiyB,GAAW,aAAA6uB,GAAa,OAAAtb,EAAA,GACpE,UAAAvgC,EAAA,CACH;AAEJ;AAwBO,SAAS+7C,GAA6B;AAAA,EAC3C,aAAAC,IAAc;AAAA,EACd,aAAAC,IAAc;AAAA,EACd,SAAAC,IAAU;AAAA,EACV,aAAAC,IAAc;AAAA,EACd,WAAAp9C;AAAA,EACA,OAAArC;AACF,GAAmD;AACjD,QAAM,EAAE,QAAA3B,GAAQ,WAAAiyB,GAAW,aAAA6uB,GAAa,OAAAtb,EAAA,IAAUmb,GAAA,GAC5C,CAACU,GAAkBC,CAAmB,IAAIl+C;AAAA,wBAC1C,IAAI,CAAC,WAAW,UAAU,QAAQ,CAAC;AAAA,EAAA,GAGnCm+C,IAAgB,CAACpgC,MAAoB;AACzC,IAAKigC,KAGLE,EAAoB,CAACp4C,MAAS;AAC5B,YAAMqS,IAAO,IAAI,IAAIrS,CAAI;AACzB,aAAIqS,EAAK,IAAI4F,CAAO,IAClB5F,EAAK,OAAO4F,CAAO,IAEnB5F,EAAK,IAAI4F,CAAO,GAEX5F;AAAA,IACT,CAAC;AAAA,EACH,GAEMimC,IAAoB,CAACrgC,MAAoB,CAACigC,KAAeC,EAAiB,IAAIlgC,CAAO;AAE3F,SACE,gBAAA5b;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,kCAAkCvB,KAAa,EAAE;AAAA,MAC5D,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,GAAGrC;AAAA,MAAA;AAAA,MAIJ,UAAA;AAAA,QAAAs/C,KACC,gBAAA58C;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,SAAS;AAAA,YACrC,UAAU,MAAMD,EAAc,SAAS;AAAA,YAEvC,UAAA,gBAAAh8C,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,MAAA,GACnD,UAAA;AAAA,cAAA,OAAO,KAAKzF,EAAe,EAAE,IAAI,CAAC2F,MACjC,gBAAApB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,SAAS,MAAMy8C,EAAYr7C,CAAI;AAAA,kBAC/B,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,eAAe;AAAA,kBAAA;AAAA,kBAGhB,UAAAA;AAAA,gBAAA;AAAA,gBAXIA;AAAA,cAAA,CAaR;AAAA,cACD,gBAAApB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAASmhC;AAAA,kBACT,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,QAAQ;AAAA,kBAAA;AAAA,kBAEX,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAKJ,gBAAAnhC;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,QAAQ;AAAA,YACpC,UAAU,MAAMD,EAAc,QAAQ;AAAA,YAEtC,UAAA,gBAAAl9C;AAAA,cAACq9C;AAAA,cAAA;AAAA,gBACC,SAAS,OAAO,KAAKljD,EAAa;AAAA,gBAClC,OAAOwB,EAAO;AAAA,gBACd,UAAU,CAAC0R,MAAMugB,EAAU,EAAE,QAAQvgB,GAAoB;AAAA,gBACzD,eAAe,CAACA,MACd,gBAAArN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,YAAY;AAAA,sBACZ,cAAc7F,GAAckT,CAAkB,EAAE;AAAA,oBAAA;AAAA,kBAClD;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAEJ;AAAA,QAAA;AAAA,QAIF,gBAAArN;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,QAAQ;AAAA,YACpC,UAAU,MAAMD,EAAc,QAAQ;AAAA,YAEtC,UAAA,gBAAAl9C;AAAA,cAACq9C;AAAA,cAAA;AAAA,gBACC,SAAS,OAAO,KAAKjjD,EAAa;AAAA,gBAClC,OAAOuB,EAAO;AAAA,gBACd,UAAU,CAAC0R,MAAMugB,EAAU,EAAE,QAAQvgB,GAAoB;AAAA,gBACzD,eAAe,CAACA,MACd,gBAAArN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,YAAY;AAAA,sBACZ,cAAc;AAAA,sBACd,WAAW5F,GAAciT,CAAkB;AAAA,oBAAA;AAAA,kBAC7C;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAEJ;AAAA,QAAA;AAAA,QAIF,gBAAArN;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,QAAQ;AAAA,YACpC,UAAU,MAAMD,EAAc,QAAQ;AAAA,YAEtC,UAAA,gBAAAl9C;AAAA,cAACq9C;AAAA,cAAA;AAAA,gBACC,SACE;AAAA,kBACE;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAGJ,OAAO1hD,EAAO;AAAA,gBACd,UAAU,CAAC0R,MAAMugB,EAAU,EAAE,aAAavgB,GAAyB;AAAA,cAAA;AAAA,YAAA;AAAA,UACrE;AAAA,QAAA;AAAA,QAIF,gBAAArN;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,OAAO;AAAA,YACnC,UAAU,MAAMD,EAAc,OAAO;AAAA,YAErC,UAAA,gBAAAl9C;AAAA,cAACq9C;AAAA,cAAA;AAAA,gBACC,SACE;AAAA,kBACE;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAGJ,OAAO1hD,EAAO;AAAA,gBACd,UAAU,CAAC0R,MAAMugB,EAAU,EAAE,YAAYvgB,GAAwB;AAAA,cAAA;AAAA,YAAA;AAAA,UACnE;AAAA,QAAA;AAAA,QAIF,gBAAArN;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,MAAM;AAAA,YAClC,UAAU,MAAMD,EAAc,MAAM;AAAA,YAEpC,UAAA,gBAAAl9C;AAAA,cAACq9C;AAAA,cAAA;AAAA,gBACC,SACE;AAAA,kBACE;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAGJ,OAAO1hD,EAAO;AAAA,gBACd,UAAU,CAAC0R,MAAMugB,EAAU,EAAE,WAAWvgB,GAAuB;AAAA,cAAA;AAAA,YAAA;AAAA,UACjE;AAAA,QAAA;AAAA,QAIF,gBAAArN;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,WAAW;AAAA,YACvC,UAAU,MAAMD,EAAc,WAAW;AAAA,YAEzC,UAAA,gBAAAl9C;AAAA,cAACq9C;AAAA,cAAA;AAAA,gBACC,SAAS,OAAO,KAAK9iD,EAAgB;AAAA,gBACrC,OAAOoB,EAAO;AAAA,gBACd,UAAU,CAAC0R,MAAMugB,EAAU,EAAE,WAAWvgB,GAAyB;AAAA,cAAA;AAAA,YAAA;AAAA,UACnE;AAAA,QAAA;AAAA,QAIF,gBAAArN;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,SAAS;AAAA,YACrC,UAAU,MAAMD,EAAc,SAAS;AAAA,YAEvC,UAAA,gBAAAl9C;AAAA,cAACq9C;AAAA,cAAA;AAAA,gBACC,SAAS,OAAO,KAAK/iD,EAAc;AAAA,gBACnC,OAAOqB,EAAO;AAAA,gBACd,UAAU,CAAC0R,MAAMugB,EAAU,EAAE,SAASvgB,GAAqB;AAAA,cAAA;AAAA,YAAA;AAAA,UAC7D;AAAA,QAAA;AAAA,QAIDwvC,KACC,gBAAA78C;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,SAAS;AAAA,YACrC,UAAU,MAAMD,EAAc,SAAS;AAAA,YAEvC,UAAA,gBAAAl9C,EAACs9C,MAAe,QAAA3hD,EAAA,CAAgB;AAAA,UAAA;AAAA,QAAA;AAAA,QAKnCmhD,KACC,gBAAA98C;AAAA,UAACo9C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAUD,EAAkB,KAAK;AAAA,YACjC,UAAU,MAAMD,EAAc,KAAK;AAAA,YAEnC,UAAA,gBAAAl9C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,UAAU;AAAA,kBACV,UAAU;AAAA,kBACV,WAAW;AAAA,gBAAA;AAAA,gBAGZ,aAAmBrE,CAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5B;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;AAaA,SAASyhD,EAAQ,EAAE,OAAAp8C,GAAO,UAAA4L,GAAU,UAAAsjB,GAAU,UAAAtvB,KAAuC;AACnF,2BACG,OAAA,EAAI,OAAO,EAAE,cAAc,UAC1B,UAAA;AAAA,IAAA,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAASgvB;AAAA,QACT,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,WAAW;AAAA,QAAA;AAAA,QAGb,UAAA;AAAA,UAAA,gBAAAlwB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,WAAW4M,IAAW,kBAAkB,QAAQ,YAAY,kBAAA;AAAA,cACtE,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGA5L;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF4L,KAAY,gBAAA5M,EAAC,OAAA,EAAI,OAAO,EAAE,aAAa,QAAQ,YAAY,MAAA,GAAU,UAAAY,EAAA,CAAS;AAAA,EAAA,GACjF;AAEJ;AASA,SAASy8C,GAA8B;AAAA,EACrC,SAAAt5C;AAAA,EACA,OAAA7H;AAAA,EACA,UAAAqhD;AAAA,EACA,eAAAC;AACF,GAAqC;AACnC,SACE,gBAAAx9C,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,MAAA,GACnD,UAAA+D,EAAQ,IAAI,CAACgoC,MACZ,gBAAA7qC;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,SAAS,MAAMq8C,EAASxR,CAAG;AAAA,MAC3B,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,QAAQ7vC,MAAU6vC,IAAM,sBAAsB;AAAA,QAC9C,cAAc;AAAA,QACd,YAAY7vC,MAAU6vC,IAAM,YAAY;AAAA,QACxC,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,UAAU;AAAA,MAAA;AAAA,MAGX,UAAA;AAAA,QAAAyR,KAAiBA,EAAczR,CAAG;AAAA,QAClCA;AAAA,MAAA;AAAA,IAAA;AAAA,IAhBIA;AAAA,EAAA,CAkBR,GACH;AAEJ;AAMA,SAASuR,GAAe,EAAE,QAAA3hD,KAA4C;AACpE,QAAM8hD,IAAe5iD,GAAqBc,EAAO,aAAa,8BAA8B,GACtF+hD,IAAc1iD,GAAoBW,EAAO,UAAU,GACnDgiD,IAAa1iD,GAAmBU,EAAO,SAAS,GAChDE,IAAS1B,GAAcwB,EAAO,MAAM,GACpCI,IAAUzB,GAAeqB,EAAO,OAAO;AAE7C,SACE,gBAAAuF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,MAAA;AAAA,MAIP,UAAA;AAAA,QAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAASnF,EAAQ;AAAA,cACjB,cAAcF,EAAO;AAAA,cACrB,GAAG8hD;AAAA,YAAA;AAAA,YAGL,UAAA;AAAA,cAAA,gBAAA39C,EAAC,MAAA,EAAG,OAAO,EAAE,QAAQ,YAAY,UAAUjE,EAAQ,SAAA,GAAY,UAAA,eAAA,CAAY;AAAA,cAG3E,gBAAAmF,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAKnF,EAAQ,KAAK,cAAc,OAAA,GAC7D,UAAA;AAAA,gBAAA,gBAAAiE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS,GAAGjE,EAAQ,QAAQ,IAAIA,EAAQ,QAAQ;AAAA,sBAChD,cAAcF,EAAO;AAAA,sBACrB,OAAO;AAAA,sBACP,UAAUE,EAAQ;AAAA,sBAClB,QAAQ;AAAA,sBACR,GAAG0hD;AAAA,oBAAA;AAAA,oBAEN,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGD,gBAAAz9C;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS,GAAGjE,EAAQ,QAAQ,IAAIA,EAAQ,QAAQ;AAAA,sBAChD,cAAcF,EAAO;AAAA,sBACrB,YAAY;AAAA,sBACZ,QAAQ;AAAA,sBACR,UAAUE,EAAQ;AAAA,sBAClB,QAAQ;AAAA,oBAAA;AAAA,oBAEX,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED,GACF;AAAA,cAGA,gBAAAiE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,aAAY;AAAA,kBACZ,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQjE,EAAQ;AAAA,oBAChB,SAAS,KAAKA,EAAQ,QAAQ;AAAA,oBAC9B,UAAUA,EAAQ;AAAA,oBAClB,SAAS;AAAA,oBACT,WAAW;AAAA,oBACX,GAAG2hD;AAAA,kBAAA;AAAA,gBACL;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,0BAID,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,UAAU,UAClD,UAAA,CAAC,QAAQ,WAAW,WAAW,OAAO,EAAE,IAAI,CAACh0B,MAC5C,gBAAA1pB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAcnE,EAAO;AAAA,cACrB,YAAY;AAAA,cACZ,UAAU;AAAA,YAAA;AAAA,YAGX,UAAA6tB;AAAA,UAAA;AAAA,UARIA;AAAA,QAAA,CAUR,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AC/jBO,SAASk0B,KAA0B;AACxC,QAAM,CAACr5C,GAAQs5C,CAAS,IAAI9+C,EAAkB,MACxC,OAAO,SAAW,MACb,KAEF++C,GAAA,CACR;AAED,SAAAv+C,EAAU,MAAM;;AACd,QAAI,OAAO,SAAW;AACpB;AAEF,IAAAs+C,EAAUC,IAAY;AACtB,UAAM9zC,IAAW,IAAI,iBAAiB,MAAM6zC,EAAUC,GAAA,CAAY,CAAC;AACnE,IAAA9zC,EAAS,QAAQ,SAAS,iBAAiB;AAAA,MACzC,YAAY;AAAA,MACZ,iBAAiB,CAAC,cAAc,SAAS,OAAO;AAAA,IAAA,CACjD;AACD,UAAMnI,IAAK,OAAO,WAAW,8BAA8B,GACrDk8C,IAAO,MAAMF,EAAUC,IAAY;AACzC,YAAAj6C,IAAAhC,EAAG,qBAAH,QAAAgC,EAAA,KAAAhC,GAAsB,UAAUk8C,IACzB,MAAM;;AACX,MAAA/zC,EAAS,WAAA,IACTnG,IAAAhC,EAAG,wBAAH,QAAAgC,EAAA,KAAAhC,GAAyB,UAAUk8C;AAAA,IACrC;AAAA,EACF,GAAG,CAAA,CAAE,GAEEx5C;AACT;AAEA,SAASu5C,KAAsB;;AAC7B,MAAI;AACF,UAAMt5C,IAAO,SAAS,iBAChBw5C,IAAOx5C,EAAK,aAAa,YAAY;AAC3C,QAAIw5C,MAAS;AACX,aAAO;AAET,QAAIA,MAAS;AACX,aAAO;AAET,QAAIx5C,EAAK,UAAU,SAAS,WAAW,KAAKA,EAAK,UAAU,SAAS,MAAM;AACxE,aAAO;AAET,QAAIA,EAAK,UAAU,SAAS,YAAY;AACtC,aAAO;AAET,UAAMorC,IAAK,iBAAiBprC,CAAI,GAC1By5C,IAAYrO,EAAG,iBAAiB,gBAAgB,EAAE,KAAA,KAAUA,EAAG;AACrE,QAAIqO,GAAW;AACb,YAAMjgC,IAAIigC,EAAU,MAAM,kBAAkB;AAC5C,UAAIjgC,GAAG;AACL,cAAM,CAAClhB,GAAGC,GAAGC,CAAC,IAAIghB,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAClW,MAAM,WAAWA,EAAE,KAAA,CAAM,CAAC;AACjE,gBAAQ,QAAQhL,IAAI,QAAQC,IAAI,QAAQC,KAAK,MAAM;AAAA,MACrD;AACA,UAAI,sBAAsB,KAAKihD,CAAS,GAAG;AACzC,cAAMrhD,IAAMqhD,EAAU,QAAQ,KAAK,EAAE,GAC/B5wC,IACJzQ,EAAI,WAAW,IACXA,EACG,MAAM,EAAE,EACR,IAAI,CAAC4J,MAAMA,IAAIA,CAAC,EAChB,KAAK,EAAE,IACV5J,EAAI,MAAM,GAAG,CAAC,GACdE,IAAI,SAASuQ,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAC9BtQ,IAAI,SAASsQ,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAC9BrQ,IAAI,SAASqQ,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACpC,gBAAQ,QAAQvQ,IAAI,QAAQC,IAAI,QAAQC,KAAK,MAAM;AAAA,MACrD;AAAA,IACF;AACA,aAAO6G,IAAA,OAAO,eAAP,gBAAAA,EAAA,aAAoB,gCAAgC,YAAW;AAAA,EACxE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;ACIO,MAAMq6C,KAA4B;AAAA;AAAA,EAEvC;AAAA,EAAiB;AAAA,EAAgB;AAAA,EAAmB;AAAA,EACpD;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAc;AAAA,EAC5C;AAAA,EAAc;AAAA,EAAmB;AAAA,EAAoB;AAAA,EACrD;AAAA,EAAgB;AAAA,EAAoB;AAAA,EAAc;AAAA,EAClD;AAAA,EAAmB;AAAA,EAAkB;AAAA,EAAY;AAAA,EACjD;AAAA,EAAgB;AAAA,EAAoB;AAAA,EAAoB;AAAA,EACxD;AAAA,EAAmB;AAAA,EAAY;AAAA,EAAgB;AAAA;AAAA,EAE/C;AAAA,EAAc;AAAA,EAAmB;AAAA,EAAkB;AAAA,EACnD;AAAA;AAAA,EAEA;AAAA,EAAa;AAAA,EAAgB;AAAA,EAAY;AAAA,EAAgB;AAAA,EACzD;AAAA,EAAgB;AAAA,EAAgB;AAAA,EAAiB;AAAA,EACjD;AAAA;AAAA,EAEA;AAAA,EAAa;AAAA,EAAW;AAAA,EAAc;AAAA,EAAmB;AAAA,EACzD;AAAA,EAAe;AAAA,EAAe;AAAA,EAAgB;AAAA,EAC9C;AAAA,EAAa;AAAA,EAAgB;AAAA,EAAgB;AAAA;AAAA,EAE7C;AAAA,EAAa;AAAA,EAAa;AAAA,EAAc;AAAA,EACxC;AAAA,EAAqB;AAAA;AAAA,EAErB;AAAA,EAAY;AAAA,EAAiB;AAAA,EAAkB;AAAA,EAC/C;AAAA,EAAY;AAAA,EAAY;AAAA,EAAmB;AAAA,EAC3C;AAAA,EAAgB;AAAA,EAAe;AAAA,EAAiB;AAAA,EAChD;AAAA,EAAuB;AAAA,EAAe;AAAA;AAAA,EAEtC;AAAA,EAAa;AAAA,EAAgB;AAAA,EAAkB;AAAA,EAC/C;AAAA,EAAmB;AAAA,EAAgB;AAAA,EAAiB;AAAA,EACpD;AAAA,EAAc;AAAA,EAAc;AAAA,EAAqB;AAAA,EACjD;AAAA,EAAe;AAAA,EAAe;AAAA,EAAkB;AAAA;AAAA,EAEhD;AAAA,EAAmB;AAAA,EAAe;AAAA,EAAiB;AAAA,EAAc;AAAA;AAAA,EAEjE;AAAA,EAAiB;AAAA,EAAa;AAAA,EAAe;AAAA;AAAA,EAE7C;AAAA,EAAW;AAAA,EAAqB;AAAA,EAAiB;AAAA;AAAA,EAEjD;AAAA,EAAY;AAAA,EAAoB;AAAA,EAAmB;AAAA,EACnD;AAAA,EAAe;AAAA;AAAA,EAEf;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAU;AAAA,EAAS;AAC3C;AAOO,SAASC,GAAqBC,GAAiC;AACpE,QAAMnW,IAAmB,CAAA;AACzB,EAAAoW,GAAaD,EAAI,MAAMnW,GAAQ,MAAM;AAErC,QAAMqW,IAAQ,IAAI,KAAKF,EAAI,eAAe,IAAI,IAAI,CAAChgD,MAAMA,EAAE,EAAE,CAAC;AAC9D,SAAAmgD,GAAiBH,EAAI,MAAME,GAAOrW,CAAM,GAEjCA;AACT;AAEA,SAASoW,GAAa/+C,GAAoB2oC,GAAkBlnC,GAAoB;AAI9E,OAHI,CAACzB,EAAK,QAAQA,EAAK,KAAK,KAAA,MAAW,OACrC2oC,EAAO,KAAK,GAAGlnC,CAAI,iBAAiB,GAElCzB,EAAK;AACP,aAAS2G,IAAI,GAAGA,IAAI3G,EAAK,SAAS,QAAQ2G;AACxC,MAAAo4C,GAAa/+C,EAAK,SAAS2G,CAAC,GAAGgiC,GAAQ,GAAGlnC,CAAI,aAAakF,CAAC,GAAG;AAGrE;AAEA,SAASs4C,GAAiBj/C,GAAoBg/C,GAAoBrW,GAAwB;AACxF,MAAI3oC,EAAK;AACP,eAAW,CAACpF,GAAKiJ,CAAG,KAAK,OAAO,QAAQ7D,EAAK,QAAQ,GAAG;AACtD,YAAMk/C,IAAOr7C,EAAI,MAAM,GAAG,EAAE,CAAC;AAC7B,MAAI,CAACm7C,EAAM,IAAIE,CAAI,KAAKA,MAAS,UAAUA,MAAS,WAClDvW,EAAO,KAAK,YAAY/tC,CAAG,qCAAqCskD,CAAI,GAAG;AAAA,IAE3E;AAEF,MAAIl/C,EAAK;AACP,eAAWm/C,KAASn/C,EAAK;AACvB,MAAAi/C,GAAiBE,GAAOH,GAAOrW,CAAM;AAG3C;AAGO,SAASyW,GAAkB/W,GAA8B5N,GAA2C;AACzG,QAAM4kB,IAAaC,GAAa7kB,GAAS4N,EAAU,KAAK;AACxD,UAAQA,EAAU,UAAA;AAAA,IAChB,KAAK;AAAM,aAAOgX,MAAehX,EAAU;AAAA,IAC3C,KAAK;AAAO,aAAOgX,MAAehX,EAAU;AAAA,IAC5C,KAAK;AAAM,aAAQgX,IAAyBhX,EAAU;AAAA,IACtD,KAAK;AAAO,aAAQgX,KAA0BhX,EAAU;AAAA,IACxD,KAAK;AAAM,aAAQgX,IAAyBhX,EAAU;AAAA,IACtD,KAAK;AAAO,aAAQgX,KAA0BhX,EAAU;AAAA,IACxD,KAAK;AAAY,aAAO,OAAOgX,CAAU,EAAE,SAAS,OAAOhX,EAAU,KAAK,CAAC;AAAA,IAC3E,KAAK;AAAS,aAAOgX,KAAc,QAAQ,OAAOA,CAAU,MAAM;AAAA,IAClE,KAAK;AAAY,aAAOA,KAAc,QAAQ,OAAOA,CAAU,MAAM;AAAA,IACrE;AAAS,aAAO;AAAA,EAAA;AAEpB;AAEA,SAASC,GAAa7kB,GAAkCh5B,GAAuB;AAC7E,QAAMiX,IAAQjX,EAAK,MAAM,GAAG;AAC5B,MAAIgI,IAAmBgxB;AACvB,aAAW8kB,KAAQ7mC;AACjB,QAAIjP,KAAW,OAAOA,KAAY,YAAY81C,KAAS91C;AACrD,MAAAA,IAAWA,EAAoC81C,CAAI;AAAA;AAEnD;AAGJ,SAAO91C;AACT;AC9GO,SAAS+1C,GAAiBnjD,GAAkD;AACjF,QAAM,EAAE,WAAAojD,GAAW,YAAAC,GAAY,iBAAAC,GAAiB,UAAAC,IAAW,GAAG,kBAAAC,IAAmB,MAAMxjD,GAEjF,CAACyjD,GAAWC,CAAY,IAAItgD,EAASogD,CAAgB,GACrD,CAACG,GAAaC,CAAc,IAAIxgD,EAAS,EAAK,GAC9CygD,IAAsBvgD,EAAA,GAGtBwgD,IAAcz2C,EAAQ,MAAM;AAChC,QAAI,OAAOg2C,KAAe;AACxB,aAAO;AAGT,UAAMU,IAAoB,IAAI,MAAMX,IAAY,CAAC;AACjD,IAAAW,EAAQ,CAAC,IAAI;AAEb,aAASz5C,IAAI,GAAGA,IAAI84C,GAAW94C;AAC7B,MAAAy5C,EAAQz5C,IAAI,CAAC,IAAIy5C,EAAQz5C,CAAC,IAAI+4C,EAAW/4C,CAAC;AAG5C,WAAOy5C;AAAA,EACT,GAAG,CAACX,GAAWC,CAAU,CAAC,GAGpBW,IAAc32C,EAAQ,MACtB,OAAOg2C,KAAe,WACjBD,IAAYC,IAEdS,IAAcA,EAAYV,CAAS,IAAI,GAC7C,CAACA,GAAWC,GAAYS,CAAW,CAAC,GAGjCG,IAAgBzgD;AAAA,IACpB,CAAC4N,MACK,OAAOiyC,KAAe,WACjBA,IAEFA,EAAWjyC,CAAK;AAAA,IAEzB,CAACiyC,CAAU;AAAA,EAAA,GAIPa,IAAgB1gD;AAAA,IACpB,CAAC4N,MACK,OAAOiyC,KAAe,WACjBjyC,IAAQiyC,IAEVS,IAAcA,EAAY1yC,CAAK,IAAI;AAAA,IAE5C,CAACiyC,GAAYS,CAAW;AAAA,EAAA,GAIpBK,IAAiB3gD;AAAA,IACrB,CAAC4gD,MAAiC;AAChC,UAAI,OAAOf,KAAe;AACxB,eAAO,KAAK,MAAMe,IAAef,CAAU;AAG7C,UAAI,CAACS;AACH,eAAO;AAGT,UAAIO,IAAM,GACNC,IAAOlB,IAAY;AAEvB,aAAOiB,KAAOC,KAAM;AAClB,cAAMC,IAAM,KAAK,OAAOF,IAAMC,KAAQ,CAAC,GACjC5sC,IAASosC,EAAYS,CAAG;AAE9B,YAAI7sC,MAAW0sC;AACb,iBAAOG;AAET,QAAI7sC,IAAS0sC,IACXC,IAAME,IAAM,IAEZD,IAAOC,IAAM;AAAA,MAEjB;AAEA,aAAO,KAAK,IAAI,GAAGF,IAAM,CAAC;AAAA,IAC5B;AAAA,IACA,CAACjB,GAAWC,GAAYS,CAAW;AAAA,EAAA,GAI/B,EAAE,YAAAU,GAAY,UAAAC,GAAU,cAAAC,EAAA,IAAiBr3C,EAAQ,MAAM;AAC3D,UAAMyR,IAAQ,KAAK,IAAI,GAAGqlC,EAAeV,CAAS,IAAIF,CAAQ;AAE9D,QAAIoB,IAAM7lC,GACN8lC,IAAoBV,EAAcplC,CAAK;AAE3C,WAAO6lC,IAAMvB,KAAawB,IAAoBnB,IAAYH;AACxD,MAAAsB,KAAqBX,EAAcU,CAAG,GACtCA;AAGF,IAAAA,IAAM,KAAK,IAAIvB,GAAWuB,IAAMpB,CAAQ;AAExC,UAAMjoC,IAAuB,CAAA;AAC7B,aAAShR,IAAIwU,GAAOxU,IAAIq6C,GAAKr6C;AAC3B,MAAAgR,EAAM,KAAK;AAAA,QACT,OAAOhR;AAAA,QACP,QAAQ45C,EAAc55C,CAAC;AAAA,QACvB,QAAQ25C,EAAc35C,CAAC;AAAA,QACvB,KAAKA;AAAA,MAAA,CACN;AAGH,WAAO,EAAE,YAAYwU,GAAO,UAAU6lC,GAAK,cAAcrpC,EAAA;AAAA,EAC3D,GAAG;AAAA,IACDmoC;AAAA,IACAH;AAAA,IACAF;AAAA,IACAG;AAAA,IACAY;AAAA,IACAD;AAAA,IACAD;AAAA,EAAA,CACD,GAGKY,IAAWrhD,EAAY,CAACY,MAAkC;AAC9D,UAAM6X,IAAS7X,EAAE;AACjB,IAAAs/C,EAAaznC,EAAO,SAAS,GAC7B2nC,EAAe,EAAI,GAGfC,EAAoB,WACtB,OAAO,aAAaA,EAAoB,OAAO,GAEjDA,EAAoB,UAAU,OAAO,WAAW,MAAM;AACpD,MAAAD,EAAe,EAAK;AAAA,IACtB,GAAG,GAAG;AAAA,EACR,GAAG,CAAA,CAAE,GAGCkB,IAAgBthD;AAAA,IACpB,CAAC4N,GAAe2zC,IAAoC,YAAY;AAC9D,YAAMrtC,IAASwsC,EAAc9yC,CAAK,GAC5B4zC,IAAWf,EAAc7yC,CAAK;AAEpC,UAAI6zC;AAEJ,cAAQF,GAAA;AAAA,QACN,KAAK;AACH,UAAAE,IAAevtC,IAAS4rC,IAAkB,IAAI0B,IAAW;AACzD;AAAA,QACF,KAAK;AACH,UAAAC,IAAevtC,IAAS4rC,IAAkB0B;AAC1C;AAAA,QACF;AACE,UAAAC,IAAevtC;AAAA,MAAA;AAGnB,MAAAgsC,EAAa,KAAK,IAAI,GAAG,KAAK,IAAIuB,GAAcjB,IAAcV,CAAe,CAAC,CAAC;AAAA,IACjF;AAAA,IACA,CAACY,GAAeD,GAAeX,GAAiBU,CAAW;AAAA,EAAA,GAIvDkB,IAAW1hD;AAAA,IACf,CAACkU,MAAmB;AAClB,MAAAgsC,EAAa,KAAK,IAAI,GAAG,KAAK,IAAIhsC,GAAQssC,IAAcV,CAAe,CAAC,CAAC;AAAA,IAC3E;AAAA,IACA,CAACU,GAAaV,CAAe;AAAA,EAAA;AAI/B,SAAA1/C,EAAU,MACD,MAAM;AACX,IAAIigD,EAAoB,WACtB,OAAO,aAAaA,EAAoB,OAAO;AAAA,EAEnD,GACC,CAAA,CAAE,GAEE;AAAA,IACL,cAAAa;AAAA,IACA,aAAAV;AAAA,IACA,WAAAP;AAAA,IACA,eAAAqB;AAAA,IACA,UAAAI;AAAA,IACA,UAAAL;AAAA,IACA,YAAAL;AAAA,IACA,UAAAC;AAAA,IACA,aAAAd;AAAA,EAAA;AAEJ;AA8CO,SAASwB,GAAenlD,GAA8C;AAC3E,QAAM;AAAA,IACJ,UAAAolD;AAAA,IACA,aAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAjC;AAAA,IACA,gBAAAkC;AAAA,IACA,UAAAjC,IAAW;AAAA,EAAA,IACTvjD,GAEE,CAACyjD,GAAWC,CAAY,IAAItgD,EAAS,CAAC,GACtC,CAACqiD,GAAYC,CAAa,IAAItiD,EAAS,CAAC,GACxC,CAACugD,GAAaC,CAAc,IAAIxgD,EAAS,EAAK,GAC9CygD,IAAsBvgD,EAAA,GAGtB0gD,IAAc32C,EAAQ,MAAM;AAChC,QAAI,OAAOi4C,KAAc;AACvB,aAAOF,IAAWE;AAEpB,QAAIriB,IAAQ;AACZ,aAAS34B,IAAI,GAAGA,IAAI86C,GAAU96C;AAC5B,MAAA24B,KAASqiB,EAAUh7C,CAAC;AAEtB,WAAO24B;AAAA,EACT,GAAG,CAACmiB,GAAUE,CAAS,CAAC,GAElBK,IAAat4C,EAAQ,MAAM;AAC/B,QAAI,OAAOk4C,KAAgB;AACzB,aAAOF,IAAcE;AAEvB,QAAItiB,IAAQ;AACZ,aAAS34B,IAAI,GAAGA,IAAI+6C,GAAa/6C;AAC/B,MAAA24B,KAASsiB,EAAYj7C,CAAC;AAExB,WAAO24B;AAAA,EACT,GAAG,CAACoiB,GAAaE,CAAW,CAAC,GAGvBK,IAAev4C,EAAQ,MAAM;AACjC,UAAMw4C,IAA2B,CAAA;AAGjC,QAAIC,IAAW,GACXC,IAAY;AAChB,QAAI,OAAOT,KAAc;AACvB,MAAAQ,IAAW,KAAK,MAAMrC,IAAY6B,CAAS,GAC3CS,IAAYD,IAAWR;AAAA;AAEvB,aAAOQ,IAAWV,KAAYW,IAAYT,EAAUQ,CAAQ,IAAIrC;AAC9D,QAAAsC,KAAaT,EAAUQ,CAAQ,GAC/BA;AAGJ,IAAAA,IAAW,KAAK,IAAI,GAAGA,IAAWvC,CAAQ;AAE1C,QAAIyC,IAASF,GACTG,IAAgB,OAAOX,KAAc,WAAWQ,IAAWR,IAAYS;AAC3E,WAAOC,IAASZ,KAAYa,IAAgBxC,IAAYH;AACtD,MAAA2C,KAAiB,OAAOX,KAAc,WAAWA,IAAYA,EAAUU,CAAM,GAC7EA;AAEF,IAAAA,IAAS,KAAK,IAAIZ,GAAUY,IAASzC,CAAQ;AAG7C,QAAI2C,IAAW,GACXC,IAAW;AACf,QAAI,OAAOZ,KAAgB;AACzB,MAAAW,IAAW,KAAK,MAAMT,IAAaF,CAAW,GAC9CY,IAAWD,IAAWX;AAAA;AAEtB,aAAOW,IAAWb,KAAec,IAAWZ,EAAYW,CAAQ,IAAIT;AAClE,QAAAU,KAAYZ,EAAYW,CAAQ,GAChCA;AAGJ,IAAAA,IAAW,KAAK,IAAI,GAAGA,IAAW3C,CAAQ;AAE1C,QAAI6C,IAASF,GACTG,IAAe,OAAOd,KAAgB,WAAWW,IAAWX,IAAcY;AAC9E,WAAOC,IAASf,KAAegB,IAAeZ,IAAaD;AACzD,MAAAa,KAAgB,OAAOd,KAAgB,WAAWA,IAAcA,EAAYa,CAAM,GAClFA;AAEF,IAAAA,IAAS,KAAK,IAAIf,GAAae,IAAS7C,CAAQ;AAGhD,QAAIpmC,IACF,OAAOmoC,KAAc,WACjBQ,IAAWR,KACV,MAAM;AACL,UAAI94C,IAAI;AACR,eAASlC,IAAI,GAAGA,IAAIw7C,GAAUx7C;AAC5B,QAAAkC,KAAK84C,EAAUh7C,CAAC;AAElB,aAAOkC;AAAA,IACT,GAAA;AAEN,aAASk0B,IAAMolB,GAAUplB,IAAMslB,GAAQtlB,KAAO;AAC5C,YAAM4lB,IAAa,OAAOhB,KAAc,WAAWA,IAAYA,EAAU5kB,CAAG;AAE5E,UAAItjB,IACF,OAAOmoC,KAAgB,WACnBW,IAAWX,KACV,MAAM;AACL,YAAIl5C,IAAI;AACR,iBAAS/B,IAAI,GAAGA,IAAI47C,GAAU57C;AAC5B,UAAA+B,KAAKk5C,EAAYj7C,CAAC;AAEpB,eAAO+B;AAAA,MACT,GAAA;AAEN,eAASs/B,IAAMua,GAAUva,IAAMya,GAAQza,KAAO;AAC5C,cAAM4a,IAAY,OAAOhB,KAAgB,WAAWA,IAAcA,EAAY5Z,CAAG;AAEjF,QAAAka,EAAM,KAAK;AAAA,UACT,UAAUnlB;AAAA,UACV,aAAaiL;AAAA,UACb,KAAAxuB;AAAA,UACA,MAAAC;AAAA,UACA,OAAOmpC;AAAA,UACP,QAAQD;AAAA,UACR,KAAK,GAAG5lB,CAAG,IAAIiL,CAAG;AAAA,QAAA,CACnB,GAEDvuB,KAAQmpC;AAAA,MACV;AAEA,MAAAppC,KAAOmpC;AAAA,IACT;AAEA,WAAOT;AAAA,EACT,GAAG;AAAA,IACDpC;AAAA,IACAgC;AAAA,IACAL;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAjC;AAAA,IACAkC;AAAA,IACAjC;AAAA,EAAA,CACD,GAEKsB,IAAWrhD,EAAY,CAACY,MAAkC;AAC9D,UAAM6X,IAAS7X,EAAE;AACjB,IAAAs/C,EAAaznC,EAAO,SAAS,GAC7BypC,EAAczpC,EAAO,UAAU,GAC/B2nC,EAAe,EAAI,GAEfC,EAAoB,WACtB,OAAO,aAAaA,EAAoB,OAAO,GAEjDA,EAAoB,UAAU,OAAO,WAAW,MAAM;AACpD,MAAAD,EAAe,EAAK;AAAA,IACtB,GAAG,GAAG;AAAA,EACR,GAAG,CAAA,CAAE;AAEL,SAAAhgD,EAAU,MACD,MAAM;AACX,IAAIigD,EAAoB,WACtB,OAAO,aAAaA,EAAoB,OAAO;AAAA,EAEnD,GACC,CAAA,CAAE,GAEE;AAAA,IACL,cAAA+B;AAAA,IACA,YAAAD;AAAA,IACA,aAAA3B;AAAA,IACA,UAAAa;AAAA,IACA,WAAApB;AAAA,IACA,YAAAgC;AAAA,IACA,aAAA9B;AAAA,EAAA;AAEJ;AAmBO,SAAS6C,GAAmBlrC,GAAY/M,GAAgB80C,GAAoBE,IAAW,GAAG;AAC/F,QAAM/+C,IAAS2+C,GAAiB;AAAA,IAC9B,WAAW7nC,EAAM;AAAA,IACjB,YAAA+nC;AAAA,IACA,iBAAiB90C;AAAA,IACjB,UAAAg1C;AAAA,EAAA,CACD,GAEKkD,IAAcjjD,EAAY,CAACkjD,MAA6BprC,EAAMorC,EAAY,KAAK,GAAG,CAACprC,CAAK,CAAC;AAE/F,SAAO;AAAA,IACL,GAAG9W;AAAA,IACH,aAAAiiD;AAAA,IACA,gBAAgB;AAAA,MACd,QAAAl4C;AAAA,MACA,UAAU;AAAA,IAAA;AAAA,IAEZ,YAAY;AAAA,MACV,QAAQ/J,EAAO;AAAA,MACf,UAAU;AAAA,IAAA;AAAA,IAEZ,cAAc,CAACkX,OAA4C;AAAA,MACzD,UAAU;AAAA,MACV,KAAKA,EAAK;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQA,EAAK;AAAA,IAAA;AAAA,EACf;AAEJ;ACxdO,SAASirC,GAAqB3mD,GAAiC;AACpE,QAAM,EAAE,OAAAsb,GAAO,UAAAsrC,GAAU,UAAAC,IAAW,GAAG,WAAAC,IAAY,MAAM9mD,GAEnD,CAAC6N,GAAOk5C,CAAQ,IAAI3jD,EAAS,EAAE,GAC/B4jD,IAAgBC,GAAiBp5C,CAAK,GACtC,CAACq5C,GAAgBC,CAAiB,IAAI/jD,EAAS,EAAE,GACjDgkD,IAAc9jD,EAAA;AAGpB,EAAAM,EAAU,MAAM;AACd,QAAIijD,IAAW;AACb,aAAAO,EAAY,UAAU,OAAO,WAAW,MAAM;AAC5C,QAAAD,EAAkBt5C,CAAK;AAAA,MACzB,GAAGg5C,CAAQ,GAEJ,MAAM;AACX,QAAIO,EAAY,WACd,OAAO,aAAaA,EAAY,OAAO;AAAA,MAE3C;AAEA,IAAAD,EAAkBt5C,CAAK;AAAA,EAE3B,GAAG,CAACA,GAAOg5C,CAAQ,CAAC;AAGpB,QAAM3W,IAAc+W,GAAiBC,CAAc,GAG7CjmC,IAAU5T,EAAQ,MAClB6iC,EAAY,SAAS4W,IAChBxrC,IAEFA,EAAM,OAAO,CAACI,MAASkrC,EAASlrC,GAAMw0B,CAAW,CAAC,GACxD,CAAC50B,GAAO40B,GAAa0W,GAAUE,CAAS,CAAC;AAK5C,SAAO;AAAA,IACL,OAAAj5C;AAAA,IACA,UAAAk5C;AAAA,IACA,SAAA9lC;AAAA,IACA,SANcivB,MAAgB8W;AAAA,IAO9B,eAAe9W;AAAA,EAAA;AAEnB;AA8BO,SAASmX,GAAsBC,GAAqC;AACzE,QAAM,CAAC/mD,GAAOgnD,CAAW,IAAInkD,EAASkkD,CAAY,GAC5C,CAACE,GAAcC,CAAe,IAAIrkD,EAASkkD,CAAY,GACvD,CAACI,GAAWC,CAAiB,IAAIC,GAAA,GAEjChY,IAAWpsC;AAAA,IACf,CAACqkB,MAAmC;AAClC,YAAMliB,IACJ,OAAOkiB,KAAa,aAAcA,EAA4BtnB,CAAK,IAAIsnB;AAEzE,MAAA4/B,EAAgB9hD,CAAQ,GACxBgiD,EAAkB,MAAM;AACtB,QAAAJ,EAAY5hD,CAAQ;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,CAACpF,CAAK;AAAA,EAAA,GAGFsnD,IAAoBrkD;AAAA,IACxB,CAACqkB,MAAmC;AAClC,YAAMliB,IACJ,OAAOkiB,KAAa,aAAcA,EAA4BtnB,CAAK,IAAIsnB;AAEzE,MAAA4/B,EAAgB9hD,CAAQ,GACxB4hD,EAAY5hD,CAAQ;AAAA,IACtB;AAAA,IACA,CAACpF,CAAK;AAAA,EAAA;AAGR,SAAO;AAAA,IACL,OAAAA;AAAA,IACA,cAAAinD;AAAA,IACA,WAAAE;AAAA,IACA,UAAA9X;AAAA,IACA,mBAAAiY;AAAA,EAAA;AAEJ;AA2BO,SAASC,GAA0B9nD,GAAsC;AAC9E,QAAM,EAAE,MAAA8kB,GAAM,WAAAijC,GAAW,WAAAC,IAAY,KAAM,UAAA1tC,IAAW,mBAAmBta,GAEnE,CAACwE,GAAQyjD,CAAS,IAAI7kD,EAAqB,IAAI,GAC/C,CAAC8kD,GAAUC,CAAW,IAAI/kD,EAAS,CAAC,GACpC,CAACglD,GAAcC,CAAe,IAAIjlD,EAAS,EAAK,GAChDklD,IAAWhlD,EAAO,EAAK,GAGvBilD,IAAU/kD,EAAY,YAAY;AACtC,QAAIshB,EAAK,WAAW,GAAG;AACrB,MAAAmjC,EAAU,CAAA,CAAE;AACZ;AAAA,IACF;AAEA,IAAAI,EAAgB,EAAI,GACpBF,EAAY,CAAC,GACbG,EAAS,UAAU;AAEnB,UAAMrnC,IAAe,CAAA,GACfgiB,IAAQne,EAAK;AAEnB,aAASxa,IAAI,GAAGA,IAAI24B,KACd,CAAAqlB,EAAS,SADYh+C,KAAK09C,GAAW;AAKzC,YAAMppB,IAAQ9Z,EAAK,MAAMxa,GAAGA,IAAI09C,CAAS,GAGnCQ,IAAe5pB,EAAM,IAAI,CAACljB,GAAMtQ,MAAQ28C,EAAUrsC,GAAMpR,IAAIc,CAAG,CAAC;AACtE,MAAA6V,EAAQ,KAAK,GAAGunC,CAAY;AAG5B,YAAMC,IAAc,KAAK,IAAI,MAAOn+C,IAAIs0B,EAAM,UAAUqE,IAAS,GAAG;AAGpE,MAAI3oB,MAAa,eAEf,MAAM,IAAI,QAAQ,CAACxQ,MAAY;AAC7B,QAAI,yBAAyB,SAEzB,OACA,oBAAoBA,CAAqB,IAE3C,WAAWA,GAAS,CAAC;AAAA,MAEzB,CAAC,IACQwQ,MAAa,kBAEtB,MAAM,IAAI,QAAQ,CAACxQ,MAAY,sBAAsBA,CAA+B,CAAC,GAIvF4+C,GAAgB,MAAM;AACpB,QAAAP,EAAYM,CAAW;AAAA,MACzB,CAAC;AAAA,IACH;AAEA,IAAAR,EAAUhnC,CAAO,GACjBonC,EAAgB,EAAK,GACrBF,EAAY,GAAG;AAAA,EACjB,GAAG,CAACrjC,GAAMijC,GAAWC,GAAW1tC,CAAQ,CAAC,GAGnCuiB,IAASr5B,EAAY,MAAM;AAC/B,IAAA8kD,EAAS,UAAU;AAAA,EACrB,GAAG,CAAA,CAAE;AAGL,SAAA1kD,EAAU,OACR2kD,EAAA,GACO,MAAM;AACX,IAAAD,EAAS,UAAU;AAAA,EACrB,IACC,CAACC,CAAO,CAAC,GAEL;AAAA,IACL,QAAA/jD;AAAA,IACA,UAAA0jD;AAAA,IACA,cAAAE;AAAA,IACA,SAAAG;AAAA,IACA,QAAA1rB;AAAA,EAAA;AAEJ;AA0BO,SAAS8rB,GACdrtC,GACAlT,IAOI,IACJ;AACA,QAAM,EAAE,cAAAwgD,IAAe,IAAI,WAAAxb,IAAY,IAAI,YAAAyb,IAAa,OAAOzgD,GAEzD,CAAC0gD,GAAcC,CAAe,IAAI3lD,EAAS,KAAK,IAAIwlD,GAActtC,EAAM,MAAM,CAAC,GAC/E,CAAC0tC,GAAYC,CAAa,IAAI7lD,EAASkY,EAAM,UAAUstC,CAAY;AAEzE,SAAAhlD,EAAU,MAAM;AACd,QAAIklD,KAAgBxtC,EAAM,QAAQ;AAChC,MAAA2tC,EAAc,EAAI;AAClB;AAAA,IACF;AAEA,UAAM3hD,IAAQ,WAAW,MAAM;AAC7B,MAAAohD,GAAgB,MAAM;AACpB,QAAAK,EAAgB,CAAC7/C,MAAS,KAAK,IAAIA,IAAOkkC,GAAW9xB,EAAM,MAAM,CAAC;AAAA,MACpE,CAAC;AAAA,IACH,GAAGutC,CAAU;AAEb,WAAO,MAAM,aAAavhD,CAAK;AAAA,EACjC,GAAG,CAACwhD,GAAcxtC,EAAM,QAAQ8xB,GAAWyb,CAAU,CAAC,GAGtDjlD,EAAU,MAAM;AACd,IAAAmlD,EAAgB,KAAK,IAAIH,GAActtC,EAAM,MAAM,CAAC,GACpD2tC,EAAc3tC,EAAM,UAAUstC,CAAY;AAAA,EAC5C,GAAG,CAACttC,GAAOstC,CAAY,CAAC,GAMjB;AAAA,IACL,cALmBv7C,EAAQ,MACpBiO,EAAM,MAAM,GAAGwtC,CAAY,GACjC,CAACxtC,GAAOwtC,CAAY,CAAC;AAAA,IAItB,cAAAA;AAAA,IACA,YAAYxtC,EAAM;AAAA,IAClB,YAAA0tC;AAAA,IACA,UAAWF,IAAextC,EAAM,SAAU;AAAA,EAAA;AAE9C;AAkCO,SAAS4tC,GAAiBlpD,GAA6B;AAC5D,QAAM,EAAE,SAAAmpD,GAAS,QAAAC,GAAQ,iBAAAC,IAAkB,OAASrpD,GAE9C,CAACO,GAAOqvC,CAAQ,IAAIxsC,EAAS+lD,CAAO,GACpC,CAACzB,GAAW4B,CAAY,IAAIlmD,EAAS,EAAK,GAC1C,CAACuG,GAAOC,CAAQ,IAAIxG,EAAuB,IAAI,GAC/CmmD,IAAmBjmD,EAAO6lD,CAAO,GAEjC3+B,IAAShnB;AAAA,IACb,OAAOqkB,MAAgB;AACrB,MAAA0hC,EAAiB,UAAUhpD,GAC3BqJ,EAAS,IAAI,GAGbgmC,EAAS/nB,CAAQ,GACjByhC,EAAa,EAAI;AAEjB,UAAI;AACF,cAAM9kD,IAAS,MAAM4kD,EAAOvhC,CAAQ;AACpC,QAAA+nB,EAASprC,CAAM;AAAA,MACjB,SAAS6f,GAAK;AACZ,QAAAza,EAASya,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,GACxDglC,KACFzZ,EAAS2Z,EAAiB,OAAO;AAAA,MAErC,UAAA;AACE,QAAAD,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC/oD,GAAO6oD,GAAQC,CAAe;AAAA,EAAA,GAG3B7jB,IAAQhiC,EAAY,MAAM;AAC9B,IAAAosC,EAASuZ,CAAO,GAChBv/C,EAAS,IAAI,GACb0/C,EAAa,EAAK;AAAA,EACpB,GAAG,CAACH,CAAO,CAAC;AAEZ,SAAO;AAAA,IACL,OAAA5oD;AAAA,IACA,QAAAiqB;AAAA,IACA,WAAAk9B;AAAA,IACA,OAAA/9C;AAAA,IACA,OAAA67B;AAAA,EAAA;AAEJ;ACrXO,SAASgkB,GACdxpD,GACiB;AACjB,QAAM,EAAE,cAAAypD,GAAc,aAAAC,IAAc,IAAA,IAAU1pD,GAExC,CAACwE,GAAQyjD,CAAS,IAAI7kD,EAAmB,IAAI,GAC7C,CAACglD,GAAcC,CAAe,IAAIjlD,EAAS,EAAK,GAChD,CAACuG,GAAOC,CAAQ,IAAIxG,EAAuB,IAAI,GAE/CumD,IAAYrmD,EAAsB,IAAI,GACtCsmD,IAAYtmD,EAAO,CAAC,GACpBumD,IAAiBvmD,EAAsB,IAAI,GAC3CwmD,IAAiBxmD,EAAA,GAGjBymD,IAAYvmD,EAAY,MAAM;AAClC,QAAI,CAACmmD,EAAU,SAAS;AACtB,UAAI,OAAOF,KAAiB,YAAY;AAEtC,cAAM7wB,IAAO,IAAI,KAAK,CAAC,IAAI6wB,EAAa,SAAA,CAAU,KAAK,GAAG;AAAA,UACxD,MAAM;AAAA,QAAA,CACP;AACD,QAAAE,EAAU,UAAU,IAAI,OAAO,IAAI,gBAAgB/wB,CAAI,CAAC;AAAA,MAC1D;AACE,QAAA+wB,EAAU,UAAU,IAAI,OAAOF,GAAc,EAAE,MAAM,UAAU;AAGjE,MAAAE,EAAU,QAAQ,YAAY,CAACvlD,MAAyC;AACtE,cAAM0rB,IAAM1rB,EAAE;AAEd,QAAI0rB,EAAI,OAAO+5B,EAAe,YAI1B/5B,EAAI,SAAS,YACfm4B,EAAUn4B,EAAI,UAAU,IAAI,GAC5Bu4B,EAAgB,EAAK,GACrBwB,EAAe,UAAU,MACzBG,EAAA,KACSl6B,EAAI,SAAS,YACtBlmB,EAAS,IAAI,MAAMkmB,EAAI,KAAK,CAAC,GAC7Bu4B,EAAgB,EAAK,GACrBwB,EAAe,UAAU,MACzBG,EAAA;AAAA,MAEJ,GAEAL,EAAU,QAAQ,UAAU,CAACvlD,MAAM;AACjC,QAAAwF,EAAS,IAAI,MAAMxF,EAAE,OAAO,CAAC,GAC7BikD,EAAgB,EAAK,GACrBwB,EAAe,UAAU;AAAA,MAC3B;AAAA,IACF;AAEA,WAAOF,EAAU;AAAA,EACnB,GAAG,CAACF,CAAY,CAAC,GAGXO,IAAmBxmD,EAAY,MAAM;AACzC,IAAIsmD,EAAe,WACjB,OAAO,aAAaA,EAAe,OAAO,GAGxCJ,IAAc,MAChBI,EAAe,UAAU,OAAO,WAAW,MAAM;AAC/C,MAAIH,EAAU,WAAW,CAACE,EAAe,YACvCF,EAAU,QAAQ,UAAA,GAClBA,EAAU,UAAU;AAAA,IAExB,GAAGD,CAAW;AAAA,EAElB,GAAG,CAACA,CAAW,CAAC,GAGVO,IAAUzmD;AAAA,IACd,CAACshB,MACQ,IAAI,QAAQ,CAAChb,GAASC,MAAW;AACtC,YAAMmgD,IAASH,EAAA,GACTI,IAAS,QAAQ,EAAEP,EAAU,OAAO;AAE1C,MAAAC,EAAe,UAAUM,GACzB9B,EAAgB,EAAI,GACpBz+C,EAAS,IAAI;AAGb,YAAMwgD,IAAoBF,EAAO;AACjC,MAAAA,EAAO,YAAY,CAAC9lD,MAAyC;AAC3D,QAAAgmD,KAAA,QAAAA,EAAmB,KAAKF,GAAQ9lD,IAE5BA,EAAE,KAAK,OAAO+lD,MACZ/lD,EAAE,KAAK,SAAS,WAClB0F,EAAQ1F,EAAE,KAAK,MAAW,IACjBA,EAAE,KAAK,SAAS,WACzB2F,EAAO,IAAI,MAAM3F,EAAE,KAAK,KAAK,CAAC;AAAA,MAGpC,GAEA8lD,EAAO,YAAY;AAAA,QACjB,MAAM;AAAA,QACN,IAAIC;AAAA,QACJ,MAAArlC;AAAA,MAAA,CACsB;AAAA,IAC1B,CAAC;AAAA,IAEH,CAACilC,CAAS;AAAA,EAAA,GAINltB,IAASr5B,EAAY,MAAM;AAC/B,IAAImmD,EAAU,WAAWE,EAAe,YACtCF,EAAU,QAAQ,YAAY;AAAA,MAC5B,MAAM;AAAA,MACN,IAAIE,EAAe;AAAA,IAAA,CACpB,GACDA,EAAe,UAAU,MACzBxB,EAAgB,EAAK;AAAA,EAEzB,GAAG,CAAA,CAAE,GAGCgC,IAAY7mD,EAAY,MAAM;AAClC,IAAImmD,EAAU,YACZA,EAAU,QAAQ,UAAA,GAClBA,EAAU,UAAU,OAElBG,EAAe,WACjB,OAAO,aAAaA,EAAe,OAAO,GAE5CD,EAAe,UAAU,MACzBxB,EAAgB,EAAK;AAAA,EACvB,GAAG,CAAA,CAAE;AAGL,SAAAzkD,EAAU,MACD,MAAM;AACX,IAAAymD,EAAA;AAAA,EACF,GACC,CAACA,CAAS,CAAC,GAEP;AAAA,IACL,QAAA7lD;AAAA,IACA,cAAA4jD;AAAA,IACA,OAAAz+C;AAAA,IACA,SAAAsgD;AAAA,IACA,QAAAptB;AAAA,IACA,WAAAwtB;AAAA,EAAA;AAEJ;AA+BO,SAASC,GAAwCtqD,GAA0B;AAChF,QAAM;AAAA,IACJ,cAAAypD;AAAA,IACA,UAAAc,IAAW,UAAU,uBAAuB;AAAA,IAC5C,aAAAb,IAAc;AAAA,EAAA,IACZ1pD,GAEEwqD,IAAalnD,EAAuB,EAAE,GACtCmnD,IAAWnnD,EAA2B,EAAE,GACxCsmD,IAAYtmD,EAAO,CAAC,GACpBwmD,IAAiBxmD,EAAA,GAGjBonD,IAAelnD,EAAY,MAAc;AAC7C,QAAI,OAAOimD,KAAiB,YAAY;AACtC,YAAM7wB,IAAO,IAAI,KAAK,CAAC,IAAI6wB,EAAa,SAAA,CAAU,KAAK,GAAG,EAAE,MAAM,0BAA0B;AAC5F,aAAO,IAAI,OAAO,IAAI,gBAAgB7wB,CAAI,CAAC;AAAA,IAC7C;AACA,WAAO,IAAI,OAAO6wB,GAAc,EAAE,MAAM,UAAU;AAAA,EACpD,GAAG,CAACA,CAAY,CAAC,GAGXkB,IAAqBnnD,EAAY,MAA2B;AAEhE,UAAMonD,IAAOJ,EAAW,QAAQ,KAAK,CAACK,MAAM,CAACA,EAAE,IAAI;AACnD,QAAID;AACF,aAAOA;AAIT,QAAIJ,EAAW,QAAQ,SAASD,GAAU;AAExC,YAAMO,IAA6B;AAAA,QACjC,QAFaJ,EAAA;AAAA,QAGb,MAAM;AAAA,QACN,QAAQ;AAAA,MAAA;AAEV,aAAAF,EAAW,QAAQ,KAAKM,CAAY,GAC7BA;AAAA,IACT;AAEA,WAAO;AAAA,EACT,GAAG,CAACJ,GAAcH,CAAQ,CAAC,GAGrBQ,IAAevnD,EAAY,MAAM;AACrC,WAAOinD,EAAS,QAAQ,SAAS,KAAG;AAClC,YAAMO,IAAYL,EAAA;AAClB,UAAI,CAACK;AACH;AAGF,YAAMC,IAAOR,EAAS,QAAQ,MAAA;AAC9B,MAAAO,EAAU,OAAO,IACjBA,EAAU,SAASC,EAAK,IAExBD,EAAU,OAAO,YAAY,CAAC5mD,MAAyC;AACrE,cAAM0rB,IAAM1rB,EAAE;AAEd,QAAI0rB,EAAI,OAAOm7B,EAAK,OAIpBD,EAAU,OAAO,IACjBA,EAAU,SAAS,MAEfl7B,EAAI,SAAS,WACfm7B,EAAK,QAAQn7B,EAAI,MAAW,IACnBA,EAAI,SAAS,WACtBm7B,EAAK,OAAO,IAAI,MAAMn7B,EAAI,KAAK,CAAC,GAIlCi7B,EAAA,GACAf,EAAA;AAAA,MACF,GAEAgB,EAAU,OAAO,UAAU,CAAC5mD,MAAM;AAChC,QAAA4mD,EAAU,OAAO,IACjBA,EAAU,SAAS,MACnBC,EAAK,OAAO,IAAI,MAAM7mD,EAAE,OAAO,CAAC,GAChC2mD,EAAA;AAAA,MACF,GAEAC,EAAU,OAAO,YAAY;AAAA,QAC3B,MAAM;AAAA,QACN,IAAIC,EAAK;AAAA,QACT,MAAMA,EAAK;AAAA,MAAA,CACZ;AAAA,IACH;AAAA,EACF,GAAG,CAACN,CAAkB,CAAC,GAGjBX,IAAmBxmD,EAAY,MAAM;AACzC,IAAIsmD,EAAe,WACjB,OAAO,aAAaA,EAAe,OAAO,GAGxCJ,IAAc,MAChBI,EAAe,UAAU,OAAO,WAAW,MAAM;AAG/C,MADaU,EAAW,QAAQ,OAAO,CAACK,MAAM,CAACA,EAAE,IAAI,EAChD,QAAQ,CAACA,MAAM;AAClB,QAAAA,EAAE,OAAO,UAAA,GACTL,EAAW,UAAUA,EAAW,QAAQ,OAAO,CAACU,MAAMA,MAAML,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH,GAAGnB,CAAW;AAAA,EAElB,GAAG,CAACA,CAAW,CAAC,GAGVO,IAAUzmD;AAAA,IACd,CAACshB,MACQ,IAAI,QAAQ,CAAChb,GAASC,MAAW;AACtC,YAAMogD,IAAS,aAAa,EAAEP,EAAU,OAAO;AAE/C,MAAAa,EAAS,QAAQ,KAAK;AAAA,QACpB,IAAIN;AAAA,QACJ,MAAArlC;AAAA,QACA,SAAAhb;AAAA,QACA,QAAAC;AAAA,MAAA,CACD,GAEDghD,EAAA;AAAA,IACF,CAAC;AAAA,IAEH,CAACA,CAAY;AAAA,EAAA,GAITI,IAAa3nD;AAAA,IACjB,CAAC8X,MACQ,QAAQ,IAAIA,EAAM,IAAI,CAACI,MAASuuC,EAAQvuC,CAAI,CAAC,CAAC;AAAA,IAEvD,CAACuuC,CAAO;AAAA,EAAA,GAIJmB,IAAe5nD,EAAY,MAAM;AACrC,IAAAgnD,EAAW,QAAQ,QAAQ,CAACK,MAAMA,EAAE,OAAO,WAAW,GACtDL,EAAW,UAAU,CAAA,GACrBC,EAAS,UAAU,CAAA,GAEfX,EAAe,WACjB,OAAO,aAAaA,EAAe,OAAO;AAAA,EAE9C,GAAG,CAAA,CAAE,GAGCuB,IAAW7nD,EAAY,OACpB;AAAA,IACL,OAAOgnD,EAAW,QAAQ;AAAA,IAC1B,MAAMA,EAAW,QAAQ,OAAO,CAACK,MAAMA,EAAE,IAAI,EAAE;AAAA,IAC/C,MAAML,EAAW,QAAQ,OAAO,CAACK,MAAM,CAACA,EAAE,IAAI,EAAE;AAAA,IAChD,QAAQJ,EAAS,QAAQ;AAAA,EAAA,IAE1B,CAAA,CAAE;AAGL,SAAA7mD,EAAU,MACD,MAAM;AACX,IAAAwnD,EAAA;AAAA,EACF,GACC,CAACA,CAAY,CAAC,GAEV;AAAA,IACL,SAAAnB;AAAA,IACA,YAAAkB;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,EAAA;AAEJ;AAsBO,SAASC,GAAyBvD,GAAgC;AACvE,QAAMwD,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAMSxD,EAAU,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAmB1CnvB,IAAO,IAAI,KAAK,CAAC2yB,CAAU,GAAG,EAAE,MAAM,0BAA0B;AACtE,SAAO,IAAI,IAAI,IAAI,gBAAgB3yB,CAAI,CAAC;AAC1C;AASO,SAAS4yB,GAAiB1mC,GAA+B;AAC9D,QAAM2mC,IAAgC,CAAA,GAEhCC,IAAU,CAAC37B,MAAuB;AACtC,IAAIA,aAAe,eAERA,aAAe,cADxB07B,EAAc,KAAK17B,CAAG,IAItB,YAAaA,KACZA,EAAwB,kBAAkB,cAE3C07B,EAAc,KAAM17B,EAAwB,MAAM,IACzCA,aAAe,cACxB07B,EAAc,KAAK17B,CAAG,IACb,MAAM,QAAQA,CAAG,IAC1BA,EAAI,QAAQ27B,CAAO,IACV37B,KAAO,OAAOA,KAAQ,YAC/B,OAAO,OAAOA,CAAG,EAAE,QAAQ27B,CAAO;AAAA,EAEtC;AAEA,SAAAA,EAAQ5mC,CAAI,GACL2mC;AACT;AC9aO,SAASE,KAAuC;AACrD,QAAM/nB,wBAAY,QAAA;AAElB,SAAO;AAAA,IACL,KAAK,CAACrlC,MAA0BqlC,EAAM,IAAIrlC,CAAG;AAAA,IAC7C,KAAK,CAACA,GAAQgC,MAAmB;AAC/B,MAAAqjC,EAAM,IAAIrlC,GAAKgC,CAAK;AAAA,IACtB;AAAA,IACA,KAAK,CAAChC,MAAoBqlC,EAAM,IAAIrlC,CAAG;AAAA,IACvC,QAAQ,CAACA,MAAoBqlC,EAAM,OAAOrlC,CAAG;AAAA,EAAA;AAEjD;AAuBO,SAASqtD,GACdxjD,IAGI,IACJ;AACA,QAAM,EAAE,SAAA6B,IAAU,KAAM,KAAAq5B,EAAA,IAAQl7B,GAC1Bw7B,wBAAY,IAAA,GAEZioB,IAAY,CAACv9C,MACZg1B,IAGE,KAAK,IAAA,IAAQh1B,EAAM,YAAYg1B,IAF7B,IAKLwoB,IAAc,MAAY;AAC9B,QAAIloB,EAAM,QAAQ35B;AAChB;AAIF,UAAM8hD,IAAoB,CAAA;AAC1B,eAAW,CAACxtD,GAAK+P,CAAK,KAAKs1B,EAAM;AAI/B,WAHIioB,EAAUv9C,CAAK,KAAKs1B,EAAM,OAAOmoB,EAAa,SAAS9hD,MACzD8hD,EAAa,KAAKxtD,CAAG,GAEnBqlC,EAAM,OAAOmoB,EAAa,UAAU9hD;AACtC;AAIJ,IAAA8hD,EAAa,QAAQ,CAAC/gD,MAAM44B,EAAM,OAAO54B,CAAC,CAAC;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,KAAK,CAACzM,MAA0B;AAC9B,YAAM+P,IAAQs1B,EAAM,IAAIrlC,CAAG;AAC3B,UAAK+P,GAIL;AAAA,YAAIu9C,EAAUv9C,CAAK,GAAG;AACpB,UAAAs1B,EAAM,OAAOrlC,CAAG;AAChB;AAAA,QACF;AAGA,eAAAqlC,EAAM,OAAOrlC,CAAG,GAChBqlC,EAAM,IAAIrlC,GAAK,EAAE,GAAG+P,GAAO,WAAW,KAAK,IAAA,GAAO,GAE3CA,EAAM;AAAA;AAAA,IACf;AAAA,IAEA,KAAK,CAAC/P,GAAQgC,MAAmB;AAC/B,MAAAqjC,EAAM,OAAOrlC,CAAG,GAChBqlC,EAAM,IAAIrlC,GAAK,EAAE,OAAAgC,GAAO,WAAW,KAAK,IAAA,GAAO,GAC/CurD,EAAA;AAAA,IACF;AAAA,IAEA,KAAK,CAACvtD,MAAoB;AACxB,YAAM+P,IAAQs1B,EAAM,IAAIrlC,CAAG;AAC3B,aAAK+P,IAGDu9C,EAAUv9C,CAAK,KACjBs1B,EAAM,OAAOrlC,CAAG,GACT,MAEF,KANE;AAAA,IAOX;AAAA,IAEA,QAAQ,CAACA,MAAoBqlC,EAAM,OAAOrlC,CAAG;AAAA,IAE7C,OAAO,MAAYqlC,EAAM,MAAA;AAAA,IAEzB,MAAM,MAAcA,EAAM;AAAA,IAE1B,MAAM,MAAW,MAAM,KAAKA,EAAM,MAAM;AAAA,EAAA;AAE5C;AAiBO,SAASooB,KAA0C;AACxD,QAAMpoB,wBAAY,IAAA,GACZqoB,IAAW,IAAI,qBAAwB,CAAC1tD,MAAQ;AACpD,IAAAqlC,EAAM,OAAOrlC,CAAG;AAAA,EAClB,CAAC;AAED,SAAO;AAAA,IACL,KAAK,CAACA,MAA0B;AAC9B,YAAMiJ,IAAMo8B,EAAM,IAAIrlC,CAAG;AACzB,UAAI,CAACiJ;AACH;AAGF,YAAMjH,IAAQiH,EAAI,MAAA;AAClB,aAAIjH,MAAU,UACZqjC,EAAM,OAAOrlC,CAAG,GAGXgC;AAAA,IACT;AAAA,IAEA,KAAK,CAAChC,GAAQgC,MAAmB;AAC/B,YAAMgmB,IAAWqd,EAAM,IAAIrlC,CAAG;AAC9B,UAAIgoB,GAAU;AAEZ,cAAMqB,IAAWrB,EAAS,MAAA;AAC1B,QAAIqB,KACFqkC,EAAS,WAAWrkC,CAAQ;AAAA,MAEhC;AAEA,MAAAgc,EAAM,IAAIrlC,GAAK,IAAI,QAAQgC,CAAK,CAAC,GACjC0rD,EAAS,SAAS1rD,GAAOhC,GAAKgC,CAAK;AAAA,IACrC;AAAA,IAEA,KAAK,CAAChC,MAAoB;AACxB,YAAMiJ,IAAMo8B,EAAM,IAAIrlC,CAAG;AACzB,aAAKiJ,IAGEA,EAAI,YAAY,SAFd;AAAA,IAGX;AAAA,IAEA,QAAQ,CAACjJ,MAAoB;AAC3B,YAAMiJ,IAAMo8B,EAAM,IAAIrlC,CAAG;AACzB,UAAIiJ,GAAK;AACP,cAAMjH,IAAQiH,EAAI,MAAA;AAClB,QAAIjH,KACF0rD,EAAS,WAAW1rD,CAAK;AAAA,MAE7B;AACA,aAAOqjC,EAAM,OAAOrlC,CAAG;AAAA,IACzB;AAAA,IAEA,OAAO,MAAYqlC,EAAM,MAAA;AAAA,IAEzB,MAAM,MAAc;AAElB,UAAIoN,IAAQ;AACZ,iBAAWxpC,KAAOo8B,EAAM;AACtB,QAAIp8B,EAAI,MAAA,MAAY,UAClBwpC;AAGJ,aAAOA;AAAA,IACT;AAAA,EAAA;AAEJ;AA+BO,SAASkb,KAAgC;AAC9C,QAAM7/B,IAAe/oB,EAA6B,EAAE,GAE9C6oD,IAAM3oD;AAAA,IACV,CACEyY,GACAgD,GACA9Y,GACAiC,MACS;AACT,MAAA6T,EAAO,iBAAiBgD,GAAiB9Y,GAASiC,CAAO,GACzDikB,EAAa,QAAQ,KAAK;AAAA,QACxB,QAAApQ;AAAA,QACA,OAAAgD;AAAA,QACA,SAAA9Y;AAAA,QACA,SAAAiC;AAAA,MAAA,CACD;AAAA,IACH;AAAA,IACA,CAAA;AAAA,EAAC,GAGGgkD,IAAY5oD,EAAY,MAAY;AACxC,IAAA6oB,EAAa,QAAQ,QAAQ,CAAC,EAAE,QAAApQ,GAAQ,OAAAgD,GAAO,SAAA9Y,GAAS,SAAAiC,QAAc;AACpE,MAAA6T,EAAO,oBAAoBgD,GAAO9Y,GAASiC,CAAO;AAAA,IACpD,CAAC,GACDikB,EAAa,UAAU,CAAA;AAAA,EACzB,GAAG,CAAA,CAAE,GAEC2kB,IAAQxtC,EAAY,MACjB6oB,EAAa,QAAQ,QAC3B,CAAA,CAAE;AAGL,SAAAzoB,EAAU,MACD,MAAM;AACX,IAAAwoD,EAAA;AAAA,EACF,GACC,CAACA,CAAS,CAAC,GAEP,EAAE,KAAAD,GAAK,WAAAC,GAAW,OAAApb,EAAA;AAC3B;AAKO,SAASqb,KAA6D;AAC3E,QAAMnnB,IAAkC,CAAA;AAExC,SAAO;AAAA,IACL,KAAK,CACHjpB,GACAgD,GACA9Y,GACAiC,MACS;AACT,MAAA6T,EAAO,iBAAiBgD,GAAiB9Y,GAASiC,CAAO,GACzD88B,EAAU,KAAK,EAAE,QAAAjpB,GAAQ,OAAAgD,GAAwB,SAAA9Y,GAAS,SAAAiC,GAAS;AAAA,IACrE;AAAA,IAEA,WAAW,MAAY;AACrB,MAAA88B,EAAU,QAAQ,CAAC,EAAE,QAAAjpB,GAAQ,OAAAgD,GAAO,SAAA9Y,GAAS,SAAAiC,QAAc;AACzD,QAAA6T,EAAO,oBAAoBgD,GAAO9Y,GAASiC,CAAO;AAAA,MACpD,CAAC,GACD88B,EAAU,SAAS;AAAA,IACrB;AAAA,IAEA,OAAO,MAAcA,EAAU;AAAA,IAE/B,SAAS,MAAY;AACnB,MAAAA,EAAU,QAAQ,CAAC,EAAE,QAAAjpB,GAAQ,OAAAgD,GAAO,SAAA9Y,GAAS,SAAAiC,QAAc;AACzD,QAAA6T,EAAO,oBAAoBgD,GAAO9Y,GAASiC,CAAO;AAAA,MACpD,CAAC,GACD88B,EAAU,SAAS;AAAA,IACrB;AAAA,EAAA;AAEJ;AAeO,SAASonB,KAA8B;AAC5C,QAAMt+B,IAAc,OAAO;AAE3B,MAAI,CAACA,EAAY;AACf,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAIjB,QAAM,EAAE,iBAAAu+B,GAAiB,iBAAAC,GAAiB,gBAAAC,EAAA,IAAmBz+B,EAAY;AAEzE,SAAO;AAAA,IACL,iBAAAu+B;AAAA,IACA,iBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,aAAcA,IAAiBF,IAAmB;AAAA,IAClD,aAAa;AAAA,EAAA;AAEjB;AAmBO,SAASG,GACdtkD,IAII,IACJ;AACA,QAAM,EAAE,kBAAAukD,IAAmB,IAAI,cAAAjkB,IAAe,KAAO,aAAAkkB,MAAgBxkD,GAE/D,CAAC4gB,GAAOqB,CAAQ,IAAIjnB,EAAsBkpD,EAAc,GACxD,CAACO,GAAaC,CAAc,IAAI1pD,EAAS,EAAK;AAEpD,SAAAQ,EAAU,MAAM;AAEd,QAAI,CADiB0oD,GAAA,EACH;AAChB;AAGF,UAAMhlD,IAAQ,YAAY,MAAM;AAC9B,YAAMylD,IAAWT,GAAA;AACjB,MAAAjiC,EAAS0iC,CAAQ;AAEjB,YAAMC,IAAYD,EAAS,cAAcJ;AACzC,MAAAG,EAAeE,CAAS,GAEpBA,KAAaJ,KACfA,EAAYG,CAAQ;AAAA,IAExB,GAAGrkB,CAAY;AAEf,WAAO,MAAM,cAAcphC,CAAK;AAAA,EAClC,GAAG,CAACqlD,GAAkBjkB,GAAckkB,CAAW,CAAC,GAEzC,EAAE,OAAA5jC,GAAO,aAAA6jC,EAAA;AAClB;AAoCO,SAASI,GAAa7kD,GAA6C;AACxE,QAAM,EAAE,KAAA8kD,GAAK,YAAAC,IAAa,SAAS,WAAAt6C,IAAY,GAAG,aAAA/O,GAAa,aAAAspD,MAAgBhlD,GAEzEZ,IAAMlE,EAAyB,IAAI,GACnC,CAAC+pD,GAAUC,CAAW,IAAIlqD,EAAS,EAAK,GACxC,CAACmqD,GAAUC,CAAW,IAAIpqD,EAAS,EAAK,GACxC,CAACqqD,GAAYC,CAAa,IAAItqD,EAASU,KAAe,EAAE;AAE9D,SAAAF,EAAU,MAAM;AACd,UAAMlD,IAAU8G,EAAI;AACpB,QAAI,CAAC9G;AACH;AAGF,UAAM2N,IAAW,IAAI;AAAA,MACnB,CAAC,CAACC,CAAK,MAAM;AACX,QAAIA,EAAM,mBACRg/C,EAAY,EAAI,GAChBj/C,EAAS,WAAA;AAAA,MAEb;AAAA,MACA,EAAE,YAAA8+C,GAAY,WAAAt6C,EAAA;AAAA,IAAU;AAG1B,WAAAxE,EAAS,QAAQ3N,CAAO,GAEjB,MAAM2N,EAAS,WAAA;AAAA,EACxB,GAAG,CAAC8+C,GAAYt6C,CAAS,CAAC,GAE1BjP,EAAU,MAAM;AACd,QAAI,CAACypD;AACH;AAGF,UAAMxjD,IAAM,IAAI,MAAA;AAEhB,WAAAA,EAAI,SAAS,MAAM;AACjB,MAAA6jD,EAAcR,CAAG,GACjBM,EAAY,EAAI;AAAA,IAClB,GAEA3jD,EAAI,MAAMqjD,GAEH,MAAM;AACX,MAAArjD,EAAI,SAAS;AAAA,IACf;AAAA,EACF,GAAG,CAACwjD,GAAUH,GAAKE,CAAW,CAAC,GAExB;AAAA,IACL,KAAA5lD;AAAA,IACA,UAAA6lD;AAAA,IACA,UAAAE;AAAA,IACA,YAAAE;AAAA,EAAA;AAEJ;AAwBO,SAASE,GAAoBvlD,GAIjC;AACD,QAAM,EAAE,QAAAwlD,GAAQ,OAAApoB,GAAO,SAAAv7B,IAAU,QAAQ7B,GACnCylD,IAAY,CAAA;AAElB,SAAO;AAAA,IACL,SAAS,MACHA,EAAK,SAAS,IACTA,EAAK,IAAA,IAEPD,EAAA;AAAA,IAGT,SAAS,CAAC79B,MAAiB;AACzB,MAAI89B,EAAK,SAAS5jD,MACZu7B,KACFA,EAAMzV,CAAG,GAEX89B,EAAK,KAAK99B,CAAG;AAAA,IAGjB;AAAA,IAEA,aAAa,CAACihB,MAAwB;AACpC,YAAM8c,IAAS,KAAK,IAAI9c,GAAO/mC,IAAU4jD,EAAK,MAAM;AACpD,eAASvjD,IAAI,GAAGA,IAAIwjD,GAAQxjD;AAC1B,QAAAujD,EAAK,KAAKD,GAAQ;AAAA,IAEtB;AAAA,IAEA,OAAO,MAAY;AACjB,MAAAC,EAAK,SAAS;AAAA,IAChB;AAAA,IAEA,MAAM,MAAcA,EAAK;AAAA,EAAA;AAE7B;AC1jBA,MAAME,KAAgD;AAAA,EACpD,MAAM;AAAA,EACN,MAAM;AACR;AAKA,eAAsBC,GAAmB7hB,GAA2C;AAClF,MAAI4hB,GAAc5hB,CAAM,MAAM;AAC5B,WAAO4hB,GAAc5hB,CAAM;AAG7B,QAAM8hB,IAAqC;AAAA,IACzC,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAGR,SAAO,IAAI,QAAQ,CAACnkD,MAAY;AAC9B,UAAMD,IAAM,IAAI,MAAA;AAChB,IAAAA,EAAI,SAAS,MAAM;AACjB,MAAAkkD,GAAc5hB,CAAM,IAAItiC,EAAI,QAAQ,KAAKA,EAAI,SAAS,GACtDC,EAAQikD,GAAc5hB,CAAM,CAAE;AAAA,IAChC,GACAtiC,EAAI,UAAU,MAAM;AAClB,MAAAkkD,GAAc5hB,CAAM,IAAI,IACxBriC,EAAQ,EAAK;AAAA,IACf,GACAD,EAAI,MAAMokD,EAAW9hB,CAAM;AAAA,EAC7B,CAAC;AACH;AAKO,SAAS+hB,KAAkB;AAChC,QAAM,CAACC,GAASC,CAAU,IAAIhrD,EAAkC;AAAA,IAC9D,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA,CACN,GACK,CAACirD,GAAYC,CAAa,IAAIlrD,EAAS,EAAI;AAEjD,SAAAQ,EAAU,MAAM;AACd,YAAQ,IAAI,CAACoqD,GAAmB,MAAM,GAAGA,GAAmB,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAACO,GAAMC,CAAI,MAAM;AAC3F,MAAAJ,EAAW,CAACptB,OAAO,EAAE,GAAGA,GAAG,MAAAutB,GAAM,MAAAC,IAAO,GACxCF,EAAc,EAAK;AAAA,IACrB,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAEE,EAAE,SAAAH,GAAS,YAAAE,EAAA;AACpB;AASO,SAASI,GAAeC,GAA0C;AACvE,SAAOA,EAAQ,IAAI,CAACviD,MAAM,GAAGA,EAAE,GAAG,IAAIA,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI;AAC7D;AAKO,SAASwiD,GACd5hD,GACA6hD,GACQ;AACR,QAAMvyC,IAAQtP,EAAY,IAAI,CAACQ,MAAO,eAAeA,EAAG,QAAQ,OAAOA,EAAG,IAAI,EAAE;AAChF,SAAA8O,EAAM,KAAKuyC,CAAW,GACfvyC,EAAM,KAAK,IAAI;AACxB;AAKO,SAASwyC,GACdH,GACAlJ,GACAsJ,IAAc,OAAO,kBACE;AACvB,QAAMC,IAAcvJ,IAAiBsJ,GAG/BE,IAAS,CAAC,GAAGN,CAAO,EAAE,KAAK,CAAC/rD,GAAGtB,MAAMsB,EAAE,QAAQtB,EAAE,KAAK;AAG5D,aAAW24B,KAAUg1B;AACnB,QAAIh1B,EAAO,SAAS+0B;AAClB,aAAO/0B;AAKX,SAAOg1B,EAAOA,EAAO,SAAS,CAAC;AACjC;AA6BO,SAASC,GAAoBjvD,GAA2C;AAC7E,QAAM;AAAA,IACJ,KAAAktD;AAAA,IACA,MAAAgC;AAAA,IACA,YAAA/B,IAAa;AAAA,IACb,WAAAt6C,IAAY;AAAA,IACZ,YAAAs8C,IAAa;AAAA,IACb,OAAApqC,IAAQ;AAAA,IACR,UAAAzK,IAAW;AAAA,IACX,QAAA80C;AAAA,IACA,SAAAC;AAAA,EAAA,IACErvD,GAEEwH,IAAMlE,EAAyB,IAAI,GACnC,CAACmN,GAAOC,CAAQ,IAAItN,EAAgC;AAAA,IACxD,YAAY8rD,KAAQ;AAAA,IACpB,cAAcA,KAAQ;AAAA,IACtB,SAAShC;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EAAA,CACR;AAGD,EAAAtpD,EAAU,MAAM;AACd,QAAI0W,MAAa,QAAQ;AACvB,MAAA5J,EAAS,CAACvE,OAAO,EAAE,GAAGA,GAAG,UAAU,KAAO;AAC1C;AAAA,IACF;AAEA,UAAMzL,IAAU8G,EAAI;AACpB,QAAI,CAAC9G;AACH;AAGF,UAAM2N,IAAW,IAAI;AAAA,MACnB,CAAC,CAACC,CAAK,MAAM;AACX,QAAIA,EAAM,mBACRoC,EAAS,CAACvE,OAAO,EAAE,GAAGA,GAAG,UAAU,KAAO,GAC1CkC,EAAS,WAAA;AAAA,MAEb;AAAA,MACA,EAAE,YAAA8+C,GAAY,WAAAt6C,EAAA;AAAA,IAAU;AAG1B,WAAAxE,EAAS,QAAQ3N,CAAO,GACjB,MAAM2N,EAAS,WAAA;AAAA,EACxB,GAAG,CAAC8+C,GAAYt6C,GAAWyH,CAAQ,CAAC,GAGpC1W,EAAU,MAAM;AACd,QAAI,CAAC6M,EAAM,YAAYA,EAAM;AAC3B;AAGF,IAAAC,EAAS,CAACvE,OAAO,EAAE,GAAGA,GAAG,OAAO+iD,IAAO,cAAc,UAAA,EAAY;AAEjE,UAAMI,IAAYvqC,IAAQ,IAAI,WAAWwqC,GAAWxqC,CAAK,IAAI;AAC7D,IAAKuqC,KACHC,EAAA;AAGF,aAASA,IAAY;AACnB,YAAM1lD,IAAM,IAAI,MAAA;AAEhB,MAAAA,EAAI,SAAS,MAAM;AACjB,QAAA6G,EAAS,CAACvE,OAAO;AAAA,UACf,GAAGA;AAAA,UACH,YAAY+gD;AAAA,UACZ,OAAO;AAAA,UACP,UAAU;AAAA,QAAA,EACV,GACFkC,KAAA,QAAAA;AAAA,MACF,GAEAvlD,EAAI,UAAU,MAAM;AAClB,cAAMF,IAAQ,IAAI,MAAM,yBAAyBujD,CAAG,EAAE;AACtD,QAAAx8C,EAAS,CAACvE,OAAO;AAAA,UACf,GAAGA;AAAA,UACH,OAAO;AAAA,UACP,OAAAxC;AAAA,QAAA,EACA,GACF0lD,KAAA,QAAAA,EAAU1lD;AAAA,MACZ,GAEAE,EAAI,MAAMqjD;AAAA,IACZ;AAEA,WAAO,MAAM;AACX,MAAIoC,KACF,aAAaA,CAAS;AAAA,IAE1B;AAAA,EACF,GAAG,CAAC7+C,EAAM,UAAUA,EAAM,UAAUy8C,GAAKgC,GAAMnqC,GAAOqqC,GAAQC,CAAO,CAAC;AAGtE,QAAM1tD,IAA6B;AAAA,IACjC,QAAQ8O,EAAM,UAAU,cAAc,QAAQ0+C,CAAU,QAAQ;AAAA,IAChE,YAAY;AAAA,IACZ,GAAI1+C,EAAM,UAAU,eAAe;AAAA,MACjC,WAAW;AAAA;AAAA,IAAA;AAAA,EACb;AAGF,SAAO;AAAA,IACL,KAAAjJ;AAAA,IACA,GAAGiJ;AAAA,IACH,OAAA9O;AAAA,EAAA;AAEJ;AASO,SAAS6tD,GAAcC,GAAiC;AAC7D,SAAO,QAAQ;AAAA,IACbA,EAAK;AAAA,MACH,CAAC/qD,MACC,IAAI,QAAc,CAACoF,GAASC,MAAW;AACrC,cAAMF,IAAM,IAAI,MAAA;AAChB,QAAAA,EAAI,SAAS,MAAMC,EAAA,GACnBD,EAAI,UAAU,MAAME,EAAO,IAAI,MAAM,sBAAsBrF,CAAG,EAAE,CAAC,GACjEmF,EAAI,MAAMnF;AAAA,MACZ,CAAC;AAAA,IAAA;AAAA,EACL;AAEJ;AAKO,SAASgrD,GAAgBD,GAAgB;AAC9C,QAAM,CAACh/C,GAAOC,CAAQ,IAAItN,EAKvB;AAAA,IACD,QAAQ;AAAA,IACR,OAAOqsD,EAAK;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ,CAAA;AAAA,EAAC,CACV;AAED,SAAA7rD,EAAU,MAAM;AACd,QAAI6rD,EAAK,WAAW,GAAG;AACrB,MAAA/+C,EAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,YAAY,IAAM,QAAQ,CAAA,GAAI;AAC9D;AAAA,IACF;AAEA,QAAIi/C,IAAS;AACb,UAAMrjB,IAAmB,CAAA;AAEzB,IAAAmjB,EAAK,QAAQ,CAAC/qD,MAAQ;AACpB,YAAMmF,IAAM,IAAI,MAAA;AAChB,MAAAA,EAAI,SAAS,MAAM;AACjB,QAAA8lD,KACAC,EAAA;AAAA,MACF,GACA/lD,EAAI,UAAU,MAAM;AAClB,QAAA8lD,KACArjB,EAAO,KAAK5nC,CAAG,GACfkrD,EAAA;AAAA,MACF,GACA/lD,EAAI,MAAMnF;AAAA,IACZ,CAAC;AAED,aAASkrD,IAAc;AACrB,MAAAl/C,EAAS;AAAA,QACP,QAAAi/C;AAAA,QACA,OAAOF,EAAK;AAAA,QACZ,YAAYE,MAAWF,EAAK;AAAA,QAC5B,QAAAnjB;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EACF,GAAG,CAACmjB,CAAI,CAAC,GAEFh/C;AACT;AASA,eAAsBo/C,GAAmB3C,GAAwC;AAC/E,QAAMrjD,IAAM,IAAI,MAAA;AAChB,SAAAA,EAAI,MAAMqjD,GAGN,OAAOrjD,EAAI,UAAW,aACxB,MAAMA,EAAI,OAAA,IAGV,MAAM,IAAI,QAAc,CAACC,GAASC,MAAW;AAC1C,IAAAF,EAAyB,SAAS,MAAMC,EAAA,GACxCD,EAAyB,UAAU,MAAME,EAAO,IAAI,MAAM,mBAAmBmjD,CAAG,EAAE,CAAC;AAAA,EACtF,CAAC,GAGIrjD;AACT;AAKO,SAASimD,GAAgB5C,GAAoB;AAClD,QAAM,CAAC6C,GAAOC,CAAQ,IAAI5sD,EAAkC,IAAI,GAC1D,CAACuzB,GAAWC,CAAY,IAAIxzB,EAAS,EAAK,GAC1C,CAACuG,GAAOC,CAAQ,IAAIxG,EAAuB,IAAI;AAErD,SAAAQ,EAAU,MAAM;AACd,QAAI,CAACspD,GAAK;AACR,MAAA8C,EAAS,IAAI;AACb;AAAA,IACF;AAEA,QAAIC,IAAY;AAChB,WAAAr5B,EAAa,EAAI,GACjBhtB,EAAS,IAAI,GAEbimD,GAAmB3C,CAAG,EACnB,KAAK,CAACrjD,MAAQ;AACb,MAAKomD,MACHD,EAASnmD,CAAG,GACZ+sB,EAAa,EAAK;AAAA,IAEtB,CAAC,EACA,MAAM,CAACvS,MAAQ;AACd,MAAK4rC,MACHrmD,EAASya,CAAG,GACZuS,EAAa,EAAK;AAAA,IAEtB,CAAC,GAEI,MAAM;AACX,MAAAq5B,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC/C,CAAG,CAAC,GAED,EAAE,OAAA6C,GAAO,WAAAp5B,GAAW,OAAAhtB,EAAA;AAC7B;AAYO,SAASumD,GAAoB9nD,IAAoC,IAItE;AACA,QAAM+nD,wBAAgB,IAAA,GAEhB9hD,IAAW,IAAI,qBAAqB,CAAC6U,MAAY;AACrD,IAAAA,EAAQ,QAAQ,CAAC5U,MAAU;AACzB,YAAM5H,IAAWypD,EAAU,IAAI7hD,EAAM,MAAM;AAC3C,MAAI5H,KAAY4H,EAAM,kBACpB5H,EAAS4H,CAAK;AAAA,IAElB,CAAC;AAAA,EACH,GAAGlG,CAAO;AAEV,SAAO;AAAA,IACL,SAAS,CAAC1H,GAAkBgG,MAA+B;AACzD,MAAAypD,EAAU,IAAIzvD,GAASgG,CAAQ,GAC/B2H,EAAS,QAAQ3N,CAAO;AAAA,IAC1B;AAAA,IACA,WAAW,CAACA,MAAqB;AAC/B,MAAAyvD,EAAU,OAAOzvD,CAAO,GACxB2N,EAAS,UAAU3N,CAAO;AAAA,IAC5B;AAAA,IACA,YAAY,MAAM;AAChB,MAAAyvD,EAAU,MAAA,GACV9hD,EAAS,WAAA;AAAA,IACX;AAAA,EAAA;AAEJ;AAKO,SAAS+hD,GACd/hD,GACAgiD,GACA;AACA,QAAM7oD,IAAMlE,EAAyB,IAAI,GACnC,CAAC+pD,GAAUC,CAAW,IAAIlqD,EAAS,EAAK;AAE9C,SAAAQ,EAAU,MAAM;AACd,UAAMlD,IAAU8G,EAAI;AACpB,QAAK9G;AAIL,aAAA2N,EAAS,QAAQ3N,GAAS,MAAM;AAC9B,QAAA4sD,EAAY,EAAI,GAChB+C,EAAA,GACAhiD,EAAS,UAAU3N,CAAO;AAAA,MAC5B,CAAC,GAEM,MAAM;AACX,QAAA2N,EAAS,UAAU3N,CAAO;AAAA,MAC5B;AAAA,EACF,GAAG,CAAC2N,GAAUgiD,CAAW,CAAC,GAEnB,EAAE,KAAA7oD,GAAK,UAAA6lD,EAAA;AAChB;AASO,SAASiD,GAAyBnxD,GAAe6N,IAAQ,IAAIuB,IAAS,IAAY;AACvF,QAAMyT,IAAM,kDAAkDhV,CAAK,aAAauB,CAAM,4CAA4CpP,CAAK;AACvI,SAAO,sBAAsB,mBAAmB6iB,CAAG,CAAC;AACtD;AAKO,SAASuuC,GACdhnD,GACAqI,IAAuC,YACvC5E,IAAQ,IACRuB,IAAS,IACD;AAKR,QAAMyT,IAAM,kDAAkDhV,CAAK,aAAauB,CAAM;AAAA;AAAA,mDAH3EqD,MAAc,eAAe,SAAS,IAKc,SAJpDA,MAAc,aAAa,SAAS,IAI2B;AAAA,8CAC9BrI,EAAO,CAAC,CAAC;AAAA,gDACPA,EAAO,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAMvD,SAAO,sBAAsB,mBAAmByY,CAAG,CAAC;AACtD;AAMO,MAAMwuC,KAAoB;AAAA;AAAA,EAE/B,oBAAAxC;AAAA,EACA,iBAAAE;AAAA;AAAA,EAEA,gBAAAO;AAAA,EACA,eAAAE;AAAA,EACA,qBAAAE;AAAA;AAAA,EAEA,qBAAAI;AAAA;AAAA,EAEA,eAAAO;AAAA,EACA,iBAAAE;AAAA;AAAA,EAEA,oBAAAG;AAAA,EACA,iBAAAC;AAAA;AAAA,EAEA,qBAAAI;AAAA,EACA,wBAAAE;AAAA;AAAA,EAEA,0BAAAE;AAAA,EACA,6BAAAC;AACF;"}