@avora-labs/meta-forge 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"avora-labs-meta-forge.mjs","sources":["../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/action.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/condition.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/guard.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/api.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/layout.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/form.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/table.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/section.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/page.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/plugin.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/meta.types.ts","../../../projects/avora-meta-forge/src/lib/core/notifications/notification.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/services/meta-state.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/services/meta-api.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/condition-evaluator.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/services/amf-dialog.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/action-dispatcher.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/component-registry.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-page.component.ts","../../../projects/avora-meta-forge/src/lib/core/auth/auth.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/plugins/plugin-registry.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-guard.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-router.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-section.interface.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/amf.routes.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/accordion-section.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/meta-modal-host.component.ts","../../../projects/avora-meta-forge/src/lib/core/icons/icon-registry.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/amf-dialog-host.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/amf-drawer-host.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/validator-factory.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/repeater-field.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/field-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/form-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/stepper-form-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/table/cell-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/table/table-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/card/card-section.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/stats-grid/stats-grid-section.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/page-header/page-header-section.component.ts","../../../projects/avora-meta-forge/src/lib/layout/api/navigation.service.ts","../../../projects/avora-meta-forge/src/lib/core/config/layout-type.enum.ts","../../../projects/avora-meta-forge/src/lib/core/config/app-config.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/avora-meta-forge.provider.ts","../../../projects/avora-meta-forge/src/lib/core/auth/auth.guard.ts","../../../projects/avora-meta-forge/src/lib/core/auth/auth.interceptor.ts","../../../projects/avora-meta-forge/src/lib/core/config/theme.service.ts","../../../projects/avora-meta-forge/src/lib/layout/common/sidebar/sidebar.component.ts","../../../projects/avora-meta-forge/src/lib/layout/common/navbar/navbar.component.ts","../../../projects/avora-meta-forge/src/lib/layout/common/footer/footer.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/vertical/vertical-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/horizontal/horizontal-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/empty/empty-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/centered/centered-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/two-column/two-column-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/dashboard-grid/dashboard-grid-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/compact/compact-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/common/notifications/notification-container.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layout.component.ts","../../../projects/avora-meta-forge/src/public-api.ts","../../../projects/avora-meta-forge/src/avora-labs-meta-forge.ts"],"sourcesContent":["/**\n * AvoraMetaForge — Action Metadata\n *\n * Comprehensive action system supporting 25+ action types covering:\n * - Navigation, API calls, UI state, modals/drawers\n * - Form manipulation, table control, clipboard, downloads\n * - State management, storage, conditional branching, scripting\n * - Parallel dispatch, delay, logging, context transforms\n */\n\n/** HTTP methods — all standard methods supported */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\n/** All built-in action types */\nexport type ActionType =\n | 'navigate' // Route navigation\n | 'api' // HTTP API call\n | 'notify' // Toast / snackbar notification\n | 'emit' // Event bus emission\n | 'confirm' // Confirmation dialog with branching\n | 'open-modal' // Open a modal/dialog\n | 'close-modal' // Close modal/dialog\n | 'open-drawer' // Open side drawer\n | 'close-drawer' // Close side drawer\n | 'set-state' // Write to reactive state store\n | 'clear-state' // Remove key from state store\n | 'reset-form' // Reset a specific form\n | 'patch-form' // Update form field values\n | 'submit-form' // Programmatically submit a form\n | 'reload-table' // Refresh a table's data\n | 'scroll-to' // Scroll to element or position\n | 'set-loading' // Show loading spinner\n | 'clear-loading' // Hide loading spinner\n | 'download-file' // Trigger file download (blob)\n | 'copy-to-clipboard' // Copy text to clipboard\n | 'open-url' // Open external URL (new tab / same tab)\n | 'set-storage' // Write to localStorage / sessionStorage\n | 'remove-storage' // Remove from localStorage / sessionStorage\n | 'dispatch-multiple' // Fan-out to multiple actions (parallel / sequential)\n | 'delay' // Pause execution chain\n | 'conditional' // Evaluate condition and branch\n | 'for-each' // Iterate and dispatch per item\n | 'transform-context' // Reshape context before passing to next action\n | 'log' // Console log for debugging action chains\n | 'print' // Print page or element\n | 'focus' // Focus an input element\n | 'blur' // Blur (unfocus) an input element\n | 'toggle-class' // Add/remove CSS class on element\n | 'set-title' // Change page title dynamically\n | 'go-back' // Browser history back\n | 'go-forward' // Browser history forward\n | 'reload-page' // Full page reload\n | 'store-data' // Legacy demo store\n | 'custom'; // Escape hatch for user-defined actions\n\n/**\n * Represents a declarative action that the framework can execute.\n * Actions are chainable via `then` and `onError`, and can fan-out via `dispatch-multiple`.\n */\nexport interface ActionMeta {\n /** The action type — built-in or custom string */\n type: ActionType | string;\n\n /** Configuration object — shape depends on `type` */\n config: NavigateActionConfig\n | ApiActionConfig\n | NotifyActionConfig\n | EmitActionConfig\n | ConfirmActionConfig\n | ModalActionConfig\n | DrawerActionConfig\n | SetStateActionConfig\n | ClearStateActionConfig\n | ResetFormActionConfig\n | PatchFormActionConfig\n | SubmitFormActionConfig\n | ReloadTableActionConfig\n | ScrollToActionConfig\n | LoadingActionConfig\n | DownloadFileActionConfig\n | CopyToClipboardActionConfig\n | OpenUrlActionConfig\n | StorageActionConfig\n | DispatchMultipleActionConfig\n | DelayActionConfig\n | ConditionalActionConfig\n | ForEachActionConfig\n | TransformContextActionConfig\n | LogActionConfig\n | PrintActionConfig\n | FocusActionConfig\n | ToggleClassActionConfig\n | SetTitleActionConfig\n | Record<string, any>;\n\n /** Action to execute after this one succeeds */\n then?: ActionMeta;\n\n /** Action to execute if this one fails */\n onError?: ActionMeta;\n\n /** Human-readable description for devtools / debugging */\n description?: string;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Navigation\n// ──────────────────────────────────────────────────────────────\nexport interface NavigateActionConfig {\n path: string;\n params?: Record<string, string>;\n queryParams?: Record<string, string>;\n replaceUrl?: boolean;\n fragment?: string;\n relativeTo?: boolean;\n skipLocationChange?: boolean;\n /** Pass state data via navigation extras */\n state?: Record<string, any>;\n}\n\n// ──────────────────────────────────────────────────────────────\n// API\n// ──────────────────────────────────────────────────────────────\nexport interface ApiActionConfig {\n /** Reference to registered endpoint by ID */\n endpointId?: string;\n /** Inline URL (alternative to endpointId) */\n url?: string;\n method?: HttpMethod;\n body?: Record<string, any> | string | 'formValue';\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n pathParams?: Record<string, string>;\n /** Response type control */\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n /** Store response in context under this key */\n storeResultAs?: string;\n /** Store response in MetaStateService under this key */\n storeInState?: string;\n /** Map status codes to error actions */\n errorMap?: Record<number, ActionMeta>;\n /** Use mock data instead of live call */\n mock?: boolean;\n mockData?: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Notifications\n// ──────────────────────────────────────────────────────────────\nexport interface NotifyActionConfig {\n type: 'success' | 'error' | 'warning' | 'info';\n message: string;\n title?: string;\n duration?: number;\n dismissible?: boolean;\n /** Action to run when notification is clicked */\n onClick?: ActionMeta;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Event Bus\n// ──────────────────────────────────────────────────────────────\nexport interface EmitActionConfig {\n event: string;\n payload?: any;\n /** Whether to include current context as payload automatically */\n includeContext?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Confirmation Dialog\n// ──────────────────────────────────────────────────────────────\nexport interface ConfirmActionConfig {\n title?: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: 'info' | 'warning' | 'danger';\n onConfirm: ActionMeta;\n onCancel?: ActionMeta;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Modal / Drawer\n// ──────────────────────────────────────────────────────────────\nexport interface ModalActionConfig {\n modalId?: string;\n title?: string;\n /** Section to render inside the modal */\n section?: import('./section.meta').SectionMeta;\n /** Custom component key to render */\n componentKey?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n closable?: boolean;\n data?: Record<string, any>;\n onClose?: ActionMeta;\n}\n\nexport interface DrawerActionConfig {\n drawerId?: string;\n title?: string;\n section?: import('./section.meta').SectionMeta;\n componentKey?: string;\n position?: 'left' | 'right';\n width?: string;\n closable?: boolean;\n data?: Record<string, any>;\n onClose?: ActionMeta;\n}\n\n// ──────────────────────────────────────────────────────────────\n// State Management\n// ──────────────────────────────────────────────────────────────\nexport interface SetStateActionConfig {\n key: string;\n /** Value to set — can be literal or 'fromContext:path.to.value' */\n value: any;\n /** Merge with existing value (for objects) instead of replacing */\n merge?: boolean;\n /** Persist to localStorage */\n persist?: boolean;\n}\n\nexport interface ClearStateActionConfig {\n key: string;\n /** Clear from persistence too */\n clearPersisted?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Form Manipulation\n// ──────────────────────────────────────────────────────────────\nexport interface ResetFormActionConfig {\n /** ID of the form to reset — matches SectionMeta id or form container */\n formId?: string;\n /** Reset to initial values instead of empty */\n toInitialValues?: boolean;\n}\n\nexport interface PatchFormActionConfig {\n formId?: string;\n /** Key-value pairs to patch into the form */\n values: Record<string, any>;\n /** If true, values come from state store keys */\n fromState?: boolean;\n}\n\nexport interface SubmitFormActionConfig {\n formId?: string;\n /** Force submit even if invalid */\n force?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Table Control\n// ──────────────────────────────────────────────────────────────\nexport interface ReloadTableActionConfig {\n tableId?: string;\n /** Reset page to 1 on reload */\n resetPage?: boolean;\n /** Clear search/filter on reload */\n clearFilters?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Scroll / Focus / UI\n// ──────────────────────────────────────────────────────────────\nexport interface ScrollToActionConfig {\n /** CSS selector or element ID */\n target?: string;\n /** Pixel offset from top */\n top?: number;\n behavior?: 'smooth' | 'instant' | 'auto';\n block?: 'start' | 'center' | 'end' | 'nearest';\n}\n\nexport interface LoadingActionConfig {\n /** Loading key (allows multiple concurrent loaders) */\n key?: string;\n message?: string;\n}\n\nexport interface FocusActionConfig {\n /** CSS selector or element ID */\n target: string;\n}\n\nexport interface ToggleClassActionConfig {\n /** CSS selector or element ID */\n target: string;\n className: string;\n action: 'add' | 'remove' | 'toggle';\n}\n\nexport interface SetTitleActionConfig {\n title: string;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Download / Clipboard / URL\n// ──────────────────────────────────────────────────────────────\nexport interface DownloadFileActionConfig {\n /** URL to download from */\n url?: string;\n /** Endpoint ID to call (returns blob) */\n endpointId?: string;\n /** Filename for the downloaded file */\n filename?: string;\n /** MIME type hint */\n mimeType?: string;\n /** Content to download as string (for generated files) */\n content?: string;\n}\n\nexport interface CopyToClipboardActionConfig {\n /** Literal text, or 'fromContext:path.to.value' to extract from context */\n text: string;\n /** Notification on success */\n successMessage?: string;\n}\n\nexport interface OpenUrlActionConfig {\n url: string;\n target?: '_blank' | '_self' | '_parent' | '_top';\n features?: string; // window.open features string\n}\n\n// ──────────────────────────────────────────────────────────────\n// Storage (localStorage / sessionStorage)\n// ──────────────────────────────────────────────────────────────\nexport interface StorageActionConfig {\n storage: 'local' | 'session';\n key: string;\n /** Value to store. 'fromContext:path' to extract from context */\n value?: any;\n /** For remove-storage, no value needed */\n}\n\n// ──────────────────────────────────────────────────────────────\n// Flow Control\n// ──────────────────────────────────────────────────────────────\nexport interface DispatchMultipleActionConfig {\n actions: ActionMeta[];\n /** Run in parallel or sequentially */\n mode?: 'parallel' | 'sequential';\n /** Stop on first error (sequential mode only) */\n stopOnError?: boolean;\n}\n\nexport interface DelayActionConfig {\n /** Delay in milliseconds */\n duration: number;\n}\n\nexport interface ConditionalActionConfig {\n condition: import('./condition.meta').ConditionMeta;\n onTrue: ActionMeta;\n onFalse?: ActionMeta;\n}\n\nexport interface ForEachActionConfig {\n /** Path in context to the array to iterate */\n items: string;\n /** Action to dispatch per item. Item is available as context.item */\n action: ActionMeta;\n /** Run in parallel or sequentially */\n mode?: 'parallel' | 'sequential';\n}\n\nexport interface TransformContextActionConfig {\n /** Map of new context keys to source paths */\n map: Record<string, string>;\n /** If true, merge with existing context. If false, replace */\n merge?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Debug / Print\n// ──────────────────────────────────────────────────────────────\nexport interface LogActionConfig {\n level?: 'log' | 'info' | 'warn' | 'error' | 'debug';\n message?: string;\n /** Log the full context */\n logContext?: boolean;\n /** Specific path in context to log */\n path?: string;\n}\n\nexport interface PrintActionConfig {\n /** CSS selector to print. If omitted, prints whole page */\n target?: string;\n title?: string;\n}\n","/**\n * AvoraMetaForge — Condition Metadata\n *\n * Extended condition system supporting:\n * - 20+ comparison operators\n * - Logical grouping (and/or/negate)\n * - State store references\n * - Custom evaluator functions\n * - Date comparisons\n * - Array operations\n * - Type checking\n */\n\nexport type ConditionOperator =\n | '==' | '!=' | '===' | '!==' | '>' | '>=' | '<' | '<='\n | 'in' | 'notIn' | 'contains' | 'startsWith' | 'endsWith'\n | 'truthy' | 'falsy' | 'empty' | 'notEmpty'\n | 'regex'\n // --- NEW operators ---\n | 'between' // value >= min && value <= max\n | 'notBetween' // value < min || value > max\n | 'hasKey' // object has key\n | 'isArray' // value is an array\n | 'isObject' // value is an object\n | 'isString' // value is a string\n | 'isNumber' // value is a number\n | 'isNull' // value is null or undefined\n | 'isNotNull' // value is not null/undefined\n | 'lengthEquals' // array/string length equals value\n | 'lengthGreaterThan' // array/string length > value\n | 'lengthLessThan' // array/string length < value\n | 'dateBefore' // date comparison\n | 'dateAfter' // date comparison\n | 'dateEquals' // date comparison (same day)\n | 'arrayContains' // array includes value\n | 'arrayNotContains' // array does not include value\n | 'matchesAny' // matches any value in array\n | 'matchesAll' // matches all values in array\n | 'custom';\n\nexport interface ConditionMeta {\n /** Field path to evaluate (dot notation for nested, e.g., 'user.role') */\n field?: string;\n\n /** Comparison operator */\n operator: ConditionOperator;\n\n /** Value to compare against. Arrays for 'in', 'between', etc. */\n value?: any;\n\n /** Logical AND — all conditions must be true */\n and?: ConditionMeta[];\n\n /** Logical OR — at least one condition must be true */\n or?: ConditionMeta[];\n\n /** Negate the result */\n negate?: boolean;\n\n /** Custom evaluator function key */\n custom?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Source\n // ──────────────────────────────────────────────────────────────\n /** Source of the field value */\n source?: 'context' | 'state' | 'route' | 'form' | 'storage';\n\n /** For 'between' operator: [min, max] */\n range?: [any, any];\n\n /** Case-insensitive comparison for string operators */\n caseInsensitive?: boolean;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n","/**\n * AvoraMetaForge — Guard & Resolver Metadata\n *\n * Extended with:\n * - canDeactivate support\n * - Token refresh hints\n * - Per-endpoint auth override\n * - Permission-based guards\n * - IP/geo restrictions\n * - Time-based access\n */\n\nimport { ConditionMeta } from './condition.meta';\nimport { ActionMeta } from './action.meta';\n\nexport interface GuardMeta {\n /** Require authentication */\n requireAuth?: boolean;\n\n /** Required roles (user must have at least one) */\n roles?: string[];\n\n /** Required permissions (user must have ALL) */\n permissions?: string[];\n\n /** Redirect path when guard fails */\n redirectTo?: string;\n\n /** Custom guard function key */\n custom?: string;\n\n // ──────────────────────────────────────────────────────────────\n // NEW\n // ──────────────────────────────────────────────────────────────\n /** Condition-based guard */\n condition?: ConditionMeta;\n\n /** Action to dispatch on guard failure (alternative to redirect) */\n onFail?: ActionMeta;\n\n /** Show a notification on guard failure */\n failMessage?: string;\n\n /** Can deactivate guard (show unsaved changes warning) */\n canDeactivate?: boolean;\n\n /** Custom deactivation message */\n deactivateMessage?: string;\n\n /** Feature flag key — page accessible only if flag is on */\n featureFlag?: string;\n\n /** Time-based access window */\n accessWindow?: {\n from?: string; // ISO date or time\n to?: string;\n timezone?: string;\n };\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface ResolverMeta {\n /** Data source */\n source: 'api' | 'static' | 'state' | 'custom';\n\n /** API endpoint ID to resolve from */\n endpointId?: string;\n\n /** Direct URL (alternative to endpointId) */\n url?: string;\n\n /** Params to pass (supports :param references from route) */\n params?: Record<string, string>;\n\n /** Static data to resolve */\n staticData?: any;\n\n /** State key to read from MetaStateService */\n stateKey?: string;\n\n /** Custom resolver function key */\n custom?: string;\n\n /** Transform the resolved data */\n transform?: {\n root?: string;\n map?: Record<string, string>;\n };\n\n /** Key to store resolved data under in route data */\n key?: string;\n\n /** Show loading indicator while resolving */\n showLoading?: boolean;\n\n /** Action on resolve failure */\n onError?: ActionMeta;\n\n /** Catch-all */\n [key: string]: any;\n}\n","/**\n * AvoraMetaForge — API Metadata\n *\n * Comprehensive API endpoint configuration supporting:\n * - All HTTP methods (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)\n * - Auth strategies (Bearer, Basic, API Key, custom)\n * - Response transforms, caching, retry with exponential backoff\n * - Mock mode for development/testing without a backend\n * - Timeout, abort, response type control\n * - Status code → action error mapping\n * - Environment-based base URL overrides\n * - File upload (multipart/form-data) support\n * - Pagination hints for server-side pagination\n */\n\nimport { HttpMethod, ActionMeta } from './action.meta';\n\nexport interface ApiEndpointMeta {\n /** Unique identifier for this endpoint */\n id: string;\n\n /** Base URL (e.g., 'https://api.example.com'). Can be overridden by environment config */\n baseUrl?: string;\n\n /** Path template (e.g., '/users/:id/posts'). Supports :param placeholders */\n path: string;\n\n /** HTTP method */\n method: HttpMethod;\n\n /** Static headers merged with default headers */\n headers?: Record<string, string>;\n\n /** Static path/query params merged with dynamic params */\n params?: Record<string, string>;\n\n /** Static request body — can be overridden dynamically */\n body?: Record<string, any> | string;\n\n /** Response transform pipeline */\n transform?: TransformMeta;\n\n /** Response caching configuration */\n cache?: CacheMeta;\n\n /** Retry configuration */\n retry?: RetryMeta;\n\n /** Custom error handler key */\n errorHandler?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Auth Configuration\n // ──────────────────────────────────────────────────────────────\n /** Authentication strategy for this endpoint */\n auth?: ApiAuthMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Request Configuration\n // ──────────────────────────────────────────────────────────────\n /** Timeout in milliseconds. 0 = no timeout */\n timeout?: number;\n\n /** Content type override. Default: 'application/json' */\n contentType?: 'application/json' | 'multipart/form-data' | 'application/x-www-form-urlencoded' | 'text/plain' | string;\n\n /** Expected response type */\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n\n /** If true, show loading indicator during this call */\n showLoading?: boolean;\n\n /** Loading message to display */\n loadingMessage?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Error Handling\n // ──────────────────────────────────────────────────────────────\n /** Map HTTP status codes to specific actions */\n errorMap?: Record<number, ActionMeta>;\n\n /** Default error notification message */\n errorMessage?: string;\n\n /** Suppress automatic error notifications */\n silentErrors?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Mock / Dev Mode\n // ──────────────────────────────────────────────────────────────\n /** If true, return mockData without making a real HTTP call */\n mock?: boolean;\n\n /** Static data to return in mock mode */\n mockData?: any;\n\n /** Simulated delay (ms) in mock mode */\n mockDelay?: number;\n\n /** Simulated error in mock mode */\n mockError?: { status: number; message: string };\n\n // ──────────────────────────────────────────────────────────────\n // Server-Side Pagination\n // ──────────────────────────────────────────────────────────────\n /** Pagination configuration for server-side pagination */\n pagination?: ApiPaginationMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Environment\n // ──────────────────────────────────────────────────────────────\n /** Environment key to resolve baseUrl from config (e.g., 'production', 'staging') */\n environment?: string;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Auth\n// ──────────────────────────────────────────────────────────────\nexport interface ApiAuthMeta {\n /** Auth strategy */\n type: 'bearer' | 'basic' | 'apiKey' | 'custom' | 'none';\n\n /** For bearer: the token string or state key (e.g., 'state:auth.token') */\n token?: string;\n\n /** For basic: username */\n username?: string;\n\n /** For basic: password */\n password?: string;\n\n /** For apiKey: header name (e.g., 'X-API-Key') */\n headerName?: string;\n\n /** For apiKey: the key value or state key */\n apiKey?: string;\n\n /** For custom: header name and value */\n customHeader?: { name: string; value: string };\n\n /** Whether to skip auth for this specific endpoint (override global) */\n skip?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Transform\n// ──────────────────────────────────────────────────────────────\nexport interface TransformMeta {\n /** Dot-notation path to unwrap (e.g., 'data.results') */\n root?: string;\n\n /** Map response keys (target ← source). Applied per item if array */\n map?: Record<string, string>;\n\n /** Custom transform function key */\n custom?: string;\n\n /** Flatten nested objects */\n flatten?: boolean;\n\n /** Pick only these keys from the response */\n pick?: string[];\n\n /** Omit these keys from the response */\n omit?: string[];\n\n /** Sort the response array */\n sort?: { key: string; direction?: 'asc' | 'desc' };\n}\n\n// ──────────────────────────────────────────────────────────────\n// Cache\n// ──────────────────────────────────────────────────────────────\nexport interface CacheMeta {\n /** Enable caching for this endpoint */\n enabled: boolean;\n\n /** Time-to-live in milliseconds */\n ttl?: number;\n\n /** Custom cache key. If omitted, auto-generated from URL + params */\n key?: string;\n\n /** Cache storage: memory (default), sessionStorage, localStorage */\n storage?: 'memory' | 'session' | 'local';\n\n /** If true, return stale data while revalidating (SWR pattern) */\n staleWhileRevalidate?: boolean;\n\n /** Invalidate cache when these endpoint IDs are called successfully */\n invalidateOn?: string[];\n}\n\n// ──────────────────────────────────────────────────────────────\n// Retry\n// ──────────────────────────────────────────────────────────────\nexport interface RetryMeta {\n /** Maximum number of retry attempts */\n maxRetries: number;\n\n /** Initial delay between retries (ms) */\n delay?: number;\n\n /** Use exponential backoff */\n exponential?: boolean;\n\n /** Only retry on these HTTP status codes */\n retryOn?: number[];\n\n /** Do NOT retry on these status codes */\n skipOn?: number[];\n\n /** Maximum total delay cap (ms) */\n maxDelay?: number;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Server-Side Pagination\n// ──────────────────────────────────────────────────────────────\nexport interface ApiPaginationMeta {\n /** Query param name for page number */\n pageParam?: string;\n\n /** Query param name for page size */\n sizeParam?: string;\n\n /** Query param name for sort field */\n sortParam?: string;\n\n /** Query param name for sort direction */\n directionParam?: string;\n\n /** Query param name for search term */\n searchParam?: string;\n\n /** Path in response to the data array */\n dataPath?: string;\n\n /** Path in response to total count */\n totalPath?: string;\n\n /** Path in response to total pages */\n totalPagesPath?: string;\n}\n","/**\n * AvoraMetaForge — Layout Metadata\n *\n * Extended with new layout types and environment/theme configuration.\n */\n\nimport { ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport type LayoutTypeKey =\n | 'vertical' | 'horizontal' | 'empty'\n | 'centered' | 'two-column' | 'dashboard-grid' | 'compact'\n // --- NEW layout types ---\n | 'sidebar-left' // Fixed sidebar on left\n | 'sidebar-right' // Fixed sidebar on right\n | 'split' // 50/50 split view\n | 'stacked' // Full-width stacked\n | 'masonry' // Masonry grid\n | 'holy-grail'; // Header + sidebar + content + sidebar + footer\n\nexport interface AppMeta {\n app: AppBrandingMeta;\n navigation: NavGroupMeta[];\n pages: import('./page.meta').PageMeta[];\n apis?: import('./api.meta').ApiEndpointMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Environment & Config\n // ──────────────────────────────────────────────────────────────\n /** Environment-based base URL mapping */\n environments?: Record<string, EnvironmentConfig>;\n\n /** Current active environment */\n activeEnvironment?: string;\n\n /** Global default headers for all API calls */\n defaultHeaders?: Record<string, string>;\n\n /** Global auth configuration */\n auth?: GlobalAuthMeta;\n\n /** Enable devtools overlay */\n devtools?: boolean;\n\n /** Global loading indicator configuration */\n loading?: {\n type?: 'spinner' | 'bar' | 'skeleton';\n color?: string;\n delay?: number;\n };\n\n /** Global error handler action */\n onError?: ActionMeta;\n\n /** Plugin configurations */\n plugins?: import('./plugin.meta').AvoraMetaForgePlugin[];\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface EnvironmentConfig {\n /** Base URL for API calls */\n baseUrl: string;\n /** Debug mode */\n debug?: boolean;\n /** Force mock mode for all endpoints */\n mockAll?: boolean;\n /** Additional config */\n [key: string]: any;\n}\n\nexport interface GlobalAuthMeta {\n /** Auth provider type */\n type: 'jwt' | 'oauth2' | 'session' | 'apiKey' | 'custom';\n /** Login endpoint ID */\n loginEndpoint?: string;\n /** Token refresh endpoint ID */\n refreshEndpoint?: string;\n /** Logout endpoint ID */\n logoutEndpoint?: string;\n /** Token storage location */\n tokenStorage?: 'localStorage' | 'sessionStorage' | 'memory';\n /** Token key in storage */\n tokenKey?: string;\n /** Refresh token key in storage */\n refreshTokenKey?: string;\n /** Auto-refresh token before expiry */\n autoRefresh?: boolean;\n /** Login redirect path */\n loginRedirect?: string;\n /** After-login default path */\n afterLoginRedirect?: string;\n /** Header name for token (default: 'Authorization') */\n headerName?: string;\n /** Token prefix (default: 'Bearer ') */\n tokenPrefix?: string;\n\n /**\n * Enable development mock-login mode.\n * When true, AuthService skips real API calls and generates a fake JWT locally.\n * Set this only in dev/demo configs — never in production AppMeta.\n */\n mock?: boolean;\n\n /** \n * AvoraMetaForge Built-in Native Auth UI\n * Let the framework handle auth screens for you using the AmfAuthShell.\n */\n builtInUI?: {\n enabled: boolean;\n /** Specific pages to enable. If omitted, all defaults are enabled. */\n pages?: ('login' | 'forgot-password' | 'contact-support')[];\n /** Custom brand name for auth pages. Fallbacks to app.name */\n brandName?: string;\n /** Custom tagline for auth pages */\n brandTagline?: string;\n /** Enable OTP two-step verification flow on login */\n requireOtp?: boolean;\n };\n}\n\nexport interface AppBrandingMeta {\n name: string;\n logo?: string;\n /** Logo for dark mode */\n logoDark?: string;\n /** Favicon URL */\n favicon?: string;\n defaultLayout?: LayoutTypeKey | string;\n defaultGuard?: import('./guard.meta').GuardMeta;\n copyright?: string;\n footerLinks?: FooterLinkMeta[];\n /** Theme configuration */\n theme?: ThemeMeta;\n /** App version */\n version?: string;\n /** Support URL or email */\n support?: string;\n [key: string]: any;\n}\n\nexport interface ThemeMeta {\n /** Primary color (hex or HSL) */\n primary?: string;\n /** Accent color */\n accent?: string;\n /** Default mode */\n mode?: 'light' | 'dark' | 'auto';\n /** Custom CSS variables */\n variables?: Record<string, string>;\n /** Font family */\n fontFamily?: string;\n /** Border radius scale */\n borderRadius?: string;\n}\n\nexport interface LayoutMeta {\n type: LayoutTypeKey | string;\n config?: LayoutConfigMeta;\n}\n\nexport interface LayoutConfigMeta {\n maxWidth?: string;\n verticalCenter?: boolean;\n leftWidth?: string;\n rightWidth?: string;\n collapsible?: boolean;\n gridColumns?: number;\n gridGap?: string;\n hideHeader?: boolean;\n hideFooter?: boolean;\n headerHeight?: string;\n showBreadcrumbs?: boolean;\n showPageTitle?: boolean;\n customCssClass?: string;\n /** Sidebar config */\n sidebar?: {\n width?: string;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n breakpoint?: number;\n };\n /** Padding */\n padding?: string;\n [key: string]: any;\n}\n\nexport interface NavGroupMeta {\n label: string;\n items: NavItemMeta[];\n visibleWhen?: ConditionMeta;\n /** Collapsed by default */\n collapsed?: boolean;\n /** Group icon */\n icon?: string;\n}\n\nexport interface NavItemMeta {\n label: string;\n icon?: string;\n route?: string;\n children?: NavItemMeta[];\n badge?: string;\n badgeColor?: string;\n visibleWhen?: ConditionMeta;\n roles?: string[];\n permissions?: string[];\n action?: ActionMeta;\n /** Open in new tab */\n external?: boolean;\n /** External URL */\n url?: string;\n /** Tooltip */\n tooltip?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Divider after this item */\n divider?: boolean;\n [key: string]: any;\n}\n\nexport interface FooterLinkMeta {\n label: string;\n url?: string;\n route?: string;\n external?: boolean;\n icon?: string;\n}\n","/**\n * AvoraMetaForge — Form Metadata\n *\n * Comprehensive form system supporting:\n * - 25+ field types including text, select, file, toggle, rich-text, code-editor\n * - Lifecycle hooks: onLoad, onSubmit, onCancel, onReset, onChange\n * - Multi-step wizard forms with step validation\n * - Autosave with debounced submit\n * - Dirty guard (warn on unsaved changes)\n * - Cross-field validators\n * - Field-level events: onChange, onBlur, onFocus\n * - Cascade selects (dependsOn)\n * - Input masking\n * - Computed/derived fields (watchFields)\n * - Conditional required validators\n * - Repeatable (array) field groups\n */\n\nimport { HttpMethod, ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport type FieldType =\n | 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n | 'textarea' | 'select' | 'multi-select' | 'radio'\n | 'checkbox' | 'toggle' | 'date' | 'datetime' | 'time'\n | 'file' | 'color' | 'range' | 'hidden'\n | 'divider' | 'heading'\n // --- NEW field types ---\n | 'rich-text' // WYSIWYG editor\n | 'code-editor' // Code editor (e.g., Monaco)\n | 'auto-complete' // Autocomplete search input\n | 'tags' // Tag/chip input\n | 'rating' // Star / numeric rating\n | 'slider' // Range slider with labels\n | 'switch' // On/off switch (alias for toggle)\n | 'image-upload' // Image upload with preview\n | 'signature' // Signature capture pad\n | 'otp' // One-time password input\n | 'phone' // Phone number with country code\n | 'address' // Structured address fields\n | 'date-range' // Start/end date picker\n | 'time-range' // Start/end time picker\n | 'currency' // Currency input with symbol\n | 'percentage' // Percentage input\n | 'group' // Nested field group (sub-form)\n | 'repeater' // Repeatable field group (array)\n | 'custom';\n\nexport type FormLayout = 'vertical' | 'horizontal' | 'grid' | 'inline' | 'stepper';\n\nexport interface FormMeta {\n /** Unique form identifier (used by reset-form, patch-form actions) */\n id?: string;\n\n fields: FieldMeta[];\n layout?: FormLayout;\n columns?: number;\n submitLabel?: string;\n cancelLabel?: string;\n resetLabel?: string;\n showCancel?: boolean;\n showReset?: boolean;\n\n /** Hide the submit button (useful for button-only forms) */\n hideSubmit?: boolean;\n\n /** API endpoint for direct form submission */\n apiEndpoint?: string;\n apiMethod?: HttpMethod;\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle Hooks\n // ──────────────────────────────────────────────────────────────\n /** Runs when form initializes (e.g., fetch data for edit mode) */\n onLoad?: ActionMeta;\n\n /** Runs on successful submit */\n onSubmit?: ActionMeta;\n\n /** Runs when cancel is clicked */\n onCancel?: ActionMeta;\n\n /** Runs when reset is clicked */\n onReset?: ActionMeta;\n\n /** Runs whenever any field value changes */\n onChange?: ActionMeta;\n\n /** Runs when form becomes valid */\n onValid?: ActionMeta;\n\n /** Runs when form becomes invalid */\n onInvalid?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Validation\n // ──────────────────────────────────────────────────────────────\n validators?: ValidatorMeta[];\n\n /** Cross-field validators (e.g., password must match confirm) */\n crossFieldValidators?: CrossFieldValidatorMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Advanced Features\n // ──────────────────────────────────────────────────────────────\n /** Pre-populate form values */\n initialValues?: Record<string, any>;\n\n /** Load initial values from API endpoint ID */\n initialValuesApi?: string;\n\n /** Multi-step wizard configuration */\n steps?: FormStepMeta[];\n\n /** Enable autosave */\n autosave?: AutosaveMeta;\n\n /** Warn before navigating away with unsaved changes */\n confirmUnsaved?: boolean;\n\n /** Custom unsaved changes message */\n unsavedMessage?: string;\n\n /** Disable the entire form */\n disabled?: boolean;\n\n /** Make the entire form read-only */\n readOnly?: boolean;\n\n /** CSS class for form container */\n cssClass?: string;\n\n /** Whether to scroll to first error on submit */\n scrollToError?: boolean;\n\n /** Show validation summary at top of form */\n showValidationSummary?: boolean;\n\n /** Whether to validate on field change or on submit only */\n validateOn?: 'change' | 'blur' | 'submit';\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\nexport interface FieldMeta {\n /** Unique key — maps to form control name */\n key: string;\n\n type: FieldType | string;\n label?: string;\n description?: string;\n placeholder?: string;\n defaultValue?: any;\n validators?: ValidatorMeta[];\n options?: OptionMeta[];\n\n /** Endpoint ID to load options from API */\n optionsApi?: string;\n\n /** Key in API response to use as label */\n optionsLabelKey?: string;\n\n /** Key in API response to use as value */\n optionsValueKey?: string;\n\n /** Show/hide based on condition */\n visibleWhen?: ConditionMeta;\n\n /** Disable based on condition */\n disabledWhen?: ConditionMeta;\n\n /** Custom component key for rendering */\n customComponent?: string;\n cssClass?: string;\n colSpan?: number;\n hint?: string;\n prefix?: string;\n suffix?: string;\n readOnly?: boolean;\n /** Statically disable this field */\n disabled?: boolean;\n autocomplete?: string;\n rows?: number;\n min?: number;\n max?: number;\n step?: number;\n accept?: string;\n multiple?: boolean;\n text?: string; // for headings / dividers\n\n // ──────────────────────────────────────────────────────────────\n // Field-Level Events\n // ──────────────────────────────────────────────────────────────\n /** Action to dispatch when field value changes */\n onChange?: ActionMeta;\n\n /** Action to dispatch when field loses focus */\n onBlur?: ActionMeta;\n\n /** Action to dispatch when field gains focus */\n onFocus?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Cascade / Dependency\n // ──────────────────────────────────────────────────────────────\n /** Field key this field depends on (cascade selects) */\n dependsOn?: string;\n\n /** API query params derived from dependent field value */\n dependsOnParams?: Record<string, string>;\n\n /** Clear this field when dependent field changes */\n clearOnDependencyChange?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Input Masking\n // ──────────────────────────────────────────────────────────────\n /** Input mask pattern (e.g., '(000) 000-0000', '000-00-0000') */\n mask?: string;\n\n /** Mask guide character (default: '_') */\n maskGuide?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Computed / Watch\n // ──────────────────────────────────────────────────────────────\n /** Derive this field's value from other field values. E.g., 'fullName = firstName + \" \" + lastName' */\n computeFrom?: ComputeFieldMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Conditional Required\n // ──────────────────────────────────────────────────────────────\n /** Make this field required only when condition is met */\n requiredWhen?: ConditionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Repeater / Group\n // ──────────────────────────────────────────────────────────────\n /** Fields within a group/repeater */\n children?: FieldMeta[];\n\n /** Min/max items for repeater */\n minItems?: number;\n maxItems?: number;\n\n /** Label for add button in repeater */\n addLabel?: string;\n\n // ──────────────────────────────────────────────────────────────\n // File Upload Enhancements\n // ──────────────────────────────────────────────────────────────\n /** Max file size in bytes */\n maxFileSize?: number;\n\n /** Show upload progress */\n showProgress?: boolean;\n\n /** Max number of files for multi-upload */\n maxFiles?: number;\n\n /** Show image preview */\n showPreview?: boolean;\n\n /** Drag and drop upload */\n dragDrop?: boolean;\n\n /** Button color variant */\n color?: string;\n\n /** Button style variant */\n variant?: string;\n\n /** Action to dispatch when button is clicked */\n onClick?: import('./action.meta').ActionMeta;\n\n /** Custom HTML attributes */\n customAttributes?: Record<string, string>;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Validators\n// ──────────────────────────────────────────────────────────────\nexport interface ValidatorMeta {\n type: 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'email'\n | 'url' | 'number' | 'integer'\n | 'match' // Match another field value\n | 'notMatch' // Must NOT match another field\n | 'unique' // Value must be unique (checked via API)\n | 'fileType' // Validate file extension\n | 'fileSize' // Validate file size\n | 'dateRange' // Date within range\n | 'custom' | string;\n value?: any;\n /** Custom error message */\n message?: string;\n /** Custom validator function key */\n custom?: string;\n /** Field key for 'match'/'notMatch' validators */\n matchField?: string;\n /** Validate only when this condition is met */\n when?: ConditionMeta;\n}\n\nexport interface CrossFieldValidatorMeta {\n type: 'match' | 'dateOrder' | 'atLeastOne' | 'custom' | string;\n /** Fields involved */\n fields: string[];\n message: string;\n custom?: string;\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Options\n// ──────────────────────────────────────────────────────────────\nexport interface OptionMeta {\n label: string;\n value: any;\n disabled?: boolean;\n icon?: string;\n group?: string;\n description?: string;\n color?: string;\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Multi-Step / Wizard\n// ──────────────────────────────────────────────────────────────\nexport interface FormStepMeta {\n /** Step title */\n title: string;\n /** Step description / subtitle */\n description?: string;\n /** Step icon */\n icon?: string;\n /** Field keys included in this step */\n fields: string[];\n /** Validate before allowing next step */\n validate?: boolean;\n /** Action to run when entering this step */\n onEnter?: ActionMeta;\n /** Action to run when leaving this step */\n onLeave?: ActionMeta;\n /** Condition to skip this step */\n skipWhen?: ConditionMeta;\n /** Whether the step can be manually skipped */\n optional?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Autosave\n// ──────────────────────────────────────────────────────────────\nexport interface AutosaveMeta {\n /** Debounce delay in milliseconds */\n debounceMs: number;\n /** API endpoint to auto-save to */\n endpointId?: string;\n /** Action to dispatch on autosave */\n action?: ActionMeta;\n /** Show save indicator */\n showIndicator?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Computed Fields\n// ──────────────────────────────────────────────────────────────\nexport interface ComputeFieldMeta {\n /** Field keys to watch */\n watch: string[];\n /** Expression template. E.g., '{{firstName}} {{lastName}}' */\n expression?: string;\n /** Custom compute function key */\n custom?: string;\n}\n","/**\n * AvoraMetaForge — Table Metadata\n *\n * Comprehensive data grid system supporting:\n * - Server-side and client-side pagination, sorting, filtering\n * - Inline editing, row expansion, drag-to-reorder\n * - Column toggle, resize, pin/freeze, multi-sort\n * - Export (CSV, JSON, Excel, PDF)\n * - Virtual scroll, infinite scroll, grouped rows\n * - Aggregate rows (sum, average, count)\n * - Selection (single, multi, checkbox)\n * - Sticky header, column show/hide toggle\n * - Cell-level actions and formatting\n * - Row status/color conditions\n */\n\nimport { ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport type CellType =\n | 'text' | 'badge' | 'avatar' | 'date' | 'datetime'\n | 'currency' | 'number' | 'boolean' | 'link'\n | 'image' | 'progress' | 'actions'\n // --- NEW cell types ---\n | 'icon' // SVG icon display\n | 'color' // Color swatch\n | 'rating' // Star rating display\n | 'tags' // Tag/chip list\n | 'truncate' // Truncated text with tooltip\n | 'html' // Raw HTML content\n | 'template' // Custom inline template\n | 'time-ago' // Relative time (e.g., \"3 hours ago\")\n | 'file-size' // Formatted file size (e.g., \"2.5 MB\")\n | 'phone' // Phone number with call link\n | 'email' // Email with mailto link\n | 'url' // Clickable URL\n | 'json' // Pretty-printed JSON\n | 'copy' // Text with copy button\n | 'editable' // Inline editable cell\n | 'select' // Inline select dropdown\n | 'toggle' // Inline toggle switch\n | 'custom';\n\nexport interface TableMeta {\n /** Unique table identifier (used by reload-table action) */\n id?: string;\n\n columns: ColumnMeta[];\n dataSource: 'api' | 'static' | 'signal';\n apiEndpoint?: string;\n /** Endpoint ID registered in the API service (for mock or real endpoints) */\n endpointId?: string;\n staticData?: any[];\n pagination?: PaginationMeta;\n searchable?: boolean;\n searchPlaceholder?: string;\n searchFields?: string[];\n filterable?: boolean;\n sortable?: boolean;\n defaultSortKey?: string;\n defaultSortDirection?: 'asc' | 'desc';\n actions?: TableActionMeta[];\n bulkActions?: TableActionMeta[];\n rowClick?: ActionMeta;\n emptyMessage?: string;\n selectable?: boolean;\n showRowNumbers?: boolean;\n title?: string;\n headerActions?: TableActionMeta[];\n filters?: TableFilterMeta[];\n cssClass?: string;\n variant?: 'default' | 'striped' | 'borderless' | 'glass' | 'elevated' | 'compact' | string;\n /** Bump this number to bust the sessionStorage cache and re-seed from staticData */\n dataVersion?: number;\n striped?: boolean;\n hoverable?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Server-Side Mode\n // ──────────────────────────────────────────────────────────────\n /** Enable server-side pagination, sort, and filter */\n serverSide?: boolean;\n\n /** API pagination config (query param names, response paths) */\n serverPagination?: ServerPaginationConfig;\n\n // ──────────────────────────────────────────────────────────────\n // Export\n // ──────────────────────────────────────────────────────────────\n /** Enable data export */\n exportable?: boolean;\n\n /** Supported export formats */\n exportFormats?: ('csv' | 'json' | 'xlsx' | 'pdf')[];\n\n /** Custom export filename (without extension) */\n exportFilename?: string;\n\n /** Columns to include in export (keys). If omitted, exports all visible */\n exportColumns?: string[];\n\n // ──────────────────────────────────────────────────────────────\n // Inline Editing\n // ──────────────────────────────────────────────────────────────\n /** Enable inline row editing */\n inlineEdit?: boolean;\n\n /** Action to dispatch when an inline edit is saved */\n onInlineEditSave?: ActionMeta;\n\n /** Action to dispatch when an inline edit is cancelled */\n onInlineEditCancel?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Row Expansion\n // ──────────────────────────────────────────────────────────────\n /** Enable row expansion (detail sub-row) */\n expandable?: boolean;\n\n /** Component key to render in expanded area */\n expandComponent?: string;\n\n /** Section to render in expanded area (alternative to component) */\n expandSection?: import('./section.meta').SectionMeta;\n\n /** Only allow one expanded row at a time */\n singleExpand?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Virtual / Infinite Scroll\n // ──────────────────────────────────────────────────────────────\n /** Enable virtual scroll for large datasets */\n virtualScroll?: boolean;\n\n /** Row height for virtual scroll calculation */\n rowHeight?: number;\n\n /** Enable infinite scroll (load more on scroll) */\n infiniteScroll?: boolean;\n\n /** API endpoint for loading next page in infinite scroll */\n loadMoreEndpoint?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Column Features\n // ──────────────────────────────────────────────────────────────\n /** Show column visibility toggle */\n columnToggle?: boolean;\n\n /** Allow column reorder via drag */\n columnReorder?: boolean;\n\n /** Allow column resize via drag */\n columnResize?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Row Features\n // ──────────────────────────────────────────────────────────────\n /** Enable row drag-to-reorder */\n reorderable?: boolean;\n\n /** Action when row order changes */\n onReorder?: ActionMeta;\n\n /** Enable multi-column sort */\n multiSort?: boolean;\n\n /** Sticky header on scroll */\n stickyHeader?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Grouping & Aggregation\n // ──────────────────────────────────────────────────────────────\n /** Group rows by this column key */\n groupBy?: string;\n\n /** Collapsible groups */\n groupCollapsible?: boolean;\n\n /** Start groups collapsed */\n groupCollapsed?: boolean;\n\n /** Aggregate row configuration (footer totals) */\n aggregates?: AggregateRowMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Selection\n // ──────────────────────────────────────────────────────────────\n /** Selection mode */\n selectionMode?: 'single' | 'multi' | 'checkbox';\n\n /** Action when selection changes */\n onSelectionChange?: ActionMeta;\n\n /** Show \"Select All\" checkbox */\n showSelectAll?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Row Styling\n // ──────────────────────────────────────────────────────────────\n /** Conditionally style rows based on data */\n rowClass?: RowClassMeta[];\n\n /** Row context menu (right-click) */\n contextMenu?: TableActionMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle\n // ──────────────────────────────────────────────────────────────\n /** Action on data load complete */\n onDataLoad?: ActionMeta;\n\n /** Action on data load error */\n onDataError?: ActionMeta;\n\n /** Refresh interval (ms) — auto-reload data periodically */\n refreshInterval?: number;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\nexport interface ColumnMeta {\n key: string;\n label: string;\n type?: CellType | string;\n sortable?: boolean;\n filterable?: boolean;\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n align?: 'left' | 'center' | 'right';\n template?: string;\n pipe?: string;\n cssClass?: string;\n badgeMap?: Record<string, string>;\n avatarKey?: string;\n subtitleKey?: string;\n linkRoute?: string;\n currencyCode?: string;\n currencyDisplay?: string | boolean; // e.g. 'symbol', 'code', or custom string like 'Rs.'\n currencyCodeKey?: string; // read dynamic currency code from row data\n dateFormat?: string;\n visibleWhen?: ConditionMeta;\n hidden?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // NEW Column Properties\n // ──────────────────────────────────────────────────────────────\n /** Pin/freeze column to left or right */\n pin?: 'left' | 'right';\n\n /** Column is resizable */\n resizable?: boolean;\n\n /** Column is reorderable */\n reorderable?: boolean;\n\n /** Tooltip text or template */\n tooltip?: string;\n\n /** Cell-level click action */\n cellClick?: ActionMeta;\n\n /** Wrap text in cell */\n wrap?: boolean;\n\n /** Max truncation length */\n truncateAt?: number;\n\n /** Header tooltip */\n headerTooltip?: string;\n\n /** Editable configuration (for inline edit) */\n editable?: boolean;\n editType?: 'text' | 'number' | 'select' | 'date' | 'toggle';\n editOptions?: { label: string; value: any }[];\n\n /** Cell format function key (for custom formatting) */\n format?: string;\n\n /** Aggregate function for this column */\n aggregate?: 'sum' | 'avg' | 'min' | 'max' | 'count' | 'custom';\n aggregateLabel?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Inline Edit Validation\n // ──────────────────────────────────────────────────────────────\n /** Validators applied to inline-edit input before committing */\n editValidators?: ColumnEditValidatorMeta[];\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface PaginationMeta {\n enabled: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n showPageSizeSelector?: boolean;\n showTotal?: boolean;\n /** Show first/last page buttons */\n showFirstLast?: boolean;\n /** Max page buttons to show */\n maxPages?: number;\n /** Show \"Showing X-Y of Z\" text */\n showRange?: boolean;\n}\n\nexport interface ServerPaginationConfig {\n /** Query param name for page number (default: 'page') */\n pageParam?: string;\n /** Query param name for page size (default: 'size') */\n sizeParam?: string;\n /** Query param name for sort field (default: 'sort') */\n sortParam?: string;\n /** Query param name for sort direction (default: 'direction') */\n directionParam?: string;\n /** Query param name for search (default: 'search') */\n searchParam?: string;\n /** Query param name for filter (default uses filter key) */\n filterParams?: Record<string, string>;\n /** Path in response to data array (default: 'data') */\n dataPath?: string;\n /** Path in response to total count (default: 'total') */\n totalPath?: string;\n /** Path in response to total pages */\n totalPagesPath?: string;\n}\n\nexport interface TableActionMeta {\n id: string;\n label: string;\n icon?: string;\n variant?: 'primary' | 'secondary' | 'danger' | 'ghost' | 'success' | 'warning' | string;\n action: ActionMeta;\n visibleWhen?: ConditionMeta;\n disabledWhen?: ConditionMeta;\n confirm?: string;\n /** Tooltip for the action button */\n tooltip?: string;\n /** Show as dropdown menu item instead of inline button */\n menuItem?: boolean;\n /** Keyboard shortcut hint */\n shortcut?: string;\n [key: string]: any;\n}\n\nexport interface TableFilterMeta {\n key: string;\n label: string;\n type?: 'select' | 'text' | 'date' | 'date-range' | 'number-range' | 'multi-select' | 'toggle';\n options?: { label: string; value: any }[];\n defaultValue?: any;\n placeholder?: string;\n /** For server-side: query param name */\n queryParam?: string;\n}\n\nexport interface AggregateRowMeta {\n /** Column key to aggregate */\n columnKey: string;\n /** Aggregate function */\n type: 'sum' | 'avg' | 'min' | 'max' | 'count' | 'custom';\n /** Display label */\n label?: string;\n /** Format (e.g., currency, percentage) */\n format?: string;\n /** Custom aggregate function key */\n custom?: string;\n}\n\nexport interface RowClassMeta {\n /** Condition to evaluate for each row */\n condition: ConditionMeta;\n /** CSS class to apply when condition is true */\n cssClass: string;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Inline Edit Validation\n// ──────────────────────────────────────────────────────────────\nexport interface ColumnEditValidatorMeta {\n type:\n | 'required' // Value must not be empty\n | 'minLength' // Minimum string length\n | 'maxLength' // Maximum string length\n | 'min' // Minimum numeric value\n | 'max' // Maximum numeric value\n | 'pattern' // Regex pattern\n | 'email' // Valid email format\n | 'number' // Must be a valid number\n | string;\n /** Validator parameter (e.g., minLength: 3, pattern: '^[A-Z]') */\n value?: any;\n /** Custom error message shown below the inline input */\n message?: string;\n}\n","/**\n * AvoraMetaForge — Section Metadata\n *\n * Sections are the building blocks within a page. Each section has a type\n * and configuration. Extended with new section types for drawers, modals,\n * tabs, accordions, and more.\n */\n\nimport { FormMeta } from './form.meta';\nimport { TableMeta } from './table.meta';\nimport { ConditionMeta } from './condition.meta';\nimport { ActionMeta } from './action.meta';\n\nexport interface SectionMeta {\n type: 'form' | 'table' | 'card' | 'stats-grid' | 'page-header' | 'html'\n // --- NEW section types ---\n | 'stepper-form' // Multi-step wizard form\n | 'tabs' // Tabbed content\n | 'accordion' // Collapsible panels\n | 'timeline' // Vertical timeline\n | 'steps' // Step-by-step wizard\n | 'chart' // Chart/graph visualization\n | 'map' // Map display\n | 'calendar' // Calendar/scheduler\n | 'kanban' // Kanban board\n | 'tree' // Tree view\n | 'gallery' // Image/media gallery\n | 'markdown' // Markdown rendered content\n | 'iframe' // Embedded iframe\n | 'divider' // Visual separator\n | 'spacer' // Empty spacer\n | 'alert' // Alert/banner message\n | 'empty-state' // Empty state with CTA\n | 'skeleton' // Loading skeleton\n | 'custom' | string;\n\n config: FormMeta | TableMeta | CardMeta | StatsGridMeta | PageHeaderMeta | HtmlMeta\n | TabsMeta | AccordionMeta | TimelineMeta | AlertMeta | EmptyStateMeta\n | IframeMeta | DividerMeta | SpacerMeta\n | Record<string, any>;\n\n /** Section ID (referenced by actions like reload-table, reset-form) */\n id?: string;\n\n visibleWhen?: ConditionMeta;\n cssClass?: string;\n style?: Record<string, string>;\n gridArea?: string;\n gridColumn?: string;\n gridRow?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Section Features\n // ──────────────────────────────────────────────────────────────\n /** Section title (rendered as a header above the section) */\n title?: string;\n\n /** Section subtitle */\n subtitle?: string;\n\n /** Collapsible section */\n collapsible?: boolean;\n\n /** Start collapsed */\n collapsed?: boolean;\n\n /** Section-level loading state */\n loading?: boolean;\n\n /** Action to dispatch when section becomes visible (lazy-load) */\n onVisible?: ActionMeta;\n\n /** Animation for section entrance */\n animation?: 'fade-in' | 'slide-up' | 'slide-left' | 'zoom-in' | 'none' | string;\n\n /** Animation delay (ms) */\n animationDelay?: number;\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface PageHeaderMeta {\n title: string;\n subtitle?: string;\n titleTemplate?: string;\n actions?: PageHeaderActionMeta[];\n showBack?: boolean;\n /** Breadcrumbs in header */\n breadcrumbs?: { label: string; path?: string }[];\n /** Avatar/icon next to title */\n avatar?: string;\n /** Status badge */\n status?: { label: string; color: string };\n [key: string]: any;\n}\n\nexport interface PageHeaderActionMeta {\n label: string;\n icon?: string;\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger' | 'success' | string;\n action: ActionMeta;\n visibleWhen?: ConditionMeta;\n disabledWhen?: ConditionMeta;\n tooltip?: string;\n /** Show as dropdown menu */\n children?: PageHeaderActionMeta[];\n}\n\nexport interface CardMeta {\n title?: string;\n content?: string;\n template?: string;\n actions?: PageHeaderActionMeta[];\n variant?: 'default' | 'glass' | 'outlined' | 'elevated' | 'gradient' | string;\n /** Card header icon */\n icon?: string;\n /** Image at top of card */\n image?: string;\n /** Footer content */\n footer?: string;\n /** Click action on the card */\n onClick?: ActionMeta;\n /** Nested sections inside the card */\n sections?: SectionMeta[];\n [key: string]: any;\n}\n\nexport interface StatsGridMeta {\n stats: StatCardMeta[];\n columns?: number;\n variant?: 'default' | 'glass' | 'compact' | 'outlined' | 'elevated' | string;\n [key: string]: any;\n}\n\nexport interface StatCardMeta {\n label: string;\n value: string;\n trend?: string;\n trendPositive?: boolean;\n icon?: string;\n color?: string;\n bgColor?: string;\n glowColor?: string;\n action?: ActionMeta;\n /** Sparkline data points */\n sparkline?: number[];\n /** Suffix text (e.g., '%', 'users') */\n suffix?: string;\n /** Prefix text (e.g., '$') */\n prefix?: string;\n /** Load value from API endpoint */\n apiEndpoint?: string;\n [key: string]: any;\n}\n\nexport interface HtmlMeta {\n html: string;\n /** Sanitize HTML (default: true) */\n sanitize?: boolean;\n}\n\nexport interface CustomComponentMeta {\n componentKey: string;\n inputs?: Record<string, any>;\n outputs?: Record<string, ActionMeta>;\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// NEW Section Types\n// ──────────────────────────────────────────────────────────────\n\nexport interface TabsMeta {\n tabs: TabMeta[];\n variant?: 'default' | 'pills' | 'underline' | 'vertical' | string;\n defaultTab?: number;\n /** Lazy load tab content */\n lazy?: boolean;\n /** Action when tab changes */\n onChange?: ActionMeta;\n}\n\nexport interface TabMeta {\n label: string;\n icon?: string;\n badge?: string;\n sections: SectionMeta[];\n visibleWhen?: ConditionMeta;\n disabled?: boolean;\n}\n\nexport interface AccordionMeta {\n panels: AccordionPanelMeta[];\n /** Allow multiple panels open */\n multi?: boolean;\n variant?: 'default' | 'bordered' | 'flush' | string;\n}\n\nexport interface AccordionPanelMeta {\n title: string;\n icon?: string;\n sections: SectionMeta[];\n expanded?: boolean;\n visibleWhen?: ConditionMeta;\n disabled?: boolean;\n}\n\nexport interface TimelineMeta {\n items: TimelineItemMeta[];\n variant?: 'default' | 'alternating' | 'compact' | string;\n /** Load items from API */\n apiEndpoint?: string;\n}\n\nexport interface TimelineItemMeta {\n title: string;\n description?: string;\n date?: string;\n icon?: string;\n color?: string;\n action?: ActionMeta;\n [key: string]: any;\n}\n\nexport interface AlertMeta {\n type: 'info' | 'success' | 'warning' | 'error';\n title?: string;\n message: string;\n dismissible?: boolean;\n icon?: string;\n action?: ActionMeta;\n actionLabel?: string;\n}\n\nexport interface EmptyStateMeta {\n icon?: string;\n title: string;\n description?: string;\n action?: ActionMeta;\n actionLabel?: string;\n image?: string;\n}\n\nexport interface IframeMeta {\n src: string;\n height?: string;\n width?: string;\n allowFullscreen?: boolean;\n sandbox?: string;\n title?: string;\n}\n\nexport interface DividerMeta {\n label?: string;\n variant?: 'solid' | 'dashed' | 'dotted';\n color?: string;\n spacing?: string;\n}\n\nexport interface SpacerMeta {\n height?: string;\n}\n","/**\n * AvoraMetaForge — Page Metadata\n *\n * Comprehensive page configuration supporting:\n * - Lifecycle hooks: onInit, onDestroy, onParamChange, onQueryChange\n * - Breadcrumbs with dynamic segments\n * - Deactivation guards (unsaved changes warning)\n * - SEO meta tags\n * - Page-level animations and transitions\n * - Deep link support with route param context\n */\n\nimport { SectionMeta } from './section.meta';\nimport { GuardMeta, ResolverMeta } from './guard.meta';\nimport { LayoutTypeKey, LayoutConfigMeta } from './layout.meta';\nimport { ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport interface PageMeta {\n id: string;\n path: string;\n title?: string;\n layout?: LayoutTypeKey | string;\n layoutConfig?: LayoutConfigMeta;\n icon?: string;\n guard?: GuardMeta;\n resolve?: Record<string, ResolverMeta>;\n sections: SectionMeta[];\n data?: Record<string, any>;\n children?: PageMeta[];\n lazyModule?: () => Promise<any>;\n showInNav?: boolean;\n navGroup?: string;\n navBadge?: string;\n navBadgeColor?: string;\n navOrder?: number;\n pathMatch?: 'full' | 'prefix';\n redirectTo?: string;\n cssClass?: string;\n customComponent?: () => Promise<any>;\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle Hooks\n // ──────────────────────────────────────────────────────────────\n /** Action to dispatch when the page initializes (e.g., load data) */\n onInit?: ActionMeta;\n\n /** Action to dispatch when the page is destroyed (e.g., cleanup) */\n onDestroy?: ActionMeta;\n\n /** Action to dispatch when route params change (for reusable pages) */\n onParamChange?: ActionMeta;\n\n /** Action to dispatch when query params change */\n onQueryChange?: ActionMeta;\n\n /** Action to dispatch when the page becomes visible (tab focus) */\n onActivate?: ActionMeta;\n\n /** Action to dispatch when the page loses visibility (tab blur) */\n onDeactivate?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Navigation Guards\n // ──────────────────────────────────────────────────────────────\n /** Whether to warn when leaving with unsaved changes */\n canDeactivate?: boolean;\n\n /** Custom deactivation message */\n deactivateMessage?: string;\n\n /** Condition that must be true to allow deactivation without prompt */\n deactivateWhen?: ConditionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Breadcrumbs\n // ──────────────────────────────────────────────────────────────\n /** Breadcrumb configuration. Auto-generated from route hierarchy if not specified */\n breadcrumbs?: BreadcrumbMeta[];\n\n /** Override parent breadcrumbs (don't inherit) */\n breadcrumbOverride?: boolean;\n\n /** Hide breadcrumbs on this page */\n hideBreadcrumbs?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // SEO\n // ──────────────────────────────────────────────────────────────\n /** Meta description for search engines */\n metaDescription?: string;\n\n /** Meta keywords */\n metaKeywords?: string[];\n\n /** Open Graph meta tags */\n og?: {\n title?: string;\n description?: string;\n image?: string;\n type?: string;\n };\n\n // ──────────────────────────────────────────────────────────────\n // Page-Level Features\n // ──────────────────────────────────────────────────────────────\n /** Page transition animation */\n animation?: 'fade' | 'slide-left' | 'slide-right' | 'slide-up' | 'zoom' | 'none' | string;\n\n /** Auto-refresh page data at this interval (ms) */\n refreshInterval?: number;\n\n /** Show loading skeleton while resolving data */\n showSkeleton?: boolean;\n\n /** Scroll to top on navigation */\n scrollToTop?: boolean;\n\n /** Page-level permissions (finer than guard) */\n permissions?: string[];\n\n /** Whether this page is a full-screen overlay */\n fullScreen?: boolean;\n\n /** Background color/gradient override */\n background?: string;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Breadcrumbs\n// ──────────────────────────────────────────────────────────────\nexport interface BreadcrumbMeta {\n /** Display label. Supports template: '{{params.name}}' */\n label: string;\n\n /** Route path. If omitted, breadcrumb is not clickable */\n path?: string;\n\n /** Icon for the breadcrumb */\n icon?: string;\n\n /** Whether this is the active/current breadcrumb */\n active?: boolean;\n\n /** Action to dispatch on click (alternative to path) */\n action?: ActionMeta;\n}\n","/**\n * AvoraMetaForge — Plugin Metadata\n *\n * Extended plugin system with lifecycle hooks, interceptors,\n * custom transforms, and more extension points.\n */\n\nimport { Type } from '@angular/core';\nimport { ActionMeta } from './action.meta';\n\nexport interface AvoraMetaForgePlugin {\n /** Unique plugin name */\n name: string;\n\n /** Plugin version */\n version?: string;\n\n /** Plugin description */\n description?: string;\n\n /** Custom section components (rendered by MetaRendererComponent) */\n components?: Record<string, Type<any>>;\n\n /** Custom validator functions */\n validators?: Record<string, (...args: any[]) => any>;\n\n /** Custom guard functions */\n guards?: Record<string, (...args: any[]) => any>;\n\n /** Custom field type components */\n fieldTypes?: Record<string, Type<any>>;\n\n /** Custom cell type components */\n cellTypes?: Record<string, Type<any>>;\n\n /** Custom condition evaluators */\n conditions?: Record<string, (context: any, condition: any) => boolean>;\n\n /** Custom action handlers */\n actions?: Record<string, (config: any, context: any) => any>;\n\n // ──────────────────────────────────────────────────────────────\n // Extension Points\n // ──────────────────────────────────────────────────────────────\n /** Custom response transforms */\n transforms?: Record<string, (data: any, config: any) => any>;\n\n /** Custom resolver functions */\n resolvers?: Record<string, (params: any) => Promise<any>>;\n\n /** Custom formatters (for table cells, display values) */\n formatters?: Record<string, (value: any, options?: any) => string>;\n\n /** Custom pipes */\n pipes?: Record<string, (value: any, ...args: any[]) => any>;\n\n /** API interceptors */\n interceptors?: {\n request?: (config: any) => any;\n response?: (response: any) => any;\n error?: (error: any) => any;\n };\n\n /** Action middleware — runs before every action dispatch */\n actionMiddleware?: (action: ActionMeta, context: any) => ActionMeta | null;\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle\n // ──────────────────────────────────────────────────────────────\n /** Called when plugin is registered */\n initialize?: () => void;\n\n /** Called when plugin is destroyed */\n destroy?: () => void;\n\n /** Called after all plugins are registered */\n afterInit?: () => void;\n\n /** Catch-all */\n [key: string]: any;\n}\n","/**\n * AvoraMetaForge — Type Barrel\n */\n\nexport * from './action.meta';\nexport * from './condition.meta';\nexport * from './guard.meta';\nexport * from './api.meta';\nexport * from './layout.meta';\nexport * from './form.meta';\nexport * from './table.meta';\nexport * from './section.meta';\nexport * from './page.meta';\nexport * from './plugin.meta';\nexport * from './dialog.meta';\n","import { Injectable, signal } from '@angular/core';\n\nexport type NotificationType = 'success' | 'error' | 'info' | 'warning';\n\nexport interface Notification {\n id: number;\n type: NotificationType;\n message: string;\n timeout?: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationService {\n private _notifications = signal<Notification[]>([]);\n readonly notifications = this._notifications.asReadonly();\n\n private _counter = 0;\n\n /** Add a notification to the stack */\n show(type: NotificationType, message: string, timeout = 5000): void {\n const id = ++this._counter;\n const notification: Notification = { id, type, message, timeout };\n\n this._notifications.update(n => [...n, notification]);\n\n if (timeout > 0) {\n setTimeout(() => this.remove(id), timeout);\n }\n }\n\n success(message: string): void { this.show('success', message); }\n error(message: string): void { this.show('error', message); }\n info(message: string): void { this.show('info', message); }\n warning(message: string): void { this.show('warning', message); }\n\n /** Remove a notification by ID */\n remove(id: number): void {\n this._notifications.update(n => n.filter(item => item.id !== id));\n }\n}\n","/**\n * AvoraMetaForge — Meta State Service\n *\n * Global reactive state store using Angular Signals. Provides:\n * - Set / Get / Select (signal-based)\n * - Merge and patch operations\n * - Optional localStorage persistence per key\n * - Computed selectors\n * - Scoped state (page-level namespaces)\n * - State reset and clear\n * - History tracking (undo/redo) per key\n */\nimport { Injectable, signal, computed, Signal } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport interface StateChange {\n key: string;\n previousValue: any;\n newValue: any;\n timestamp: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MetaStateService {\n /** Internal state map — each key holds a signal */\n private readonly store = new Map<string, ReturnType<typeof signal<any>>>();\n private readonly persistedKeys = new Set<string>();\n private readonly _changes$ = new Subject<StateChange>();\n\n /** Observable stream of all state changes */\n readonly changes$ = this._changes$.asObservable();\n\n // ──────────────────────────────────────────────────────────────\n // Core CRUD\n // ──────────────────────────────────────────────────────────────\n\n /** Set a value in the store */\n set(key: string, value: any, persist: boolean = false): void {\n const previous = this.get(key);\n const sig = this.getOrCreateSignal(key);\n sig.set(value);\n\n if (persist) {\n this.persistedKeys.add(key);\n this.persistToStorage(key, value);\n }\n\n this._changes$.next({ key, previousValue: previous, newValue: value, timestamp: Date.now() });\n }\n\n /** Get current value of a key */\n get(key: string): any {\n return this.store.get(key)?.() ?? this.loadFromStorage(key);\n }\n\n /** Get a signal for reactive binding */\n select(key: string): Signal<any> {\n return this.getOrCreateSignal(key);\n }\n\n /** Computed signal derived from one or more keys */\n selectComputed(keys: string[], fn: (...values: any[]) => any): Signal<any> {\n const signals = keys.map(k => this.select(k));\n return computed(() => fn(...signals.map(s => s())));\n }\n\n /** Merge value with existing (for objects) */\n merge(key: string, partial: Record<string, any>, persist: boolean = false): void {\n const current = this.get(key) || {};\n const merged = { ...current, ...partial };\n this.set(key, merged, persist);\n }\n\n /** Patch a nested path within a stored object */\n patch(key: string, path: string, value: any, persist: boolean = false): void {\n const current = { ...(this.get(key) || {}) };\n const keys = path.split('.');\n let obj = current;\n for (let i = 0; i < keys.length - 1; i++) {\n obj[keys[i]] = { ...(obj[keys[i]] || {}) };\n obj = obj[keys[i]];\n }\n obj[keys[keys.length - 1]] = value;\n this.set(key, current, persist);\n }\n\n /** Check if a key exists */\n has(key: string): boolean {\n return this.store.has(key) || localStorage.getItem(this.storageKey(key)) !== null;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Clear / Reset\n // ──────────────────────────────────────────────────────────────\n\n /** Remove a key from the store */\n clear(key: string, clearPersisted: boolean = true): void {\n const sig = this.store.get(key);\n if (sig) sig.set(undefined);\n this.store.delete(key);\n\n if (clearPersisted) {\n this.persistedKeys.delete(key);\n localStorage.removeItem(this.storageKey(key));\n }\n }\n\n /** Reset entire store */\n resetAll(clearPersisted: boolean = true): void {\n for (const key of this.store.keys()) {\n this.clear(key, clearPersisted);\n }\n }\n\n /** Reset specific namespace (e.g., clear all 'page.users.*' keys) */\n clearNamespace(namespace: string, clearPersisted: boolean = true): void {\n for (const key of this.store.keys()) {\n if (key.startsWith(namespace + '.') || key === namespace) {\n this.clear(key, clearPersisted);\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Scoped State (page-level)\n // ──────────────────────────────────────────────────────────────\n\n /** Get all keys under a namespace as an object */\n getNamespace(namespace: string): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, sig] of this.store.entries()) {\n if (key.startsWith(namespace + '.')) {\n const subKey = key.substring(namespace.length + 1);\n result[subKey] = sig();\n }\n }\n return result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Bulk Operations\n // ──────────────────────────────────────────────────────────────\n\n /** Set multiple keys at once */\n setMany(entries: Record<string, any>, persist: boolean = false): void {\n for (const [key, value] of Object.entries(entries)) {\n this.set(key, value, persist);\n }\n }\n\n /** Get all keys and values as a plain object */\n snapshot(): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, sig] of this.store.entries()) {\n result[key] = sig();\n }\n return result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Context Resolution (for actions)\n // ──────────────────────────────────────────────────────────────\n\n /** Resolve a value that might be prefixed with 'state:' */\n resolveValue(value: any): any {\n if (typeof value === 'string' && value.startsWith('state:')) {\n return this.get(value.substring(6));\n }\n if (typeof value === 'string' && value.startsWith('fromContext:')) {\n return value; // handled by the dispatcher\n }\n return value;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Internals\n // ──────────────────────────────────────────────────────────────\n\n private getOrCreateSignal(key: string): ReturnType<typeof signal<any>> {\n if (!this.store.has(key)) {\n const initial = this.loadFromStorage(key);\n this.store.set(key, signal(initial));\n }\n return this.store.get(key)!;\n }\n\n private storageKey(key: string): string {\n return `amf_state_${key}`;\n }\n\n private persistToStorage(key: string, value: any): void {\n try {\n localStorage.setItem(this.storageKey(key), JSON.stringify(value));\n } catch (e) {\n console.warn(`[AvoraMetaForge] Failed to persist state key \"${key}\":`, e);\n }\n }\n\n private loadFromStorage(key: string): any {\n try {\n const raw = localStorage.getItem(this.storageKey(key));\n return raw ? JSON.parse(raw) : undefined;\n } catch {\n return undefined;\n }\n }\n}\n","/**\n * AvoraMetaForge — Meta API Service\n *\n * Production-grade HTTP service supporting:\n * - All HTTP methods (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)\n * - Auth injection (Bearer, Basic, API Key) from state or config\n * - Request/response interceptors (plugin-based)\n * - Timeout with abort controller\n * - Mock mode (return static fixtures without HTTP)\n * - Response transforms (root, map, pick, omit, sort, flatten)\n * - Caching with TTL, invalidation, and SWR pattern\n * - Retry with exponential backoff\n * - Error mapping (status code → action)\n * - Environment-based base URL resolution\n * - File upload support (multipart/form-data)\n * - Server-side pagination parameter injection\n */\nimport { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { ApiEndpointMeta, TransformMeta, CacheMeta, RetryMeta, ApiAuthMeta } from '../models/meta.types';\nimport { MetaStateService } from './meta-state.service';\nimport { firstValueFrom, timeout as rxTimeout, retry as rxRetry, timer, throwError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\n\ninterface CacheEntry {\n data: any;\n timestamp: number;\n ttl: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MetaApiService {\n private readonly http = inject(HttpClient);\n private readonly state = inject(MetaStateService);\n private endpoints = new Map<string, ApiEndpointMeta>();\n private cache = new Map<string, CacheEntry>();\n private environments = new Map<string, { baseUrl: string;[key: string]: any }>();\n private activeEnvironment: string | undefined;\n private globalHeaders: Record<string, string> = {};\n private customTransforms = new Map<string, (data: any, config: any) => any>();\n\n // ──────────────────────────────────────────────────────────────\n // Registration\n // ──────────────────────────────────────────────────────────────\n\n registerEndpoints(apis: ApiEndpointMeta[]): void {\n apis.forEach(api => this.endpoints.set(api.id, api));\n }\n\n registerEnvironments(envs: Record<string, { baseUrl: string;[key: string]: any }>, active?: string): void {\n for (const [key, config] of Object.entries(envs)) {\n this.environments.set(key, config);\n }\n if (active) this.activeEnvironment = active;\n }\n\n setActiveEnvironment(env: string): void {\n this.activeEnvironment = env;\n }\n\n setGlobalHeaders(headers: Record<string, string>): void {\n this.globalHeaders = { ...this.globalHeaders, ...headers };\n }\n\n registerTransform(key: string, fn: (data: any, config: any) => any): void {\n this.customTransforms.set(key, fn);\n }\n\n getEndpoint(id: string): ApiEndpointMeta | undefined { return this.endpoints.get(id); }\n\n // ──────────────────────────────────────────────────────────────\n // Main Call Method\n // ──────────────────────────────────────────────────────────────\n\n async call(\n id: string,\n dynamicParams?: Record<string, string>,\n dynamicBody?: any,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n paginationParams?: Record<string, string>;\n }\n ): Promise<any> {\n const meta = this.endpoints.get(id);\n if (!meta) throw new Error(`[AvoraMetaForge] API endpoint \"${id}\" not found.`);\n\n // --- Mock Mode ---\n if (meta.mock) {\n return this.handleMock(meta);\n }\n\n // --- Cache Check ---\n if (meta.cache?.enabled && meta.method === 'GET') {\n const cached = this.getCached(meta, dynamicParams);\n if (cached !== undefined) return cached;\n }\n\n // --- Build URL ---\n let url = this.resolveBaseUrl(meta) + meta.path;\n const params = { ...meta.params, ...dynamicParams };\n for (const [k, v] of Object.entries(params)) {\n if (url.includes(`:${k}`)) {\n url = url.replace(`:${k}`, encodeURIComponent(v));\n }\n }\n\n // --- Query Params ---\n let httpParams = new HttpParams();\n for (const [k, v] of Object.entries(params)) {\n if (!meta.path.includes(`:${k}`)) httpParams = httpParams.set(k, v);\n }\n if (options?.queryParams) {\n for (const [k, v] of Object.entries(options.queryParams)) {\n httpParams = httpParams.set(k, v);\n }\n }\n if (options?.paginationParams) {\n for (const [k, v] of Object.entries(options.paginationParams)) {\n httpParams = httpParams.set(k, v);\n }\n }\n\n // --- Headers ---\n let headers = new HttpHeaders({ ...this.globalHeaders, ...meta.headers, ...options?.headers });\n\n // --- Auth ---\n if (meta.auth && !meta.auth.skip) {\n headers = this.injectAuth(headers, meta.auth);\n }\n\n // --- Content Type ---\n if (meta.contentType && meta.contentType !== 'multipart/form-data') {\n headers = headers.set('Content-Type', meta.contentType);\n }\n\n // --- Body ---\n let body = dynamicBody ?? meta.body;\n if (meta.contentType === 'multipart/form-data' && body && !(body instanceof FormData)) {\n body = this.toFormData(body);\n }\n\n // --- Response Type ---\n const responseType: any = meta.responseType || 'json';\n\n // --- Build Observable ---\n let request$ = this.http.request(meta.method, url, {\n body,\n headers,\n params: httpParams,\n responseType,\n observe: 'body'\n });\n\n // --- Timeout ---\n if (meta.timeout && meta.timeout > 0) {\n request$ = request$.pipe(rxTimeout(meta.timeout));\n }\n\n // --- Retry ---\n if (meta.retry && meta.retry.maxRetries > 0) {\n request$ = request$.pipe(\n this.retryWithBackoff(meta.retry)\n );\n }\n\n // --- Execute ---\n let response = await firstValueFrom(request$);\n\n // --- Transform ---\n if (meta.transform) {\n response = this.applyTransform(response, meta.transform);\n }\n\n // --- Cache Store ---\n if (meta.cache?.enabled && meta.method === 'GET') {\n this.storeInCache(meta, dynamicParams, response);\n }\n\n return response;\n }\n\n /**\n * Direct call without registered endpoint — supports inline config\n */\n async callDirect(config: {\n url: string;\n method: HttpMethod;\n body?: any;\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n timeout?: number;\n }): Promise<any> {\n let headers = new HttpHeaders({ ...this.globalHeaders, ...config.headers });\n let httpParams = new HttpParams();\n if (config.queryParams) {\n for (const [k, v] of Object.entries(config.queryParams)) {\n httpParams = httpParams.set(k, v);\n }\n }\n\n let request$ = this.http.request(config.method, config.url, {\n body: config.body,\n headers,\n params: httpParams,\n responseType: (config.responseType || 'json') as any,\n observe: 'body'\n });\n\n if (config.timeout) {\n request$ = request$.pipe(rxTimeout(config.timeout));\n }\n\n return firstValueFrom(request$);\n }\n\n // ──────────────────────────────────────────────────────────────\n // Cache Management\n // ──────────────────────────────────────────────────────────────\n\n /** Invalidate cache for a specific endpoint */\n invalidateCache(endpointId: string): void {\n for (const key of this.cache.keys()) {\n if (key.startsWith(endpointId + ':')) {\n this.cache.delete(key);\n }\n }\n }\n\n /** Invalidate all caches */\n invalidateAllCache(): void {\n this.cache.clear();\n }\n\n /** Invalidate caches linked via invalidateOn */\n invalidateLinkedCaches(triggeredEndpointId: string): void {\n for (const [, meta] of this.endpoints) {\n if (meta.cache?.invalidateOn?.includes(triggeredEndpointId)) {\n this.invalidateCache(meta.id);\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Auth\n // ──────────────────────────────────────────────────────────────\n\n private injectAuth(headers: HttpHeaders, auth: ApiAuthMeta): HttpHeaders {\n switch (auth.type) {\n case 'bearer': {\n const token = auth.token?.startsWith('state:')\n ? this.state.get(auth.token.substring(6))\n : auth.token;\n if (token) headers = headers.set('Authorization', `Bearer ${token}`);\n break;\n }\n case 'basic': {\n const user = auth.username?.startsWith('state:') ? this.state.get(auth.username.substring(6)) : auth.username;\n const pass = auth.password?.startsWith('state:') ? this.state.get(auth.password.substring(6)) : auth.password;\n if (user && pass) {\n headers = headers.set('Authorization', `Basic ${btoa(`${user}:${pass}`)}`);\n }\n break;\n }\n case 'apiKey': {\n const key = auth.apiKey?.startsWith('state:') ? this.state.get(auth.apiKey.substring(6)) : auth.apiKey;\n const headerName = auth.headerName || 'X-API-Key';\n if (key) headers = headers.set(headerName, key);\n break;\n }\n case 'custom': {\n if (auth.customHeader) {\n const value = auth.customHeader.value.startsWith('state:')\n ? this.state.get(auth.customHeader.value.substring(6))\n : auth.customHeader.value;\n if (value) headers = headers.set(auth.customHeader.name, value);\n }\n break;\n }\n }\n return headers;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Mock\n // ──────────────────────────────────────────────────────────────\n\n private async handleMock(meta: ApiEndpointMeta): Promise<any> {\n // ── DEV WARNING ────────────────────────────────────────────────────────────\n // This endpoint is running in MOCK mode — no real HTTP request is made.\n // To connect to a real backend, remove `mock: true` from the endpoint config\n // and set the correct `baseUrl` + `path`. See FRAMEWORK_GUIDE.md §2.\n // ──────────────────────────────────────────────────────────────────────────\n console.warn(\n `[AvoraMetaForge] ⚠️ Endpoint \"${meta.id}\" is running in MOCK mode.`,\n 'Remove mock:true and configure a real baseUrl to connect to a backend.'\n );\n\n const delay = meta.mockDelay || 0;\n if (delay > 0) {\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n\n if (meta.mockError) {\n throw { status: meta.mockError.status, message: meta.mockError.message };\n }\n\n let response = meta.mockData ?? null;\n if (meta.transform) {\n response = this.applyTransform(response, meta.transform);\n }\n return response;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Transform\n // ──────────────────────────────────────────────────────────────\n\n private applyTransform(response: any, transform: TransformMeta): any {\n // Custom transform\n if (transform.custom) {\n const fn = this.customTransforms.get(transform.custom);\n if (fn) return fn(response, transform);\n }\n\n // Root extraction\n if (transform.root) {\n response = transform.root.split('.').reduce((c: any, k: string) => c?.[k], response);\n }\n\n // Pick specific keys\n if (transform.pick && typeof response === 'object' && response !== null) {\n if (Array.isArray(response)) {\n response = response.map(item => this.pickKeys(item, transform.pick!));\n } else {\n response = this.pickKeys(response, transform.pick);\n }\n }\n\n // Omit specific keys\n if (transform.omit && typeof response === 'object' && response !== null) {\n if (Array.isArray(response)) {\n response = response.map(item => this.omitKeys(item, transform.omit!));\n } else {\n response = this.omitKeys(response, transform.omit);\n }\n }\n\n // Map keys\n if (transform.map && Array.isArray(response)) {\n response = response.map((item: any) => {\n const mapped: any = {};\n for (const [targetKey, sourceKey] of Object.entries(transform.map!)) {\n mapped[targetKey] = sourceKey.split('.').reduce((c: any, k: string) => c?.[k], item);\n }\n return mapped;\n });\n }\n\n // Sort\n if (transform.sort && Array.isArray(response)) {\n const dir = transform.sort.direction === 'desc' ? -1 : 1;\n const key = transform.sort.key;\n response = [...response].sort((a, b) => {\n if (a[key] < b[key]) return -1 * dir;\n if (a[key] > b[key]) return 1 * dir;\n return 0;\n });\n }\n\n // Flatten\n if (transform.flatten && Array.isArray(response)) {\n response = response.flat(Infinity);\n }\n\n return response;\n }\n\n private pickKeys(obj: any, keys: string[]): any {\n const result: any = {};\n for (const key of keys) {\n if (key in obj) result[key] = obj[key];\n }\n return result;\n }\n\n private omitKeys(obj: any, keys: string[]): any {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Cache\n // ──────────────────────────────────────────────────────────────\n\n private getCacheKey(meta: ApiEndpointMeta, params?: Record<string, string>): string {\n if (meta.cache?.key) return meta.cache.key;\n return `${meta.id}:${JSON.stringify(params || {})}`;\n }\n\n private getCached(meta: ApiEndpointMeta, params?: Record<string, string>): any | undefined {\n const key = this.getCacheKey(meta, params);\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n const ttl = meta.cache?.ttl || 60000; // default 60s\n if (Date.now() - entry.timestamp > ttl) {\n this.cache.delete(key);\n return undefined;\n }\n\n return entry.data;\n }\n\n private storeInCache(meta: ApiEndpointMeta, params: Record<string, string> | undefined, data: any): void {\n const key = this.getCacheKey(meta, params);\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl: meta.cache?.ttl || 60000\n });\n }\n\n // ──────────────────────────────────────────────────────────────\n // Retry\n // ──────────────────────────────────────────────────────────────\n\n private retryWithBackoff(retryConfig: RetryMeta) {\n return (source: any) => source.pipe(\n catchError((error: any, caught: any) => {\n return caught;\n }),\n rxRetry({\n count: retryConfig.maxRetries,\n delay: (error: any, retryCount: number) => {\n // Check if we should retry for this status\n const status = error?.status;\n if (retryConfig.retryOn?.length && status && !retryConfig.retryOn.includes(status)) {\n return throwError(() => error);\n }\n if (retryConfig.skipOn?.length && status && retryConfig.skipOn.includes(status)) {\n return throwError(() => error);\n }\n\n let delay = retryConfig.delay || 1000;\n if (retryConfig.exponential) {\n delay = delay * Math.pow(2, retryCount - 1);\n }\n if (retryConfig.maxDelay) {\n delay = Math.min(delay, retryConfig.maxDelay);\n }\n\n console.log(`[AvoraMetaForge] Retry ${retryCount}/${retryConfig.maxRetries} in ${delay}ms`);\n return timer(delay);\n }\n })\n );\n }\n\n // ──────────────────────────────────────────────────────────────\n // Base URL\n // ──────────────────────────────────────────────────────────────\n\n private resolveBaseUrl(meta: ApiEndpointMeta): string {\n // 1. Endpoint-level environment override\n if (meta.environment && this.environments.has(meta.environment)) {\n return this.environments.get(meta.environment)!.baseUrl;\n }\n // 2. Active global environment\n if (this.activeEnvironment && this.environments.has(this.activeEnvironment)) {\n return meta.baseUrl || this.environments.get(this.activeEnvironment)!.baseUrl;\n }\n // 3. Endpoint-level baseUrl\n return meta.baseUrl || '';\n }\n\n // ──────────────────────────────────────────────────────────────\n // Form Data\n // ──────────────────────────────────────────────────────────────\n\n private toFormData(obj: Record<string, any>): FormData {\n const formData = new FormData();\n for (const [key, value] of Object.entries(obj)) {\n if (value instanceof File) {\n formData.append(key, value, value.name);\n } else if (value instanceof FileList) {\n for (let i = 0; i < value.length; i++) {\n formData.append(key, value[i], value[i].name);\n }\n } else if (typeof value === 'object' && value !== null) {\n formData.append(key, JSON.stringify(value));\n } else {\n formData.append(key, String(value));\n }\n }\n return formData;\n }\n}\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n","/**\n * AvoraMetaForge — Condition Evaluator Service\n *\n * Evaluates all 35+ condition operators with support for:\n * - Strict/loose equality, comparisons, range checks\n * - String operations (contains, startsWith, endsWith, regex)\n * - Array operations (in, notIn, arrayContains, matchesAny, matchesAll)\n * - Type checks (isArray, isObject, isString, isNumber, isNull)\n * - Length checks (lengthEquals, lengthGreaterThan, lengthLessThan)\n * - Date comparisons (dateBefore, dateAfter, dateEquals)\n * - Logical grouping (and, or, negate)\n * - Multi-source resolution (context, state, form, route, storage)\n * - Custom evaluator functions (plugin-provided)\n */\nimport { Injectable, inject } from '@angular/core';\nimport { ConditionMeta } from '../models/meta.types';\n\ntype CustomEvaluatorFn = (context: any, condition: ConditionMeta) => boolean;\n\n@Injectable({ providedIn: 'root' })\nexport class ConditionEvaluatorService {\n private customEvaluators = new Map<string, CustomEvaluatorFn>();\n\n /** Register a custom evaluator function (from plugins or app code) */\n registerEvaluator(key: string, fn: CustomEvaluatorFn): void {\n this.customEvaluators.set(key, fn);\n }\n\n /** Evaluate a condition against a context object */\n evaluate(condition: ConditionMeta | undefined, context: Record<string, any>): boolean {\n if (!condition) return true;\n\n // Logical AND\n if (condition.and?.length) {\n const result = condition.and.every(c => this.evaluate(c, context));\n return condition.negate ? !result : result;\n }\n\n // Logical OR\n if (condition.or?.length) {\n const result = condition.or.some(c => this.evaluate(c, context));\n return condition.negate ? !result : result;\n }\n\n let result: boolean;\n\n // Custom evaluator\n if (condition.operator === 'custom' && condition.custom) {\n const evaluator = this.customEvaluators.get(condition.custom);\n result = evaluator ? evaluator(context, condition) : false;\n } else {\n // Resolve field value from the appropriate source\n const fieldValue = this.resolveFieldValue(condition, context);\n result = this.compare(fieldValue, condition.operator, condition.value, condition);\n }\n\n return condition.negate ? !result : result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Value Resolution\n // ──────────────────────────────────────────────────────────────\n\n private resolveFieldValue(condition: ConditionMeta, context: Record<string, any>): any {\n const field = condition.field || '';\n const source = condition.source || 'context';\n\n switch (source) {\n case 'state': {\n // lazy import to avoid circular dependency — reads from MetaStateService\n // State values are resolved via context.state if provided\n return this.getNestedValue(context?.['state'] || context, field);\n }\n case 'route': {\n return this.getNestedValue(context?.['params'] || context?.['queryParams'] || context, field);\n }\n case 'form': {\n return this.getNestedValue(context?.['formValue'] || context, field);\n }\n case 'storage': {\n try {\n const raw = localStorage.getItem(field) || sessionStorage.getItem(field);\n return raw ? JSON.parse(raw) : undefined;\n } catch {\n return localStorage.getItem(field) || sessionStorage.getItem(field);\n }\n }\n case 'context':\n default:\n return this.getNestedValue(context, field);\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Comparison Engine\n // ──────────────────────────────────────────────────────────────\n\n private compare(fv: any, op: string, cv: any, condition?: ConditionMeta): boolean {\n // Normalize for case-insensitive string comparisons\n const ci = condition?.caseInsensitive;\n const fvStr = ci && typeof fv === 'string' ? fv.toLowerCase() : fv;\n const cvStr = ci && typeof cv === 'string' ? cv.toLowerCase() : cv;\n\n switch (op) {\n // --- Equality ---\n case '==': return fv == cv;\n case '!=': return fv != cv;\n case '===': return fv === cv;\n case '!==': return fv !== cv;\n\n // --- Numeric Comparison ---\n case '>': return fv > cv;\n case '>=': return fv >= cv;\n case '<': return fv < cv;\n case '<=': return fv <= cv;\n\n // --- Membership ---\n case 'in': return Array.isArray(cv) && cv.includes(fv);\n case 'notIn': return Array.isArray(cv) && !cv.includes(fv);\n\n // --- String Operations ---\n case 'contains': return typeof fvStr === 'string' && fvStr.includes(cvStr);\n case 'startsWith': return typeof fvStr === 'string' && fvStr.startsWith(cvStr);\n case 'endsWith': return typeof fvStr === 'string' && fvStr.endsWith(cvStr);\n case 'regex': return new RegExp(cv).test(String(fv));\n\n // --- Truthiness ---\n case 'truthy': return !!fv;\n case 'falsy': return !fv;\n case 'empty': return fv == null || fv === '' || (Array.isArray(fv) && fv.length === 0) || (typeof fv === 'object' && fv !== null && Object.keys(fv).length === 0);\n case 'notEmpty': return fv != null && fv !== '' && !(Array.isArray(fv) && fv.length === 0) && !(typeof fv === 'object' && fv !== null && Object.keys(fv).length === 0);\n\n // --- Range ---\n case 'between': {\n const range = condition?.range || (Array.isArray(cv) ? cv : []);\n return range.length >= 2 && fv >= range[0] && fv <= range[1];\n }\n case 'notBetween': {\n const range = condition?.range || (Array.isArray(cv) ? cv : []);\n return range.length >= 2 && (fv < range[0] || fv > range[1]);\n }\n\n // --- Type Checks ---\n case 'hasKey': return typeof fv === 'object' && fv !== null && cv in fv;\n case 'isArray': return Array.isArray(fv);\n case 'isObject': return typeof fv === 'object' && fv !== null && !Array.isArray(fv);\n case 'isString': return typeof fv === 'string';\n case 'isNumber': return typeof fv === 'number' && !isNaN(fv);\n case 'isNull': return fv == null;\n case 'isNotNull': return fv != null;\n\n // --- Length Checks ---\n case 'lengthEquals': {\n const len = this.getLength(fv);\n return len !== null && len === cv;\n }\n case 'lengthGreaterThan': {\n const len = this.getLength(fv);\n return len !== null && len > cv;\n }\n case 'lengthLessThan': {\n const len = this.getLength(fv);\n return len !== null && len < cv;\n }\n\n // --- Date Comparisons ---\n case 'dateBefore': {\n const d1 = new Date(fv); const d2 = new Date(cv);\n return !isNaN(d1.getTime()) && !isNaN(d2.getTime()) && d1 < d2;\n }\n case 'dateAfter': {\n const d1 = new Date(fv); const d2 = new Date(cv);\n return !isNaN(d1.getTime()) && !isNaN(d2.getTime()) && d1 > d2;\n }\n case 'dateEquals': {\n const d1 = new Date(fv); const d2 = new Date(cv);\n return !isNaN(d1.getTime()) && !isNaN(d2.getTime()) && d1.toDateString() === d2.toDateString();\n }\n\n // --- Array Operations ---\n case 'arrayContains': {\n return Array.isArray(fv) && fv.includes(cv);\n }\n case 'arrayNotContains': {\n return Array.isArray(fv) && !fv.includes(cv);\n }\n case 'matchesAny': {\n return Array.isArray(cv) && cv.some(v => fv === v);\n }\n case 'matchesAll': {\n return Array.isArray(cv) && cv.every(v => Array.isArray(fv) ? fv.includes(v) : fv === v);\n }\n\n default:\n console.warn(`[AvoraMetaForge] Unknown condition operator: \"${op}\"`);\n return false;\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Utilities\n // ──────────────────────────────────────────────────────────────\n\n private getLength(value: any): number | null {\n if (typeof value === 'string' || Array.isArray(value)) return value.length;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length;\n return null;\n }\n\n private getNestedValue(obj: any, path: string): any {\n if (!path) return obj;\n return path.split('.').reduce((current, key) => current?.[key], obj);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { DialogConfig } from '../../models/meta.types';\n\nexport interface DialogRequest {\n config: DialogConfig;\n resolve: (value: boolean) => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AmfDialogService {\n /** Emits the current dialog request down to the AmfDialogHostComponent */\n readonly dialogState$ = new Subject<DialogRequest | null>();\n\n /** \n * Opens a confirmation dialog and waits for user's explicit choice.\n * Resolves to true if confirmed, false if cancelled.\n */\n async confirm(configOrMessage: DialogConfig | string): Promise<boolean> {\n const config: DialogConfig = typeof configOrMessage === 'string'\n ? { message: configOrMessage, title: 'Confirm Action', showCancel: true, variant: 'warning', icon: 'alert-triangle' }\n : { showCancel: true, variant: 'warning', ...configOrMessage };\n\n return new Promise<boolean>((resolve) => {\n this.dialogState$.next({ config, resolve });\n });\n }\n\n /**\n * Opens a simple alert message box.\n * Resolves when the user clicks 'OK' to dismiss it.\n */\n async alert(configOrMessage: DialogConfig | string): Promise<void> {\n const config: DialogConfig = typeof configOrMessage === 'string'\n ? { message: configOrMessage, title: 'Alert', showCancel: false, variant: 'info', icon: 'info' }\n : { showCancel: false, variant: 'info', ...configOrMessage };\n\n return new Promise<void>((resolve) => {\n this.dialogState$.next({ \n config, \n resolve: () => resolve() \n });\n });\n }\n}\n","/**\n * AvoraMetaForge — Action Dispatcher Service\n *\n * Central orchestrator that executes all declarative actions.\n * Supports 35+ built-in action types with chainable `then` / `onError`,\n * parallel fan-out, conditional branching, and plugin-provided handlers.\n *\n * Every action type from ActionMeta is wired here — no missing handlers.\n */\nimport { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport {\n ActionMeta, NavigateActionConfig, NotifyActionConfig, EmitActionConfig,\n ApiActionConfig, ConfirmActionConfig, ModalActionConfig, DrawerActionConfig,\n SetStateActionConfig, ClearStateActionConfig, ResetFormActionConfig,\n PatchFormActionConfig, SubmitFormActionConfig, ReloadTableActionConfig,\n ScrollToActionConfig, LoadingActionConfig, DownloadFileActionConfig,\n CopyToClipboardActionConfig, OpenUrlActionConfig, StorageActionConfig,\n DispatchMultipleActionConfig, DelayActionConfig, ConditionalActionConfig,\n ForEachActionConfig, TransformContextActionConfig, LogActionConfig,\n PrintActionConfig, FocusActionConfig, ToggleClassActionConfig, SetTitleActionConfig\n} from '../models/meta.types';\nimport { NotificationService } from '../../core/notifications/notification.service';\nimport { MetaApiService } from '../services/meta-api.service';\nimport { MetaStateService } from '../services/meta-state.service';\nimport { ConditionEvaluatorService } from './condition-evaluator.service';\nimport { AmfDialogService } from './services/amf-dialog.service';\nimport { Subject } from 'rxjs';\n\ntype CustomActionFn = (config: any, context: any) => any;\n\n@Injectable({ providedIn: 'root' })\nexport class ActionDispatcherService {\n private readonly router = inject(Router);\n private readonly titleService = inject(Title);\n private readonly notifications = inject(NotificationService);\n private readonly apiService = inject(MetaApiService);\n private readonly stateService = inject(MetaStateService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n private readonly dialogService = inject(AmfDialogService);\n\n private readonly customHandlers = new Map<string, CustomActionFn>();\n private readonly _events$ = new Subject<{ event: string; payload: any }>();\n private readonly _modalEvents$ = new Subject<{ action: 'open' | 'close'; config: any }>();\n private readonly _drawerEvents$ = new Subject<{ action: 'open' | 'close'; config: any }>();\n private readonly _formEvents$ = new Subject<{ action: 'reset' | 'patch' | 'submit'; config: any }>();\n private readonly _tableEvents$ = new Subject<{ action: 'reload'; config: any }>();\n private readonly _loadingState = new Map<string, boolean>();\n\n /** General event bus */\n readonly events$ = this._events$.asObservable();\n\n /** Modal open/close events */\n readonly modalEvents$ = this._modalEvents$.asObservable();\n\n /** Drawer open/close events */\n readonly drawerEvents$ = this._drawerEvents$.asObservable();\n\n /** Form manipulation events */\n readonly formEvents$ = this._formEvents$.asObservable();\n\n /** Table reload events */\n readonly tableEvents$ = this._tableEvents$.asObservable();\n\n /** Register a custom action handler */\n registerHandler(type: string, handler: CustomActionFn): void {\n this.customHandlers.set(type, handler);\n }\n\n /** Check loading state */\n isLoading(key: string = 'global'): boolean {\n return this._loadingState.get(key) || false;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Main Dispatch\n // ──────────────────────────────────────────────────────────────\n\n async dispatch(action: ActionMeta, context?: any): Promise<any> {\n try {\n let result: any;\n\n switch (action.type) {\n // --- Navigation ---\n case 'navigate':\n result = await this.handleNavigate(action.config as NavigateActionConfig, context);\n break;\n\n case 'go-back':\n window.history.back();\n break;\n\n case 'go-forward':\n window.history.forward();\n break;\n\n case 'reload-page':\n window.location.reload();\n break;\n\n // --- API ---\n case 'api':\n result = await this.handleApi(action.config as ApiActionConfig, context);\n break;\n\n // --- Notifications ---\n case 'notify':\n this.handleNotify(action.config as NotifyActionConfig, context);\n break;\n\n // --- Event Bus ---\n case 'emit':\n this.handleEmit(action.config as EmitActionConfig, context);\n break;\n\n // --- Confirmation ---\n case 'confirm':\n result = await this.handleConfirm(action.config as ConfirmActionConfig, context);\n return; // confirm handles its own chaining\n\n // --- Modal ---\n case 'open-modal':\n this._modalEvents$.next({ action: 'open', config: action.config });\n break;\n\n case 'close-modal':\n this._modalEvents$.next({ action: 'close', config: action.config });\n break;\n\n // --- Drawer ---\n case 'open-drawer':\n case 'openDrawer':\n this._drawerEvents$.next({ action: 'open', config: action.config });\n break;\n\n case 'close-drawer':\n case 'closeDrawer':\n this._drawerEvents$.next({ action: 'close', config: action.config });\n break;\n\n // --- State Management ---\n case 'set-state':\n this.handleSetState(action.config as SetStateActionConfig, context);\n break;\n\n case 'clear-state':\n this.handleClearState(action.config as ClearStateActionConfig);\n break;\n\n // --- Form Manipulation ---\n case 'reset-form':\n this._formEvents$.next({ action: 'reset', config: action.config });\n break;\n\n case 'patch-form':\n const patchConfig = { ...(action.config as PatchFormActionConfig) };\n const patchValues = patchConfig.values as any;\n if (typeof patchValues === 'string' && patchValues.startsWith('fromContext:')) {\n patchConfig.values = this.resolveContextPath(context, patchValues.substring(12));\n }\n this._formEvents$.next({ action: 'patch', config: patchConfig });\n break;\n\n case 'submit-form':\n this._formEvents$.next({ action: 'submit', config: action.config });\n break;\n\n // --- Table Control ---\n case 'reload-table':\n this._tableEvents$.next({ action: 'reload', config: action.config });\n break;\n\n // --- Scroll / Focus / UI ---\n case 'scroll-to':\n this.handleScrollTo(action.config as ScrollToActionConfig);\n break;\n\n case 'focus':\n this.handleFocus(action.config as FocusActionConfig);\n break;\n\n case 'blur':\n this.handleBlur(action.config as FocusActionConfig);\n break;\n\n case 'toggle-class':\n this.handleToggleClass(action.config as ToggleClassActionConfig);\n break;\n\n case 'set-title': {\n const titleCfg = action.config as SetTitleActionConfig;\n let title = titleCfg.title;\n // Resolve context references (e.g. fromContext:formValue.appName)\n if (typeof title === 'string' && title.startsWith('fromContext:')) {\n title = this.resolveContextPath(context, title.substring('fromContext:'.length));\n }\n if (title) this.titleService.setTitle(String(title));\n break;\n }\n\n // --- Loading ---\n case 'set-loading':\n this.handleSetLoading(action.config as LoadingActionConfig, true);\n break;\n\n case 'clear-loading':\n this.handleSetLoading(action.config as LoadingActionConfig, false);\n break;\n\n // --- Download / Clipboard / URL ---\n case 'download-file':\n await this.handleDownloadFile(action.config as DownloadFileActionConfig, context);\n break;\n\n case 'copy-to-clipboard':\n await this.handleCopyToClipboard(action.config as CopyToClipboardActionConfig, context);\n break;\n\n case 'open-url':\n this.handleOpenUrl(action.config as OpenUrlActionConfig);\n break;\n\n // --- Storage ---\n case 'set-storage':\n this.handleSetStorage(action.config as StorageActionConfig, context);\n break;\n\n case 'remove-storage':\n this.handleRemoveStorage(action.config as StorageActionConfig);\n break;\n\n // --- Flow Control ---\n case 'dispatch-multiple':\n result = await this.handleDispatchMultiple(action.config as DispatchMultipleActionConfig, context);\n break;\n\n case 'delay':\n await this.handleDelay(action.config as DelayActionConfig);\n break;\n\n case 'conditional':\n const _cfg = action.config as ConditionalActionConfig;\n const conditionalResult = this.conditionEvaluator.evaluate(_cfg.condition, context);\n const nextAction = conditionalResult ? _cfg.onTrue : _cfg.onFalse;\n if (nextAction) {\n result = await this.dispatch(nextAction, context);\n }\n break;\n\n case 'for-each':\n await this.handleForEach(action.config as ForEachActionConfig, context);\n break;\n\n case 'transform-context':\n context = this.handleTransformContext(action.config as TransformContextActionConfig, context);\n break;\n\n // --- Debug ---\n case 'log':\n this.handleLog(action.config as LogActionConfig, context);\n break;\n\n case 'print':\n this.handlePrint(action.config as PrintActionConfig);\n break;\n\n // --- Legacy ---\n case 'store-data':\n this.handleStoreData(action.config as any, context);\n break;\n\n // --- Custom / Plugin ---\n default: {\n const handler = this.customHandlers.get(action.type);\n if (handler) {\n result = await handler(action.config, context);\n } else {\n console.warn(`[AvoraMetaForge] No handler registered for action type: \"${action.type}\"`);\n }\n }\n }\n\n // Chain the next action\n if (action.then) {\n const nextContext = result !== undefined ? { ...context, result } : context;\n await this.dispatch(action.then, nextContext);\n }\n\n return result;\n } catch (error) {\n console.error(`[AvoraMetaForge] Action \"${action.type}\" failed:`, error);\n if (action.onError) {\n await this.dispatch(action.onError, { ...context, error });\n } else {\n throw error;\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Handler Implementations\n // ──────────────────────────────────────────────────────────────\n\n private async handleNavigate(config: NavigateActionConfig, context?: any): Promise<void> {\n const processVars = (target: any) => {\n if (!target) return undefined;\n const result = { ...target };\n for (const [key, val] of Object.entries(result)) {\n if (typeof val === 'string' && val.startsWith('fromContext:')) {\n result[key] = this.resolveContextPath(context, val.substring(12));\n }\n }\n return result;\n };\n\n const extras: any = {\n queryParams: processVars(config.queryParams),\n replaceUrl: config.replaceUrl,\n fragment: config.fragment,\n skipLocationChange: config.skipLocationChange\n };\n\n // Merge state\n if (config.state || context) {\n extras.state = { ...processVars(config.state), ...(context.row ? { row: context.row } : {}) };\n }\n\n await this.router.navigate([config.path], extras);\n }\n\n private async handleApi(config: ApiActionConfig, context?: any): Promise<any> {\n let response: any;\n\n if (config.mock) {\n // Inline mock\n response = config.mockData;\n } else if (config.endpointId) {\n // Call registered endpoint\n const body = config.body === 'formValue' ? context?.formValue : config.body;\n response = await this.apiService.call(\n config.endpointId,\n config.pathParams,\n body,\n { headers: config.headers, queryParams: config.queryParams }\n );\n } else if (config.url) {\n // Inline call\n const body = config.body === 'formValue' ? context?.formValue : config.body;\n response = await this.apiService.callDirect({\n url: config.url,\n method: config.method || 'GET',\n body,\n headers: config.headers,\n queryParams: config.queryParams,\n responseType: config.responseType,\n });\n }\n\n // Store result in context\n if (config.storeResultAs && context) {\n context[config.storeResultAs] = response;\n }\n\n // Store result in state\n if (config.storeInState) {\n this.stateService.set(config.storeInState, response);\n }\n\n return response;\n }\n\n private handleNotify(config: NotifyActionConfig, context?: any): void {\n const message = this.interpolateTemplate(config.message, context);\n this.notifications.show(config.type, message, config.duration);\n }\n\n /** Replace {{key}} and {{key.nested}} tokens with values from context */\n private interpolateTemplate(template: string, context?: any): string {\n if (!template || !context) return template;\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_, path) => {\n const val = this.resolveContextPath(context, path.trim());\n return val !== undefined && val !== null ? String(val) : '';\n });\n }\n\n private handleEmit(config: EmitActionConfig, context?: any): void {\n const payload = config.includeContext ? { ...config.payload, context } : config.payload;\n this._events$.next({ event: config.event, payload });\n }\n\n private async handleConfirm(config: ConfirmActionConfig, context?: any): Promise<void> {\n const confirmed = await this.dialogService.confirm(config as any);\n if (confirmed) {\n await this.dispatch(config.onConfirm, context);\n } else if (config.onCancel) {\n await this.dispatch(config.onCancel, context);\n }\n }\n\n private handleSetState(config: SetStateActionConfig, context?: any): void {\n let value = config.value;\n\n // Resolve value from context\n if (typeof value === 'string' && value.startsWith('fromContext:')) {\n const path = value.substring('fromContext:'.length);\n value = this.resolveContextPath(context, path);\n }\n\n if (config.merge) {\n this.stateService.merge(config.key, value, config.persist);\n } else {\n this.stateService.set(config.key, value, config.persist);\n }\n }\n\n private handleClearState(config: ClearStateActionConfig): void {\n this.stateService.clear(config.key, config.clearPersisted);\n }\n\n private handleScrollTo(config: ScrollToActionConfig): void {\n if (config.target) {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el) {\n el.scrollIntoView({ behavior: config.behavior || 'smooth', block: config.block || 'start' });\n return;\n }\n }\n if (config.top !== undefined) {\n window.scrollTo({ top: config.top, behavior: config.behavior || 'smooth' });\n }\n }\n\n private handleFocus(config: FocusActionConfig): void {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el && el instanceof HTMLElement) {\n el.focus();\n }\n }\n\n private handleBlur(config: FocusActionConfig): void {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el && el instanceof HTMLElement) {\n el.blur();\n }\n }\n\n private handleToggleClass(config: ToggleClassActionConfig): void {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el) {\n switch (config.action) {\n case 'add': el.classList.add(config.className); break;\n case 'remove': el.classList.remove(config.className); break;\n case 'toggle': el.classList.toggle(config.className); break;\n }\n }\n }\n\n private handleSetLoading(config: LoadingActionConfig, loading: boolean): void {\n const key = config.key || 'global';\n this._loadingState.set(key, loading);\n this.stateService.set(`loading.${key}`, loading);\n }\n\n private async handleDownloadFile(config: DownloadFileActionConfig, context?: any): Promise<void> {\n let blob: Blob;\n\n if (config.content) {\n // Download string content as file\n blob = new Blob([config.content], { type: config.mimeType || 'text/plain' });\n } else if (config.endpointId) {\n // Download from API endpoint\n const response = await this.apiService.call(config.endpointId);\n blob = response instanceof Blob ? response : new Blob([JSON.stringify(response)], { type: 'application/json' });\n } else if (config.url) {\n // Download from URL\n const response = await this.apiService.callDirect({\n url: config.url,\n method: 'GET',\n responseType: 'blob'\n });\n blob = response;\n } else {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = config.filename || 'download';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n\n private async handleCopyToClipboard(config: CopyToClipboardActionConfig, context?: any): Promise<void> {\n let text = config.text;\n if (typeof text === 'string' && text.startsWith('fromContext:')) {\n text = this.resolveContextPath(context, text.substring('fromContext:'.length));\n }\n\n try {\n await navigator.clipboard.writeText(String(text));\n if (config.successMessage) {\n this.notifications.show('success', config.successMessage);\n }\n } catch (err) {\n // Fallback for older browsers\n const ta = document.createElement('textarea');\n ta.value = String(text);\n ta.style.position = 'fixed';\n ta.style.left = '-9999px';\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n if (config.successMessage) {\n this.notifications.show('success', config.successMessage);\n }\n }\n }\n\n private handleOpenUrl(config: OpenUrlActionConfig): void {\n window.open(config.url, config.target || '_blank', config.features);\n }\n\n private handleSetStorage(config: StorageActionConfig, context?: any): void {\n const storage = config.storage === 'local' ? localStorage : sessionStorage;\n let value = config.value;\n if (typeof value === 'string' && value.startsWith('fromContext:')) {\n value = this.resolveContextPath(context, value.substring('fromContext:'.length));\n }\n storage.setItem(config.key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n\n private handleRemoveStorage(config: StorageActionConfig): void {\n const storage = config.storage === 'local' ? localStorage : sessionStorage;\n storage.removeItem(config.key);\n }\n\n private async handleDispatchMultiple(config: DispatchMultipleActionConfig, context?: any): Promise<any[]> {\n if (config.mode === 'sequential') {\n const results: any[] = [];\n for (const action of config.actions) {\n try {\n results.push(await this.dispatch(action, context));\n } catch (error) {\n if (config.stopOnError) throw error;\n results.push(error);\n }\n }\n return results;\n } else {\n // Parallel by default\n return Promise.all(config.actions.map(action => this.dispatch(action, context)));\n }\n }\n\n private async handleDelay(config: DelayActionConfig): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, config.duration));\n }\n\n private async handleConditional(config: ConditionalActionConfig, context?: any): Promise<void> {\n const result = this.conditionEvaluator.evaluate(config.condition, context || {});\n if (result) {\n await this.dispatch(config.onTrue, context);\n } else if (config.onFalse) {\n await this.dispatch(config.onFalse, context);\n }\n }\n\n private async handleForEach(config: ForEachActionConfig, context?: any): Promise<void> {\n const items = this.resolveContextPath(context, config.items);\n if (!Array.isArray(items)) {\n console.warn(`[AvoraMetaForge] for-each: \"${config.items}\" is not an array`);\n return;\n }\n\n if (config.mode === 'sequential') {\n for (const item of items) {\n await this.dispatch(config.action, { ...context, item });\n }\n } else {\n await Promise.all(items.map(item => this.dispatch(config.action, { ...context, item })));\n }\n }\n\n private handleTransformContext(config: TransformContextActionConfig, context?: any): any {\n const transformed: any = {};\n for (const [targetKey, sourcePath] of Object.entries(config.map)) {\n transformed[targetKey] = this.resolveContextPath(context, sourcePath);\n }\n return config.merge ? { ...context, ...transformed } : transformed;\n }\n\n private handleLog(config: LogActionConfig, context?: any): void {\n const level = config.level || 'log';\n const prefix = '[AvoraMetaForge Debug]';\n\n if (config.logContext) {\n (console as any)[level](prefix, config.message || 'Context:', context);\n } else if (config.path) {\n const value = this.resolveContextPath(context, config.path);\n (console as any)[level](prefix, config.message || config.path, value);\n } else {\n (console as any)[level](prefix, config.message || 'Action logged');\n }\n }\n\n private handlePrint(config: PrintActionConfig): void {\n if (config.target) {\n const el = document.querySelector(config.target);\n if (el) {\n const printWindow = window.open('', '_blank');\n if (printWindow) {\n printWindow.document.write(`\n <html><head><title>${config.title || 'Print'}</title>\n <style>body { font-family: system-ui, sans-serif; padding: 20px; }</style>\n </head><body>${el.innerHTML}</body></html>\n `);\n printWindow.document.close();\n printWindow.print();\n printWindow.close();\n }\n }\n } else {\n window.print();\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // Built-in Client-Side Data Store (Demo / Testbed Action)\n // ────────────────────────────────────────────────────────────────\n\n /**\n * Built-in CLIENT-SIDE CRUD SIMULATOR — for demos and testbeds only.\n *\n * This action uses `sessionStorage` as a temporary in-memory database so that\n * CRUD operations (add / edit / delete) work without any backend connection.\n * Data does NOT persist across browser sessions or tabs.\n *\n * ## When to use this\n * Use `store-data` when you want to demonstrate or test a complete CRUD flow\n * (Add → Edit → Delete) entirely in the browser, with zero backend setup.\n * It is intentionally available to any AvoraMetaForge user for rapid prototyping.\n *\n * ## How to switch to a real backend\n * Replace the `store-data` action with an `api` action pointing to your endpoint:\n *\n * ```ts\n * // BEFORE (client-side mock):\n * { type: 'store-data', config: { storageKey: 'amf_table_users', action: 'add' } }\n *\n * // AFTER (real backend):\n * { type: 'api', config: { endpointId: 'create-user', body: 'formValue',\n * storeResultAs: 'newUser' } }\n * ```\n *\n * ## Config options\n * - `storageKey` — sessionStorage key (default: 'amf_demo_data')\n * - `action` — 'add' | 'edit' | 'delete'\n * - `identifierKey` — row identity field (default: 'id')\n * - `computedFields` — derived string fields interpolated from formValue\n * - `autoTimestampField`— if set, auto-stamps this field with an ISO date on 'add'\n */\n private handleStoreData(config: any, context: any): void {\n const key = config.storageKey || 'amf_demo_data';\n let data = JSON.parse(sessionStorage.getItem(key) || '[]');\n const identifier = config.identifierKey || 'id';\n\n // Compute derived fields based on config\n const computedValues: any = {};\n if (config.computedFields && context.formValue) {\n for (const [field, template] of Object.entries(config.computedFields)) {\n if (typeof template === 'string') {\n // Simple string interpolation: ${fieldName}\n computedValues[field] = template.replace(/\\$\\{([^}]+)\\}/g, (_, k) => context.formValue[k] || '').trim();\n }\n }\n }\n\n if (config.action === 'add') {\n const formValue = { ...context.formValue, ...computedValues };\n // Auto-stamp a timestamp field if configured (config-driven, not hardcoded)\n const tsField = config.autoTimestampField || 'joinDate';\n if (!formValue[tsField]) formValue[tsField] = new Date().toISOString();\n if (!formValue.id) formValue.id = Date.now();\n data.unshift(formValue);\n } else if (config.action === 'edit') {\n const idValue = context?.state?.row?.[identifier] || context.formValue?.[identifier] || context.formValue?.email;\n const index = data.findIndex((i: any) => i[identifier] === idValue || (idValue && i.email === idValue));\n\n if (index > -1) {\n const updatedFormValue = { ...context.formValue, ...computedValues };\n data[index] = { ...data[index], ...updatedFormValue };\n } else {\n data.unshift({ ...context.formValue, ...computedValues });\n }\n } else if (config.action === 'delete') {\n const idValue = context?.row?.[identifier] || context?.row?.email;\n data = data.filter((i: any) => i[identifier] !== idValue && i.email !== idValue);\n }\n sessionStorage.setItem(key, JSON.stringify(data));\n }\n\n // ──────────────────────────────────────────────────────────────\n // Utilities\n // ──────────────────────────────────────────────────────────────\n\n private resolveContextPath(context: any, path: string): any {\n if (!context || !path) return undefined;\n return path.split('.').reduce((obj, key) => obj?.[key], context);\n }\n}\n","/**\n * AvoraMetaForge — Component Registry Service\n */\nimport { Injectable, Type } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ComponentRegistryService {\n private readonly registry = new Map<string, Type<any>>();\n\n register(key: string, component: Type<any>): void { this.registry.set(key, component); }\n registerAll(entries: Record<string, Type<any>>): void { for (const [key, component] of Object.entries(entries)) { this.register(key, component); } }\n get(key: string): Type<any> | undefined { return this.registry.get(key); }\n has(key: string): boolean { return this.registry.has(key); }\n keys(): string[] { return Array.from(this.registry.keys()); }\n unregister(key: string): boolean { return this.registry.delete(key); }\n}\n","/**\n * AvoraMetaForge — Meta Renderer Component\n */\nimport { Component, Input, ViewContainerRef, inject, OnChanges, SimpleChanges, ViewChild, OnDestroy } from '@angular/core';\nimport { ComponentRegistryService } from './component-registry.service';\nimport { ConditionEvaluatorService } from './condition-evaluator.service';\nimport { SectionMeta } from '../models/meta.types';\n\n@Component({\n selector: 'amf-renderer',\n standalone: true,\n template: `<ng-container #outlet></ng-container>`,\n styles: [`:host { display: block; }`]\n})\nexport class MetaRendererComponent implements OnChanges, OnDestroy {\n @Input() section!: SectionMeta;\n @Input() context: any = {};\n @ViewChild('outlet', { read: ViewContainerRef, static: true }) outlet!: ViewContainerRef;\n\n private readonly registry = inject(ComponentRegistryService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n\n ngOnChanges(changes: SimpleChanges): void { if (changes['section'] || changes['context']) this.render(); }\n ngOnDestroy(): void { this.outlet?.clear(); }\n\n private render(): void {\n this.outlet.clear();\n if (!this.section) return;\n\n if (this.section.visibleWhen && !this.conditionEvaluator.evaluate(this.section.visibleWhen, this.context)) return;\n\n const componentType = this.registry.get(this.section.type);\n if (!componentType) { console.warn(`[AvoraMetaForge] No component registered for type: \"${this.section.type}\"`); return; }\n\n const componentRef = this.outlet.createComponent(componentType);\n const instance = componentRef.instance;\n\n if ('config' in instance) instance.config = { ...this.section.config, _sectionId: this.section.id };\n if ('context' in instance) instance.context = this.context;\n\n const hostEl = (componentRef.location.nativeElement as HTMLElement);\n if (this.section.cssClass) hostEl.classList.add(...this.section.cssClass.split(' '));\n if (this.section.style) { for (const [prop, value] of Object.entries(this.section.style)) hostEl.style.setProperty(prop, value); }\n if (this.section.gridArea) hostEl.style.gridArea = this.section.gridArea;\n if (this.section.gridColumn) hostEl.style.gridColumn = this.section.gridColumn;\n if (this.section.gridRow) hostEl.style.gridRow = this.section.gridRow;\n }\n}\n","/**\n * AvoraMetaForge — Meta Page Component\n *\n * Generic page component that receives PageMeta from route data\n * and delegates rendering to MetaRendererComponent for each section.\n *\n * Enhanced with:\n * - Lifecycle hooks: onInit, onDestroy, onParamChange, onQueryChange\n * - Breadcrumb generation\n * - Page title management\n * - Deactivation guard support (canDeactivate with dirty check)\n * - Scroll-to-top on navigation\n * - Page-level animation support\n *\n * CRITICAL: Uses reactive route.data (toSignal) instead of snapshot\n * so the component re-renders when navigating between pages that\n * share this same component (Angular reuses component instances).\n */\nimport { Component, inject, computed, DestroyRef, OnDestroy, effect } from '@angular/core';\n\nimport { ActivatedRoute, Data, Router, NavigationEnd, Params } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { filter, distinctUntilChanged, map } from 'rxjs/operators';\nimport { PageMeta } from '../models/meta.types';\nimport { MetaRendererComponent } from './meta-renderer.component';\nimport { ActionDispatcherService } from './action-dispatcher.service';\nimport { AmfDialogService } from './services/amf-dialog.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-page',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n @if (pageMeta()) {\n <div class=\"amf-page-wrapper\" [class]=\"pageMeta()!.cssClass || ''\"\n [class.amf-animate-fade]=\"pageMeta()!.animation === 'fade'\"\n [class.amf-animate-slide-up]=\"pageMeta()!.animation === 'slide-up'\"\n [class.amf-animate-zoom]=\"pageMeta()!.animation === 'zoom'\">\n @for (section of pageMeta()!.sections; track $index) {\n <amf-renderer [section]=\"section\" [context]=\"context()\" class=\"amf-section\"></amf-renderer>\n }\n </div>\n }\n `,\n styles: [`\n .amf-page-wrapper { display: flex; flex-direction: column; gap: 24px; width: 100%; }\n .amf-section { display: block; width: 100%; }\n\n /* Page animations */\n .amf-animate-fade { animation: amfFadeIn 0.3s ease-out; }\n .amf-animate-slide-up { animation: amfSlideUp 0.3s ease-out; }\n .amf-animate-zoom { animation: amfZoom 0.3s ease-out; }\n\n @keyframes amfFadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes amfSlideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n @keyframes amfZoom { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } }\n `]\n})\nexport class MetaPageComponent implements OnDestroy {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly titleService = inject(Title);\n private readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly dialogService = inject(AmfDialogService);\n private readonly destroyRef = inject(DestroyRef);\n\n private subscriptions: Subscription[] = [];\n private previousParams: string | null = null;\n private previousQueryParams: string | null = null;\n private initDispatched = false;\n\n /** Reactive route data — updates automatically on navigation */\n private readonly routeData = toSignal(this.route.data, { initialValue: {} as Data });\n\n /** Computed PageMeta from route data */\n readonly pageMeta = computed(() => {\n const data = this.routeData();\n return (data?.['pageMeta'] as PageMeta) ?? null;\n });\n\n /** Computed context from route data */\n readonly context = computed(() => {\n const data = this.routeData();\n const meta = this.pageMeta();\n return {\n params: this.route.snapshot.params,\n queryParams: this.route.snapshot.queryParams,\n state: this.router.getCurrentNavigation()?.extras.state || history.state,\n data,\n pageMeta: meta\n };\n });\n\n constructor() {\n // React to page meta changes (fires onInit, sets title, etc.)\n effect(() => {\n const meta = this.pageMeta();\n if (meta) {\n this.onPageMetaChange(meta);\n }\n });\n\n // Watch param changes\n const paramSub = this.route.params.pipe(\n map((p: Params) => JSON.stringify(p)),\n distinctUntilChanged()\n ).subscribe(paramsStr => {\n if (this.previousParams !== null && this.previousParams !== paramsStr) {\n const meta = this.pageMeta();\n if (meta?.onParamChange) {\n this.actionDispatcher.dispatch(meta.onParamChange, this.context());\n }\n }\n this.previousParams = paramsStr;\n });\n this.subscriptions.push(paramSub);\n\n // Watch query param changes\n const querySub = this.route.queryParams.pipe(\n map((p: Params) => JSON.stringify(p)),\n distinctUntilChanged()\n ).subscribe(queryStr => {\n if (this.previousQueryParams !== null && this.previousQueryParams !== queryStr) {\n const meta = this.pageMeta();\n if (meta?.onQueryChange) {\n this.actionDispatcher.dispatch(meta.onQueryChange, this.context());\n }\n }\n this.previousQueryParams = queryStr;\n });\n this.subscriptions.push(querySub);\n }\n\n private onPageMetaChange(meta: PageMeta): void {\n // Set page title\n if (meta.title) {\n this.titleService.setTitle(meta.title);\n }\n\n // Scroll to top\n if (meta.scrollToTop !== false) {\n window.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior });\n }\n\n // Dispatch onInit (only once per navigation to this page)\n if (meta.onInit && !this.initDispatched) {\n this.initDispatched = true;\n this.actionDispatcher.dispatch(meta.onInit, this.context());\n }\n\n // Reset init flag when page changes\n this.destroyRef.onDestroy(() => {\n this.initDispatched = false;\n });\n }\n\n ngOnDestroy(): void {\n const meta = this.pageMeta();\n\n // Dispatch onDestroy\n if (meta?.onDestroy) {\n this.actionDispatcher.dispatch(meta.onDestroy, this.context());\n }\n\n // Cleanup subscriptions\n this.subscriptions.forEach(s => s.unsubscribe());\n }\n\n /**\n * canDeactivate check — called by the router guard.\n * Returns true if safe to navigate away, or a confirm dialog if dirty.\n */\n canDeactivate(): boolean | Promise<boolean> {\n const meta = this.pageMeta();\n if (meta?.canDeactivate) {\n const message = meta.deactivateMessage || 'You have unsaved changes. Are you sure you want to leave?';\n return this.dialogService.confirm(message);\n }\n return true;\n }\n}\n","import { Injectable, inject, computed, Signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { MetaStateService } from '../../avora-meta-forge/services/meta-state.service';\nimport { MetaApiService } from '../../avora-meta-forge/services/meta-api.service';\nimport { GlobalAuthMeta } from '../../avora-meta-forge/models/meta.types';\n\nexport interface AuthUser {\n id?: string;\n email?: string;\n name?: string;\n roles?: string[];\n permissions?: string[];\n avatar?: string;\n role?: string; // Kept for backwards compatibility with legacy UI templates\n [key: string]: any;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private readonly state = inject(MetaStateService);\n private readonly apiService = inject(MetaApiService);\n private readonly router = inject(Router);\n private config: GlobalAuthMeta | null = null;\n private refreshTimer: any;\n private isDevMode = false;\n\n private readonly REDIRECT_KEY = 'amf_auth_redirect';\n\n // ──────────────────────────────────────────────────────────────\n // Reactive Signals (For UI Binding)\n // ──────────────────────────────────────────────────────────────\n\n readonly user: Signal<AuthUser | null> = this.state.select('auth.user');\n readonly isAuthenticated: Signal<boolean> = computed(() => {\n const isAuth = this.state.select('auth.isAuthenticated')();\n if (!isAuth) return false;\n return !this.isTokenExpired();\n });\n\n // ──────────────────────────────────────────────────────────────\n // Configuration\n // ──────────────────────────────────────────────────────────────\n\n configure(authConfig: GlobalAuthMeta, isDevMode: boolean = false): void {\n this.config = authConfig;\n this.isDevMode = isDevMode;\n\n // Load persisted token on startup\n const token = this.getStoredToken();\n if (token) {\n this.state.set('auth.token', token);\n this.state.set('auth.isAuthenticated', true);\n\n if (authConfig.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n // Load persisted user\n const userRaw = this.getFromStorage(`${authConfig.tokenKey || 'amf_auth'}_user`);\n if (userRaw) {\n try {\n const user = JSON.parse(userRaw);\n this.state.set('auth.user', user);\n } catch { /* invalid stored user */ }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Token Management\n // ──────────────────────────────────────────────────────────────\n\n setToken(token: string, refreshToken?: string): void {\n const storage = this.getStorage();\n const tokenKey = this.config?.tokenKey || 'amf_auth_token';\n\n storage.setItem(tokenKey, token);\n this.state.set('auth.token', token);\n this.state.set('auth.isAuthenticated', true);\n\n if (refreshToken) {\n const refreshKey = this.config?.refreshTokenKey || 'amf_auth_refresh';\n storage.setItem(refreshKey, refreshToken);\n this.state.set('auth.refreshToken', refreshToken);\n }\n\n if (this.config?.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n getToken(): string | null {\n return this.state.get('auth.token') || this.getStoredToken();\n }\n\n getRefreshToken(): string | null {\n const refreshKey = this.config?.refreshTokenKey || 'amf_auth_refresh';\n return this.getFromStorage(refreshKey);\n }\n\n // ──────────────────────────────────────────────────────────────\n // User Management\n // ──────────────────────────────────────────────────────────────\n\n setUser(user: AuthUser): void {\n this.state.set('auth.user', user);\n this.state.set('auth.roles', user.roles || []);\n this.state.set('auth.permissions', user.permissions || []);\n\n const tokenKey = this.config?.tokenKey || 'amf_auth';\n const storage = this.getStorage();\n storage.setItem(`${tokenKey}_user`, JSON.stringify(user));\n }\n\n getUserProfile(): AuthUser | null {\n return this.state.get('auth.user') || null;\n }\n\n hasRole(role: string | string[]): boolean {\n const roles: string[] = this.state.get('auth.roles') || [];\n \n // Check fallback if single role property is mapped directly \n const singleRole = this.user()?.role;\n if (singleRole && Array.isArray(role) && role.includes(singleRole)) return true;\n if (singleRole && !Array.isArray(role) && role === singleRole) return true;\n\n if (Array.isArray(role)) {\n return role.some(r => roles.includes(r));\n }\n return roles.includes(role);\n }\n\n hasPermission(permission: string): boolean {\n const permissions: string[] = this.state.get('auth.permissions') || [];\n return permissions.includes(permission);\n }\n\n // ──────────────────────────────────────────────────────────────\n // Login / Logout\n // ──────────────────────────────────────────────────────────────\n\n async login(credentials: Record<string, any>, preventRedirect = false): Promise<any> {\n // DEV MODE MOCK LOGIN\n if (this.isDevMode && (!this.config || !this.config.loginEndpoint || this.config.mock)) {\n return this._mockLogin(credentials['email'], credentials['password'], preventRedirect);\n }\n\n if (!this.config?.loginEndpoint) {\n throw new Error('[AvoraMetaForge] No login endpoint configured. Set loginEndpoint in AppMeta or enable devMode mock auth.');\n }\n\n const response = await this.apiService.call(this.config.loginEndpoint, undefined, credentials);\n\n if (response?.token) {\n this.setToken(response.token, response.refreshToken);\n }\n if (response?.user) {\n this.setUser(response.user);\n }\n\n if (!preventRedirect) {\n this.handleRedirect();\n }\n return response;\n }\n\n async logout(): Promise<void> {\n if (this.config?.logoutEndpoint && !this.isDevMode) {\n try {\n await this.apiService.call(this.config.logoutEndpoint);\n } catch { /* ignore logout errors */ }\n }\n\n const storage = this.getStorage();\n const tokenKey = this.config?.tokenKey || 'amf_auth_token';\n const refreshKey = this.config?.refreshTokenKey || 'amf_auth_refresh';\n storage.removeItem(tokenKey);\n storage.removeItem(refreshKey);\n storage.removeItem(`${this.config?.tokenKey || 'amf_auth'}_user`);\n\n this.state.clearNamespace('auth');\n\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n \n this.router.navigateByUrl('/login');\n }\n\n private _mockLogin(email: string, _password?: string, preventRedirect = false): any {\n const isStaff = email && email.toLowerCase().includes('staff');\n const role = isStaff ? 'STAFF' : 'ADMIN';\n const company = isStaff ? 'AvoraMetaForge Support' : 'AvoraMetaForge Inc.';\n\n const payload = {\n sub: isStaff ? 'user-002' : 'user-001',\n email: email || 'demo@example.com',\n name: (email || 'demo').split('@')[0].replace(/[^a-zA-Z]/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase()),\n role,\n company,\n iat: Date.now(),\n exp: Date.now() + 24 * 60 * 60 * 1000,\n };\n\n const token = `mock.${btoa(JSON.stringify(payload))}.demo-signature`;\n const profile: AuthUser = {\n id: payload.sub,\n name: payload.name,\n email: payload.email,\n avatar: '',\n roles: [payload.role],\n role: payload.role,\n company: payload.company,\n };\n\n this.setToken(token);\n this.setUser(profile);\n \n if (!preventRedirect) {\n this.handleRedirect();\n }\n \n return { token, user: profile };\n }\n\n // ──────────────────────────────────────────────────────────────\n // Navigation & Expiry\n // ──────────────────────────────────────────────────────────────\n\n storeRedirectUrl(url: string): void {\n localStorage.setItem(this.REDIRECT_KEY, url);\n }\n\n private handleRedirect(): void {\n const redirect = localStorage.getItem(this.REDIRECT_KEY) || '/dashboard';\n localStorage.removeItem(this.REDIRECT_KEY);\n this.router.navigateByUrl(redirect);\n }\n\n isTokenExpired(token?: string | null): boolean {\n const rawToken = token || this.getToken();\n if (!rawToken) return true;\n\n try {\n const parts = rawToken.split('.');\n if (parts.length < 2) return true;\n const payload = JSON.parse(atob(parts[1]));\n return payload.exp ? payload.exp * 1000 < Date.now() : false;\n } catch {\n return true;\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Token Refresh\n // ──────────────────────────────────────────────────────────────\n\n async refreshAuthToken(): Promise<string | null> {\n if (!this.config?.refreshEndpoint) return null;\n\n const refreshToken = this.getRefreshToken();\n if (!refreshToken) return null;\n\n try {\n const response = await this.apiService.call(\n this.config.refreshEndpoint,\n undefined,\n { refreshToken }\n );\n\n if (response?.token) {\n this.setToken(response.token, response.refreshToken || refreshToken);\n return response.token;\n }\n } catch (error) {\n console.error('[AvoraMetaForge] Token refresh failed:', error);\n await this.logout();\n }\n\n return null;\n }\n\n private scheduleTokenRefresh(): void {\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n\n const token = this.getToken();\n if (!token) return;\n\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n if (payload.exp) {\n const expiresIn = payload.exp * 1000 - Date.now();\n const refreshIn = Math.max(expiresIn - 60000, 5000);\n this.refreshTimer = setTimeout(() => this.refreshAuthToken(), refreshIn);\n }\n } catch {}\n }\n\n // ──────────────────────────────────────────────────────────────\n // Storage Helpers\n // ──────────────────────────────────────────────────────────────\n\n private getStorage(): Storage {\n switch (this.config?.tokenStorage) {\n case 'sessionStorage': return sessionStorage;\n case 'localStorage':\n default: return localStorage;\n }\n }\n\n private getStoredToken(): string | null {\n const tokenKey = this.config?.tokenKey || 'amf_auth_token';\n return this.getFromStorage(tokenKey);\n }\n\n private getFromStorage(key: string): string | null {\n const storage = this.getStorage();\n return storage.getItem(key);\n }\n}\n","/**\n * AvoraMetaForge — Plugin Registry Service\n */\nimport { Injectable } from '@angular/core';\nimport { AvoraMetaForgePlugin } from '../models/meta.types';\n\n@Injectable({ providedIn: 'root' })\nexport class PluginRegistryService {\n private plugins = new Map<string, AvoraMetaForgePlugin>();\n\n register(plugin: AvoraMetaForgePlugin): void {\n this.plugins.set(plugin.name, plugin);\n if (plugin.initialize) plugin.initialize();\n }\n\n getAll(): AvoraMetaForgePlugin[] { return Array.from(this.plugins.values()); }\n get(name: string): AvoraMetaForgePlugin | undefined { return this.plugins.get(name); }\n}\n","/**\n * AvoraMetaForge — Meta Guard\n *\n * Enhanced route guard supporting:\n * - Authentication check\n * - Role-based access (user must have at least one role)\n * - Permission-based access (user must have ALL permissions)\n * - Condition-based guards (declarative)\n * - Feature flag guards\n * - Time-based access windows\n * - Custom guard functions (plugin-provided)\n * - Failure actions and messages\n * - CanDeactivate for unsaved changes\n */\nimport { inject } from '@angular/core';\nimport { CanActivateFn, CanDeactivateFn, Router, ActivatedRouteSnapshot } from '@angular/router';\nimport { AuthService } from '../../core/auth/auth.service';\nimport { GuardMeta } from '../models/meta.types';\nimport { NotificationService } from '../../core/notifications/notification.service';\nimport { PluginRegistryService } from '../plugins/plugin-registry.service';\nimport { ConditionEvaluatorService } from './condition-evaluator.service';\nimport { ActionDispatcherService } from './action-dispatcher.service';\nimport { MetaStateService } from '../services/meta-state.service';\nimport { MetaPageComponent } from './meta-page.component';\n\n/**\n * CanActivate guard — controls whether a page can be accessed\n */\nexport const metaGuard: CanActivateFn = (route: ActivatedRouteSnapshot) => {\n const router = inject(Router);\n const authService = inject(AuthService);\n const notifications = inject(NotificationService);\n const plugins = inject(PluginRegistryService);\n const conditionEvaluator = inject(ConditionEvaluatorService);\n const actionDispatcher = inject(ActionDispatcherService);\n const stateService = inject(MetaStateService);\n\n const guardMeta = route.data['guard'] as GuardMeta | undefined;\n if (!guardMeta) return true;\n\n // --- Custom Guard ---\n if (guardMeta.custom) {\n let customFn;\n for (const plugin of plugins.getAll()) {\n if (plugin.guards?.[guardMeta.custom]) { customFn = plugin.guards[guardMeta.custom]; break; }\n }\n if (customFn) return customFn(route);\n console.warn(`[AvoraMetaForge] Custom guard \"${guardMeta.custom}\" not found.`);\n }\n\n // --- Feature Flag ---\n if (guardMeta.featureFlag) {\n const flagValue = stateService.get(`features.${guardMeta.featureFlag}`);\n if (!flagValue) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'This feature is not available');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n\n // --- Time-based Access ---\n if (guardMeta.accessWindow) {\n const now = new Date();\n if (guardMeta.accessWindow.from) {\n const from = new Date(guardMeta.accessWindow.from);\n if (now < from) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Access not yet available');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n if (guardMeta.accessWindow.to) {\n const to = new Date(guardMeta.accessWindow.to);\n if (now > to) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Access has expired');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n }\n\n // --- Authentication ---\n if (guardMeta.requireAuth && !authService.isAuthenticated()) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Please login to access this page');\n return router.parseUrl(guardMeta.redirectTo || '/login');\n }\n\n // --- Roles ---\n if (guardMeta.roles?.length) {\n const userRole = authService.user()?.role || 'Guest';\n const userRoles = Array.isArray(userRole) ? userRole : [userRole];\n const hasRole = guardMeta.roles.some(r => userRoles.includes(r));\n if (!hasRole) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'You do not have permission to access this page');\n return router.parseUrl(guardMeta.redirectTo || '/unauthorized');\n }\n }\n\n // --- Permissions ---\n if (guardMeta.permissions?.length) {\n const userPerms = (authService.user() as any)?.permissions || [];\n const hasAll = guardMeta.permissions.every(p => userPerms.includes(p));\n if (!hasAll) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'You lack specific permissions for this action');\n return router.parseUrl(guardMeta.redirectTo || '/unauthorized');\n }\n }\n\n // --- Condition-based Guard ---\n if (guardMeta.condition) {\n const context = {\n user: authService.user(),\n route: route.params,\n queryParams: route.queryParams,\n state: stateService.snapshot()\n };\n const result = conditionEvaluator.evaluate(guardMeta.condition, context);\n if (!result) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Access denied');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n\n return true;\n};\n\n/**\n * CanDeactivate guard — warns before leaving if page has unsaved changes\n */\nexport const metaCanDeactivateGuard: CanDeactivateFn<MetaPageComponent> = (component) => {\n return component.canDeactivate();\n};\n\n// ──────────────────────────────────────────────────────────────\n// Helper\n// ──────────────────────────────────────────────────────────────\n\nfunction handleGuardFailure(\n guardMeta: GuardMeta,\n notifications: NotificationService,\n actionDispatcher: ActionDispatcherService,\n defaultMessage: string\n): void {\n const message = guardMeta.failMessage || defaultMessage;\n notifications.show('error', message);\n\n if (guardMeta.onFail) {\n actionDispatcher.dispatch(guardMeta.onFail);\n }\n}\n","/**\n * AvoraMetaForge — Meta Router Service\n *\n * Generates Angular Routes from PageMeta[] definitions and merges them\n * into the existing Router config during APP_INITIALIZER.\n *\n * Architecture note: AppComponent always renders <app-layout>, which picks\n * a layout variant (vertical, empty, etc.) based on route data. Each layout\n * variant contains a <router-outlet>. Therefore all generated routes are\n * TOP-LEVEL (flat) — they render directly into the layout's outlet.\n */\nimport { Injectable, inject } from '@angular/core';\nimport { Route, Routes, Router } from '@angular/router';\nimport { PageMeta, AppMeta } from '../models/meta.types';\nimport { MetaPageComponent } from './meta-page.component';\nimport { metaGuard } from './meta-guard';\n\n@Injectable({ providedIn: 'root' })\nexport class MetaRouterService {\n private readonly router = inject(Router);\n\n /**\n * Called during APP_INITIALIZER to register all metadata-driven routes.\n * Preserves any existing static routes (e.g. login) already registered\n * via app.routes.ts, then appends dynamically generated routes.\n */\n registerApp(appMeta: AppMeta): void {\n const pageRoutes = this.buildPageRoutes(appMeta.pages, appMeta.app.defaultLayout);\n\n // Root redirect: go to login if auth UI is enabled, otherwise go to first page\n const defaultPath = appMeta.auth?.builtInUI?.enabled\n ? 'login'\n : (appMeta.pages?.[0]?.path ?? 'dashboard');\n\n // Keep existing static routes (e.g. login) that were registered via provideRouter\n const staticRoutes = this.router.config.filter(r =>\n r.path !== '**' && r.path !== ''\n );\n\n const finalConfig: Routes = [\n ...staticRoutes,\n ...pageRoutes,\n { path: '', redirectTo: defaultPath, pathMatch: 'full' },\n { path: '**', redirectTo: defaultPath }\n ];\n\n this.router.resetConfig(finalConfig);\n console.log('[AvoraMetaForge] Router configured with', finalConfig.length, 'routes');\n }\n\n /**\n * Recursively converts PageMeta[] into Angular Route[].\n */\n private buildPageRoutes(pages: PageMeta[], fallbackLayout?: string): Routes {\n if (!pages?.length) return [];\n\n return pages.map(page => {\n const routeData: Record<string, any> = {\n pageMeta: page,\n layout: page.layout || fallbackLayout || 'vertical'\n };\n\n // Only add guard data if guard is defined\n if (page.guard) {\n routeData['guard'] = page.guard;\n }\n\n // Merge any custom data\n if (page.data) {\n Object.assign(routeData, page.data);\n }\n\n const route: Route = {\n path: page.path,\n data: routeData\n };\n\n // Set title if provided\n if (page.title) {\n route.title = page.title;\n }\n\n // Only set pathMatch when explicitly specified (avoid 'undefined' in config)\n if (page.pathMatch) {\n route.pathMatch = page.pathMatch;\n }\n\n // Determine what component renders this route\n if (page.redirectTo) {\n route.redirectTo = page.redirectTo;\n } else if (page.customComponent) {\n route.loadComponent = page.customComponent;\n } else {\n // Default: use MetaPageComponent which iterates over page.sections\n route.component = MetaPageComponent;\n }\n\n // Attach meta guard if guard config exists\n if (page.guard) {\n route.canActivate = [metaGuard];\n }\n\n // Recurse into children\n if (page.children?.length) {\n route.children = this.buildPageRoutes(\n page.children,\n page.layout || fallbackLayout\n );\n }\n\n return route;\n });\n }\n}\n","/**\n * AvoraMetaForge — Meta Section Interface\n */\nimport { InjectionToken } from '@angular/core';\nexport const META_SECTION_CONFIG = new InjectionToken<any>('META_SECTION_CONFIG');\nexport const META_SECTION_CONTEXT = new InjectionToken<any>('META_SECTION_CONTEXT');\n\nexport interface MetaSectionComponent<T = any> {\n config: T;\n context?: any;\n}\n","import { Routes } from '@angular/router';\nimport { AppMeta } from '../models/layout.meta';\n\n/**\n * Returns the routing configuration for AvoraMetaForge's built-in auth UI.\n * Connect this output to your main `app.routes.ts`.\n * If auth UI is disabled, it returns an empty array, allowing the MetaRouterService\n * to safely handle dynamic page routes.\n */\nexport function getAmfRoutes(meta: AppMeta): Routes {\n if (!meta.auth?.builtInUI?.enabled) {\n return [];\n }\n\n const pages = meta.auth.builtInUI.pages || ['login', 'register', 'forgot-password', 'reset-password', 'contact-support'];\n const routes: Routes = [];\n\n\n if (pages.includes('login')) {\n routes.push({\n path: 'login',\n loadComponent: () => import('../pages/auth/login.page').then(m => m.LoginComponent),\n data: { layout: 'empty' },\n });\n }\n\n if (pages.includes('forgot-password')) {\n routes.push({\n path: 'forgot-password',\n loadComponent: () => import('../pages/auth/forgot-password.page').then(m => m.ForgotPasswordComponent),\n data: { layout: 'empty' },\n });\n }\n\n if (pages.includes('contact-support')) {\n routes.push({\n path: 'contact-support',\n loadComponent: () => import('../pages/auth/contact-support.page').then(m => m.ContactSupportComponent),\n data: { layout: 'empty' },\n });\n }\n\n return routes;\n}\n\n\n","/**\n * AvoraMetaForge — Accordion Section Component\n *\n * Renders AccordionMeta as expandable/collapsible panels.\n * Each panel can contain any SectionMeta[] — including forms,\n * tables, stats-grids, and other accordions.\n */\nimport {\n Component, Input, inject, OnChanges, SimpleChanges, signal\n} from '@angular/core';\n\nimport { AccordionMeta, AccordionPanelMeta } from '../../models/meta.types';\nimport { ConditionEvaluatorService } from '../condition-evaluator.service';\nimport { MetaSectionComponent } from '../meta-section.interface';\nimport { MetaRendererComponent } from '../meta-renderer.component';\n\n@Component({\n selector: 'amf-accordion-section',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n <div class=\"amf-accordion\"\n [class]=\"'variant-' + (config.variant || 'default')\"\n [class.accordion-bordered]=\"config.variant === 'bordered'\">\n @for (panel of visiblePanels(); track $index) {\n <div class=\"accordion-panel\"\n [class.open]=\"isOpen($index)\"\n [class.disabled]=\"panel.disabled\">\n\n <!-- Panel Header -->\n <button\n type=\"button\"\n class=\"accordion-header\"\n [attr.aria-expanded]=\"isOpen($index)\"\n [disabled]=\"panel.disabled\"\n (click)=\"togglePanel($index)\">\n\n <div class=\"accordion-header-left\">\n @if (panel.icon) {\n <svg class=\"panel-icon\" viewBox=\"0 0 24 24\">\n <path [attr.d]=\"panel.icon\"/>\n </svg>\n }\n <span class=\"panel-title\">{{ panel.title }}</span>\n </div>\n\n <div class=\"accordion-header-right\">\n <svg class=\"chevron-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"/>\n </svg>\n </div>\n </button>\n\n <!-- Panel Content -->\n <div class=\"accordion-body\" [class.open]=\"isOpen($index)\">\n <div class=\"accordion-body-inner\">\n @for (section of panel.sections; track $index) {\n <amf-renderer [section]=\"section\" [context]=\"context\" class=\"amf-section\">\n </amf-renderer>\n }\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n /* ─── Container ─── */\n .amf-accordion {\n display: flex;\n flex-direction: column;\n border-radius: 16px;\n overflow: hidden;\n border: 1px solid var(--app-border);\n background: var(--app-surface);\n }\n .amf-accordion.variant-flush {\n border: none;\n border-radius: 0;\n gap: 0;\n }\n .amf-accordion.variant-bordered {\n gap: 8px;\n border: none;\n background: transparent;\n overflow: visible;\n }\n\n /* ─── Panel ─── */\n .accordion-panel {\n overflow: hidden;\n transition: box-shadow 0.2s;\n }\n .variant-default .accordion-panel + .accordion-panel {\n border-top: 1px solid var(--app-border);\n }\n .variant-bordered .accordion-panel {\n border: 1px solid var(--app-border);\n border-radius: 12px;\n overflow: hidden;\n background: var(--app-surface);\n transition: box-shadow 0.25s;\n }\n .variant-bordered .accordion-panel.open {\n box-shadow: 0 4px 20px rgba(0,0,0,0.12);\n border-color: var(--app-primary);\n }\n .accordion-panel.disabled { opacity: 0.5; pointer-events: none; }\n\n /* ─── Header ─── */\n .accordion-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 16px 20px;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n transition: background 0.2s;\n gap: 12px;\n }\n .accordion-header:hover { background: var(--glass-bg); }\n .accordion-header:disabled { cursor: not-allowed; }\n\n .accordion-panel.open .accordion-header { background: var(--glass-bg); }\n\n .accordion-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n min-width: 0;\n }\n .panel-icon {\n width: 18px;\n height: 18px;\n fill: var(--app-primary);\n flex-shrink: 0;\n }\n .panel-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--app-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .accordion-header-right { flex-shrink: 0; }\n .chevron-icon {\n width: 20px;\n height: 20px;\n fill: var(--app-text-muted);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .accordion-panel.open .chevron-icon { transform: rotate(180deg); fill: var(--app-primary); }\n\n /* ─── Body ─── */\n .accordion-body {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.45s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .accordion-body.open { max-height: 4000px; }\n\n .accordion-body-inner {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 20px 20px;\n border-top: 1px solid var(--app-border);\n animation: accordionFadeIn 0.3s ease-out;\n }\n @keyframes accordionFadeIn {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n :host { display: block; }\n .amf-section { display: block; }\n `]\n})\nexport class AccordionSectionComponent implements MetaSectionComponent<AccordionMeta>, OnChanges {\n @Input() config!: AccordionMeta;\n @Input() context: any = {};\n\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n\n /** Set of open panel indices */\n openPanels = signal<Set<number>>(new Set<number>());\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.config) {\n // Expand panels that start expanded\n const defaultOpen = new Set<number>();\n this.config.panels?.forEach((panel, i) => {\n if (panel.expanded) defaultOpen.add(i);\n });\n this.openPanels.set(defaultOpen);\n }\n }\n\n visiblePanels(): AccordionPanelMeta[] {\n return (this.config?.panels ?? []).filter(panel => {\n if (!panel.visibleWhen) return true;\n return this.conditionEvaluator.evaluate(panel.visibleWhen, this.context);\n });\n }\n\n isOpen(index: number): boolean {\n return this.openPanels().has(index);\n }\n\n togglePanel(index: number): void {\n const current = new Set(this.openPanels());\n if (current.has(index)) {\n current.delete(index);\n } else {\n if (!this.config.multi) {\n // Close all others\n current.clear();\n }\n current.add(index);\n }\n this.openPanels.set(current);\n }\n}\n","import { Component, inject, signal, OnDestroy, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActionDispatcherService } from '../action-dispatcher.service';\nimport { MetaRendererComponent } from '../meta-renderer.component';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-modal-host',\n standalone: true,\n imports: [CommonModule, MetaRendererComponent],\n template: `\n @if (isOpen()) {\n <div class=\"amf-modal-backdrop\" (click)=\"closeOnBackdrop($event)\">\n <div class=\"amf-modal-dialog\" [ngClass]=\"['size-' + (config()?.size || 'md')]\" (click)=\"$event.stopPropagation()\">\n <div class=\"amf-modal-header\">\n <h3>{{ config()?.title }}</h3>\n <button class=\"amf-modal-close\" (click)=\"close()\">&times;</button>\n </div>\n <div class=\"amf-modal-content\">\n @if (config()?.content) {\n <amf-renderer [section]=\"config()!.content\" [context]=\"{}\"></amf-renderer>\n }\n </div>\n @if (config()?.actions?.length) {\n <div class=\"amf-modal-footer\">\n @for (action of config()!.actions; track action.label) {\n <button [class]=\"'btn-' + (action.color || 'primary')\" (click)=\"dispatchAction(action.action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n }\n `,\n styles: [`\n .amf-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n animation: fadeIn 0.2s ease-out;\n }\n .amf-modal-dialog {\n background: var(--glass-bg, rgba(20,25,40,0.9));\n border: 1px solid var(--app-border, rgba(255,255,255,0.1));\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0,0,0,0.5);\n width: 100%;\n max-height: 90vh;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n animation: slideUp 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n }\n .size-sm { max-width: 400px; }\n .size-md { max-width: 600px; }\n .size-lg { max-width: 800px; }\n .size-full { max-width: 95vw; height: 95vh; }\n \n .amf-modal-header {\n padding: 20px 24px;\n border-bottom: 1px solid var(--app-border, rgba(255,255,255,0.1));\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .amf-modal-header h3 {\n font-size: 1.25rem;\n margin: 0;\n color: #fff;\n }\n .amf-modal-close {\n background: transparent;\n border: none;\n color: #94a3b8;\n font-size: 1.5rem;\n cursor: pointer;\n line-height: 1;\n padding: 0 4px;\n }\n .amf-modal-close:hover { color: #fff; }\n \n .amf-modal-content {\n padding: 24px;\n flex-grow: 1;\n color: #94a3b8;\n }\n .amf-modal-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--app-border, rgba(255,255,255,0.1));\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc)); color: white; padding: 10px 20px; border-radius: 8px; border: none; cursor: pointer; font-weight: 600;}\n .btn-outline { background: transparent; border: 1px solid #475569; color: #e2e8f0; padding: 10px 20px; border-radius: 8px; cursor: pointer; font-weight: 600;}\n .btn-danger { background: #ef4444; color: white; padding: 10px 20px; border-radius: 8px; border: none; cursor: pointer; font-weight: 600;}\n \n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes slideUp { from { opacity: 0; transform: translateY(20px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } }\n `]\n})\nexport class MetaModalHostComponent implements OnInit, OnDestroy {\n private dispatcher = inject(ActionDispatcherService);\n private sub?: Subscription;\n\n isOpen = signal(false);\n config = signal<any>(null);\n\n ngOnInit() {\n this.sub = this.dispatcher.modalEvents$.subscribe(event => {\n if (event.action === 'open') {\n this.config.set(event.config);\n this.isOpen.set(true);\n } else if (event.action === 'close') {\n this.isOpen.set(false);\n setTimeout(() => this.config.set(null), 300); // clear after animation\n }\n });\n }\n\n ngOnDestroy() {\n this.sub?.unsubscribe();\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n closeOnBackdrop(e: Event) {\n if (this.config()?.disableCloseOnBackdrop) return;\n this.close();\n }\n\n dispatchAction(actionMeta: any) {\n this.dispatcher.dispatch(actionMeta, {});\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * A simple SVG icon registry so the template doesn't depend on external icon fonts.\n * Icons are registered as inline SVG path data keyed by name.\n */\n@Injectable({ providedIn: 'root' })\nexport class IconRegistryService {\n private icons = new Map<string, string>();\n\n constructor() {\n this.registerDefaults();\n }\n\n /** Register a named SVG icon (viewBox 0 0 24 24) */\n register(name: string, svgPath: string): void {\n this.icons.set(name, svgPath);\n }\n\n /** Get SVG path data for a named icon */\n getIcon(name: string): string {\n return this.icons.get(name) ?? this.icons.get('default')!;\n }\n\n /** Check if an icon exists */\n has(name: string): boolean {\n return this.icons.has(name);\n }\n\n private registerDefaults(): void {\n this.register('default', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z');\n this.register('dashboard', 'M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z');\n this.register('analytics', 'M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z');\n this.register('users', 'M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z');\n this.register('settings', 'M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 00.12-.61l-1.92-3.32a.488.488 0 00-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 00-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.07.62-.07.94s.02.64.07.94l-2.03 1.58a.49.49 0 00-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z');\n this.register('shield', 'M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z');\n this.register('bell', 'M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z');\n this.register('menu', 'M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z');\n this.register('close', 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z');\n this.register('search', 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z');\n this.register('logout', 'M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z');\n this.register('person', 'M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z');\n this.register('chevron-down', 'M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z');\n this.register('chevron-right', 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z');\n this.register('palette', 'M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-1 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z');\n\n // Status & Feedback Icons\n this.register('add', 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z');\n this.register('check-circle', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z');\n this.register('error', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z');\n this.register('info', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z');\n this.register('warning', 'M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z');\n\n // Navigation & Action Icons (used by APP_META)\n this.register('home', 'M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z');\n this.register('bar-chart-2', 'M5 9.2h3V19H5V9.2zM10.6 5h2.8v14h-2.8V5zm5.6 8H19v6h-2.8v-6z');\n this.register('layers', 'M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27-7.38 5.74zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16z');\n this.register('download', 'M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z');\n this.register('user-plus', 'M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z');\n this.register('edit-2', 'M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z');\n this.register('trash-2', 'M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z');\n this.register('eye', 'M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z');\n this.register('clock', 'M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z');\n this.register('trending-up', 'M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6z');\n this.register('dollar-sign', 'M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z');\n this.register('activity', 'M22 12h-4l-3 9L9 3l-3 9H2');\n }\n}\n","import { Component, inject, OnDestroy, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { AmfDialogService, DialogRequest } from '../services/amf-dialog.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\n\n@Component({\n selector: 'amf-dialog-host',\n standalone: true,\n imports: [CommonModule],\n template: `\n @if (currentDialog()) {\n <div class=\"amf-dialog-backdrop\" (click)=\"onBackdropClick()\">\n <div class=\"amf-dialog-box\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"dialog-header\">\n <div class=\"dialog-icon-wrapper\" [ngClass]=\"'variant-' + (currentDialog()?.config?.variant || 'info')\">\n @if (currentDialog()?.config?.icon) {\n <svg viewBox=\"0 0 24 24\" class=\"icon-element\">\n <path [attr.d]=\"iconPath\"></path>\n </svg>\n } @else {\n <span class=\"icon-fallback\">!</span>\n }\n </div>\n @if (currentDialog()?.config?.title) {\n <h3 class=\"dialog-title\">{{ currentDialog()!.config!.title }}</h3>\n }\n </div>\n\n <div class=\"dialog-content\">\n <p class=\"dialog-message\">{{ currentDialog()!.config!.message }}</p>\n </div>\n\n <div class=\"dialog-actions\">\n @if (currentDialog()?.config?.showCancel) {\n <button class=\"btn btn-cancel\" (click)=\"close(false)\">\n {{ currentDialog()?.config?.cancelLabel || 'Cancel' }}\n </button>\n }\n <button class=\"btn btn-confirm\" [ngClass]=\"'btn-variant-' + (currentDialog()?.config?.variant || 'info')\" (click)=\"close(true)\">\n {{ currentDialog()?.config?.confirmLabel || 'OK' }}\n </button>\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n .amf-dialog-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(10, 15, 30, 0.75);\n backdrop-filter: blur(12px);\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n animation: fadeIn 0.25s ease-out;\n }\n \n .amf-dialog-box {\n background: var(--glass-bg, rgba(20,25,40,0.9));\n border: 1px solid var(--app-border, rgba(255,255,255,0.1));\n border-radius: 20px;\n box-shadow: 0 25px 50px -12px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.05) inset;\n width: 100%;\n max-width: 420px;\n display: flex;\n flex-direction: column;\n animation: popIn 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n overflow: hidden;\n }\n\n .dialog-header {\n padding: 32px 32px 16px 32px;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 16px;\n }\n\n .dialog-icon-wrapper {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n color: white;\n box-shadow: 0 8px 16px -4px rgba(0,0,0,0.3);\n }\n \n .dialog-icon-wrapper.variant-info { background: linear-gradient(135deg, #3b82f6, #2563eb); box-shadow: 0 8px 24px -6px rgba(59,130,246,0.5); }\n .dialog-icon-wrapper.variant-success { background: linear-gradient(135deg, #10b981, #059669); box-shadow: 0 8px 24px -6px rgba(16,185,129,0.5); }\n .dialog-icon-wrapper.variant-warning { background: linear-gradient(135deg, #f59e0b, #d97706); box-shadow: 0 8px 24px -6px rgba(245,158,11,0.5); }\n .dialog-icon-wrapper.variant-danger { background: linear-gradient(135deg, #ef4444, #dc2626); box-shadow: 0 8px 24px -6px rgba(239,68,68,0.5); }\n\n .icon-element { width: 32px; height: 32px; display: block; filter: drop-shadow(0 2px 2px rgba(0,0,0,0.2)); }\n .icon-fallback { font-family: monospace; font-weight: bold; }\n\n .dialog-title {\n margin: 0;\n color: var(--app-text, #ffffff);\n font-size: 1.25rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n }\n\n .dialog-content {\n padding: 0 32px 32px 32px;\n text-align: center;\n }\n\n .dialog-message {\n margin: 0;\n color: var(--app-text-muted, #94a3b8);\n font-size: 0.95rem;\n line-height: 1.5;\n }\n\n .dialog-actions {\n display: flex;\n gap: 12px;\n padding: 24px 32px;\n background: rgba(0,0,0,0.2);\n border-top: 1px solid var(--app-border, rgba(255,255,255,0.05));\n }\n\n .btn {\n flex: 1;\n padding: 12px 20px;\n border-radius: 12px;\n font-size: 0.9rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-cancel {\n background: rgba(255,255,255,0.05);\n color: var(--app-text, #ffffff);\n border: 1px solid rgba(255,255,255,0.1);\n }\n .btn-cancel:hover { background: rgba(255,255,255,0.1); }\n\n .btn-confirm { color: white; box-shadow: 0 4px 12px transparent; }\n .btn-confirm:hover { transform: translateY(-1px); }\n \n .btn-variant-info { background: #3b82f6; box-shadow: 0 4px 12px rgba(59,130,246,0.3); }\n .btn-variant-info:hover { background: #60a5fa; box-shadow: 0 6px 16px rgba(59,130,246,0.4); }\n \n .btn-variant-success { background: #10b981; box-shadow: 0 4px 12px rgba(16,185,129,0.3); }\n .btn-variant-success:hover { background: #34d399; box-shadow: 0 6px 16px rgba(16,185,129,0.4); }\n \n .btn-variant-warning { background: #f59e0b; box-shadow: 0 4px 12px rgba(245,158,11,0.3); }\n .btn-variant-warning:hover { background: #fbbf24; box-shadow: 0 6px 16px rgba(245,158,11,0.4); }\n \n .btn-variant-danger { background: #ef4444; box-shadow: 0 4px 12px rgba(239,68,68,0.3); }\n .btn-variant-danger:hover { background: #f87171; box-shadow: 0 6px 16px rgba(239,68,68,0.4); }\n\n @keyframes fadeIn { from { opacity: 0; backdrop-filter: blur(0px); } to { opacity: 1; backdrop-filter: blur(12px); } }\n @keyframes popIn { \n 0% { opacity: 0; transform: scale(0.9) translateY(10px); } \n 100% { opacity: 1; transform: scale(1) translateY(0); } \n }\n `]\n})\nexport class AmfDialogHostComponent implements OnInit, OnDestroy {\n readonly iconRegistry = inject(IconRegistryService);\n private readonly dialogService = inject(AmfDialogService);\n private sub?: Subscription;\n\n currentDialog = signal<DialogRequest | null>(null);\n\n get iconPath(): string | undefined {\n const icon = this.currentDialog()?.config?.icon;\n return icon ? this.iconRegistry.getIcon(icon) : undefined;\n }\n\n ngOnInit() {\n this.sub = this.dialogService.dialogState$.subscribe(request => {\n this.currentDialog.set(request);\n });\n }\n\n ngOnDestroy() {\n if (this.sub) this.sub.unsubscribe();\n }\n\n onBackdropClick() {\n // Only close if it's informational, or if it has a cancel button (meaning it's a choice)\n const req = this.currentDialog();\n if (req && req.config.showCancel) {\n this.close(false);\n }\n }\n\n close(result: boolean) {\n const req = this.currentDialog();\n if (req) {\n req.resolve(result); // Resolve the promise!\n this.currentDialog.set(null); // Clear the dialog visually\n }\n }\n}\n","import { Component, inject, signal, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActionDispatcherService } from '../action-dispatcher.service';\nimport { MetaRendererComponent } from '../meta-renderer.component';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-drawer-host',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n @if (isOpen()) {\n <!-- Backdrop -->\n <div class=\"amf-drawer-backdrop\" (click)=\"closeOnBackdrop()\"></div>\n }\n <!-- Drawer panel — always in DOM so the CSS slide animation works -->\n <div class=\"amf-drawer-panel\"\n [class.is-open]=\"isOpen()\"\n [style.width]=\"config()?.size || '420px'\"\n [class.position-left]=\"config()?.position === 'left'\"\n (click)=\"$event.stopPropagation()\">\n @if (isOpen() && config()) {\n <div class=\"amf-drawer-header\">\n <h3>{{ config()?.title }}</h3>\n <button class=\"amf-drawer-close\" (click)=\"close()\" aria-label=\"Close drawer\">&times;</button>\n </div>\n <div class=\"amf-drawer-content\">\n @if (config()?.content) {\n <amf-renderer [section]=\"config()!.content\" [context]=\"{}\"></amf-renderer>\n }\n </div>\n @if (config()?.actions?.length) {\n <div class=\"amf-drawer-footer\">\n @for (action of config()!.actions; track action.label) {\n <button [class]=\"'btn-' + (action.color || 'primary')\" (click)=\"dispatchAction(action.action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n }\n </div>\n `,\n styles: [`\n /* ── Backdrop ── */\n .amf-drawer-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(4px);\n z-index: 1200;\n animation: fadeIn 0.25s ease-out;\n }\n\n /* ── Panel ── */\n .amf-drawer-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100%;\n max-width: 95vw;\n background: var(--glass-bg, rgba(15, 20, 40, 0.97));\n border-left: 1px solid var(--app-border, rgba(255,255,255,0.08));\n box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);\n z-index: 1201;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);\n will-change: transform;\n overflow: hidden;\n }\n\n .amf-drawer-panel.position-left {\n right: auto;\n left: 0;\n border-left: none;\n border-right: 1px solid var(--app-border, rgba(255,255,255,0.08));\n transform: translateX(-100%);\n }\n\n .amf-drawer-panel.is-open {\n transform: translateX(0);\n }\n\n /* ── Header ── */\n .amf-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--app-border, rgba(255,255,255,0.08));\n flex-shrink: 0;\n }\n\n .amf-drawer-header h3 {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 700;\n color: var(--app-text, #f1f5f9);\n letter-spacing: -0.01em;\n }\n\n .amf-drawer-close {\n background: rgba(255,255,255,0.06);\n border: 1px solid rgba(255,255,255,0.08);\n color: var(--app-text-muted, #94a3b8);\n font-size: 1.25rem;\n line-height: 1;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n\n .amf-drawer-close:hover {\n background: rgba(255,255,255,0.12);\n color: var(--app-text, #f1f5f9);\n }\n\n /* ── Content ── */\n .amf-drawer-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n /* ── Footer ── */\n .amf-drawer-footer {\n flex-shrink: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--app-border, rgba(255,255,255,0.08));\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n background: rgba(0,0,0,0.15);\n }\n\n .btn-primary {\n background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc));\n color: white; padding: 10px 20px; border-radius: 8px; border: none; cursor: pointer; font-weight: 600;\n transition: all 0.2s;\n }\n .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 6px 20px var(--app-glow); }\n\n .btn-outline {\n background: transparent; border: 1px solid #475569; color: #e2e8f0;\n padding: 10px 20px; border-radius: 8px; cursor: pointer; font-weight: 600;\n transition: all 0.2s;\n }\n .btn-outline:hover { background: rgba(255,255,255,0.06); }\n\n .btn-danger {\n background: #ef4444; color: white; padding: 10px 20px; border-radius: 8px;\n border: none; cursor: pointer; font-weight: 600;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `]\n})\nexport class AmfDrawerHostComponent implements OnInit, OnDestroy {\n private readonly dispatcher = inject(ActionDispatcherService);\n private sub?: Subscription;\n\n isOpen = signal(false);\n config = signal<any>(null);\n\n ngOnInit(): void {\n this.sub = this.dispatcher.drawerEvents$.subscribe(event => {\n if (event.action === 'open') {\n this.config.set(event.config);\n this.isOpen.set(true);\n } else if (event.action === 'close') {\n this.isOpen.set(false);\n // Clear config after slide-out animation completes\n setTimeout(() => this.config.set(null), 400);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n close(): void {\n this.isOpen.set(false);\n setTimeout(() => this.config.set(null), 400);\n }\n\n closeOnBackdrop(): void {\n if (this.config()?.disableCloseOnBackdrop) return;\n this.close();\n }\n\n dispatchAction(actionMeta: any): void {\n this.dispatcher.dispatch(actionMeta, {});\n }\n}\n","/**\n * AvoraMetaForge — Validator Factory Service\n */\nimport { Injectable } from '@angular/core';\nimport { Validators, ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { ValidatorMeta } from '../../models/meta.types';\n\ntype CustomValidatorFn = (value: any, ...args: any[]) => ValidationErrors | null;\n\n@Injectable({ providedIn: 'root' })\nexport class ValidatorFactoryService {\n private customValidators = new Map<string, CustomValidatorFn>();\n\n registerValidator(key: string, fn: CustomValidatorFn): void { this.customValidators.set(key, fn); }\n\n createValidators(metas: ValidatorMeta[] | undefined): ValidatorFn[] {\n if (!metas?.length) return [];\n return metas.map(meta => this.createValidator(meta)).filter((v): v is ValidatorFn => v !== null);\n }\n\n private createValidator(meta: ValidatorMeta): ValidatorFn | null {\n switch (meta.type) {\n case 'required': return this.withMessage(Validators.required, meta.message || 'Required');\n case 'email': return this.withMessage(Validators.email, meta.message || 'Invalid email');\n case 'minLength': return this.withMessage(Validators.minLength(meta.value), meta.message || `Min length: ${meta.value}`);\n case 'maxLength': return this.withMessage(Validators.maxLength(meta.value), meta.message || `Max length: ${meta.value}`);\n case 'min': return this.withMessage(Validators.min(meta.value), meta.message || `Min: ${meta.value}`);\n case 'max': return this.withMessage(Validators.max(meta.value), meta.message || `Max: ${meta.value}`);\n case 'pattern': return this.withMessage(Validators.pattern(meta.value), meta.message || 'Invalid format');\n case 'custom':\n if (meta.custom) {\n const customFn = this.customValidators.get(meta.custom);\n if (customFn) {\n return (control: AbstractControl): ValidationErrors | null => {\n const errors = customFn(control.value, meta.value);\n return errors ? { custom: { message: meta.message || 'Validation failed', ...errors } } : null;\n };\n }\n }\n return null;\n default: return null;\n }\n }\n\n private withMessage(validator: ValidatorFn, message: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const result = validator(control);\n if (result) {\n const key = Object.keys(result)[0];\n return { [key]: { ...result[key], message } };\n }\n return null;\n };\n }\n\n getErrorMessage(errors: ValidationErrors | null): string {\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n const error = errors[firstKey];\n if (typeof error === 'object' && error?.message) return error.message;\n return 'Invalid field';\n }\n}\n\n","import { Component, Input, Output, EventEmitter, inject, forwardRef } from '@angular/core';\n\nimport { FormArray, FormGroup, ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { FieldMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { FieldRendererComponent } from './field-renderer.component';\n\n@Component({\n selector: 'amf-repeater-field',\n standalone: true,\n imports: [ReactiveFormsModule, forwardRef(() => FieldRendererComponent)],\n template: `\n <div class=\"amf-repeater\" [class]=\"field.cssClass\">\n <!-- ── Header & Global Add ── -->\n <div class=\"repeater-header\">\n <label class=\"repeater-label\">{{ field.label }}</label>\n @if (canAdd) {\n <button type=\"button\" class=\"btn-repeater-add\" (click)=\"addItem()\" [disabled]=\"formDisabled\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>\n {{ field.addLabel || 'Add Item' }}\n </button>\n }\n </div>\n \n @if (field.description) {\n <p class=\"repeater-description\">{{ field.description }}</p>\n }\n\n <div class=\"repeater-list\">\n @for (ctrl of formArray.controls; track $index) {\n <div class=\"repeater-item-card\">\n <div class=\"repeater-item-header\">\n <span class=\"item-title\">Item {{ $index + 1 }}</span>\n @if (canRemove) {\n <button type=\"button\" class=\"btn-repeater-remove\" (click)=\"removeItem($index)\" [disabled]=\"formDisabled\" title=\"Remove Item\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.12-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z\"/></svg>\n </button>\n }\n </div>\n \n <div class=\"repeater-item-body\">\n <div class=\"repeater-fields-grid\" [style.grid-template-columns]=\"getGridStyle(field)\">\n @for (child of field.children || []; track child.key) {\n <amf-field-renderer\n [field]=\"child\"\n [form]=\"getFormGroup(ctrl)\"\n [formDisabled]=\"formDisabled\"\n [actionDispatcher]=\"actionDispatcher\"\n [context]=\"context\"\n [style.grid-column]=\"child.colSpan ? 'span ' + child.colSpan : null\">\n </amf-field-renderer>\n }\n </div>\n </div>\n </div>\n }\n\n @if (formArray.controls.length === 0) {\n <div class=\"repeater-empty-state\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>\n <p>No items added yet. Click \"{{ field.addLabel || 'Add Item' }}\" to begin.</p>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .amf-repeater { margin-bottom: 24px; }\n .repeater-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n .repeater-label { font-size: 0.9375rem; font-weight: 600; color: var(--app-text); margin: 0; }\n .repeater-description { font-size: 0.8125rem; color: var(--app-text-muted); margin: 0 0 16px 0; }\n \n .btn-repeater-add {\n display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px;\n font-size: 0.8125rem; font-weight: 500; font-family: inherit; cursor: pointer;\n border: 1px solid rgba(59, 130, 246, 0.3); border-radius: 6px;\n background: rgba(59, 130, 246, 0.1); color: #3b82f6; transition: all 0.2s;\n }\n .btn-repeater-add svg { width: 14px; height: 14px; fill: currentColor; }\n .btn-repeater-add:hover:not(:disabled) { background: rgba(59, 130, 246, 0.2); }\n .btn-repeater-add:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .repeater-list { display: flex; flex-direction: column; gap: 16px; }\n\n .repeater-item-card {\n background: var(--app-surface-hover); border: 1px solid var(--app-border);\n border-radius: 8px; overflow: hidden; transition: box-shadow 0.2s;\n }\n .repeater-item-card:hover { border-color: rgba(59, 130, 246, 0.3); }\n\n .repeater-item-header {\n display: flex; align-items: center; justify-content: space-between;\n padding: 10px 16px; border-bottom: 1px solid var(--app-border);\n background: rgba(0, 0, 0, 0.02);\n }\n :host-context(body.amf-dark) .repeater-item-header { background: rgba(255, 255, 255, 0.02); }\n\n .item-title { font-size: 0.8125rem; font-weight: 600; color: var(--app-text); text-transform: uppercase; letter-spacing: 0.5px; }\n\n .btn-repeater-remove {\n display: flex; align-items: center; justify-content: center;\n width: 28px; height: 28px; padding: 0; border: none; border-radius: 4px;\n background: transparent; color: #ef4444; cursor: pointer; transition: background 0.2s;\n }\n .btn-repeater-remove svg { width: 18px; height: 18px; fill: currentColor; }\n .btn-repeater-remove:hover:not(:disabled) { background: rgba(239, 68, 68, 0.1); }\n .btn-repeater-remove:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .repeater-item-body { padding: 16px; }\n \n .repeater-fields-grid {\n display: grid; gap: 16px;\n }\n\n .repeater-empty-state {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n padding: 32px 16px; text-align: center; border: 1.5px dashed var(--app-border);\n border-radius: 8px; color: var(--app-text-muted); background: var(--app-surface-hover);\n }\n .repeater-empty-state svg { width: 32px; height: 32px; fill: currentColor; opacity: 0.5; margin-bottom: 12px; }\n .repeater-empty-state p { font-size: 0.875rem; margin: 0; }\n `]\n})\nexport class RepeaterFieldComponent {\n @Input() field!: FieldMeta;\n @Input() formArray!: FormArray;\n @Input() formDisabled = false;\n @Input() actionDispatcher: any;\n @Input() context: any = {};\n\n private readonly validatorFactory = inject(ValidatorFactoryService);\n\n get canAdd(): boolean {\n if (this.formDisabled) return false;\n if (this.field.maxItems !== undefined && this.formArray.length >= this.field.maxItems) return false;\n return true;\n }\n\n get canRemove(): boolean {\n if (this.formDisabled) return false;\n if (this.field.minItems !== undefined && this.formArray.length <= this.field.minItems) return false;\n return true;\n }\n\n getFormGroup(ctrl: any): FormGroup {\n return ctrl as FormGroup;\n }\n\n getGridStyle(field: FieldMeta): string {\n const cols = field['columns'] || 1;\n return `repeat(${cols}, minmax(0, 1fr))`;\n }\n\n addItem(): void {\n if (!this.canAdd) return;\n\n const groupControls: Record<string, FormControl> = {};\n for (const child of this.field.children || []) {\n const validators = this.validatorFactory.createValidators(child.validators);\n groupControls[child.key] = new FormControl(child.defaultValue ?? '', validators);\n }\n \n this.formArray.push(new FormGroup(groupControls));\n }\n\n removeItem(index: number): void {\n if (!this.canRemove) return;\n this.formArray.removeAt(index);\n }\n}\n","/**\n * AvoraMetaForge — Field Renderer Component\n */\nimport { Component, Input, inject, signal } from '@angular/core';\n\nimport { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';\nimport { FieldMeta } from '../../models/meta.types';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { RepeaterFieldComponent } from './repeater-field.component';\n\n@Component({\n selector: 'amf-field-renderer',\n standalone: true,\n imports: [ReactiveFormsModule, RepeaterFieldComponent],\n template: `\n @if (field.type !== 'hidden') {\n <div class=\"amf-field\" [class]=\"field.cssClass\" [class.has-error]=\"hasError\" [class.field-disabled]=\"isFieldDisabled\">\n @if (field.type === 'heading') { <h3 class=\"field-heading\">{{ field.text || field.label }}</h3> }\n @else if (field.type === 'divider') { <hr class=\"field-divider\" /> }\n @else {\n @if (field.label && field.type !== 'repeater') { <label class=\"field-label\" [for]=\"field.key\">{{ field.label }} @if (isRequired) { <span class=\"required-mark\">*</span> } </label> }\n <div class=\"field-input-wrapper\" [class.has-prefix]=\"!!field.prefix\" [class.has-suffix]=\"!!field.suffix\">\n @if (field.prefix) { <span class=\"field-prefix\">{{ field.prefix }}</span> }\n @switch (field.type) {\n @case ('button') {\n <button type=\"button\" class=\"field-button\" [class]=\"'btn-' + (field.color || 'primary')\" [disabled]=\"isFieldDisabled\" (click)=\"handleButtonClick()\">\n {{ field.label }}\n </button>\n }\n @case ('textarea') { <textarea class=\"field-input field-textarea\" [id]=\"field.key\" [formControl]=\"control\" [placeholder]=\"field.placeholder || ''\" [rows]=\"field.rows || 3\" [readOnly]=\"field.readOnly || false\"></textarea> }\n @case ('select') {\n <select class=\"field-input field-select\" [id]=\"field.key\" [formControl]=\"control\">\n <option value=\"\" disabled>{{ field.placeholder || 'Select...' }}</option>\n @for (opt of field.options || []; track opt.value) { <option [value]=\"opt.value\" [disabled]=\"opt.disabled || false\">{{ opt.label }}</option> }\n </select>\n }\n @case ('checkbox') {\n <label class=\"field-checkbox-label\"><input type=\"checkbox\" class=\"field-checkbox\" [id]=\"field.key\" [formControl]=\"control\" /><span>{{ field.placeholder || field.label }}</span></label>\n }\n @case ('toggle') {\n <label class=\"field-toggle-label\"><input type=\"checkbox\" class=\"field-toggle-input\" [id]=\"field.key\" [formControl]=\"control\" /><span class=\"field-toggle-track\"><span class=\"field-toggle-thumb\"></span></span>@if (field.placeholder) { <span class=\"field-toggle-text\">{{ field.placeholder }}</span> }</label>\n }\n @case ('switch') {\n <label class=\"field-toggle-label\"><input type=\"checkbox\" class=\"field-toggle-input\" [id]=\"field.key\" [formControl]=\"control\" /><span class=\"field-toggle-track\"><span class=\"field-toggle-thumb\"></span></span>@if (field.placeholder) { <span class=\"field-toggle-text\">{{ field.placeholder }}</span> }</label>\n }\n @case ('radio') {\n <div class=\"field-radio-group\">\n @for (opt of field.options || []; track opt.value) {\n <label class=\"field-radio-label\"><input type=\"radio\" [name]=\"field.key\" [value]=\"opt.value\" [formControl]=\"control\" [attr.disabled]=\"opt.disabled ? '' : null\" /><span>{{ opt.label }}</span></label>\n }\n </div>\n }\n @case ('otp') {\n <div class=\"field-otp-group\">\n @for (val of otpArray; track $index) {\n <input class=\"field-input otp-digit\" type=\"text\" inputmode=\"numeric\" [value]=\"val\" (input)=\"onOtpInput($event, $index)\" (keydown)=\"onOtpKeydown($event, $index)\" [disabled]=\"isFieldDisabled\" placeholder=\"•\" />\n }\n </div>\n }\n @case ('repeater') {\n <amf-repeater-field\n [field]=\"field\"\n [formArray]=\"getFormArray(field.key)\"\n [formDisabled]=\"isFieldDisabled\"\n [actionDispatcher]=\"actionDispatcher\"\n [context]=\"context\">\n </amf-repeater-field>\n }\n @case ('password') {\n <div class=\"password-wrapper\">\n <input\n class=\"field-input password-input\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n [id]=\"field.key\"\n [formControl]=\"control\"\n [placeholder]=\"field.placeholder || ''\"\n [readOnly]=\"field.readOnly || false\"\n [attr.autocomplete]=\"field.autocomplete\" />\n <button\n type=\"button\"\n class=\"pwd-toggle-btn\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\"\n (click)=\"togglePasswordVisibility()\">\n @if (showPassword()) {\n <!-- Eye-slash: password visible -->\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\"/>\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\"/>\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>\n </svg>\n } @else {\n <!-- Eye: password hidden -->\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n }\n </button>\n </div>\n }\n @case ('currency') {\n <div class=\"currency-wrapper\">\n <span class=\"currency-symbol\">{{ currencySymbol }}</span>\n <input\n class=\"field-input currency-input\"\n type=\"text\"\n inputmode=\"decimal\"\n [id]=\"field.key\"\n [value]=\"formattedCurrencyValue\"\n [placeholder]=\"field.placeholder || '0.00'\"\n [disabled]=\"isFieldDisabled\"\n (input)=\"onCurrencyInput($event)\"\n (blur)=\"onCurrencyBlur($event)\" />\n </div>\n }\n @default { <input class=\"field-input\" [type]=\"field.type\" [id]=\"field.key\" [formControl]=\"control\" [placeholder]=\"field.placeholder || ''\" [readOnly]=\"field.readOnly || false\" [attr.min]=\"field.min\" [attr.max]=\"field.max\" [attr.step]=\"field.step\" [attr.accept]=\"field.accept\" [attr.multiple]=\"field.multiple ? '' : null\" [attr.autocomplete]=\"field.autocomplete\" /> }\n }\n @if (field.suffix) { <span class=\"field-suffix\">{{ field.suffix }}</span> }\n </div>\n @if (field.hint && !hasError) { <span class=\"field-hint\">{{ field.hint }}</span> }\n @if (hasError) { <span class=\"field-error\">{{ errorMessage }}</span> }\n }\n </div>\n }\n `,\n styles: [`\n .amf-field { display: flex; flex-direction: column; gap: 6px; }\n .amf-field.field-disabled { opacity: 0.5; pointer-events: none; }\n .field-label { font-size: 0.875rem; font-weight: 600; color: var(--app-text); }\n .required-mark { color: #f43f5e; margin-left: 2px; }\n .field-input-wrapper { display: flex; align-items: stretch; position: relative; }\n .field-prefix, .field-suffix { padding: 10px 12px; font-size: 0.875rem; color: var(--app-text-muted); background: var(--glass-bg); border: 1px solid var(--app-border); display: flex; align-items: center; justify-content: center; white-space: nowrap; box-sizing: border-box; }\n .field-prefix { border-right: none; border-radius: 8px 0 0 8px; }\n .field-suffix { border-left: none; border-radius: 0 8px 8px 0; }\n .field-input { flex: 1; width: 100%; padding: 10px 14px; border: 1px solid var(--app-border); border-radius: 8px; background: var(--glass-bg); color: var(--app-text); font-size: 0.875rem; font-family: inherit; outline: none; transition: border-color 0.2s, box-shadow 0.2s; box-sizing: border-box; }\n .has-prefix .field-input { border-top-left-radius: 0; border-bottom-left-radius: 0; }\n .has-suffix .field-input { border-top-right-radius: 0; border-bottom-right-radius: 0; }\n .field-input:focus { border-color: var(--app-primary); box-shadow: 0 0 0 3px var(--app-primary-light); z-index: 3; position: relative; }\n .field-input::placeholder { color: var(--app-text-muted); opacity: 0.6; }\n .field-input[readonly] { opacity: 0.7; cursor: not-allowed; }\n .field-input:disabled { opacity: 0.5; cursor: not-allowed; }\n .has-error .field-input { border-color: #f43f5e; }\n .has-error .field-input:focus { box-shadow: 0 0 0 3px rgba(244, 63, 94, 0.15); }\n .field-select { appearance: none; cursor: pointer; padding-right: 36px; background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24'%3E%3Cpath fill='%2394a3b8' d='M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z'/%3E%3C/svg%3E\"); background-repeat: no-repeat; background-position: right 12px center; color-scheme: dark; }\n .field-select option { background-color: #1e1e2d; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) .field-select { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) .field-select option { background-color: #ffffff; color: #000000; }\n .field-textarea { resize: vertical; min-height: 80px; }\n .field-checkbox-label, .field-radio-label { display: flex; align-items: center; gap: 8px; font-size: 0.875rem; color: var(--app-text); cursor: pointer; }\n .field-radio-group { display: flex; flex-direction: column; gap: 8px; }\n .field-otp-group { display: flex; gap: 8px; justify-content: center; width: 100%; }\n .otp-digit { width: 44px; height: 50px; text-align: center; font-size: 1.25rem; font-weight: 600; padding: 0; letter-spacing: 0; }\n .field-toggle-label { display: flex; align-items: center; gap: 10px; cursor: pointer; }\n .field-toggle-input { display: none; }\n .field-toggle-track { width: 44px; height: 24px; background: var(--app-border); border-radius: 12px; position: relative; transition: background 0.2s; }\n .field-toggle-input:checked + .field-toggle-track { background: var(--app-primary); }\n .field-toggle-thumb { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: white; border-radius: 50%; transition: transform 0.2s; }\n .field-toggle-input:checked + .field-toggle-track .field-toggle-thumb { transform: translateX(20px); }\n .field-toggle-text { font-size: 0.875rem; color: var(--app-text); }\n .field-hint { font-size: 0.75rem; color: var(--app-text-muted); }\n .field-error { font-size: 0.75rem; color: #f43f5e; font-weight: 500; }\n .field-heading { font-size: 1.125rem; margin-top: 8px; color: var(--app-text); }\n .field-divider { border: none; border-top: 1px solid var(--app-border); margin: 8px 0; }\n .field-button { padding: 10px 20px; border-radius: 10px; font-weight: 600; font-size: 0.875rem; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); border: none; width: 100%; }\n .field-button.btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; }\n .field-button.btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .field-button.btn-secondary { background: var(--glass-bg); color: var(--app-text); border: 1px solid var(--app-border); }\n .field-button.btn-secondary:hover:not(:disabled) { background: var(--glass-bg-hover); border-color: var(--glass-border-light); }\n .field-button.btn-outline { background: transparent; color: var(--app-text); border: 1px solid var(--app-border); }\n .field-button.btn-outline:hover:not(:disabled) { background: var(--glass-bg-hover); }\n .field-button.btn-success { background: linear-gradient(135deg, #10b981, #34d399); color: white; }\n .field-button.btn-success:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px rgba(16,185,129,0.3); }\n .field-button.btn-accent { background: linear-gradient(135deg, var(--app-accent), var(--app-primary)); color: white; }\n .field-button.btn-accent:hover:not(:disabled) { transform: translateY(-2px); }\n .field-button:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n\n /* ─── Password Toggle ──────────────────────────────────────── */\n .password-wrapper { position: relative; display: flex; align-items: stretch; width: 100%; }\n .password-input { padding-right: 44px !important; }\n .pwd-toggle-btn {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--app-text-muted);\n border-radius: 0 8px 8px 0;\n transition: color 0.2s;\n z-index: 2;\n }\n .pwd-toggle-btn:hover { color: var(--app-primary); }\n .pwd-toggle-btn svg { width: 18px; height: 18px; }\n\n /* ─── Currency Formatter ───────────────────────────────────── */\n .currency-wrapper { display: flex; align-items: stretch; width: 100%; }\n .currency-symbol {\n padding: 10px 12px;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--app-text-muted);\n background: var(--glass-bg);\n border: 1px solid var(--app-border);\n border-right: none;\n border-radius: 8px 0 0 8px;\n display: flex;\n align-items: center;\n white-space: nowrap;\n box-sizing: border-box;\n }\n .currency-input { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; }\n `]\n})\nexport class FieldRendererComponent {\n @Input() field!: FieldMeta;\n @Input() form!: FormGroup;\n @Input() formDisabled: boolean = false;\n @Input() actionDispatcher!: ActionDispatcherService;\n @Input() context: any = {};\n private readonly validatorFactory = inject(ValidatorFactoryService);\n\n get control(): FormControl { return this.form.controls[this.field.key] as FormControl; }\n get hasError(): boolean { const ctrl = this.control; return ctrl ? ctrl.invalid && (ctrl.dirty || ctrl.touched) : false; }\n get isRequired(): boolean { return Array.isArray(this.field.validators) ? this.field.validators.some(v => v.type === 'required') : !!(this.field.validators as any)?.required; }\n get errorMessage(): string { const ctrl = this.control; return ctrl?.errors ? this.validatorFactory.getErrorMessage(ctrl.errors) : ''; }\n get isFieldDisabled(): boolean { return this.formDisabled || !!(this.field as any).disabled; }\n\n getFormArray(key: string): any {\n return this.form.get(key);\n }\n\n // ─── Password Toggle ────────────────────────────────────────\n showPassword = signal(false);\n togglePasswordVisibility(): void { this.showPassword.update(v => !v); }\n\n // ─── Currency Formatter ──────────────────────────────────────\n /** Read-only getters so the template never needs `(field as any)` casts */\n get currencySymbol(): string { return (this.field as any).currencySymbol || '$'; }\n get currencyLocale(): string { return (this.field as any).locale || 'en-US'; }\n\n get formattedCurrencyValue(): string {\n const raw = this.control?.value;\n if (raw === null || raw === undefined || raw === '') return '';\n const num = parseFloat(String(raw).replace(/,/g, ''));\n if (isNaN(num)) return '';\n return num.toLocaleString(this.currencyLocale, { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n }\n\n onCurrencyInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n // Strip everything except digits and decimal point\n const stripped = input.value.replace(/[^0-9.]/g, '');\n // Prevent multiple decimals\n const parts = stripped.split('.');\n const clean = parts.length > 2 ? parts[0] + '.' + parts.slice(1).join('') : stripped;\n const num = parseFloat(clean);\n // Store raw number in form control\n this.control?.setValue(isNaN(num) ? '' : num, { emitEvent: true });\n // Format display without triggering another input event\n const formatted = isNaN(num) ? clean : num.toLocaleString(this.currencyLocale, { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n // Restore formatted value in the visible input\n setTimeout(() => { input.value = formatted; });\n }\n\n onCurrencyBlur(event: Event): void {\n const input = event.target as HTMLInputElement;\n const raw = this.control?.value;\n if (raw !== null && raw !== undefined && raw !== '') {\n const num = parseFloat(String(raw));\n if (!isNaN(num)) {\n input.value = num.toLocaleString(this.currencyLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n }\n this.control?.markAsTouched();\n }\n\n // --- OTP Logic ---\n get otpArray(): string[] {\n const val = this.control?.value || '';\n const length = (this.field as any).otpLength || 6;\n return Array.from({ length }, (_, i) => val[i] || '');\n }\n\n onOtpInput(event: Event, index: number): void {\n const input = event.target as HTMLInputElement;\n let value = input.value;\n const length = (this.field as any).otpLength || 6;\n\n // Handle Paste (multiple chars)\n if (value.length > 1) {\n const pasted = value.replace(/[^0-9a-zA-Z]/g, '').slice(0, length);\n this.control.setValue(pasted);\n setTimeout(() => {\n const parent = input.parentElement;\n if (parent) {\n const nextIndex = Math.min(length - 1, pasted.length < length ? pasted.length : length - 1);\n const nextInput = parent.children[nextIndex] as HTMLInputElement;\n if (nextInput) nextInput.focus();\n }\n });\n return;\n }\n\n const currentArr = [...this.otpArray];\n currentArr[index] = value.slice(-1);\n this.control.setValue(currentArr.join(''));\n\n // Move to next input\n if (value && index < length - 1) {\n const nextInput = input.nextElementSibling as HTMLInputElement;\n if (nextInput) nextInput.focus();\n }\n }\n\n onOtpKeydown(event: KeyboardEvent, index: number): void {\n const input = event.target as HTMLInputElement;\n if (event.key === 'Backspace' && !input.value && index > 0) {\n const prev = input.previousElementSibling as HTMLInputElement;\n if (prev) {\n prev.focus();\n const currentArr = [...this.otpArray];\n currentArr[index - 1] = '';\n this.control.setValue(currentArr.join(''));\n }\n }\n }\n\n\n handleButtonClick(): void {\n if (this.isFieldDisabled) return;\n const onClick = (this.field as any).onClick;\n if (onClick && this.actionDispatcher) {\n this.actionDispatcher.dispatch(onClick, this.context);\n }\n }\n}\n\n\n","/**\n * AvoraMetaForge — Form Renderer Component\n */\nimport { Component, Input, Output, EventEmitter, inject, OnInit, OnChanges, SimpleChanges, OnDestroy } from '@angular/core';\n\nimport { ReactiveFormsModule, FormGroup, FormControl, FormArray, AbstractControl } from '@angular/forms';\nimport { FormMeta, FieldMeta } from '../../models/meta.types';\nimport { Subscription } from 'rxjs';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { ConditionEvaluatorService } from '../../core/condition-evaluator.service';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { FieldRendererComponent } from './field-renderer.component';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { MetaStateService } from '../../services/meta-state.service';\n\n@Component({\n selector: 'amf-form-renderer',\n standalone: true,\n imports: [ReactiveFormsModule, FieldRendererComponent],\n template: `\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\" class=\"amf-form\" [class]=\"config.cssClass\" [class.form-disabled]=\"config.disabled\">\n <div class=\"amf-form-fields\" [class]=\"layoutClass\" [style.grid-template-columns]=\"gridColumns\">\n @for (field of visibleFields; track field.key) {\n <amf-field-renderer [field]=\"field\" [form]=\"formGroup\" [formDisabled]=\"!!config.disabled\" [actionDispatcher]=\"actionDispatcher\" [context]=\"context\" [style.grid-column]=\"field.colSpan ? 'span ' + field.colSpan : null\"></amf-field-renderer>\n }\n </div>\n @if (!config.hideSubmit) {\n <div class=\"amf-form-actions\">\n @if (config.showCancel) { <button type=\"button\" class=\"btn-secondary\" (click)=\"handleCancel()\" [disabled]=\"config.disabled\">{{ config.cancelLabel || 'Cancel' }}</button> }\n @if (config.showReset) { <button type=\"button\" class=\"btn-secondary\" (click)=\"formGroup.reset()\" [disabled]=\"config.disabled\">Reset</button> }\n <button type=\"submit\" class=\"btn-primary\" [disabled]=\"formGroup.invalid || config.disabled\">{{ config.submitLabel || 'Submit' }}</button>\n </div>\n }\n </form>\n `,\n styles: [`\n .amf-form { display: flex; flex-direction: column; gap: 24px; }\n .amf-form.form-disabled { opacity: 0.6; pointer-events: none; }\n .amf-form-fields { display: flex; flex-direction: column; gap: 20px; }\n .amf-form-fields.layout-grid { display: grid; gap: 20px; }\n .amf-form-fields.layout-horizontal { flex-direction: row; flex-wrap: wrap; gap: 16px; }\n .amf-form-fields.layout-horizontal > * { flex: 1; min-width: 200px; }\n .amf-form-fields.layout-inline { flex-direction: row; align-items: flex-end; gap: 12px; }\n .amf-form-actions { display: flex; justify-content: flex-end; gap: 12px; padding-top: 8px; border-top: 1px solid var(--app-border); }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: var(--app-on-primary, #fff); border: none; padding: 10px 24px; border-radius: 10px; font-weight: 600; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); }\n .btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n .btn-secondary { background: var(--glass-bg); color: var(--app-text); border: 1px solid var(--app-border); padding: 10px 24px; border-radius: 10px; font-weight: 600; cursor: pointer; transition: all 0.2s; }\n .btn-secondary:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); }\n `]\n})\nexport class FormRendererComponent implements MetaSectionComponent<FormMeta>, OnInit, OnChanges, OnDestroy {\n @Input() config!: FormMeta;\n @Input() context: any = {};\n @Output() formSubmit = new EventEmitter<any>();\n @Output() formCancel = new EventEmitter<void>();\n @Output() formChange = new EventEmitter<any>();\n\n formGroup!: FormGroup;\n private readonly validatorFactory = inject(ValidatorFactoryService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly stateService = inject(MetaStateService);\n\n private sub?: Subscription;\n\n ngOnInit(): void { \n this.buildForm(); \n this.sub = this.actionDispatcher.formEvents$.subscribe(event => {\n // Match against both config.id (explicit form ID) and _sectionId (injected by MetaRendererComponent)\n const formId = this.config.id || (this.config as any)._sectionId;\n if (event.config?.formId && event.config.formId !== formId) return;\n \n if (event.action === 'reset') {\n this.formGroup.reset();\n } else if (event.action === 'patch') {\n const payload = event.config.values;\n if (payload) {\n // If a value comes from state dynamically\n const finalPatch = { ...payload };\n if (event.config.fromState) {\n // Can be extended if needed\n }\n this.formGroup.patchValue(finalPatch);\n }\n } else if (event.action === 'submit') {\n this.onSubmit();\n }\n });\n }\n \n ngOnDestroy(): void {\n if (this.sub) this.sub.unsubscribe();\n }\n\n ngOnChanges(changes: SimpleChanges): void { if (changes['config'] && !changes['config'].firstChange) { this.buildForm(); } }\n\n get visibleFields(): FieldMeta[] {\n return this.normalizedFields.filter(field => {\n if (!field.visibleWhen) return true;\n return this.conditionEvaluator.evaluate(field.visibleWhen, { ...this.context, ...this.formGroup.value });\n });\n }\n\n /** Normalize fields: ensure every field has a `key` (falling back to `name` for backward compat) */\n private get normalizedFields(): FieldMeta[] {\n return this.config.fields.map(f => ({ ...f, key: f.key || (f as any).name || f.label || '' }));\n }\n\n get layoutClass(): string { return this.config.layout ? `layout-${this.config.layout}` : ''; }\n get gridColumns(): string | null { return (this.config.layout === 'grid' && this.config.columns) ? `repeat(${this.config.columns}, 1fr)` : null; }\n\n onSubmit(): void {\n if (this.formGroup.valid) {\n const value = this.formGroup.value;\n this.formSubmit.emit(value);\n if (this.config.onSubmit) this.actionDispatcher.dispatch(this.config.onSubmit, { ...this.context, formValue: value });\n } else {\n this.markAllTouched();\n }\n }\n\n handleCancel(): void {\n this.formCancel.emit();\n if (this.config.onCancel) this.actionDispatcher.dispatch(this.config.onCancel, this.context);\n }\n\n private buildForm(): void {\n const rowData = this.context?.state?.row || this.context?.row || {};\n const controls = this.buildControls(this.normalizedFields, rowData, '');\n \n this.formGroup = new FormGroup(controls);\n\n // Emit value changes\n this.formGroup.valueChanges.subscribe(val => this.formChange.emit(val));\n\n // If entire form is disabled, disable the FormGroup\n if (this.config.disabled) {\n this.formGroup.disable();\n }\n }\n\n buildControls(fields: FieldMeta[], rowData: any, statePrefix: string): Record<string, AbstractControl> {\n const controls: Record<string, AbstractControl> = {};\n \n for (const field of fields) {\n if (field.type === 'divider' || field.type === 'heading' || field.type === 'button') continue;\n\n let value = rowData?.[field.key] ?? this.config.initialValues?.[field.key];\n\n if (value === undefined || value === null) {\n const stateNs: string | undefined = this.config['loadFromState'];\n if (stateNs) {\n const keyPath = statePrefix ? `${stateNs}.${statePrefix}.${field.key}` : `${stateNs}.${field.key}`;\n const saved = this.stateService.get(keyPath);\n value = saved !== undefined && saved !== null ? saved : field.defaultValue;\n } else {\n value = field.defaultValue;\n }\n }\n\n const validators = this.validatorFactory.createValidators(field.validators);\n const isDisabled = field.disabled || (field.disabledWhen ? this.conditionEvaluator.evaluate(field.disabledWhen, this.context) : false);\n\n if (field.type === 'repeater') {\n const initialArray = Array.isArray(value) ? value : [];\n const minItems = field.minItems || 0;\n \n // Ensure minimum items exist\n while (initialArray.length < minItems) {\n initialArray.push({});\n }\n\n const formArrayControls = initialArray.map((itemValue, idx) => {\n const groupControls = this.buildControls(field.children || [], itemValue, `${field.key}[${idx}]`);\n return new FormGroup(groupControls);\n });\n\n const formArray = new FormArray(formArrayControls, validators);\n if (isDisabled) formArray.disable();\n controls[field.key] = formArray;\n } else {\n value = value ?? '';\n controls[field.key] = new FormControl({ value, disabled: isDisabled }, validators);\n }\n }\n \n return controls;\n }\n private markAllTouched(): void { Object.values(this.formGroup.controls).forEach(c => c.markAsTouched()); }\n}\n","/**\n * AvoraMetaForge — Stepper Form Renderer Component\n *\n * Renders a FormMeta with layout: 'stepper' as an animated multi-step wizard.\n * - Builds the full FormGroup upfront (same DI as FormRendererComponent)\n * - Validates only the active step's fields before advancing\n * - Supports skipWhen conditions, onEnter/onLeave step hooks\n * - Enterprise-grade stepper UI with animated step indicators\n */\nimport {\n Component, Input, Output, EventEmitter,\n inject, OnInit, OnChanges, SimpleChanges, OnDestroy, signal, computed\n} from '@angular/core';\n\nimport { ReactiveFormsModule, FormGroup, FormControl, FormArray, AbstractControl } from '@angular/forms';\nimport { FormMeta, FieldMeta, FormStepMeta } from '../../models/meta.types';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { ConditionEvaluatorService } from '../../core/condition-evaluator.service';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { FieldRendererComponent } from './field-renderer.component';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { MetaStateService } from '../../services/meta-state.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-stepper-form-renderer',\n standalone: true,\n imports: [ReactiveFormsModule, FieldRendererComponent],\n template: `\n <div class=\"amf-stepper\" [class]=\"config.cssClass\" [class.stepper-disabled]=\"config.disabled\">\n\n <!-- ─── Step Header ──────────────────────────────────── -->\n <div class=\"stepper-header\">\n @for (step of resolvedSteps(); track $index) {\n <div class=\"step-item\"\n [class.active]=\"$index === currentStep()\"\n [class.completed]=\"isCompleted($index)\"\n [class.skipped]=\"isSkipped($index)\"\n [class.navigable]=\"canNavigateTo($index)\"\n (click)=\"canNavigateTo($index) && goToStep($index)\">\n <div class=\"step-indicator\">\n @if (isCompleted($index)) {\n <svg class=\"check-icon\" viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>\n } @else if (isSkipped($index)) {\n <svg class=\"skip-icon\" viewBox=\"0 0 24 24\"><path d=\"M6 18l8.5-6L6 6v12zm2-8.14L11.03 12 8 14.14V9.86zM16 6h2v12h-2z\"/></svg>\n } @else {\n <span class=\"step-number\">{{ $index + 1 }}</span>\n }\n </div>\n <div class=\"step-label-group\">\n <span class=\"step-title\">{{ step.title }}</span>\n @if (step.description) { <span class=\"step-description\">{{ step.description }}</span> }\n </div>\n @if ($index < resolvedSteps().length - 1) {\n <div class=\"step-connector\" [class.completed]=\"isCompleted($index)\"></div>\n }\n </div>\n }\n </div>\n\n <!-- ─── Mobile Progress Bar ───────────────────────────── -->\n <div class=\"stepper-progress-mobile\">\n <span class=\"progress-label\">Step {{ currentStep() + 1 }} of {{ resolvedSteps().length }}: {{ resolvedSteps()[currentStep()]?.title }}</span>\n <div class=\"progress-bar-track\">\n <div class=\"progress-bar-fill\" [style.width.%]=\"progressPercent()\"></div>\n </div>\n </div>\n\n <!-- ─── Step Content ─────────────────────────────────── -->\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\" class=\"stepper-form-body\">\n <div class=\"step-content\">\n <div class=\"step-fields\" [style.grid-template-columns]=\"currentGridColumns()\">\n @for (field of currentStepVisibleFields(); track field.key) {\n <amf-field-renderer\n [field]=\"field\"\n [form]=\"formGroup\"\n [formDisabled]=\"!!config.disabled\"\n [actionDispatcher]=\"actionDispatcher\"\n [context]=\"context\"\n [style.grid-column]=\"field.colSpan ? 'span ' + field.colSpan : null\">\n </amf-field-renderer>\n }\n </div>\n\n <!-- Step-level validation error summary -->\n @if (stepErrors().length) {\n <div class=\"step-error-summary\">\n <svg viewBox=\"0 0 24 24\" class=\"error-summary-icon\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\n <span>Please fix {{ stepErrors().length }} error{{ stepErrors().length > 1 ? 's' : '' }} before continuing.</span>\n </div>\n }\n </div>\n\n <!-- ─── Navigation Actions ────────────────────────────── -->\n <div class=\"stepper-actions\">\n <div class=\"stepper-actions-left\">\n @if (config.showReset) {\n <button type=\"button\" class=\"btn-reset\" (click)=\"resetForm()\" [disabled]=\"config.disabled\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/></svg>\n {{ config.resetLabel || 'Start Over' }}\n </button>\n }\n @if (currentStep() > 0) {\n <button type=\"button\" class=\"btn-back\" (click)=\"goBack()\" [disabled]=\"config.disabled\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"/></svg>\n Back\n </button>\n }\n </div>\n <div class=\"stepper-actions-right\">\n @if (resolvedSteps()[currentStep()]?.optional) {\n <button type=\"button\" class=\"btn-skip\" (click)=\"skipStep()\" [disabled]=\"config.disabled\">Skip</button>\n }\n @if (currentStep() < resolvedSteps().length - 1) {\n <button type=\"button\" class=\"btn-next\" (click)=\"goNext()\" [disabled]=\"config.disabled\">\n {{ resolvedSteps()[currentStep() + 1] ? 'Next' : 'Review' }}\n <svg viewBox=\"0 0 24 24\"><path d=\"M4 11v2h12l-5.59 5.59L12 20l8-8-8-8-1.41 1.41L16 11H4z\"/></svg>\n </button>\n } @else {\n @if (!config.hideSubmit) {\n <button type=\"submit\" class=\"btn-submit\" [disabled]=\"formGroup.invalid || config.disabled\">\n {{ config.submitLabel || 'Submit' }}\n <svg viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>\n </button>\n }\n }\n </div>\n </div>\n </form>\n </div>\n `,\n styles: [`\n /* ─── Container ─────────────────────────────────────────── */\n .amf-stepper { display: flex; flex-direction: column; gap: 0; }\n .amf-stepper.stepper-disabled { opacity: 0.6; pointer-events: none; }\n\n /* ─── Step Header ────────────────────────────────────────── */\n .stepper-header {\n display: flex;\n align-items: flex-start;\n gap: 0;\n padding: 20px 24px 0;\n overflow-x: auto;\n scrollbar-width: none;\n }\n .stepper-header::-webkit-scrollbar { display: none; }\n\n .step-item {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n cursor: default;\n position: relative;\n }\n .step-item.navigable { cursor: pointer; }\n .step-item.navigable:hover .step-indicator { border-color: var(--app-primary); }\n .step-item.navigable:hover .step-title { color: var(--app-text); }\n\n .step-indicator {\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 2px solid var(--app-border);\n background: var(--app-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 1;\n }\n .step-item.active .step-indicator {\n border-color: var(--app-primary);\n background: var(--app-primary);\n box-shadow: 0 0 0 4px rgba(var(--app-primary-rgb, 99 102 241), 0.18);\n }\n .step-item.completed .step-indicator {\n border-color: #22c55e;\n background: #22c55e;\n }\n .step-item.skipped .step-indicator {\n border-color: var(--app-text-muted);\n background: var(--glass-bg);\n }\n\n .step-number { font-size: 0.8125rem; font-weight: 700; color: var(--app-text-muted); }\n .step-item.active .step-number { color: #fff; }\n .check-icon, .skip-icon { width: 18px; height: 18px; fill: #fff; }\n .skip-icon { fill: var(--app-text-muted); }\n\n .step-label-group {\n display: flex;\n flex-direction: column;\n margin-left: 10px;\n min-width: 0;\n flex-shrink: 0;\n }\n .step-title {\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--app-text-muted);\n white-space: nowrap;\n transition: color 0.2s;\n }\n .step-item.active .step-title { color: var(--app-text); }\n .step-item.completed .step-title { color: var(--app-text-muted); }\n\n .step-description {\n font-size: 0.6875rem;\n color: var(--app-text-muted);\n opacity: 0.7;\n white-space: nowrap;\n margin-top: 1px;\n }\n\n .step-connector {\n flex: 1;\n height: 2px;\n background: var(--app-border);\n margin: 0 10px;\n margin-top: 0;\n border-radius: 1px;\n transition: background 0.4s ease;\n align-self: center;\n margin-bottom: 14px;\n }\n .step-connector.completed { background: linear-gradient(90deg, #22c55e, var(--app-primary)); }\n\n /* ─── Mobile Progress ────────────────────────────────────── */\n .stepper-progress-mobile {\n display: none;\n flex-direction: column;\n gap: 8px;\n padding: 16px 24px 0;\n }\n @media (max-width: 640px) {\n .stepper-header { display: none; }\n .stepper-progress-mobile { display: flex; }\n }\n .progress-label { font-size: 0.8125rem; font-weight: 600; color: var(--app-text); }\n .progress-bar-track {\n width: 100%;\n height: 6px;\n background: var(--app-border);\n border-radius: 3px;\n overflow: hidden;\n }\n .progress-bar-fill {\n height: 100%;\n background: linear-gradient(90deg, var(--app-primary), var(--app-accent));\n border-radius: 3px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* ─── Step Content ───────────────────────────────────────── */\n .stepper-form-body { display: flex; flex-direction: column; gap: 24px; padding: 24px; }\n\n .step-content { animation: stepFadeIn 0.3s ease-out; }\n @keyframes stepFadeIn {\n from { opacity: 0; transform: translateX(12px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .step-fields {\n display: grid;\n grid-template-columns: 1fr;\n gap: 20px;\n }\n\n /* ─── Step Error Summary ─────────────────────────────────── */\n .step-error-summary {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: rgba(244, 63, 94, 0.08);\n border: 1px solid rgba(244, 63, 94, 0.25);\n border-radius: 10px;\n margin-top: 8px;\n animation: stepFadeIn 0.2s ease-out;\n }\n .error-summary-icon { width: 18px; height: 18px; fill: #f43f5e; flex-shrink: 0; }\n .step-error-summary span { font-size: 0.8125rem; color: #f43f5e; font-weight: 500; }\n\n /* ─── Actions ────────────────────────────────────────────── */\n .stepper-actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 8px;\n border-top: 1px solid var(--app-border);\n }\n .stepper-actions-left, .stepper-actions-right { display: flex; gap: 10px; align-items: center; }\n\n .btn-reset {\n display: flex; align-items: center; gap: 6px;\n background: transparent;\n color: #ef4444; /* red-500 */\n border: 1px solid rgba(239, 68, 68, 0.3);\n padding: 10px 20px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-reset svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-reset:hover { background: rgba(239, 68, 68, 0.1); border-color: rgba(239, 68, 68, 0.5); }\n .btn-reset:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .btn-back {\n display: flex; align-items: center; gap: 6px;\n background: var(--glass-bg);\n color: var(--app-text);\n border: 1px solid var(--app-border);\n padding: 10px 20px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-back svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-back:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); }\n .btn-back:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .btn-skip {\n background: transparent;\n color: var(--app-text-muted);\n border: none;\n padding: 10px 16px;\n border-radius: 10px;\n font-weight: 500;\n font-size: 0.8125rem;\n cursor: pointer;\n transition: color 0.2s;\n }\n .btn-skip:hover { color: var(--app-primary); }\n .btn-skip:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .btn-next {\n display: flex; align-items: center; gap: 6px;\n background: linear-gradient(135deg, var(--app-primary), var(--app-accent));\n color: #fff;\n border: none;\n padding: 10px 24px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .btn-next svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-next:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .btn-next:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n\n .btn-submit {\n display: flex; align-items: center; gap: 6px;\n background: linear-gradient(135deg, #22c55e, #16a34a);\n color: #fff;\n border: none;\n padding: 10px 28px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .btn-submit svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-submit:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px rgba(34, 197, 94, 0.35); }\n .btn-submit:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n `]\n})\nexport class StepperFormRendererComponent\n implements MetaSectionComponent<FormMeta>, OnInit, OnChanges, OnDestroy {\n\n @Input() config!: FormMeta;\n @Input() context: any = {};\n @Output() formSubmit = new EventEmitter<any>();\n @Output() formCancel = new EventEmitter<void>();\n\n formGroup!: FormGroup;\n\n private readonly validatorFactory = inject(ValidatorFactoryService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly stateService = inject(MetaStateService);\n\n private sub?: Subscription;\n\n // ─── Step State ─────────────────────────────────────────────\n currentStep = signal(0);\n completedSteps = signal<Set<number>>(new Set());\n skippedSteps = signal<Set<number>>(new Set());\n stepErrors = signal<string[]>([]);\n\n // ─── Derived ─────────────────────────────────────────────────\n resolvedSteps = computed<FormStepMeta[]>(() => this.config?.steps ?? []);\n\n progressPercent = computed(() => {\n const total = this.resolvedSteps().length;\n return total > 0 ? Math.round(((this.currentStep() + 1) / total) * 100) : 0;\n });\n\n currentGridColumns = computed(() => {\n const cols = this.config.columns || 1;\n return `repeat(${cols}, minmax(0, 1fr))`;\n });\n\n ngOnInit(): void {\n this.buildForm();\n\n this.sub = this.actionDispatcher.formEvents$.subscribe(event => {\n const formId = this.config.id || (this.config as any)._sectionId;\n if (event.config?.formId && event.config.formId !== formId) return;\n\n if (event.action === 'reset') {\n this.resetForm();\n } else if (event.action === 'patch') {\n if (event.config.values) this.formGroup.patchValue(event.config.values);\n } else if (event.action === 'submit') {\n this.onSubmit();\n }\n });\n }\n\n resetForm(): void {\n this.formGroup.reset();\n this.currentStep.set(0);\n this.completedSteps.set(new Set());\n this.skippedSteps.set(new Set());\n this.stepErrors.set([]);\n if (this.config.onReset) {\n this.actionDispatcher.dispatch(this.config.onReset, this.context);\n }\n }\n\n ngOnDestroy(): void { this.sub?.unsubscribe(); }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) this.buildForm();\n }\n\n // ─── Fields for current step ────────────────────────────────\n currentStepVisibleFields = computed<FieldMeta[]>(() => {\n const step = this.resolvedSteps()[this.currentStep()];\n if (!step) return [];\n return this.normalizedFields\n .filter(f => step.fields.includes(f.key))\n .filter(f => {\n if (!f.visibleWhen) return true;\n return this.conditionEvaluator.evaluate(f.visibleWhen, {\n ...this.context,\n ...this.formGroup?.value\n });\n });\n });\n\n private get normalizedFields(): FieldMeta[] {\n return (this.config?.fields ?? []).map(f => ({\n ...f,\n key: f.key || (f as any).name || f.label || ''\n }));\n }\n\n // ─── Step navigation ────────────────────────────────────────\n isCompleted(index: number): boolean { return this.completedSteps().has(index); }\n isSkipped(index: number): boolean { return this.skippedSteps().has(index); }\n\n canNavigateTo(index: number): boolean {\n // Allow clicking only past (completed/skipped) steps\n return this.isCompleted(index) || this.isSkipped(index);\n }\n\n goToStep(index: number): void {\n if (index < 0 || index >= this.resolvedSteps().length) return;\n\n // Fire onLeave for current step\n const leaving = this.resolvedSteps()[this.currentStep()];\n if (leaving?.onLeave) this.actionDispatcher.dispatch(leaving.onLeave, this.context);\n\n this.currentStep.set(index);\n this.stepErrors.set([]);\n\n // Fire onEnter for new step\n const entering = this.resolvedSteps()[index];\n if (entering?.onEnter) this.actionDispatcher.dispatch(entering.onEnter, this.context);\n }\n\n goNext(): void {\n const step = this.resolvedSteps()[this.currentStep()];\n if (step?.validate !== false) {\n // Validate only the current step's field controls\n const stepFieldKeys = step?.fields ?? [];\n const errors: string[] = [];\n for (const key of stepFieldKeys) {\n const ctrl = this.formGroup.controls[key];\n if (ctrl) {\n ctrl.markAsTouched();\n ctrl.updateValueAndValidity();\n if (ctrl.invalid) {\n const field = this.normalizedFields.find(f => f.key === key);\n errors.push(field?.label || key);\n }\n }\n }\n if (errors.length) {\n this.stepErrors.set(errors);\n return;\n }\n }\n\n this.stepErrors.set([]);\n\n // Mark step as completed\n const completed = new Set(this.completedSteps());\n completed.add(this.currentStep());\n this.completedSteps.set(completed);\n\n // Find next non-skipped step\n let next = this.currentStep() + 1;\n while (next < this.resolvedSteps().length) {\n const nextStep = this.resolvedSteps()[next];\n if (nextStep.skipWhen && this.conditionEvaluator.evaluate(nextStep.skipWhen, {\n ...this.context,\n ...this.formGroup.value\n })) {\n // Auto-skip\n const skipped = new Set(this.skippedSteps());\n skipped.add(next);\n this.skippedSteps.set(skipped);\n next++;\n } else {\n break;\n }\n }\n\n if (next < this.resolvedSteps().length) {\n this.goToStep(next);\n }\n }\n\n goBack(): void {\n let prev = this.currentStep() - 1;\n while (prev >= 0 && this.isSkipped(prev)) { prev--; }\n if (prev >= 0) this.goToStep(prev);\n }\n\n skipStep(): void {\n const skipped = new Set(this.skippedSteps());\n skipped.add(this.currentStep());\n this.skippedSteps.set(skipped);\n\n let next = this.currentStep() + 1;\n if (next < this.resolvedSteps().length) this.goToStep(next);\n }\n\n // ─── Submit ─────────────────────────────────────────────────\n onSubmit(): void {\n if (this.formGroup.valid) {\n const value = this.formGroup.value;\n this.formSubmit.emit(value);\n if (this.config.onSubmit) {\n this.actionDispatcher.dispatch(this.config.onSubmit, { ...this.context, formValue: value });\n }\n // Auto-reset: allow notification/action to render first, then return to Step 1\n setTimeout(() => this.resetForm(), 500);\n } else {\n Object.values(this.formGroup.controls).forEach(c => c.markAsTouched());\n }\n }\n\n // ─── Form Building ───────────────────────────────────────────\n private buildForm(): void {\n const rowData = this.context?.state?.row || this.context?.row || {};\n const controls = this.buildControls(this.normalizedFields, rowData, '');\n \n this.formGroup = new FormGroup(controls);\n if (this.config.disabled) this.formGroup.disable();\n }\n\n private buildControls(fields: FieldMeta[], rowData: any, statePrefix: string): Record<string, AbstractControl> {\n const controls: Record<string, AbstractControl> = {};\n\n for (const field of fields) {\n if (field.type === 'divider' || field.type === 'heading' || field.type === 'button') continue;\n\n let value = rowData?.[field.key] ?? this.config.initialValues?.[field.key];\n\n if (value === undefined || value === null) {\n const stateNs: string | undefined = this.config['loadFromState'];\n if (stateNs) {\n const keyPath = statePrefix ? `${stateNs}.${statePrefix}.${field.key}` : `${stateNs}.${field.key}`;\n const saved = this.stateService.get(keyPath);\n value = saved !== undefined && saved !== null ? saved : field.defaultValue;\n } else {\n value = field.defaultValue;\n }\n }\n\n const validators = this.validatorFactory.createValidators(field.validators);\n const isDisabled = field.disabled || (field.disabledWhen ? this.conditionEvaluator.evaluate(field.disabledWhen, this.context) : false);\n\n if (field.type === 'repeater') {\n const initialArray = Array.isArray(value) ? value : [];\n const minItems = field.minItems || 0;\n \n while (initialArray.length < minItems) {\n initialArray.push({});\n }\n\n const formArrayControls = initialArray.map((itemValue, idx) => {\n const groupControls = this.buildControls(field.children || [], itemValue, `${field.key}[${idx}]`);\n return new FormGroup(groupControls);\n });\n\n const formArray = new FormArray(formArrayControls, validators);\n if (isDisabled) formArray.disable();\n controls[field.key] = formArray;\n } else {\n value = value ?? '';\n controls[field.key] = new FormControl({ value, disabled: isDisabled }, validators);\n }\n }\n \n return controls;\n }\n}\n","/**\n * AvoraMetaForge — Cell Renderer Component\n */\nimport { Component, Input } from '@angular/core';\nimport { CommonModule, TitleCasePipe, DatePipe, CurrencyPipe } from '@angular/common';\nimport { ColumnMeta } from '../../models/meta.types';\n\n@Component({\n selector: 'amf-cell-renderer',\n standalone: true,\n imports: [CommonModule, TitleCasePipe, DatePipe, CurrencyPipe],\n template: `\n @switch (column.type || 'text') {\n @case ('badge') { <span class=\"cell-badge\" [class]=\"getBadgeClass()\">{{ value | titlecase }}</span> }\n @case ('avatar') {\n <div class=\"cell-avatar\">\n <div class=\"avatar-circle\">{{ getInitial() }}</div>\n <div class=\"avatar-info\">\n <span class=\"avatar-name\">{{ value }}</span>\n @if (column.subtitleKey) { <span class=\"avatar-subtitle\">{{ getNestedValue(row, column.subtitleKey) }}</span> }\n </div>\n </div>\n }\n @case ('date') { <span>{{ value | date:(column.dateFormat || 'mediumDate') }}</span> }\n @case ('datetime') { <span>{{ value | date:(column.dateFormat || 'medium') }}</span> }\n @case ('currency') { <span>{{ value | currency:(column.currencyCodeKey ? getNestedValue(row, column.currencyCodeKey) : (column.currencyCode || 'USD')):(column.currencyDisplay !== undefined ? column.currencyDisplay : 'symbol') }}</span> }\n @case ('boolean') { <span class=\"cell-boolean\" [class.is-true]=\"value\">{{ value ? '✓' : '✗' }}</span> }\n @case ('number') { <span class=\"cell-number\">{{ value }}</span> }\n @case ('progress') {\n <div class=\"cell-progress\">\n <div class=\"progress-bar\"><div class=\"progress-fill\" [style.width.%]=\"value\"></div></div>\n <span class=\"progress-text\">{{ value }}%</span>\n </div>\n }\n @default { <span>{{ value }}</span> }\n }\n `,\n styles: [`\n :host { display: contents; }\n .cell-badge { padding: 4px 10px; border-radius: 6px; font-size: 0.75rem; font-weight: 600; display: inline-block; }\n .cell-badge.success, .cell-badge.active { background: rgba(52,211,153,0.15); color: #34d399; }\n .cell-badge.danger, .cell-badge.inactive { background: rgba(244,63,94,0.15); color: #fb7185; }\n .cell-badge.warning, .cell-badge.pending { background: rgba(251,191,36,0.15); color: #fbbf24; }\n .cell-badge.info { background: rgba(59,130,246,0.15); color: #60a5fa; }\n .cell-badge.muted { background: var(--glass-bg); color: var(--app-text-muted); }\n\n .cell-avatar { display: flex; align-items: center; gap: 12px; }\n .avatar-circle { width: 34px; height: 34px; border-radius: 50%; background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.875rem; flex-shrink: 0; }\n .avatar-info { display: flex; flex-direction: column; }\n .avatar-name { font-weight: 600; color: var(--app-text); font-size: 0.875rem; }\n .avatar-subtitle { font-size: 0.75rem; color: var(--app-text-muted); }\n\n .cell-boolean { font-weight: 700; }\n .cell-boolean.is-true { color: #34d399; }\n .cell-boolean:not(.is-true) { color: #fb7185; }\n\n .cell-number { font-variant-numeric: tabular-nums; }\n .cell-progress { display: flex; align-items: center; gap: 8px; }\n .progress-bar { flex: 1; height: 6px; background: var(--glass-bg); border-radius: 3px; overflow: hidden; }\n .progress-fill { height: 100%; background: linear-gradient(90deg, var(--app-primary), var(--app-accent)); border-radius: 3px; transition: width 0.3s; }\n .progress-text { font-size: 0.75rem; color: var(--app-text-muted); min-width: 36px; }\n `]\n})\nexport class CellRendererComponent {\n @Input() column!: ColumnMeta;\n @Input() row: any;\n @Input() value: any;\n\n getInitial(): string { return String(this.value || '').charAt(0).toUpperCase(); }\n getBadgeClass(): string {\n if (this.column.badgeMap && this.value) {\n const strVal = String(this.value);\n return this.column.badgeMap[strVal] || this.column.badgeMap[strVal.toLowerCase()] || '';\n }\n return String(this.value || '').toLowerCase();\n }\n getNestedValue(obj: any, path: string): any {\n if (!path) return '';\n return path.split('.').reduce((c, k) => c?.[k], obj) ?? '';\n }\n}\n","/**\n * AvoraMetaForge — Table Renderer Component\n */\nimport { Component, Input, Output, EventEmitter, inject, OnInit, OnDestroy, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { TableMeta, ColumnMeta, TableActionMeta, ColumnEditValidatorMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { MetaApiService } from '../../services/meta-api.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { CellRendererComponent } from './cell-renderer.component';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { Subscription } from 'rxjs';\nimport { AmfDialogService } from '../../core/services/amf-dialog.service';\n\n@Component({\n selector: 'amf-table-renderer',\n standalone: true,\n imports: [CommonModule, FormsModule, DragDropModule, CellRendererComponent],\n template: `\n <div class=\"amf-table-card\" [class]=\"'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')\">\n <div class=\"table-header\">\n <div class=\"table-header-left\">\n @if (config.searchable) {\n <div class=\"search-box\">\n <svg viewBox=\"0 0 24 24\" class=\"search-icon\"><path [attr.d]=\"iconRegistry.getIcon('search')\"></path></svg>\n <input type=\"text\" [placeholder]=\"config.searchPlaceholder || 'Search...'\" [ngModel]=\"searchQuery()\" (ngModelChange)=\"searchQuery.set($event)\" />\n </div>\n }\n @for (filter of config.filters || []; track filter.key) {\n <select class=\"filter-select\" [ngModel]=\"getFilterValue(filter.key)\" (ngModelChange)=\"setFilterValue(filter.key, $event)\">\n <option value=\"\">{{ filter.label }}</option>\n @for (opt of filter.options; track opt.value) { <option [value]=\"opt.value\">{{ opt.label }}</option> }\n </select>\n }\n </div>\n <div class=\"table-header-right\">\n @for (action of config.headerActions || []; track action.id) {\n <button class=\"btn-primary btn-sm\" (click)=\"handleAction(action, null)\">\n @if (action.icon) { <svg viewBox=\"0 0 24 24\" class=\"btn-icon\"><path [attr.d]=\"iconRegistry.getIcon(action.icon)\"></path></svg> }\n {{ action.label }}\n </button>\n }\n\n @if (config.exportable) {\n <div class=\"export-container\">\n <button class=\"btn-ghost btn-sm\" (click)=\"exportMenuOpen.set(!exportMenuOpen())\">\n <svg viewBox=\"0 0 24 24\" class=\"btn-icon\"><path [attr.d]=\"iconRegistry.getIcon('download')\"></path></svg>\n Export\n </button>\n @if (exportMenuOpen()) {\n <div class=\"dropdown-menu export-menu\">\n @for (format of config.exportFormats || ['csv', 'json']; track format) {\n <div class=\"dropdown-item\" (click)=\"exportData(format); exportMenuOpen.set(false)\">\n Export as {{ format | uppercase }}\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\" [class.striped]=\"config.striped\" [class.hoverable]=\"config.hoverable !== false\">\n <thead>\n <tr cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"dropColumn($event)\">\n @if (config.reorderable) { <th class=\"drag-col\" style=\"width: 40px; text-align: center;\"></th> }\n @if (config.selectionMode === 'checkbox') {\n <th class=\"selection-col\" style=\"width: 40px; text-align: center;\">\n @if (config.showSelectAll !== false) {\n <input type=\"checkbox\"\n class=\"amf-checkbox\"\n [checked]=\"selectedRows().size > 0 && selectedRows().size === filteredData().length\"\n (change)=\"toggleAllSelection($event)\" />\n }\n </th>\n }\n @if (config.expandable) {\n <th style=\"width: 36px;\"></th>\n }\n @for (col of visibleColumns(); track col.key) {\n <th cdkDrag [cdkDragDisabled]=\"!config.columnReorder\" [style.width]=\"col.width\" [style.min-width]=\"col.minWidth\" [style.text-align]=\"col.align || 'left'\" [class.sortable]=\"col.sortable\" (click)=\"col.sortable ? toggleSort(col.key) : null\">\n {{ col.label }} @if (col.sortable && sortKey() === col.key) { <span class=\"sort-indicator\">{{ sortDirection() === 'asc' ? '↑' : '↓' }}</span> }\n </th>\n }\n @if (config.actions?.length) { <th class=\"actions-col\">Actions</th> }\n </tr>\n </thead>\n <tbody cdkDropList (cdkDropListDropped)=\"dropRow($event)\">\n @for (row of groupedRows(); track $index) {\n @if (row.__isGroupHeader) {\n <tr class=\"group-header-row\">\n <td [attr.colspan]=\"visibleColumns().length + (config.reorderable ? 1 : 0) + (config.selectionMode === 'checkbox' ? 1 : 0) + (config.expandable ? 1 : 0) + (config.actions?.length ? 1 : 0)\">\n <button class=\"group-toggle\" (click)=\"toggleGroup(row.__groupKey)\">\n <span class=\"group-chevron\" [class.open]=\"!collapsedGroups().has(row.__groupKey)\">▶</span>\n {{ config.groupBy }}: <strong>{{ row.__groupKey }}</strong>\n <span class=\"group-count\">({{ row.__count }} items)</span>\n </button>\n </td>\n </tr>\n } @else {\n <tr cdkDrag [cdkDragDisabled]=\"!config.reorderable\" (click)=\"handleRowClick(row)\" [class.clickable]=\"config.rowClick || config.selectionMode === 'single' || config.selectionMode === 'multi'\" [class.selected]=\"selectedRows().has(row)\" [class.expanded]=\"expandedRows().has(row)\">\n @if (config.reorderable) {\n <td class=\"drag-cell\" (click)=\"$event.stopPropagation()\" cdkDragHandle>\n <svg viewBox=\"0 0 24 24\" style=\"width:16px;height:16px;fill:var(--app-text-muted)\"><path [attr.d]=\"iconRegistry.getIcon('menu')\"></path></svg>\n </td>\n }\n @if (config.selectionMode === 'checkbox') {\n <td class=\"selection-cell\" (click)=\"$event.stopPropagation(); toggleSelection(row)\">\n <input type=\"checkbox\" class=\"amf-checkbox\" [checked]=\"selectedRows().has(row)\" (click)=\"$event.stopPropagation()\" (change)=\"$event.stopPropagation(); toggleSelection(row)\" />\n </td>\n }\n @if (config.expandable) {\n <td class=\"expand-cell\" (click)=\"$event.stopPropagation(); toggleRowExpand(row)\">\n <span class=\"expand-chevron\" [class.open]=\"expandedRows().has(row)\">▶</span>\n </td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td [style.text-align]=\"col.align || 'left'\" (dblclick)=\"config.inlineEdit && col.editable !== false ? startEdit(row, col.key, $event) : null\" [class.editable-cell]=\"config.inlineEdit && col.editable !== false\">\n @if (isEditing(row, col.key)) {\n <div class=\"inline-edit-wrap\" (click)=\"$event.stopPropagation()\">\n <div class=\"inline-edit-row\">\n @if (col.editType === 'select' && col.editOptions) {\n <select class=\"inline-input\" [(ngModel)]=\"editBuffer[col.key]\">\n @for (opt of col.editOptions; track opt.value) { <option [value]=\"opt.value\">{{ opt.label }}</option> }\n </select>\n } @else {\n <input class=\"inline-input\" [type]=\"col.editType || 'text'\" [(ngModel)]=\"editBuffer[col.key]\" (keydown.enter)=\"commitEdit(row, col.key)\" (keydown.escape)=\"cancelEdit()\" />\n }\n <div class=\"inline-edit-actions\">\n <button class=\"ie-btn ie-save\" title=\"Save (Enter)\" (click)=\"commitEdit(row, col.key)\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>\n </button>\n <button class=\"ie-btn ie-cancel\" title=\"Cancel (Esc)\" (click)=\"cancelEdit()\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/></svg>\n </button>\n </div>\n </div>\n @if (editError()) {\n <span class=\"inline-edit-error\">{{ editError() }}</span>\n }\n </div>\n } @else {\n <amf-cell-renderer [column]=\"col\" [row]=\"row\" [value]=\"getCellValue(row, col.key)\"></amf-cell-renderer>\n }\n </td>\n }\n @if (config.actions?.length) {\n <td class=\"actions-cell\">\n <div class=\"action-btns\">\n @for (action of config.actions; track action.id) {\n <button class=\"action-btn\" [class]=\"action.variant || 'ghost'\" [title]=\"action.label\" (click)=\"handleAction(action, row); $event.stopPropagation()\">\n @if (action.icon) { <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"iconRegistry.getIcon(action.icon)\"></path></svg> } @else { {{ action.label }} }\n </button>\n }\n </div>\n </td>\n }\n </tr>\n @if (config.expandable && expandedRows().has(row)) {\n <tr class=\"expanded-row\">\n <td [attr.colspan]=\"visibleColumns().length + (config.reorderable ? 1 : 0) + (config.selectionMode === 'checkbox' ? 1 : 0) + 1 + (config.actions?.length ? 1 : 0)\" class=\"expanded-content\">\n @if (config.expandSection) {\n <div class=\"expand-section\">Row detail: {{ row | json }}</div>\n } @else {\n <div class=\"expand-section\">\n @for (col of visibleColumns(); track col.key) {\n <div class=\"expand-field\"><span class=\"expand-label\">{{ col.label }}:</span> <span>{{ getCellValue(row, col.key) }}</span></div>\n }\n </div>\n }\n </td>\n </tr>\n }\n }\n } @empty { <tr><td [attr.colspan]=\"visibleColumns().length + (config.actions?.length ? 1 : 0)\" class=\"empty-state\">{{ config.emptyMessage || 'No data found.' }}</td></tr> }\n @if (config.aggregates?.length) {\n <tr class=\"aggregate-row\">\n @if (config.reorderable) { <td></td> }\n @if (config.selectionMode === 'checkbox') { <td></td> }\n @if (config.expandable) { <td></td> }\n @for (col of visibleColumns(); track col.key) {\n <td class=\"aggregate-cell\" [style.text-align]=\"col.align || 'right'\">\n @if (getAggregate(col.key); as agg) { <span class=\"agg-value\">{{ agg.label ? agg.label + ': ' : '' }}{{ agg.value }}</span> }\n </td>\n }\n @if (config.actions?.length) { <td></td> }\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (config.pagination?.enabled) {\n <div class=\"table-footer\">\n <div class=\"footer-left\">\n <span class=\"results-count\">Showing {{ paginatedData().length }} of {{ filteredData().length }} @if (config.pagination?.showTotal) { (total: {{ allData().length }}) }</span>\n @if ((config.pagination?.pageSizeOptions || [5, 10, 25, 50]).length > 1) {\n <div class=\"page-size-wrap\">\n <label class=\"page-size-label\">Rows:</label>\n <select class=\"page-size-select\" [ngModel]=\"activePageSize()\" (ngModelChange)=\"setPageSize($event)\">\n @for (opt of config.pagination?.pageSizeOptions || [5, 10, 25, 50]; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n }\n </div>\n <div class=\"pagination\">\n <button class=\"btn-page-nav\" [disabled]=\"currentPage() <= 1\" (click)=\"currentPage.set(currentPage() - 1)\">Previous</button>\n @for (p of pageNumbers(); track p) { <button class=\"btn-page\" [class.active]=\"p === currentPage()\" (click)=\"currentPage.set(p)\">{{ p }}</button> }\n <button class=\"btn-page-nav\" [disabled]=\"currentPage() >= totalPages()\" (click)=\"currentPage.set(currentPage() + 1)\">Next</button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .amf-table-card { background: var(--app-surface); border: 1px solid var(--app-border); border-radius: 16px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.05); }\n .table-header { padding: 16px 20px; display: flex; justify-content: space-between; align-items: center; gap: 16px; border-bottom: 1px solid var(--app-border); flex-wrap: wrap; }\n .table-header-left, .table-header-right { display: flex; align-items: center; gap: 12px; }\n .search-box { position: relative; min-width: 240px; }\n .search-icon { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; fill: var(--app-text-muted); }\n .search-box input { width: 100%; padding: 8px 12px 8px 36px; border: 1px solid var(--app-border); border-radius: 8px; font-size: 0.8125rem; outline: none; background: var(--glass-bg); color: var(--app-text); }\n .search-box input:focus { border-color: var(--app-primary); }\n .filter-select { padding: 8px 12px; border: 1px solid var(--app-border); border-radius: 8px; font-size: 0.8125rem; outline: none; background: var(--glass-bg); color: var(--app-text); color-scheme: dark; }\n .filter-select option { background-color: #1e1e2d; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) .filter-select { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) .filter-select option { background-color: #ffffff; color: #000000; }\n .table-wrapper { width: 100%; overflow-x: auto; }\n .data-table { width: 100%; border-collapse: collapse; white-space: normal; word-break: break-word; }\n .data-table th { background: var(--app-bg); padding: 10px 20px; font-size: 0.6875rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--app-text-muted); border-bottom: 1px solid var(--app-border); user-select: none; }\n .data-table th.sortable { cursor: pointer; } .data-table th.sortable:hover { color: var(--app-primary); }\n .sort-indicator { margin-left: 4px; font-size: 0.75rem; }\n .data-table td { padding: 14px 20px; border-bottom: 1px solid var(--app-border); font-size: 0.875rem; color: var(--app-text); }\n .data-table.hoverable tbody tr:hover { background: var(--glass-bg); }\n .data-table.striped tbody tr:nth-child(even) { background: var(--glass-bg); }\n \n /* Table Variants */\n .variant-striped .data-table tbody tr:nth-child(even) { background: var(--glass-bg); }\n .variant-borderless { border: none !important; box-shadow: none !important; background: transparent !important; }\n .variant-borderless .table-header { border-bottom: none; padding: 0 0 16px 0; }\n .variant-borderless .data-table th { background: transparent; border-bottom: 2px solid var(--app-border); }\n .variant-borderless .data-table td { border-bottom: 1px dashed var(--app-border); }\n .variant-borderless .table-footer { border-top: none; background: transparent; padding: 16px 0 0 0; }\n \n .variant-glass { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: 1px solid var(--glass-border); box-shadow: var(--glass-shadow-sm); }\n .variant-glass .table-header, .variant-glass .table-footer, .variant-glass .data-table th { background: transparent; border-color: var(--glass-border); }\n .variant-glass .data-table td { border-bottom: 1px solid var(--glass-border); }\n \n .variant-elevated { box-shadow: 0 20px 40px var(--glass-shadow); transform: translateY(-2px); transition: all 0.3s ease; }\n \n .variant-compact .table-header { padding: 12px 16px; }\n .variant-compact .data-table th { padding: 8px 16px; font-size: 0.625rem; }\n .variant-compact .data-table td { padding: 8px 16px; font-size: 0.8125rem; }\n .variant-compact .table-footer { padding: 8px 16px; }\n \n \n tr.clickable { cursor: pointer; }\n .amf-checkbox { width: 16px; height: 16px; cursor: pointer; accent-color: var(--app-primary); }\n .data-table tbody tr.selected { background: rgba(59, 130, 246, 0.15) !important; }\n \n .actions-col { text-align: right !important; width: 120px; } .actions-cell { text-align: right; }\n .action-btns { display: flex; justify-content: flex-end; gap: 6px; }\n .action-btn { width: 30px; height: 30px; border-radius: 6px; border: 1px solid var(--app-border); background: transparent; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s; }\n .action-btn svg { width: 14px; height: 14px; fill: var(--app-text-muted); }\n .action-btn:hover { border-color: var(--app-primary); } .action-btn:hover svg { fill: var(--app-primary); }\n .action-btn.danger:hover { border-color: #f43f5e; } .action-btn.danger:hover svg { fill: #f43f5e; }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; display: flex; align-items: center; gap: 6px; transition: all 0.2s; }\n .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 4px 12px var(--app-glow); }\n .btn-icon { width: 16px; height: 16px; fill: currentColor; }\n .btn-sm { padding: 6px 12px; font-size: 0.75rem; border-radius: 6px; }\n .btn-ghost { background: transparent; border: 1px solid var(--app-border); color: var(--app-text); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; display: flex; align-items: center; gap: 6px; cursor: pointer; transition: all 0.2s; }\n .btn-ghost:hover { background: var(--glass-bg-hover); color: var(--app-primary); }\n .export-container { position: relative; }\n .export-menu { position: absolute; top: calc(100% + 8px); right: 0; background: var(--app-surface); border: 1px solid var(--app-border); border-radius: 12px; box-shadow: 0 10px 40px rgba(0,0,0,0.5); min-width: 160px; z-index: 100; overflow: hidden; animation: slideInDown 0.2s ease-out backwards; }\n .export-menu .dropdown-item { padding: 10px 16px; font-size: 0.8125rem; font-weight: 500; cursor: pointer; color: var(--app-text); transition: background 0.2s; }\n .export-menu .dropdown-item:hover { background: var(--glass-bg-hover); color: var(--app-primary); }\n .empty-state { text-align: center; padding: 40px !important; color: var(--app-text-muted); }\n .table-footer { padding: 12px 20px; display: flex; justify-content: space-between; align-items: center; background: var(--app-bg); border-top: 1px solid var(--app-border); }\n .footer-left { display: flex; align-items: center; gap: 16px; }\n .results-count { font-size: 0.75rem; color: var(--app-text-muted); }\n .page-size-wrap { display: flex; align-items: center; gap: 6px; }\n .page-size-label { font-size: 0.75rem; color: var(--app-text-muted); white-space: nowrap; }\n .page-size-select { padding: 4px 8px; border: 1px solid var(--app-border); border-radius: 6px; font-size: 0.75rem; background: var(--glass-bg); color: var(--app-text); outline: none; cursor: pointer; color-scheme: dark; }\n .page-size-select option { background-color: #1a1a2e; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) .page-size-select { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) .page-size-select option { background-color: #ffffff; color: #000000; }\n .pagination { display: flex; gap: 4px; }\n .btn-page, .btn-page-nav { padding: 6px 10px; border: 1px solid var(--app-border); background: transparent; border-radius: 6px; font-size: 0.75rem; font-weight: 500; color: var(--app-text); cursor: pointer; }\n .btn-page.active { background: var(--app-primary); border-color: var(--app-primary); color: white; }\n .btn-page-nav:disabled { opacity: 0.4; cursor: not-allowed; }\n /* Inline Edit */\n .editable-cell { position: relative; }\n .editable-cell:hover { background: rgba(59,130,246,0.08); cursor: text; }\n .inline-edit-wrap { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n .inline-edit-row { display: flex; align-items: center; gap: 4px; }\n .inline-edit-row { display: flex; align-items: center; gap: 4px; }\n .inline-input { flex: 1; min-width: 0; padding: 5px 8px; border: 1.5px solid var(--app-primary); border-radius: 6px; background: var(--app-surface); color: var(--app-text); font-size: 0.875rem; outline: none; }\n .inline-input.input-invalid { border-color: #f43f5e; }\n .inline-edit-error { font-size: 0.6875rem; color: #f43f5e; font-weight: 500; padding: 0 2px; animation: fadeIn 0.15s ease-out; }\n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n .inline-edit-actions { display: flex; gap: 3px; flex-shrink: 0; }\n .ie-btn { width: 26px; height: 26px; border-radius: 5px; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: opacity 0.15s; }\n .ie-btn svg { width: 14px; height: 14px; fill: currentColor; }\n .ie-btn:hover { opacity: 0.85; }\n .ie-save { background: #22c55e; color: white; }\n .ie-cancel { background: var(--app-border); color: var(--app-text-muted); }\n select.inline-input { color-scheme: dark; cursor: pointer; }\n select.inline-input option { background-color: #1a1a2e; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) select.inline-input { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) select.inline-input option { background-color: #ffffff; color: #000000; }\n /* Row Expansion */\n .expand-cell { width: 36px; text-align: center; cursor: pointer; }\n .expand-chevron { display: inline-block; transition: transform 0.2s; font-size: 0.625rem; color: var(--app-text-muted); }\n .expand-chevron.open { transform: rotate(90deg); }\n .expanded-row td { padding: 0 !important; }\n .expanded-content { padding: 0 !important; }\n .expand-section { padding: 14px 24px; display: flex; flex-wrap: wrap; gap: 16px; background: var(--glass-bg); animation: fadeInUp 0.2s ease-out; }\n .expand-field { display: flex; gap: 8px; font-size: 0.8125rem; }\n .expand-label { color: var(--app-text-muted); font-weight: 600; }\n /* Grouping */\n .group-header-row td { background: var(--app-bg); }\n .group-toggle { display: flex; align-items: center; gap: 8px; background: none; border: none; color: var(--app-text); cursor: pointer; font-size: 0.8125rem; padding: 8px 16px; }\n .group-chevron { display: inline-block; font-size: 0.625rem; transition: transform 0.2s; color: var(--app-text-muted); }\n .group-chevron.open { transform: rotate(90deg); }\n .group-count { color: var(--app-text-muted); font-size: 0.75rem; }\n /* Aggregations Footer */\n .aggregate-row td { background: var(--app-bg); border-top: 2px solid var(--app-border); }\n .aggregate-cell { padding: 10px 20px !important; }\n .agg-value { font-size: 0.8125rem; font-weight: 700; color: var(--app-primary); }\n `]\n})\nexport class TableRendererComponent implements MetaSectionComponent<TableMeta>, OnInit, OnDestroy {\n @Input() config!: TableMeta;\n @Input() context: any = {};\n @Output() rowAction = new EventEmitter<{ actionId: string; row: any }>();\n\n readonly iconRegistry = inject(IconRegistryService);\n private readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly apiService = inject(MetaApiService);\n private readonly dialogService = inject(AmfDialogService);\n\n searchQuery = signal(''); sortKey = signal<string | null>(null); sortDirection = signal<'asc' | 'desc'>('asc'); currentPage = signal(1);\n exportMenuOpen = signal(false);\n selectedRows = signal<Set<any>>(new Set());\n expandedRows = signal<Set<any>>(new Set());\n collapsedGroups = signal<Set<string>>(new Set());\n localColumns = signal<ColumnMeta[]>([]);\n editingCell = signal<{ row: any; key: string } | null>(null);\n editBuffer: Record<string, any> = {};\n editError = signal<string | null>(null);\n pageSizeOverride = signal<number | null>(null);\n private filterValues = new Map<string, string>(); allData = signal<any[]>([]);\n private tableEventsSub?: Subscription;\n private sectionId?: string;\n\n ngOnInit(): void {\n // Capture section ID from context for reload-table matching\n this.sectionId = (this.config as any)._sectionId;\n this.localColumns.set([...this.config.columns]);\n\n // Load data from various sources\n this.loadData();\n\n // Subscribe to reload-table events\n this.tableEventsSub = this.actionDispatcher.tableEvents$.subscribe(event => {\n if (event.action === 'reload') {\n const targetId = event.config?.tableId;\n // Reload if no targetId specified, or if targetId matches our section ID or config ID\n if (!targetId || targetId === this.sectionId || targetId === (this.config as any).id) {\n this.loadData();\n }\n }\n });\n\n if (this.config.defaultSortKey) { this.sortKey.set(this.config.defaultSortKey); this.sortDirection.set(this.config.defaultSortDirection || 'asc'); }\n }\n\n ngOnDestroy(): void {\n this.tableEventsSub?.unsubscribe();\n }\n\n private async loadData(): Promise<void> {\n const storageKey = this.getStorageKey();\n const versionKey = storageKey + '_v';\n const stored = sessionStorage.getItem(storageKey);\n const storedVersion = sessionStorage.getItem(versionKey);\n const currentVersion = String(this.config.dataVersion ?? 1);\n\n // If dataVersion changed, wipe the stale cache and re-seed (only if version was previously tracked)\n if (stored && storedVersion !== null && storedVersion !== currentVersion) {\n sessionStorage.removeItem(storageKey);\n sessionStorage.removeItem(versionKey);\n }\n\n const freshStored = sessionStorage.getItem(storageKey);\n\n if (this.config.endpointId) {\n try {\n const apiData = await this.apiService.call(this.config.endpointId);\n const localData = freshStored ? JSON.parse(freshStored) : [];\n const merged = [...localData, ...(Array.isArray(apiData) ? apiData : [])];\n this.allData.set(merged);\n } catch (e) {\n console.warn(`[AvoraMetaForge] Table: failed to load from endpoint \"${this.config.endpointId}\"`, e);\n if (freshStored) this.allData.set(JSON.parse(freshStored));\n }\n } else if (this.config.staticData) {\n if (freshStored) {\n this.allData.set(JSON.parse(freshStored));\n } else {\n this.allData.set([...this.config.staticData]);\n sessionStorage.setItem(storageKey, JSON.stringify(this.config.staticData));\n sessionStorage.setItem(versionKey, currentVersion);\n }\n } else if (freshStored) {\n this.allData.set(JSON.parse(freshStored));\n }\n }\n\n private getStorageKey(): string {\n return `amf_table_${this.sectionId || (this.config as any).id || 'default'}`;\n }\n\n visibleColumns = computed(() => this.localColumns().filter(c => !c.hidden));\n\n filteredData = computed(() => {\n let data = this.allData();\n const query = this.searchQuery().toLowerCase();\n if (query) {\n const fields = this.config.searchFields || this.localColumns().map(c => c.key);\n data = data.filter(row => fields.some(f => String(this.getCellValue(row, f)).toLowerCase().includes(query)));\n }\n for (const [key, val] of this.filterValues.entries()) {\n if (val) { data = data.filter(row => String(this.getCellValue(row, key)) === val); }\n }\n const sk = this.sortKey();\n if (sk) {\n const dir = this.sortDirection() === 'asc' ? 1 : -1;\n data = [...data].sort((a, b) => {\n const va = this.getCellValue(a, sk); const vb = this.getCellValue(b, sk);\n if (va < vb) return -1 * dir; if (va > vb) return 1 * dir; return 0;\n });\n }\n return data;\n });\n\n /** Flat list with injected group-header sentinel objects for @for rendering */\n groupedRows = computed(() => {\n const data = this.paginatedData();\n if (!this.config.groupBy) return data;\n const key = this.config.groupBy;\n const groups = new Map<string, any[]>();\n for (const row of data) {\n const gk = String(this.getCellValue(row, key) ?? 'Other');\n if (!groups.has(gk)) groups.set(gk, []);\n groups.get(gk)!.push(row);\n }\n const result: any[] = [];\n for (const [gk, rows] of groups.entries()) {\n result.push({ __isGroupHeader: true, __groupKey: gk, __count: rows.length });\n if (!this.collapsedGroups().has(gk)) result.push(...rows);\n }\n return result;\n });\n\n activePageSize = computed(() => this.pageSizeOverride() ?? this.config.pagination?.pageSize ?? 10);\n\n setPageSize(size: number | string): void {\n this.pageSizeOverride.set(+size);\n this.currentPage.set(1);\n }\n\n paginatedData = computed(() => {\n const data = this.filteredData();\n if (!this.config.pagination?.enabled) return data;\n const ps = this.activePageSize();\n const start = (this.currentPage() - 1) * ps;\n return data.slice(start, start + ps);\n });\n\n totalPages = computed(() => {\n if (!this.config.pagination?.enabled) return 1;\n return Math.ceil(this.filteredData().length / this.activePageSize());\n });\n\n pageNumbers = computed(() => {\n const total = this.totalPages();\n return Array.from({ length: total }, (_, i) => i + 1);\n });\n\n toggleSort(key: string): void {\n if (this.sortKey() === key) { this.sortDirection.set(this.sortDirection() === 'asc' ? 'desc' : 'asc'); }\n else { this.sortKey.set(key); this.sortDirection.set('asc'); }\n }\n\n getCellValue(row: any, key: string): any { return key.split('.').reduce((obj, k) => obj?.[k], row) ?? ''; }\n getFilterValue(key: string): string { return this.filterValues.get(key) || ''; }\n setFilterValue(key: string, value: string): void { this.filterValues.set(key, value); this.currentPage.set(1); this.allData.update(d => [...d]); }\n\n async handleAction(action: TableActionMeta, row: any): Promise<void> {\n if (action.confirm) {\n const confirmed = await this.dialogService.confirm(action.confirm);\n if (!confirmed) return;\n }\n\n // Direct local delete for static data demo (only if no custom action is defined)\n if (action.id === 'delete' && this.config.staticData && !action.action) {\n this.allData.update(data => {\n const newData = data.filter(r => r !== row);\n sessionStorage.setItem(this.getStorageKey(), JSON.stringify(newData));\n return newData;\n });\n }\n\n this.rowAction.emit({ actionId: action.id, row });\n this.actionDispatcher.dispatch(action.action, { ...this.context, row });\n }\n\n handleRowClick(row: any): void {\n if (this.config.selectionMode === 'single' || this.config.selectionMode === 'multi') {\n this.toggleSelection(row);\n }\n if (this.config.rowClick) { this.actionDispatcher.dispatch(this.config.rowClick, { ...this.context, row }); }\n }\n\n toggleSelection(row: any): void {\n if (!this.config.selectionMode) return;\n const set = new Set(this.selectedRows());\n if (set.has(row)) {\n set.delete(row);\n } else {\n if (this.config.selectionMode === 'single') set.clear();\n set.add(row);\n }\n this.selectedRows.set(set);\n this.emitSelectionChange();\n }\n\n toggleAllSelection(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n if (checked) {\n this.selectedRows.set(new Set(this.filteredData()));\n } else {\n this.selectedRows.set(new Set());\n }\n this.emitSelectionChange();\n }\n\n private emitSelectionChange(): void {\n if (this.config.onSelectionChange) {\n this.actionDispatcher.dispatch(this.config.onSelectionChange, { ...this.context, selection: Array.from(this.selectedRows()) });\n }\n }\n\n /* ─── INLINE EDIT ─────────────────────────────── */\n isEditing(row: any, key: string): boolean {\n const ec = this.editingCell();\n return ec?.row === row && ec?.key === key;\n }\n\n startEdit(row: any, key: string, event: MouseEvent): void {\n event.stopPropagation();\n this.editError.set(null);\n this.editingCell.set({ row, key });\n this.editBuffer = { [key]: this.getCellValue(row, key) };\n }\n\n commitEdit(row: any, key: string): void {\n // Run inline edit validators before committing\n const col = this.localColumns().find(c => c.key === key);\n const validators: ColumnEditValidatorMeta[] = col?.editValidators ?? [];\n const value = this.editBuffer[key];\n const error = this.runInlineValidators(validators, value);\n if (error) {\n this.editError.set(error);\n return;\n }\n this.editError.set(null);\n row[key] = value;\n // Persist to session storage if using static data\n const storageKey = this.getStorageKey();\n sessionStorage.setItem(storageKey, JSON.stringify(this.allData()));\n if (this.config.onInlineEditSave) {\n this.actionDispatcher.dispatch(this.config.onInlineEditSave, { ...this.context, row, key, value });\n }\n this.editingCell.set(null);\n }\n\n /** Runs all validators for an inline-edit value. Returns the first error message, or null if valid. */\n private runInlineValidators(validators: ColumnEditValidatorMeta[], value: any): string | null {\n for (const v of validators) {\n const str = value == null ? '' : String(value).trim();\n switch (v.type) {\n case 'required':\n if (!str) return v.message ?? 'This field is required.';\n break;\n case 'minLength':\n if (str.length < +v.value) return v.message ?? `Minimum ${v.value} characters required.`;\n break;\n case 'maxLength':\n if (str.length > +v.value) return v.message ?? `Maximum ${v.value} characters allowed.`;\n break;\n case 'min':\n if (parseFloat(str) < +v.value) return v.message ?? `Value must be at least ${v.value}.`;\n break;\n case 'max':\n if (parseFloat(str) > +v.value) return v.message ?? `Value must be at most ${v.value}.`;\n break;\n case 'pattern': {\n if (!str) break;\n const re = new RegExp(v.value);\n if (!re.test(str)) return v.message ?? `Invalid format.`;\n break;\n }\n case 'email': {\n if (!str) break;\n const emailRe = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRe.test(str)) return v.message ?? 'Invalid email address.';\n break;\n }\n case 'number':\n if (isNaN(parseFloat(str)) || !isFinite(+str)) return v.message ?? 'Must be a valid number.';\n break;\n }\n }\n return null;\n }\n\n cancelEdit(): void {\n if (this.config.onInlineEditCancel) {\n this.actionDispatcher.dispatch(this.config.onInlineEditCancel, this.context);\n }\n this.editError.set(null);\n this.editingCell.set(null);\n }\n\n /* ─── ROW EXPANSION ───────────────────────────── */\n toggleRowExpand(row: any): void {\n const set = new Set(this.expandedRows());\n set.has(row) ? set.delete(row) : (this.config.singleExpand ? set.clear() : null, set.add(row));\n this.expandedRows.set(set);\n }\n\n /* ─── GROUPING ────────────────────────────────── */\n toggleGroup(key: string): void {\n const set = new Set(this.collapsedGroups());\n set.has(key) ? set.delete(key) : set.add(key);\n this.collapsedGroups.set(set);\n }\n\n /* ─── AGGREGATIONS ────────────────────────────── */\n getAggregate(colKey: string): { label?: string; value: string | number } | null {\n const agg = this.config.aggregates?.find(a => a.columnKey === colKey);\n if (!agg) return null;\n const vals = this.filteredData().map(r => parseFloat(this.getCellValue(r, colKey))).filter(v => !isNaN(v));\n let value: number;\n switch (agg.type) {\n case 'sum': value = vals.reduce((a, b) => a + b, 0); break;\n case 'avg': value = vals.length ? vals.reduce((a, b) => a + b, 0) / vals.length : 0; break;\n case 'min': value = Math.min(...vals); break;\n case 'max': value = Math.max(...vals); break;\n case 'count': value = this.filteredData().length; break;\n default: return null;\n }\n return { label: agg.label, value: agg.format === 'currency' ? '$' + value.toFixed(2) : agg.format === 'percent' ? value.toFixed(1) + '%' : +value.toFixed(2) };\n }\n\n exportData(format: string): void {\n const data = this.filteredData();\n const columns = this.config.exportColumns || this.visibleColumns().map(c => c.key);\n const filename = (this.config.exportFilename || 'export_data') + '.' + format;\n \n let content = '';\n let mimeType = '';\n\n if (format === 'csv') {\n const header = columns.map(k => {\n const col = this.visibleColumns().find(c => c.key === k);\n return '\"' + (col ? col.label : k).replace(/\"/g, '\"\"') + '\"';\n }).join(',');\n \n const rows = data.map(row => {\n return columns.map(k => {\n let val = this.getCellValue(row, k) ?? '';\n if (typeof val === 'object') val = JSON.stringify(val);\n return '\"' + String(val).replace(/\"/g, '\"\"') + '\"';\n }).join(',');\n }).join('\\\\n');\n \n content = header + '\\\\n' + rows;\n mimeType = 'text/csv;charset=utf-8;';\n } else if (format === 'json') {\n // Export only specified columns for JSON too\n const mappedData = data.map(row => {\n const obj: any = {};\n columns.forEach(k => obj[k] = this.getCellValue(row, k));\n return obj;\n });\n content = JSON.stringify(mappedData, null, 2);\n mimeType = 'application/json;charset=utf-8;';\n } else {\n console.warn('[AvoraMetaForge] Export format not fully implemented natively:', format);\n return;\n }\n\n // Trigger download\n const blob = new Blob([content], { type: mimeType });\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', filename);\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n dropColumn(event: CdkDragDrop<string[]>): void {\n if (!this.config.columnReorder) return;\n const cols = [...this.localColumns()];\n const visCols = this.visibleColumns();\n const prevId = visCols[event.previousIndex].key;\n const currId = visCols[event.currentIndex].key;\n const absPrev = cols.findIndex(c => c.key === prevId);\n const absCurr = cols.findIndex(c => c.key === currId);\n moveItemInArray(cols, absPrev, absCurr);\n this.localColumns.set(cols);\n }\n\n dropRow(event: CdkDragDrop<any[]>): void {\n if (!this.config.reorderable) return;\n const currentData = [...this.allData()];\n moveItemInArray(currentData, event.previousIndex, event.currentIndex);\n this.allData.set(currentData);\n if (this.config.onReorder) {\n this.actionDispatcher.dispatch(this.config.onReorder, { ...this.context, previousIndex: event.previousIndex, currentIndex: event.currentIndex });\n }\n }\n}\n\n","/**\n * AvoraMetaForge — Card Section Component\n */\nimport { Component, Input, inject } from '@angular/core';\n\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { CardMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { MetaRendererComponent } from '../../core/meta-renderer.component';\n\n@Component({\n selector: 'amf-card',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n <div class=\"amf-card\" [class]=\"'variant-' + (config.variant || 'glass')\">\n @if (config.title) { <h2 class=\"card-title\">{{ config.title }}</h2> }\n @if (config.content) { <div class=\"card-content\" [innerHTML]=\"trustedContent\"></div> }\n @if (config.sections?.length) {\n <div class=\"card-sections\">\n @for (nested of config.sections; track nested.id) {\n <amf-renderer [section]=\"nested\" [context]=\"context\" class=\"card-nested-section\"></amf-renderer>\n }\n </div>\n }\n @if (config.actions?.length) {\n <div class=\"card-actions\">\n @for (action of config.actions; track action.label) { <button [class]=\"'btn-' + (action.variant || 'secondary')\" (click)=\"actionDispatcher.dispatch(action.action, context)\">{{ action.label }}</button> }\n </div>\n }\n </div>\n `,\n styles: [`\n .amf-card { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: 1px solid var(--glass-border); border-radius: 16px; padding: 24px; box-shadow: var(--glass-shadow-sm); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); }\n .amf-card:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); box-shadow: var(--glass-shadow); transform: translateY(-2px); }\n .variant-default { background: var(--app-surface); border: 1px solid var(--app-border); backdrop-filter: none; -webkit-backdrop-filter: none; }\n .variant-outlined { background: transparent; backdrop-filter: none; }\n .variant-elevated { box-shadow: 0 20px 40px var(--glass-shadow); transform: translateY(-4px); }\n .variant-gradient { background: linear-gradient(135deg, rgba(59, 130, 246, 0.15), rgba(139, 92, 246, 0.15)); border: 1px solid rgba(139, 92, 246, 0.3); }\n .card-title { font-size: 1.25rem; margin-bottom: 16px; }\n .card-content { color: var(--app-text-muted); font-size: 0.9375rem; line-height: 1.6; }\n .card-sections { display: flex; flex-direction: column; gap: 16px; margin-top: 16px; }\n .card-nested-section { display: block; }\n .card-actions { margin-top: 20px; display: flex; gap: 12px; }\n .btn-secondary { background: var(--glass-bg); border: 1px solid var(--app-border); color: var(--app-text); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-secondary:hover { background: var(--glass-bg-hover); }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 4px 12px var(--app-glow); }\n .btn-danger { background: linear-gradient(135deg, #ef4444, #dc2626); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-danger:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4); }\n .btn-success { background: linear-gradient(135deg, #10b981, #059669); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-success:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4); }\n .btn-ghost { background: transparent; border: 1px solid transparent; color: var(--app-text-muted); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-ghost:hover { background: rgba(255, 255, 255, 0.05); color: var(--app-text); }\n `]\n})\nexport class CardSectionComponent implements MetaSectionComponent<CardMeta> {\n @Input() config!: CardMeta;\n @Input() context: any = {};\n readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly sanitizer = inject(DomSanitizer);\n\n get trustedContent(): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(this.config.content || '');\n }\n}\n","/**\n * AvoraMetaForge — Stats Grid Section Component\n */\nimport { Component, Input, inject } from '@angular/core';\n\nimport { StatsGridMeta } from '../../models/meta.types';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\n\n@Component({\n selector: 'amf-stats-grid',\n standalone: true,\n imports: [],\n template: `\n <div class=\"amf-stats-grid\" [style.grid-template-columns]=\"gridCols\" [class]=\"'variant-' + (config.variant || 'glass')\">\n @for (stat of config.stats; track stat.label; let i = $index) {\n <div class=\"stat-card\" [style.animation-delay]=\"(i * 0.1) + 's'\">\n <div class=\"stat-glow\" [style.background]=\"stat.glowColor || stat.color\"></div>\n @if (stat.icon) {\n <div class=\"stat-icon\" [style.color]=\"stat.color\" [style.background]=\"stat.bgColor\">\n <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"iconRegistry.getIcon(stat.icon)\"></path></svg>\n </div>\n }\n <div class=\"stat-data\">\n <span class=\"stat-label\">{{ stat.label }}</span>\n <span class=\"stat-value\">{{ stat.value }}</span>\n @if (stat.trend) { <span class=\"stat-trend\" [class.positive]=\"stat.trendPositive\" [class.negative]=\"!stat.trendPositive\">{{ stat.trend }}</span> }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .amf-stats-grid { display: grid; gap: 20px; }\n .stat-card { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: 1px solid var(--glass-border); border-radius: 16px; padding: 24px; display: flex; align-items: center; gap: 20px; position: relative; overflow: hidden; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); animation: fadeInUp 0.5s ease-out backwards; }\n .stat-card:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); transform: translateY(-4px); box-shadow: var(--glass-shadow); }\n .variant-default .stat-card { background: var(--app-surface); border: 1px solid var(--app-border); backdrop-filter: none; -webkit-backdrop-filter: none; }\n .variant-compact .stat-card { padding: 14px 16px; gap: 14px; min-height: 80px; }\n .variant-compact .stat-icon { width: 38px; height: 38px; border-radius: 10px; }\n .variant-compact .stat-icon svg { width: 18px; height: 18px; }\n .variant-compact .stat-value { font-size: 1.25rem; font-weight: 800; }\n .variant-compact .stat-glow { width: 60px; height: 60px; top: -10px; right: -10px; }\n .variant-outlined .stat-card { background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; }\n .variant-elevated .stat-card { box-shadow: 0 20px 40px var(--glass-shadow); transform: translateY(-2px); border-color: var(--glass-border-light); }\n .stat-glow { position: absolute; width: 100px; height: 100px; border-radius: 50%; filter: blur(40px); opacity: 0.15; top: -20px; right: -20px; pointer-events: none; transition: opacity 0.3s; }\n .stat-card:hover .stat-glow { opacity: 0.3; }\n .stat-icon { width: 52px; height: 52px; border-radius: 14px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n .stat-icon svg { width: 26px; height: 26px; fill: currentColor; }\n .stat-data { display: flex; flex-direction: column; }\n .stat-label { font-size: 0.8125rem; color: var(--app-text-muted); font-weight: 500; }\n .stat-value { font-size: 1.5rem; font-weight: 700; color: var(--app-text); margin: 2px 0; }\n .stat-trend { font-size: 0.75rem; font-weight: 600; }\n .stat-trend.positive { color: #34d399; } .stat-trend.negative { color: #fb7185; }\n @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n `]\n})\nexport class StatsGridSectionComponent implements MetaSectionComponent<StatsGridMeta> {\n @Input() config!: StatsGridMeta;\n @Input() context: any = {};\n readonly iconRegistry = inject(IconRegistryService);\n\n get gridCols(): string { return `repeat(auto-fit, minmax(280px, 1fr))`; }\n}\n","/**\n * AvoraMetaForge — Page Header Section Component\n */\nimport { Component, Input, inject } from '@angular/core';\n\nimport { PageHeaderMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\n\n@Component({\n selector: 'amf-page-header',\n standalone: true,\n imports: [],\n template: `\n <header class=\"amf-page-header\">\n <div class=\"header-content\">\n <h1>{{ resolvedTitle }}</h1>\n @if (config.subtitle) { <p>{{ config.subtitle }}</p> }\n </div>\n <div class=\"header-actions\">\n @for (action of config.actions || []; track action.label) {\n <button [class]=\"'btn-' + (action.variant || 'primary')\" (click)=\"actionDispatcher.dispatch(action.action, context)\">\n @if (action.icon) { <svg viewBox=\"0 0 24 24\" class=\"btn-icon\"><path [attr.d]=\"iconRegistry.getIcon(action.icon)\"></path></svg> }\n {{ action.label }}\n </button>\n }\n </div>\n </header>\n `,\n styles: [`\n .amf-page-header { display: flex; justify-content: space-between; align-items: center; animation: fadeInUp 0.4s ease-out; }\n .header-content h1 { font-size: 1.875rem; margin-bottom: 4px; }\n .header-content p { color: var(--app-text-muted); font-size: 0.9375rem; }\n .header-actions { display: flex; gap: 12px; }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; border: none; padding: 10px 20px; border-radius: 10px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.3s; }\n .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .btn-secondary { background: var(--glass-bg); border: 1px solid var(--app-border); color: var(--app-text); padding: 10px 20px; border-radius: 10px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.2s; }\n .btn-secondary:hover { background: var(--glass-bg-hover); }\n .btn-ghost { background: transparent; border: none; color: var(--app-text-muted); padding: 10px 20px; border-radius: 10px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.2s; }\n .btn-ghost:hover { color: var(--app-primary); background: var(--glass-bg); }\n .btn-icon { width: 18px; height: 18px; fill: currentColor; }\n @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n `]\n})\nexport class PageHeaderSectionComponent implements MetaSectionComponent<PageHeaderMeta> {\n @Input() config!: PageHeaderMeta;\n @Input() context: any = {};\n\n readonly actionDispatcher = inject(ActionDispatcherService);\n readonly iconRegistry = inject(IconRegistryService);\n\n get resolvedTitle(): string {\n if (this.config.titleTemplate && this.context) {\n return this.config.titleTemplate.replace(/\\{\\{(\\w+(?:\\.\\w+)*)\\}\\}/g, (_, key) => {\n return key.split('.').reduce((obj: any, k: string) => obj?.[k], this.context) ?? '';\n });\n }\n return this.config.title;\n }\n}\n","import { Injectable, signal, inject } from '@angular/core';\nimport { APP_META_CONFIG_TOKEN } from '../../avora-meta-forge/avora-meta-forge.provider';\nexport interface NavItem {\n label: string;\n icon?: string;\n route?: string;\n children?: NavItem[];\n badge?: string;\n badgeColor?: string;\n}\n\nexport interface NavGroup {\n label: string;\n items: NavItem[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationService {\n private readonly metaConfig: any = inject(APP_META_CONFIG_TOKEN, { optional: true });\n readonly menuItems = signal<NavGroup[]>(this.metaConfig?.navigation || []);\n\n setMenuItems(groups: NavGroup[]): void {\n this.menuItems.set(groups);\n }\n}\n","/**\n * Defines the available layout types for the application shell.\n * Used in route data to determine which layout wraps a given page.\n */\nexport enum LayoutType {\n /** Classic admin: sidebar left, header top */\n VERTICAL = 'vertical',\n /** Modern admin: horizontal menu in header */\n HORIZONTAL = 'horizontal',\n /** Blank wrapper for login, error, and standalone pages */\n EMPTY = 'empty',\n /** Centered content card — wizards, onboarding, standalone forms */\n CENTERED = 'centered',\n /** Split-pane master-detail — settings, detail views */\n TWO_COLUMN = 'two-column',\n /** CSS Grid widget layout — analytics, monitoring dashboards */\n DASHBOARD_GRID = 'dashboard-grid',\n /** Minimal chrome, auto-hiding header — data-dense, mobile-first */\n COMPACT = 'compact',\n}\n","import { Injectable, signal, computed, inject, OnDestroy } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { filter, Subscription } from 'rxjs';\nimport { LayoutType } from './layout-type.enum';\nimport { MetaStateService } from '../../avora-meta-forge/services/meta-state.service';\nimport { Title } from '@angular/platform-browser';\n\nimport { APP_META_CONFIG_TOKEN } from '../../avora-meta-forge/avora-meta-forge.provider';\n\n/** Routes that use the EMPTY layout (no sidebar/navbar chrome). */\nconst EMPTY_LAYOUT_PATHS = ['/login', '/register', '/forgot-password', '/reset-password', '/contact-support'];\n/**\n * Central configuration service for the application shell.\n * Manages layout state, branding, and global settings using Angular Signals.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppConfigService implements OnDestroy {\n private readonly metaConfig: any = inject(APP_META_CONFIG_TOKEN, { optional: true });\n\n /**\n * Current active layout type.\n * Initialized from the browser URL *before* Angular's first navigation so\n * the correct layout shell renders on the very first frame, preventing the\n * brief flash of the sidebar/navbar chrome on pages like /login.\n */\n private readonly _currentLayout = signal<LayoutType>(this.getInitialLayout());\n\n /** Application display name */\n readonly appName = signal('AvoraMetaForge');\n\n /** Copyright text for the footer */\n readonly copyrightText = signal(`© ${new Date().getFullYear()} AvoraMetaForge. All rights reserved.`);\n\n /** Sidebar collapsed state */\n readonly sidebarCollapsed = signal(false);\n\n /** Public read-only accessor for the current layout */\n readonly currentLayout = computed(() => this._currentLayout());\n\n private readonly stateService = inject(MetaStateService);\n private readonly titleService = inject(Title);\n private _settingsSub?: Subscription;\n\n /**\n * Reads window.location.pathname before Angular's first navigation to\n * determine the correct initial layout. Prevents the one-frame flash of\n * the sidebar/navbar shell when refreshing on an auth-only page like /login.\n */\n private getInitialLayout(): LayoutType {\n const path = window.location.pathname;\n const isEmptyRoute = EMPTY_LAYOUT_PATHS.some(p => path === p || path.startsWith(p + '/'));\n if (isEmptyRoute) return LayoutType.EMPTY;\n \n return (this.metaConfig?.app?.defaultLayout as LayoutType) || LayoutType.VERTICAL;\n }\n\n constructor(private router: Router) {\n this.router.events\n .pipe(filter((event): event is NavigationEnd => event instanceof NavigationEnd))\n .subscribe(() => {\n this.updateLayoutFromUrl();\n });\n\n // Apply any previously persisted settings from the Settings page\n this.applyPersistedSettings();\n\n // React to settings changes saved via the Settings page\n this._settingsSub = this.stateService.changes$.pipe(\n filter(change => change.key.startsWith('settings.'))\n ).subscribe(change => {\n this.applySettingChange(change.key, change.newValue);\n });\n }\n\n ngOnDestroy(): void {\n this._settingsSub?.unsubscribe();\n }\n\n /** Update layout based on the current activated route data */\n private updateLayoutFromUrl(): void {\n let route = this.router.routerState.snapshot.root;\n let layout: LayoutType | null = null;\n\n // Traverse the route tree and pick up the last 'layout' data found\n while (route) {\n const layoutData = route.data['layout'] as LayoutType | undefined;\n if (layoutData) {\n layout = layoutData;\n }\n route = route.firstChild!;\n }\n\n if (layout && layout !== this._currentLayout()) {\n this._currentLayout.set(layout);\n }\n }\n\n /** Set the layout type programmatically */\n setLayout(type: LayoutType): void {\n this._currentLayout.set(type);\n }\n\n /** Toggle sidebar collapsed state */\n toggleSidebar(): void {\n this.sidebarCollapsed.update(v => !v);\n }\n\n /** Walk the route tree to find the deepest activated child */\n private getDeepestRoute(route: any): any {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n }\n\n /** Apply settings persisted across sessions on startup */\n private applyPersistedSettings(): void {\n const name = this.stateService.get('settings.appName');\n if (name) this.appName.set(String(name));\n\n const compact = this.stateService.get('settings.compactSidebar');\n if (compact !== undefined && compact !== null) this.sidebarCollapsed.set(Boolean(compact));\n\n // Restore dark/light mode preference (default is dark)\n const darkMode = this.stateService.get('settings.darkMode');\n // If no preference is stored yet, default to dark (no attribute = dark variables from :root)\n if (darkMode !== undefined && darkMode !== null) {\n this.applyColorScheme(Boolean(darkMode));\n }\n }\n\n /**\n * Called whenever a settings.* state key changes (e.g. after the Settings\n * form is submitted). Maps each key to the appropriate runtime effect.\n */\n private applySettingChange(key: string, value: any): void {\n switch (key) {\n case 'settings.appName':\n if (value) {\n this.appName.set(String(value));\n this.titleService.setTitle(String(value));\n }\n break;\n\n case 'settings.compactSidebar':\n this.sidebarCollapsed.set(Boolean(value));\n break;\n\n case 'settings.darkMode':\n this.applyColorScheme(Boolean(value));\n break;\n\n case 'settings.language':\n // Language preference is stored; full i18n runtime switching requires\n // a translation library (ngx-translate / transloco) — noted for future.\n console.info(`[AvoraMetaForge] Language preference saved: ${value}. Full runtime translation requires i18n integration.`);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Toggles dark / light mode by setting data-color-scheme on <html>.\n * Dark mode = no attribute (uses :root CSS vars from _variables.scss).\n * Light mode = data-color-scheme=\"light\" (overrides via _themes.scss).\n */\n private applyColorScheme(isDark: boolean): void {\n const html = document.documentElement;\n if (isDark) {\n html.removeAttribute('data-color-scheme');\n } else {\n html.setAttribute('data-color-scheme', 'light');\n }\n }\n}\n","/**\n * AvoraMetaForge — Provider Initialization\n *\n * Provides the APP_INITIALIZER factory that bootstraps the framework:\n * 1. Registers built-in section components (form, table, card, etc.)\n * 2. Registers API endpoint definitions\n * 3. Registers environments and auth configuration\n * 4. Generates and registers dynamic routes from metadata\n * 5. Registers plugins (custom actions, validators, conditions, etc.)\n * 6. Initializes MetaStateService and MetaAuthService\n */\nimport { APP_INITIALIZER, Provider, InjectionToken } from '@angular/core';\nimport { AppMeta } from './models/meta.types';\n\nexport const APP_META_CONFIG_TOKEN = new InjectionToken<AppMeta>('APP_META_CONFIG');\nimport { MetaRouterService } from './core/meta-router.service';\nimport { ComponentRegistryService } from './core/component-registry.service';\nimport { MetaApiService } from './services/meta-api.service';\nimport { MetaStateService } from './services/meta-state.service';\nimport { AuthService } from '../core/auth/auth.service';\nimport { ActionDispatcherService } from './core/action-dispatcher.service';\nimport { ConditionEvaluatorService } from './core/condition-evaluator.service';\nimport { PluginRegistryService } from './plugins/plugin-registry.service';\nimport { NavigationService } from '../layout/api/navigation.service';\nimport { AppConfigService } from '../core/config/app-config.service';\nimport { FormRendererComponent } from './renderers/form/form-renderer.component';\nimport { StepperFormRendererComponent } from './renderers/form/stepper-form-renderer.component';\nimport { TableRendererComponent } from './renderers/table/table-renderer.component';\nimport { CardSectionComponent } from './renderers/card/card-section.component';\nimport { StatsGridSectionComponent } from './renderers/stats-grid/stats-grid-section.component';\nimport { PageHeaderSectionComponent } from './renderers/page-header/page-header-section.component';\nimport { AccordionSectionComponent } from './core/components/accordion-section.component';\n\n/**\n * Factory function invoked by APP_INITIALIZER before the app renders.\n * Returns a synchronous function — Angular waits for it to complete\n * before performing the initial navigation.\n */\nexport function initializeAvoraMetaForge(\n registry: ComponentRegistryService,\n routerService: MetaRouterService,\n apiService: MetaApiService,\n stateService: MetaStateService,\n authService: AuthService,\n actionDispatcher: ActionDispatcherService,\n conditionEvaluator: ConditionEvaluatorService,\n pluginRegistry: PluginRegistryService,\n navService: NavigationService,\n appConfigService: AppConfigService,\n config: AppMeta\n) {\n return () => {\n // 1. Register built-in section renderers\n registry.registerAll({\n 'form': FormRendererComponent,\n 'stepper-form': StepperFormRendererComponent,\n 'table': TableRendererComponent,\n 'card': CardSectionComponent,\n 'stats-grid': StatsGridSectionComponent,\n 'page-header': PageHeaderSectionComponent,\n 'accordion': AccordionSectionComponent\n });\n\n // 2. Register API endpoint definitions (if any)\n if (config.apis?.length) {\n apiService.registerEndpoints(config.apis);\n }\n\n // 3. Register environments\n if (config.environments) {\n apiService.registerEnvironments(config.environments, config.activeEnvironment);\n }\n\n // 4. Set global default headers\n if (config.defaultHeaders) {\n apiService.setGlobalHeaders(config.defaultHeaders);\n }\n\n const authConfig = config.auth;\n if (authConfig) {\n authService.configure(authConfig, authConfig.mock || false);\n }\n\n // 6. Register plugins\n if (config.plugins?.length) {\n for (const plugin of config.plugins) {\n pluginRegistry.register(plugin);\n\n // Wire plugin components\n if (plugin.components) {\n registry.registerAll(plugin.components);\n }\n\n // Wire plugin action handlers\n if (plugin.actions) {\n for (const [type, handler] of Object.entries(plugin.actions)) {\n actionDispatcher.registerHandler(type, handler);\n }\n }\n\n // Wire plugin condition evaluators\n if (plugin.conditions) {\n for (const [key, evaluator] of Object.entries(plugin.conditions)) {\n conditionEvaluator.registerEvaluator(key, evaluator);\n }\n }\n\n // Wire plugin transforms\n if (plugin.transforms) {\n for (const [key, fn] of Object.entries(plugin.transforms)) {\n apiService.registerTransform(key, fn);\n }\n }\n }\n }\n\n // 7. Generate and register dynamic routes from page metadata.\n // Angular's APP_INITIALIZER guarantees this runs before the router\n // performs initial navigation, so no manual initialNavigation() needed.\n routerService.registerApp(config);\n\n // 8. Push navigation and app branding to the layout services explicitly.\n // (NavigationService reads APP_META_CONFIG_TOKEN in its constructor,\n // but explicit push guarantees the signal is populated even if the\n // service was instantiated before providers were fully resolved.)\n if (config.navigation?.length) {\n navService.setMenuItems(config.navigation as any);\n }\n if (config.app?.name) {\n appConfigService.appName.set(config.app.name);\n }\n\n console.log('[AvoraMetaForge] Framework initialized successfully.');\n };\n}\n\n/**\n * Call this in app.config.ts to wire up AvoraMetaForge:\n *\n * provideAvoraMetaForge(APP_META)\n */\nexport function provideAvoraMetaForge(config: AppMeta): Provider[] {\n return [\n { provide: APP_META_CONFIG_TOKEN, useValue: config },\n {\n provide: APP_INITIALIZER,\n useFactory: initializeAvoraMetaForge,\n deps: [\n ComponentRegistryService,\n MetaRouterService,\n MetaApiService,\n MetaStateService,\n AuthService,\n ActionDispatcherService,\n ConditionEvaluatorService,\n PluginRegistryService,\n NavigationService,\n AppConfigService,\n APP_META_CONFIG_TOKEN\n ],\n multi: true\n }\n ];\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from './auth.service';\n\n/**\n * Functional auth guard (CanActivateFn).\n * - Checks if a valid (non-expired) token exists via AuthService.\n * - Stores the attempted URL for post-login redirect.\n * - Redirects unauthenticated users to /login.\n */\nexport const authGuard: CanActivateFn = (route, state) => {\n const authService = inject(AuthService);\n const router = inject(Router);\n\n if (authService.isAuthenticated()) {\n return true;\n }\n\n // Store the URL the user was trying to reach\n authService.storeRedirectUrl(state.url);\n return router.createUrlTree(['/login']);\n};\n","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { catchError, throwError } from 'rxjs';\nimport { AuthService } from './auth.service';\n\n/**\n * HTTP Interceptor — Bearer token injection + 401 global logout.\n */\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const authService = inject(AuthService);\n const token = authService.getToken();\n\n // Clone request and add auth header if token exists\n const authReq = token\n ? req.clone({ setHeaders: { Authorization: `Bearer ${token}` } })\n : req;\n\n return next(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n authService.logout();\n }\n return throwError(() => error);\n })\n );\n};\n","import { Injectable, signal, effect } from '@angular/core';\n\n/**\n * Manages runtime theming by toggling the `data-theme` attribute on the <body> element.\n * Allows switching brand skins without recompiling styles.\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n /** Currently active theme name */\n readonly currentTheme = signal<string>('default');\n\n /** Available theme names */\n readonly availableThemes: ReadonlyArray<{ name: string; label: string }> = [\n { name: 'default', label: 'Default' },\n { name: 'client-a', label: 'Client A (Blue)' },\n { name: 'client-b', label: 'Client B (Red)' },\n ];\n\n constructor() {\n // Sync theme signal to the DOM\n effect(() => {\n const theme = this.currentTheme();\n if (theme === 'default') {\n document.body.removeAttribute('data-theme');\n } else {\n document.body.setAttribute('data-theme', theme);\n }\n });\n\n // Restore persisted theme\n const saved = localStorage.getItem('app-theme');\n if (saved) {\n this.currentTheme.set(saved);\n }\n }\n\n /** Switch to a named theme */\n setTheme(themeName: string): void {\n this.currentTheme.set(themeName);\n localStorage.setItem('app-theme', themeName);\n }\n\n /** Cycle to the next theme */\n cycleTheme(): void {\n const themes = this.availableThemes;\n const idx = themes.findIndex(t => t.name === this.currentTheme());\n const next = themes[(idx + 1) % themes.length];\n this.setTheme(next.name);\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { NavItem, NavigationService } from '../../api/navigation.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { AppConfigService } from '../../../core/config/app-config.service';\n\n@Component({\n selector: 'app-sidebar',\n standalone: true,\n imports: [CommonModule, RouterLink, RouterLinkActive],\n template: `\n <div class=\"sidebar-container\" [class.collapsed]=\"config.sidebarCollapsed()\">\n <div class=\"sidebar-header\">\n <div class=\"logo\">\n <div class=\"logo-glow\">\n <svg viewBox=\"0 0 24 24\" class=\"logo-icon\">\n <path [attr.d]=\"iconRegistry.getIcon('dashboard')\"></path>\n </svg>\n </div>\n <span class=\"logo-text\">{{ config.appName() }}</span>\n </div>\n </div>\n\n <nav class=\"sidebar-nav\">\n @for (group of navigation.menuItems(); track group.label) {\n <div class=\"nav-group\">\n <h3 class=\"group-title\">{{ group.label }}</h3>\n <ul>\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: group.items }\"></ng-container>\n </ul>\n </div>\n }\n </nav>\n\n <ng-template #menuList let-listItems>\n @for (node of listItems; track node.label) {\n <li class=\"nav-item-wrapper\">\n <div\n class=\"nav-item\"\n [routerLink]=\"node.route ? node.route : null\"\n routerLinkActive=\"active\"\n [class.has-children]=\"node.children?.length\"\n (click)=\"toggleExpand(node)\"\n >\n <div class=\"nav-link-content\">\n @if (node.icon) {\n <svg viewBox=\"0 0 24 24\" class=\"nav-icon\">\n <path [attr.d]=\"iconRegistry.getIcon(node.icon)\"></path>\n </svg>\n }\n <span class=\"nav-label\">{{ node.label }}</span>\n </div>\n\n @if (node.badge) {\n <span class=\"badge\" [style.background]=\"'linear-gradient(135deg, ' + node.badgeColor + ', ' + node.badgeColor + '88)'\">\n {{ node.badge }}\n </span>\n }\n\n @if (node.children?.length) {\n <svg viewBox=\"0 0 24 24\" class=\"chevron\" [class.rotated]=\"expandedItems.has(node)\">\n <path [attr.d]=\"iconRegistry.getIcon('chevron-right')\"></path>\n </svg>\n }\n </div>\n\n @if (node.children?.length && expandedItems.has(node)) {\n <ul class=\"sub-menu\">\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: node.children }\"></ng-container>\n </ul>\n }\n </li>\n }\n </ng-template>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .sidebar-container {\n width: var(--sidebar-width, 260px);\n height: 100%;\n background: var(--app-sidebar-bg);\n backdrop-filter: blur(var(--glass-blur-heavy));\n -webkit-backdrop-filter: blur(var(--glass-blur-heavy));\n border-right: 1px solid var(--glass-border);\n display: flex;\n flex-direction: column;\n transition: width var(--transition-smooth);\n overflow: hidden;\n position: relative;\n }\n\n .sidebar-container::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 1px;\n height: 100%;\n background: linear-gradient(\n to bottom,\n transparent,\n var(--app-primary-light),\n transparent\n );\n pointer-events: none;\n }\n\n .sidebar-container.collapsed {\n width: 80px;\n }\n\n .sidebar-header {\n height: 68px;\n display: flex;\n align-items: center;\n padding: 0 20px;\n border-bottom: 1px solid var(--glass-border);\n }\n\n .logo {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 700;\n font-size: 1.25rem;\n color: var(--app-text);\n white-space: nowrap;\n }\n\n .logo-glow {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n background: linear-gradient(135deg, var(--app-primary), var(--app-accent));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 0 20px var(--app-glow);\n animation: pulseGlow 4s ease-in-out infinite;\n flex-shrink: 0;\n }\n\n .logo-icon {\n width: 20px;\n height: 20px;\n fill: white;\n }\n\n .sidebar-container.collapsed .logo-text {\n display: none;\n }\n\n .sidebar-nav {\n flex: 1;\n overflow-y: auto;\n padding: 16px 0;\n }\n\n .nav-group {\n margin-top: 28px;\n }\n\n .nav-group:first-child {\n margin-top: 0;\n }\n\n .group-title {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--app-text-muted);\n padding: 0 24px 8px;\n opacity: 0.6;\n }\n\n .sidebar-container.collapsed .group-title {\n display: none;\n }\n\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n .nav-item-wrapper {\n margin-bottom: 2px;\n padding: 0 10px;\n }\n\n .nav-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 44px;\n padding: 0 14px;\n border-radius: 10px;\n color: var(--app-sidebar-text);\n cursor: pointer;\n transition: all var(--transition-smooth);\n text-decoration: none;\n position: relative;\n }\n\n .nav-item:hover {\n background: var(--glass-bg-hover);\n color: var(--app-text);\n }\n\n .nav-item.active {\n background: linear-gradient(135deg,\n var(--app-primary-light),\n var(--app-accent-light)\n );\n color: var(--app-primary);\n box-shadow: 0 0 20px var(--app-glow);\n }\n\n .nav-item.active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n width: 3px;\n height: 20px;\n border-radius: 0 3px 3px 0;\n background: linear-gradient(to bottom, var(--app-primary), var(--app-accent));\n }\n\n .nav-item.active .nav-icon {\n filter: drop-shadow(0 0 6px var(--app-glow));\n }\n\n .nav-link-content {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .nav-icon {\n width: 20px;\n height: 20px;\n fill: currentColor;\n flex-shrink: 0;\n transition: all var(--transition-fast);\n }\n\n .sidebar-container.collapsed .nav-label,\n .sidebar-container.collapsed .chevron,\n .sidebar-container.collapsed .badge {\n display: none;\n }\n\n .chevron {\n width: 16px;\n height: 16px;\n fill: currentColor;\n transition: transform var(--transition-smooth);\n opacity: 0.5;\n }\n\n .chevron.rotated {\n transform: rotate(90deg);\n }\n\n .badge {\n font-size: 10px;\n padding: 2px 8px;\n border-radius: 10px;\n color: white;\n font-weight: 600;\n backdrop-filter: blur(8px);\n }\n\n .sub-menu {\n padding-left: 24px;\n margin-top: 4px;\n animation: fadeInUp 0.2s ease-out;\n }\n\n .sidebar-container.collapsed .sub-menu {\n display: none;\n }\n `]\n})\nexport class SidebarComponent {\n readonly config = inject(AppConfigService);\n readonly navigation = inject(NavigationService);\n readonly iconRegistry = inject(IconRegistryService);\n\n expandedItems = new Set<NavItem>();\n\n toggleExpand(item: NavItem): void {\n if (item.children?.length) {\n if (this.expandedItems.has(item)) {\n this.expandedItems.delete(item);\n } else {\n this.expandedItems.add(item);\n }\n }\n }\n}\n","import { Component, inject, signal } from '@angular/core';\n\nimport { AppConfigService } from '../../../core/config/app-config.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { ThemeService } from '../../../core/config/theme.service';\nimport { AuthService } from '../../../core/auth/auth.service';\n\n@Component({\n selector: 'app-navbar',\n standalone: true,\n imports: [],\n template: `\n <header class=\"navbar-container\">\n <div class=\"left-section\">\n <button class=\"icon-btn\" (click)=\"config.toggleSidebar()\" title=\"Toggle Sidebar\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('menu')\"></path>\n </svg>\n </button>\n\n <div class=\"search-box\">\n <svg viewBox=\"0 0 24 24\" class=\"search-icon\">\n <path [attr.d]=\"iconRegistry.getIcon('search')\"></path>\n </svg>\n <input type=\"text\" placeholder=\"Search anything...\">\n </div>\n </div>\n\n <div class=\"right-section\">\n <!-- Theme Switcher -->\n <button class=\"icon-btn theme-btn\" (click)=\"themeToggleOpen.set(!themeToggleOpen())\" title=\"Change Theme\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('palette')\"></path>\n </svg>\n\n @if (themeToggleOpen()) {\n <div class=\"dropdown theme-dropdown\">\n @for (theme of themeService.availableThemes; track theme.name) {\n <div\n class=\"dropdown-item\"\n [class.active]=\"themeService.currentTheme() === theme.name\"\n (click)=\"themeService.setTheme(theme.name); themeToggleOpen.set(false)\"\n >\n <span class=\"theme-dot\" [style.background]=\"getThemeColor(theme.name)\"></span>\n {{ theme.label }}\n </div>\n }\n </div>\n }\n </button>\n\n <!-- User Profile -->\n <div class=\"user-profile\" (click)=\"userMenuOpen.set(!userMenuOpen())\">\n <div class=\"user-info\">\n <span class=\"user-name\">{{ auth.user()?.name }}</span>\n <span class=\"user-role\">{{ auth.user()?.role }}</span>\n </div>\n <div class=\"avatar\">\n @if (auth.user()?.avatar) {\n <img [src]=\"auth.user()?.avatar\" [alt]=\"auth.user()?.name\">\n } @else {\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('person')\"></path>\n </svg>\n }\n </div>\n\n @if (userMenuOpen()) {\n <div class=\"dropdown user-dropdown\">\n <div class=\"dropdown-header\">\n <strong>{{ auth.user()?.name }}</strong>\n <span>{{ auth.user()?.email }}</span>\n </div>\n <div class=\"divider\"></div>\n <div class=\"dropdown-item\">Your Profile</div>\n <div class=\"dropdown-item\">Settings</div>\n <div class=\"divider\"></div>\n <div class=\"dropdown-item logout\" (click)=\"auth.logout()\">\n <svg viewBox=\"0 0 24 24\" class=\"logout-icon\">\n <path [attr.d]=\"iconRegistry.getIcon('logout')\"></path>\n </svg>\n Logout\n </div>\n </div>\n }\n </div>\n </div>\n </header>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n }\n\n .navbar-container {\n height: 68px;\n padding: 0 24px;\n background: var(--app-navbar-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n border-bottom: 1px solid var(--glass-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: sticky;\n top: 0;\n z-index: 100;\n }\n\n .left-section, .right-section {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .icon-btn {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--app-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--transition-smooth);\n position: relative;\n }\n\n .icon-btn:hover {\n background: var(--glass-bg-hover);\n border-color: var(--glass-border);\n color: var(--app-primary);\n box-shadow: 0 0 16px var(--app-glow);\n }\n\n .icon-btn svg {\n width: 22px;\n height: 22px;\n fill: currentColor;\n }\n\n .search-box {\n display: flex;\n align-items: center;\n background: var(--glass-bg);\n border: 1px solid var(--glass-border);\n border-radius: 10px;\n padding: 0 14px;\n width: 300px;\n height: 40px;\n transition: all var(--transition-smooth);\n }\n\n .search-box:focus-within {\n border-color: var(--app-primary);\n background: var(--glass-bg-hover);\n box-shadow: 0 0 20px var(--app-glow);\n }\n\n .search-icon {\n width: 18px;\n height: 18px;\n fill: var(--app-text-muted);\n flex-shrink: 0;\n transition: fill var(--transition-fast);\n }\n\n .search-box:focus-within .search-icon {\n fill: var(--app-primary);\n }\n\n .search-box input {\n border: none;\n background: transparent;\n padding: 8px;\n outline: none;\n flex: 1;\n font-size: 0.875rem;\n color: var(--app-text);\n }\n\n .search-box input::placeholder {\n color: var(--app-text-muted);\n }\n\n .user-profile {\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n padding: 4px 12px;\n border-radius: 12px;\n border: 1px solid transparent;\n transition: all var(--transition-smooth);\n position: relative;\n }\n\n .user-profile:hover {\n background: var(--glass-bg-hover);\n border-color: var(--glass-border);\n }\n\n .user-info {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n .user-name {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--app-text);\n }\n\n .user-role {\n font-size: 0.6875rem;\n color: var(--app-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .avatar {\n width: 38px;\n height: 38px;\n border-radius: 12px;\n background: linear-gradient(135deg, var(--app-primary), var(--app-accent));\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n transition: box-shadow var(--transition-smooth);\n }\n\n .user-profile:hover .avatar {\n box-shadow: 0 0 20px var(--app-glow);\n }\n\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar svg {\n width: 22px;\n height: 22px;\n fill: currentColor;\n }\n\n /* ── Dropdowns ── */\n .dropdown {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\n background: var(--app-bg-secondary);\n backdrop-filter: blur(var(--glass-blur-heavy));\n -webkit-backdrop-filter: blur(var(--glass-blur-heavy));\n border: 1px solid var(--glass-border-light);\n border-radius: 14px;\n box-shadow: var(--glass-shadow), 0 0 30px rgba(0,0,0,0.4);\n min-width: 220px;\n overflow: hidden;\n animation: slideInDown 0.25s ease-out;\n }\n\n .dropdown-header {\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n }\n\n .dropdown-header strong {\n color: var(--app-text);\n font-size: 0.9375rem;\n }\n\n .dropdown-header span {\n font-size: 0.75rem;\n color: var(--app-text-muted);\n margin-top: 2px;\n }\n\n .dropdown-item {\n padding: 10px 16px;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all var(--transition-fast);\n color: var(--app-text-muted);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .dropdown-item:hover {\n background: var(--glass-bg-hover);\n color: var(--app-primary);\n }\n\n .dropdown-item.active {\n background: var(--app-primary-light);\n color: var(--app-primary);\n font-weight: 600;\n }\n\n .theme-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .divider {\n height: 1px;\n background: var(--glass-border);\n margin: 4px 0;\n }\n\n .logout {\n color: #f43f5e !important;\n }\n\n .logout:hover {\n background: rgba(244, 63, 94, 0.1) !important;\n color: #fb7185 !important;\n }\n\n .logout-icon {\n width: 18px;\n height: 18px;\n fill: currentColor;\n }\n `]\n})\nexport class NavbarComponent {\n readonly config = inject(AppConfigService);\n readonly iconRegistry = inject(IconRegistryService);\n readonly themeService = inject(ThemeService);\n readonly auth = inject(AuthService);\n\n themeToggleOpen = signal(false);\n userMenuOpen = signal(false);\n\n getThemeColor(name: string): string {\n const colors: Record<string, string> = {\n 'default': '#06b6d4',\n 'client-a': '#3b82f6',\n 'client-b': '#f43f5e'\n };\n return colors[name] || '#06b6d4';\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { AppConfigService } from '../../../core/config/app-config.service';\n\n@Component({\n selector: 'app-footer',\n standalone: true,\n imports: [],\n template: `\n <footer class=\"footer-container\">\n <div class=\"footer-content\">\n <p class=\"copyright\">{{ config.copyrightText() }}</p>\n <div class=\"links\">\n <a href=\"#\">Terms</a>\n <a href=\"#\">Privacy</a>\n <a href=\"#\">Support</a>\n </div>\n </div>\n </footer>\n `,\n styles: [`\n .footer-container {\n height: 52px;\n padding: 0 28px;\n background: var(--app-navbar-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n border-top: 1px solid var(--glass-border);\n display: flex;\n align-items: center;\n margin-top: auto;\n position: relative;\n }\n\n .footer-container::before {\n content: '';\n position: absolute;\n top: 0;\n left: 10%;\n right: 10%;\n height: 1px;\n background: linear-gradient(\n to right,\n transparent,\n var(--app-primary-light),\n transparent\n );\n }\n\n .footer-content {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .copyright {\n font-size: 0.8125rem;\n color: var(--app-text-muted);\n opacity: 0.6;\n }\n\n .links {\n display: flex;\n gap: 20px;\n }\n\n .links a {\n font-size: 0.8125rem;\n color: var(--app-text-muted);\n text-decoration: none;\n transition: all var(--transition-fast);\n opacity: 0.6;\n }\n\n .links a:hover {\n color: var(--app-primary);\n opacity: 1;\n }\n `]\n})\nexport class FooterComponent {\n readonly config = inject(AppConfigService);\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\nimport { SidebarComponent } from '../../common/sidebar/sidebar.component';\nimport { NavbarComponent } from '../../common/navbar/navbar.component';\nimport { FooterComponent } from '../../common/footer/footer.component';\nimport { AppConfigService } from '../../../core/config/app-config.service';\n\n@Component({\n selector: 'app-vertical-layout',\n standalone: true,\n imports: [RouterOutlet, SidebarComponent, NavbarComponent, FooterComponent],\n template: `\n <div class=\"layout-wrapper\" [class.collapsed]=\"config.sidebarCollapsed()\">\n <!-- Animated Gradient Mesh Background -->\n <div class=\"gradient-mesh\" aria-hidden=\"true\">\n <div class=\"blob blob-1\"></div>\n <div class=\"blob blob-2\"></div>\n <div class=\"blob blob-3\"></div>\n </div>\n\n <!-- Sidebar -->\n <app-sidebar class=\"layout-sidebar\"></app-sidebar>\n\n <!-- Main Content Area -->\n <div class=\"layout-main\">\n <app-navbar></app-navbar>\n\n <main class=\"content-body\">\n <router-outlet></router-outlet>\n </main>\n\n <app-footer></app-footer>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100vh;\n width: 100%;\n }\n\n .layout-wrapper {\n display: flex;\n height: 100vh;\n overflow: hidden;\n background: var(--app-bg);\n position: relative;\n }\n\n /* ── Animated Gradient Mesh ── */\n .gradient-mesh {\n position: fixed;\n inset: 0;\n z-index: 0;\n overflow: hidden;\n pointer-events: none;\n }\n\n .blob {\n position: absolute;\n border-radius: 50%;\n filter: blur(80px);\n opacity: 0.35;\n will-change: transform;\n }\n\n .blob-1 {\n width: 500px;\n height: 500px;\n background: var(--app-gradient-1);\n top: -10%;\n right: -5%;\n animation: blobMove1 20s ease-in-out infinite;\n }\n\n .blob-2 {\n width: 400px;\n height: 400px;\n background: var(--app-gradient-2);\n bottom: -10%;\n left: 10%;\n animation: blobMove2 25s ease-in-out infinite;\n }\n\n .blob-3 {\n width: 350px;\n height: 350px;\n background: var(--app-gradient-3);\n top: 40%;\n left: 40%;\n animation: blobMove3 22s ease-in-out infinite;\n }\n\n /* ── Layout ── */\n .layout-sidebar {\n flex-shrink: 0;\n z-index: 100;\n position: relative;\n }\n\n .layout-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n position: relative;\n z-index: 1;\n transition: margin-left var(--transition-smooth);\n }\n\n .content-body {\n padding: 28px;\n flex: 1;\n max-width: 1600px;\n width: 100%;\n margin: 0 auto;\n animation: fadeInUp 0.4s ease-out;\n }\n `]\n})\nexport class VerticalLayoutComponent {\n readonly config = inject(AppConfigService);\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';\nimport { NavbarComponent } from '../../common/navbar/navbar.component';\nimport { FooterComponent } from '../../common/footer/footer.component';\nimport { NavigationService } from '../../api/navigation.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\n\n@Component({\n selector: 'app-horizontal-layout',\n standalone: true,\n imports: [RouterOutlet, NavbarComponent, FooterComponent, RouterLink, RouterLinkActive],\n template: `\n <div class=\"layout-wrapper\">\n <app-navbar>\n <!-- Horizontal Menu Injection (Conceptual - in a full app we'd use a dedicated component or slot) -->\n </app-navbar>\n\n <nav class=\"horizontal-nav\">\n <div class=\"nav-container\">\n <ul>\n @for (group of navigation.menuItems(); track group.label) {\n @for (item of group.items; track item.label) {\n <li class=\"nav-item\">\n <a [routerLink]=\"item.route\" routerLinkActive=\"active\" class=\"nav-link\">\n @if (item.icon) {\n <svg viewBox=\"0 0 24 24\" class=\"nav-icon\">\n <path [attr.d]=\"iconRegistry.getIcon(item.icon)\"></path>\n </svg>\n }\n {{ item.label }}\n </a>\n </li>\n }\n }\n </ul>\n </div>\n </nav>\n\n <main class=\"content-body\">\n <router-outlet></router-outlet>\n </main>\n\n <app-footer></app-footer>\n </div>\n `,\n styles: [`\n .layout-wrapper {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--app-bg, #f9fafb);\n }\n\n .horizontal-nav {\n background: var(--app-navbar-bg, #ffffff);\n border-bottom: 1px solid var(--app-border, #e5e7eb);\n height: 48px;\n }\n\n .nav-container {\n max-width: 1600px;\n margin: 0 auto;\n height: 100%;\n padding: 0 24px;\n }\n\n ul {\n display: flex;\n list-style: none;\n padding: 0;\n margin: 0;\n height: 100%;\n gap: 32px;\n }\n\n .nav-item {\n height: 100%;\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 100%;\n color: var(--app-text, #374151);\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n transition: all 0.2s;\n }\n\n .nav-link:hover {\n color: var(--app-primary, #3b82f6);\n }\n\n .nav-link.active {\n color: var(--app-primary, #3b82f6);\n border-bottom-color: var(--app-primary, #3b82f6);\n }\n\n .nav-icon {\n width: 18px;\n height: 18px;\n fill: currentColor;\n }\n\n .content-body {\n padding: 24px;\n flex: 1;\n max-width: 1600px;\n width: 100%;\n margin: 0 auto;\n }\n `]\n})\nexport class HorizontalLayoutComponent {\n readonly navigation = inject(NavigationService);\n readonly iconRegistry = inject(IconRegistryService);\n}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-empty-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"empty-layout-container\">\n <router-outlet></router-outlet>\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .empty-layout-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--app-bg, #f9fafb);\n color: var(--app-text, #111827);\n }\n `]\n})\nexport class EmptyLayoutComponent { }\n","import { Component, inject } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-centered-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"centered-container\">\n <div class=\"centered-content glass-panel\">\n <router-outlet></router-outlet>\n </div>\n </div>\n `,\n styles: [`\n .centered-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n background: var(--app-bg, #f9fafb);\n padding: 2rem;\n }\n .centered-content {\n width: 100%;\n max-width: 600px;\n padding: 2rem;\n border-radius: 1rem;\n }\n .glass-panel {\n background: var(--glass-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n border: 1px solid var(--glass-border);\n box-shadow: var(--glass-shadow);\n }\n `]\n})\nexport class CenteredLayoutComponent {}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-two-column-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"two-column-container\">\n <aside class=\"left-panel glass-panel\">\n <!-- Master list or secondary navigation ideally goes here -->\n <div class=\"placeholder-nav\">Navigation / List</div>\n </aside>\n <main class=\"right-panel\">\n <router-outlet></router-outlet>\n </main>\n </div>\n `,\n styles: [`\n .two-column-container {\n display: flex;\n min-height: 100vh;\n background: var(--app-bg);\n }\n .left-panel {\n width: 300px;\n flex-shrink: 0;\n border-right: 1px solid var(--glass-border);\n padding: 1rem;\n display: flex;\n flex-direction: column;\n }\n .right-panel {\n flex: 1;\n padding: 2rem;\n overflow-y: auto;\n }\n .glass-panel {\n background: var(--glass-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n }\n .placeholder-nav {\n color: var(--app-text-muted);\n font-size: 0.875rem;\n text-align: center;\n margin-top: 2rem;\n }\n `]\n})\nexport class TwoColumnLayoutComponent {}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-dashboard-grid-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"dashboard-grid-container\">\n <router-outlet></router-outlet>\n </div>\n `,\n styles: [`\n .dashboard-grid-container {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n gap: 1.5rem;\n padding: 2rem;\n min-height: 100vh;\n background: var(--app-bg);\n }\n /* Children will define their own gridColumn spans */\n `]\n})\nexport class DashboardGridLayoutComponent {}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-compact-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"compact-container\">\n <!-- Minimal or no header -->\n <main class=\"compact-content\">\n <router-outlet></router-outlet>\n </main>\n </div>\n `,\n styles: [`\n .compact-container {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--app-bg);\n }\n .compact-content {\n flex: 1;\n padding: 1rem;\n max-width: 100%;\n overflow-x: hidden;\n }\n `]\n})\nexport class CompactLayoutComponent {}\n","import { Component, inject } from '@angular/core';\n\nimport { NotificationService } from '../../../core/notifications/notification.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\n\n@Component({\n selector: 'app-notification-container',\n standalone: true,\n imports: [],\n template: `\n <div class=\"notification-wrapper\">\n @for (n of service.notifications(); track n.id) {\n <div class=\"toast\" [class]=\"n.type\" (click)=\"service.remove(n.id)\">\n <div class=\"toast-icon\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"getIcon(n.type)\"></path>\n </svg>\n </div>\n <div class=\"toast-content\">\n {{ n.message }}\n </div>\n <button class=\"toast-close\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('close')\"></path>\n </svg>\n </button>\n </div>\n }\n </div>\n `,\n styles: [`\n .notification-wrapper {\n position: fixed;\n top: 24px;\n right: 24px;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n gap: 12px;\n pointer-events: none;\n }\n\n .toast {\n pointer-events: auto;\n min-width: 300px;\n max-width: 450px;\n background: var(--app-surface, #ffffff);\n border-radius: 12px;\n padding: 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n border-left: 4px solid #e5e7eb;\n cursor: pointer;\n animation: slideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transition: all 0.2s;\n }\n\n .toast:hover {\n transform: translateY(-2px);\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n }\n\n .toast.success { border-left-color: #10b981; }\n .toast.error { border-left-color: #ef4444; }\n .toast.warning { border-left-color: #f59e0b; }\n .toast.info { border-left-color: #3b82f6; }\n\n .toast-icon {\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n }\n\n .toast.success .toast-icon { fill: #10b981; }\n .toast.error .toast-icon { fill: #ef4444; }\n .toast.warning .toast-icon { fill: #f59e0b; }\n .toast.info .toast-icon { fill: #3b82f6; }\n\n .toast-content {\n flex: 1;\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--app-text, #1f2937);\n line-height: 1.4;\n }\n\n .toast-close {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--app-text-muted, #6b7280);\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .toast-close:hover {\n opacity: 1;\n }\n\n .toast-close svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(100%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n `]\n})\nexport class NotificationContainerComponent {\n readonly service = inject(NotificationService);\n readonly iconRegistry = inject(IconRegistryService);\n\n getIcon(type: string): string {\n switch (type) {\n case 'success': return this.iconRegistry.getIcon('check-circle');\n case 'error': return this.iconRegistry.getIcon('error');\n case 'warning': return this.iconRegistry.getIcon('warning');\n default: return this.iconRegistry.getIcon('info');\n }\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { AppConfigService } from '../core/config/app-config.service';\nimport { LayoutType } from '../core/config/layout-type.enum';\nimport { VerticalLayoutComponent } from './layouts/vertical/vertical-layout.component';\nimport { HorizontalLayoutComponent } from './layouts/horizontal/horizontal-layout.component';\nimport { EmptyLayoutComponent } from './layouts/empty/empty-layout.component';\nimport { CenteredLayoutComponent } from './layouts/centered/centered-layout.component';\nimport { TwoColumnLayoutComponent } from './layouts/two-column/two-column-layout.component';\nimport { DashboardGridLayoutComponent } from './layouts/dashboard-grid/dashboard-grid-layout.component';\nimport { CompactLayoutComponent } from './layouts/compact/compact-layout.component';\nimport { NotificationContainerComponent } from './common/notifications/notification-container.component';\nimport { MetaModalHostComponent } from '../avora-meta-forge/core/components/meta-modal-host.component';\nimport { AmfDialogHostComponent } from '../avora-meta-forge/core/components/amf-dialog-host.component';\nimport { AmfDrawerHostComponent } from '../avora-meta-forge/core/components/amf-drawer-host.component';\n\n/**\n * The Root Renderer (Traffic Controller).\n * Decides which layout to load based on the currentLayout signal from AppConfigService.\n */\n@Component({\n selector: 'app-layout',\n standalone: true,\n imports: [\n VerticalLayoutComponent,\n HorizontalLayoutComponent,\n EmptyLayoutComponent,\n CenteredLayoutComponent,\n TwoColumnLayoutComponent,\n DashboardGridLayoutComponent,\n CompactLayoutComponent,\n NotificationContainerComponent,\n MetaModalHostComponent,\n AmfDialogHostComponent,\n AmfDrawerHostComponent\n],\n template: `\n <app-notification-container></app-notification-container>\n <amf-modal-host></amf-modal-host>\n <amf-dialog-host></amf-dialog-host>\n <amf-drawer-host></amf-drawer-host>\n @switch (config.currentLayout()) {\n @case (LayoutType.VERTICAL) {\n <app-vertical-layout></app-vertical-layout>\n }\n @case (LayoutType.HORIZONTAL) {\n <app-horizontal-layout></app-horizontal-layout>\n }\n @case (LayoutType.EMPTY) {\n <app-empty-layout></app-empty-layout>\n }\n @case (LayoutType.CENTERED) {\n <app-centered-layout></app-centered-layout>\n }\n @case (LayoutType.TWO_COLUMN) {\n <app-two-column-layout></app-two-column-layout>\n }\n @case (LayoutType.DASHBOARD_GRID) {\n <app-dashboard-grid-layout></app-dashboard-grid-layout>\n }\n @case (LayoutType.COMPACT) {\n <app-compact-layout></app-compact-layout>\n }\n @default {\n <app-vertical-layout></app-vertical-layout>\n }\n }\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n `]\n})\nexport class LayoutComponent {\n readonly config = inject(AppConfigService);\n readonly LayoutType = LayoutType;\n}\n","/**\n * AvoraMetaForge — Public API Surface\n *\n * This is the single entry point for all consumers of the @avora/meta-forge library.\n * Import from this path to use the framework in any Angular application.\n */\n\n// ─── Engine: Models (all meta-type interfaces) ───────────────────────────────\nexport * from './lib/avora-meta-forge/models/meta.types';\n\n// ─── Engine: Core Services ────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/core/action-dispatcher.service';\nexport * from './lib/avora-meta-forge/core/condition-evaluator.service';\nexport * from './lib/avora-meta-forge/core/component-registry.service';\nexport * from './lib/avora-meta-forge/core/meta-router.service';\nexport * from './lib/avora-meta-forge/core/meta-section.interface';\nexport * from './lib/avora-meta-forge/core/meta-guard';\nexport * from './lib/avora-meta-forge/core/amf.routes';\n\n// ─── Engine: Core Components ─────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/core/meta-renderer.component';\nexport * from './lib/avora-meta-forge/core/meta-page.component';\nexport * from './lib/avora-meta-forge/core/components/accordion-section.component';\nexport * from './lib/avora-meta-forge/core/components/meta-modal-host.component';\nexport * from './lib/avora-meta-forge/core/components/amf-dialog-host.component';\nexport * from './lib/avora-meta-forge/core/components/amf-drawer-host.component';\n\n// ─── Engine: Services ────────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/services/meta-api.service';\nexport * from './lib/avora-meta-forge/services/meta-state.service';\n// AuthService is exported via the Core: Auth block below\n\n// ─── Engine: Plugins ─────────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/plugins/plugin-registry.service';\n\n// ─── Engine: Renderers ───────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/renderers/form/form-renderer.component';\nexport * from './lib/avora-meta-forge/renderers/form/stepper-form-renderer.component';\nexport * from './lib/avora-meta-forge/renderers/form/repeater-field.component';\nexport * from './lib/avora-meta-forge/renderers/table/table-renderer.component';\nexport * from './lib/avora-meta-forge/renderers/card/card-section.component';\nexport * from './lib/avora-meta-forge/renderers/stats-grid/stats-grid-section.component';\nexport * from './lib/avora-meta-forge/renderers/page-header/page-header-section.component';\n\n// ─── Engine: Provider (bootstrap) ────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/avora-meta-forge.provider';\n\n// ─── Core: Auth ──────────────────────────────────────────────────────────────\nexport * from './lib/core/auth/auth.service';\nexport * from './lib/core/auth/auth.guard';\nexport * from './lib/core/auth/auth.interceptor';\n\n// ─── Core: Config ────────────────────────────────────────────────────────────\nexport * from './lib/core/config/app-config.service';\nexport * from './lib/core/config/layout-type.enum';\nexport * from './lib/core/config/theme.service';\n\n// ─── Core: Notifications ─────────────────────────────────────────────────────\nexport * from './lib/core/notifications/notification.service';\n\n// ─── Layout Shell ────────────────────────────────────────────────────────────\nexport * from './lib/layout/layout.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["rxTimeout","rxRetry","i1","i3","catchError"],"mappings":"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"}
1
+ {"version":3,"file":"avora-labs-meta-forge.mjs","sources":["../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/action.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/condition.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/guard.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/api.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/layout.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/form.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/table.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/section.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/page.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/plugin.meta.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/models/meta.types.ts","../../../projects/avora-meta-forge/src/lib/core/notifications/notification.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/services/meta-state.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/services/meta-api.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/condition-evaluator.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/services/amf-dialog.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/action-dispatcher.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/component-registry.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-page.component.ts","../../../projects/avora-meta-forge/src/lib/core/auth/auth.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/plugins/plugin-registry.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-guard.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-router.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/meta-section.interface.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/amf.routes.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/accordion-section.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/meta-modal-host.component.ts","../../../projects/avora-meta-forge/src/lib/core/icons/icon-registry.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/amf-dialog-host.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/core/components/amf-drawer-host.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/validator-factory.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/repeater-field.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/field-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/form-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/form/stepper-form-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/table/cell-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/table/table-renderer.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/card/card-section.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/stats-grid/stats-grid-section.component.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/renderers/page-header/page-header-section.component.ts","../../../projects/avora-meta-forge/src/lib/layout/api/navigation.service.ts","../../../projects/avora-meta-forge/src/lib/core/config/layout-type.enum.ts","../../../projects/avora-meta-forge/src/lib/core/config/app-config.service.ts","../../../projects/avora-meta-forge/src/lib/avora-meta-forge/avora-meta-forge.provider.ts","../../../projects/avora-meta-forge/src/lib/core/auth/auth.guard.ts","../../../projects/avora-meta-forge/src/lib/core/auth/auth.interceptor.ts","../../../projects/avora-meta-forge/src/lib/core/config/theme.types.ts","../../../projects/avora-meta-forge/src/lib/core/config/theme.service.ts","../../../projects/avora-meta-forge/src/lib/layout/common/sidebar/sidebar.component.ts","../../../projects/avora-meta-forge/src/lib/layout/common/navbar/navbar.component.ts","../../../projects/avora-meta-forge/src/lib/layout/common/footer/footer.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/vertical/vertical-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/horizontal/horizontal-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/empty/empty-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/centered/centered-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/two-column/two-column-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/dashboard-grid/dashboard-grid-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layouts/compact/compact-layout.component.ts","../../../projects/avora-meta-forge/src/lib/layout/common/notifications/notification-container.component.ts","../../../projects/avora-meta-forge/src/lib/layout/common/theme-customizer/theme-customizer.component.ts","../../../projects/avora-meta-forge/src/lib/layout/layout.component.ts","../../../projects/avora-meta-forge/src/public-api.ts","../../../projects/avora-meta-forge/src/avora-labs-meta-forge.ts"],"sourcesContent":["/**\n * AvoraMetaForge — Action Metadata\n *\n * Comprehensive action system supporting 25+ action types covering:\n * - Navigation, API calls, UI state, modals/drawers\n * - Form manipulation, table control, clipboard, downloads\n * - State management, storage, conditional branching, scripting\n * - Parallel dispatch, delay, logging, context transforms\n */\n\n/** HTTP methods — all standard methods supported */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\n/** All built-in action types */\nexport type ActionType =\n | 'navigate' // Route navigation\n | 'api' // HTTP API call\n | 'notify' // Toast / snackbar notification\n | 'emit' // Event bus emission\n | 'confirm' // Confirmation dialog with branching\n | 'open-modal' // Open a modal/dialog\n | 'close-modal' // Close modal/dialog\n | 'open-drawer' // Open side drawer\n | 'close-drawer' // Close side drawer\n | 'set-state' // Write to reactive state store\n | 'clear-state' // Remove key from state store\n | 'reset-form' // Reset a specific form\n | 'patch-form' // Update form field values\n | 'submit-form' // Programmatically submit a form\n | 'reload-table' // Refresh a table's data\n | 'scroll-to' // Scroll to element or position\n | 'set-loading' // Show loading spinner\n | 'clear-loading' // Hide loading spinner\n | 'download-file' // Trigger file download (blob)\n | 'copy-to-clipboard' // Copy text to clipboard\n | 'open-url' // Open external URL (new tab / same tab)\n | 'set-storage' // Write to localStorage / sessionStorage\n | 'remove-storage' // Remove from localStorage / sessionStorage\n | 'dispatch-multiple' // Fan-out to multiple actions (parallel / sequential)\n | 'delay' // Pause execution chain\n | 'conditional' // Evaluate condition and branch\n | 'for-each' // Iterate and dispatch per item\n | 'transform-context' // Reshape context before passing to next action\n | 'log' // Console log for debugging action chains\n | 'print' // Print page or element\n | 'focus' // Focus an input element\n | 'blur' // Blur (unfocus) an input element\n | 'toggle-class' // Add/remove CSS class on element\n | 'set-title' // Change page title dynamically\n | 'go-back' // Browser history back\n | 'go-forward' // Browser history forward\n | 'reload-page' // Full page reload\n | 'store-data' // Legacy demo store\n | 'custom'; // Escape hatch for user-defined actions\n\n/**\n * Represents a declarative action that the framework can execute.\n * Actions are chainable via `then` and `onError`, and can fan-out via `dispatch-multiple`.\n */\nexport interface ActionMeta {\n /** The action type — built-in or custom string */\n type: ActionType | string;\n\n /** Configuration object — shape depends on `type` */\n config: NavigateActionConfig\n | ApiActionConfig\n | NotifyActionConfig\n | EmitActionConfig\n | ConfirmActionConfig\n | ModalActionConfig\n | DrawerActionConfig\n | SetStateActionConfig\n | ClearStateActionConfig\n | ResetFormActionConfig\n | PatchFormActionConfig\n | SubmitFormActionConfig\n | ReloadTableActionConfig\n | ScrollToActionConfig\n | LoadingActionConfig\n | DownloadFileActionConfig\n | CopyToClipboardActionConfig\n | OpenUrlActionConfig\n | StorageActionConfig\n | DispatchMultipleActionConfig\n | DelayActionConfig\n | ConditionalActionConfig\n | ForEachActionConfig\n | TransformContextActionConfig\n | LogActionConfig\n | PrintActionConfig\n | FocusActionConfig\n | ToggleClassActionConfig\n | SetTitleActionConfig\n | Record<string, any>;\n\n /** Action to execute after this one succeeds */\n then?: ActionMeta;\n\n /** Action to execute if this one fails */\n onError?: ActionMeta;\n\n /** Human-readable description for devtools / debugging */\n description?: string;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Navigation\n// ──────────────────────────────────────────────────────────────\nexport interface NavigateActionConfig {\n path: string;\n params?: Record<string, string>;\n queryParams?: Record<string, string>;\n replaceUrl?: boolean;\n fragment?: string;\n relativeTo?: boolean;\n skipLocationChange?: boolean;\n /** Pass state data via navigation extras */\n state?: Record<string, any>;\n}\n\n// ──────────────────────────────────────────────────────────────\n// API\n// ──────────────────────────────────────────────────────────────\nexport interface ApiActionConfig {\n /** Reference to registered endpoint by ID */\n endpointId?: string;\n /** Inline URL (alternative to endpointId) */\n url?: string;\n method?: HttpMethod;\n body?: Record<string, any> | string | 'formValue';\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n pathParams?: Record<string, string>;\n /** Response type control */\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n /** Store response in context under this key */\n storeResultAs?: string;\n /** Store response in MetaStateService under this key */\n storeInState?: string;\n /** Map status codes to error actions */\n errorMap?: Record<number, ActionMeta>;\n /** Use mock data instead of live call */\n mock?: boolean;\n mockData?: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Notifications\n// ──────────────────────────────────────────────────────────────\nexport interface NotifyActionConfig {\n type: 'success' | 'error' | 'warning' | 'info';\n message: string;\n title?: string;\n duration?: number;\n dismissible?: boolean;\n /** Action to run when notification is clicked */\n onClick?: ActionMeta;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Event Bus\n// ──────────────────────────────────────────────────────────────\nexport interface EmitActionConfig {\n event: string;\n payload?: any;\n /** Whether to include current context as payload automatically */\n includeContext?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Confirmation Dialog\n// ──────────────────────────────────────────────────────────────\nexport interface ConfirmActionConfig {\n title?: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: 'info' | 'warning' | 'danger';\n onConfirm: ActionMeta;\n onCancel?: ActionMeta;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Modal / Drawer\n// ──────────────────────────────────────────────────────────────\nexport interface ModalActionConfig {\n modalId?: string;\n title?: string;\n /** Section to render inside the modal */\n section?: import('./section.meta').SectionMeta;\n /** Custom component key to render */\n componentKey?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n closable?: boolean;\n data?: Record<string, any>;\n onClose?: ActionMeta;\n}\n\nexport interface DrawerActionConfig {\n drawerId?: string;\n title?: string;\n section?: import('./section.meta').SectionMeta;\n componentKey?: string;\n position?: 'left' | 'right';\n width?: string;\n closable?: boolean;\n data?: Record<string, any>;\n onClose?: ActionMeta;\n}\n\n// ──────────────────────────────────────────────────────────────\n// State Management\n// ──────────────────────────────────────────────────────────────\nexport interface SetStateActionConfig {\n key: string;\n /** Value to set — can be literal or 'fromContext:path.to.value' */\n value: any;\n /** Merge with existing value (for objects) instead of replacing */\n merge?: boolean;\n /** Persist to localStorage */\n persist?: boolean;\n}\n\nexport interface ClearStateActionConfig {\n key: string;\n /** Clear from persistence too */\n clearPersisted?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Form Manipulation\n// ──────────────────────────────────────────────────────────────\nexport interface ResetFormActionConfig {\n /** ID of the form to reset — matches SectionMeta id or form container */\n formId?: string;\n /** Reset to initial values instead of empty */\n toInitialValues?: boolean;\n}\n\nexport interface PatchFormActionConfig {\n formId?: string;\n /** Key-value pairs to patch into the form */\n values: Record<string, any>;\n /** If true, values come from state store keys */\n fromState?: boolean;\n}\n\nexport interface SubmitFormActionConfig {\n formId?: string;\n /** Force submit even if invalid */\n force?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Table Control\n// ──────────────────────────────────────────────────────────────\nexport interface ReloadTableActionConfig {\n tableId?: string;\n /** Reset page to 1 on reload */\n resetPage?: boolean;\n /** Clear search/filter on reload */\n clearFilters?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Scroll / Focus / UI\n// ──────────────────────────────────────────────────────────────\nexport interface ScrollToActionConfig {\n /** CSS selector or element ID */\n target?: string;\n /** Pixel offset from top */\n top?: number;\n behavior?: 'smooth' | 'instant' | 'auto';\n block?: 'start' | 'center' | 'end' | 'nearest';\n}\n\nexport interface LoadingActionConfig {\n /** Loading key (allows multiple concurrent loaders) */\n key?: string;\n message?: string;\n}\n\nexport interface FocusActionConfig {\n /** CSS selector or element ID */\n target: string;\n}\n\nexport interface ToggleClassActionConfig {\n /** CSS selector or element ID */\n target: string;\n className: string;\n action: 'add' | 'remove' | 'toggle';\n}\n\nexport interface SetTitleActionConfig {\n title: string;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Download / Clipboard / URL\n// ──────────────────────────────────────────────────────────────\nexport interface DownloadFileActionConfig {\n /** URL to download from */\n url?: string;\n /** Endpoint ID to call (returns blob) */\n endpointId?: string;\n /** Filename for the downloaded file */\n filename?: string;\n /** MIME type hint */\n mimeType?: string;\n /** Content to download as string (for generated files) */\n content?: string;\n}\n\nexport interface CopyToClipboardActionConfig {\n /** Literal text, or 'fromContext:path.to.value' to extract from context */\n text: string;\n /** Notification on success */\n successMessage?: string;\n}\n\nexport interface OpenUrlActionConfig {\n url: string;\n target?: '_blank' | '_self' | '_parent' | '_top';\n features?: string; // window.open features string\n}\n\n// ──────────────────────────────────────────────────────────────\n// Storage (localStorage / sessionStorage)\n// ──────────────────────────────────────────────────────────────\nexport interface StorageActionConfig {\n storage: 'local' | 'session';\n key: string;\n /** Value to store. 'fromContext:path' to extract from context */\n value?: any;\n /** For remove-storage, no value needed */\n}\n\n// ──────────────────────────────────────────────────────────────\n// Flow Control\n// ──────────────────────────────────────────────────────────────\nexport interface DispatchMultipleActionConfig {\n actions: ActionMeta[];\n /** Run in parallel or sequentially */\n mode?: 'parallel' | 'sequential';\n /** Stop on first error (sequential mode only) */\n stopOnError?: boolean;\n}\n\nexport interface DelayActionConfig {\n /** Delay in milliseconds */\n duration: number;\n}\n\nexport interface ConditionalActionConfig {\n condition: import('./condition.meta').ConditionMeta;\n onTrue: ActionMeta;\n onFalse?: ActionMeta;\n}\n\nexport interface ForEachActionConfig {\n /** Path in context to the array to iterate */\n items: string;\n /** Action to dispatch per item. Item is available as context.item */\n action: ActionMeta;\n /** Run in parallel or sequentially */\n mode?: 'parallel' | 'sequential';\n}\n\nexport interface TransformContextActionConfig {\n /** Map of new context keys to source paths */\n map: Record<string, string>;\n /** If true, merge with existing context. If false, replace */\n merge?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Debug / Print\n// ──────────────────────────────────────────────────────────────\nexport interface LogActionConfig {\n level?: 'log' | 'info' | 'warn' | 'error' | 'debug';\n message?: string;\n /** Log the full context */\n logContext?: boolean;\n /** Specific path in context to log */\n path?: string;\n}\n\nexport interface PrintActionConfig {\n /** CSS selector to print. If omitted, prints whole page */\n target?: string;\n title?: string;\n}\n","/**\n * AvoraMetaForge — Condition Metadata\n *\n * Extended condition system supporting:\n * - 20+ comparison operators\n * - Logical grouping (and/or/negate)\n * - State store references\n * - Custom evaluator functions\n * - Date comparisons\n * - Array operations\n * - Type checking\n */\n\nexport type ConditionOperator =\n | '==' | '!=' | '===' | '!==' | '>' | '>=' | '<' | '<='\n | 'in' | 'notIn' | 'contains' | 'startsWith' | 'endsWith'\n | 'truthy' | 'falsy' | 'empty' | 'notEmpty'\n | 'regex'\n // --- NEW operators ---\n | 'between' // value >= min && value <= max\n | 'notBetween' // value < min || value > max\n | 'hasKey' // object has key\n | 'isArray' // value is an array\n | 'isObject' // value is an object\n | 'isString' // value is a string\n | 'isNumber' // value is a number\n | 'isNull' // value is null or undefined\n | 'isNotNull' // value is not null/undefined\n | 'lengthEquals' // array/string length equals value\n | 'lengthGreaterThan' // array/string length > value\n | 'lengthLessThan' // array/string length < value\n | 'dateBefore' // date comparison\n | 'dateAfter' // date comparison\n | 'dateEquals' // date comparison (same day)\n | 'arrayContains' // array includes value\n | 'arrayNotContains' // array does not include value\n | 'matchesAny' // matches any value in array\n | 'matchesAll' // matches all values in array\n | 'custom';\n\nexport interface ConditionMeta {\n /** Field path to evaluate (dot notation for nested, e.g., 'user.role') */\n field?: string;\n\n /** Comparison operator */\n operator: ConditionOperator;\n\n /** Value to compare against. Arrays for 'in', 'between', etc. */\n value?: any;\n\n /** Logical AND — all conditions must be true */\n and?: ConditionMeta[];\n\n /** Logical OR — at least one condition must be true */\n or?: ConditionMeta[];\n\n /** Negate the result */\n negate?: boolean;\n\n /** Custom evaluator function key */\n custom?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Source\n // ──────────────────────────────────────────────────────────────\n /** Source of the field value */\n source?: 'context' | 'state' | 'route' | 'form' | 'storage';\n\n /** For 'between' operator: [min, max] */\n range?: [any, any];\n\n /** Case-insensitive comparison for string operators */\n caseInsensitive?: boolean;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n","/**\n * AvoraMetaForge — Guard & Resolver Metadata\n *\n * Extended with:\n * - canDeactivate support\n * - Token refresh hints\n * - Per-endpoint auth override\n * - Permission-based guards\n * - IP/geo restrictions\n * - Time-based access\n */\n\nimport { ConditionMeta } from './condition.meta';\nimport { ActionMeta } from './action.meta';\n\nexport interface GuardMeta {\n /** Require authentication */\n requireAuth?: boolean;\n\n /** Required roles (user must have at least one) */\n roles?: string[];\n\n /** Required permissions (user must have ALL) */\n permissions?: string[];\n\n /** Redirect path when guard fails */\n redirectTo?: string;\n\n /** Custom guard function key */\n custom?: string;\n\n // ──────────────────────────────────────────────────────────────\n // NEW\n // ──────────────────────────────────────────────────────────────\n /** Condition-based guard */\n condition?: ConditionMeta;\n\n /** Action to dispatch on guard failure (alternative to redirect) */\n onFail?: ActionMeta;\n\n /** Show a notification on guard failure */\n failMessage?: string;\n\n /** Can deactivate guard (show unsaved changes warning) */\n canDeactivate?: boolean;\n\n /** Custom deactivation message */\n deactivateMessage?: string;\n\n /** Feature flag key — page accessible only if flag is on */\n featureFlag?: string;\n\n /** Time-based access window */\n accessWindow?: {\n from?: string; // ISO date or time\n to?: string;\n timezone?: string;\n };\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface ResolverMeta {\n /** Data source */\n source: 'api' | 'static' | 'state' | 'custom';\n\n /** API endpoint ID to resolve from */\n endpointId?: string;\n\n /** Direct URL (alternative to endpointId) */\n url?: string;\n\n /** Params to pass (supports :param references from route) */\n params?: Record<string, string>;\n\n /** Static data to resolve */\n staticData?: any;\n\n /** State key to read from MetaStateService */\n stateKey?: string;\n\n /** Custom resolver function key */\n custom?: string;\n\n /** Transform the resolved data */\n transform?: {\n root?: string;\n map?: Record<string, string>;\n };\n\n /** Key to store resolved data under in route data */\n key?: string;\n\n /** Show loading indicator while resolving */\n showLoading?: boolean;\n\n /** Action on resolve failure */\n onError?: ActionMeta;\n\n /** Catch-all */\n [key: string]: any;\n}\n","/**\n * AvoraMetaForge — API Metadata\n *\n * Comprehensive API endpoint configuration supporting:\n * - All HTTP methods (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)\n * - Auth strategies (Bearer, Basic, API Key, custom)\n * - Response transforms, caching, retry with exponential backoff\n * - Mock mode for development/testing without a backend\n * - Timeout, abort, response type control\n * - Status code → action error mapping\n * - Environment-based base URL overrides\n * - File upload (multipart/form-data) support\n * - Pagination hints for server-side pagination\n */\n\nimport { HttpMethod, ActionMeta } from './action.meta';\n\nexport interface ApiEndpointMeta {\n /** Unique identifier for this endpoint */\n id: string;\n\n /** Base URL (e.g., 'https://api.example.com'). Can be overridden by environment config */\n baseUrl?: string;\n\n /** Path template (e.g., '/users/:id/posts'). Supports :param placeholders */\n path: string;\n\n /** HTTP method */\n method: HttpMethod;\n\n /** Static headers merged with default headers */\n headers?: Record<string, string>;\n\n /** Static path/query params merged with dynamic params */\n params?: Record<string, string>;\n\n /** Static request body — can be overridden dynamically */\n body?: Record<string, any> | string;\n\n /** Response transform pipeline */\n transform?: TransformMeta;\n\n /** Response caching configuration */\n cache?: CacheMeta;\n\n /** Retry configuration */\n retry?: RetryMeta;\n\n /** Custom error handler key */\n errorHandler?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Auth Configuration\n // ──────────────────────────────────────────────────────────────\n /** Authentication strategy for this endpoint */\n auth?: ApiAuthMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Request Configuration\n // ──────────────────────────────────────────────────────────────\n /** Timeout in milliseconds. 0 = no timeout */\n timeout?: number;\n\n /** Content type override. Default: 'application/json' */\n contentType?: 'application/json' | 'multipart/form-data' | 'application/x-www-form-urlencoded' | 'text/plain' | string;\n\n /** Expected response type */\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n\n /** If true, show loading indicator during this call */\n showLoading?: boolean;\n\n /** Loading message to display */\n loadingMessage?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Error Handling\n // ──────────────────────────────────────────────────────────────\n /** Map HTTP status codes to specific actions */\n errorMap?: Record<number, ActionMeta>;\n\n /** Default error notification message */\n errorMessage?: string;\n\n /** Suppress automatic error notifications */\n silentErrors?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Mock / Dev Mode\n // ──────────────────────────────────────────────────────────────\n /** If true, return mockData without making a real HTTP call */\n mock?: boolean;\n\n /** Static data to return in mock mode */\n mockData?: any;\n\n /** Simulated delay (ms) in mock mode */\n mockDelay?: number;\n\n /** Simulated error in mock mode */\n mockError?: { status: number; message: string };\n\n // ──────────────────────────────────────────────────────────────\n // Server-Side Pagination\n // ──────────────────────────────────────────────────────────────\n /** Pagination configuration for server-side pagination */\n pagination?: ApiPaginationMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Environment\n // ──────────────────────────────────────────────────────────────\n /** Environment key to resolve baseUrl from config (e.g., 'production', 'staging') */\n environment?: string;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Auth\n// ──────────────────────────────────────────────────────────────\nexport interface ApiAuthMeta {\n /** Auth strategy */\n type: 'bearer' | 'basic' | 'apiKey' | 'custom' | 'none';\n\n /** For bearer: the token string or state key (e.g., 'state:auth.token') */\n token?: string;\n\n /** For basic: username */\n username?: string;\n\n /** For basic: password */\n password?: string;\n\n /** For apiKey: header name (e.g., 'X-API-Key') */\n headerName?: string;\n\n /** For apiKey: the key value or state key */\n apiKey?: string;\n\n /** For custom: header name and value */\n customHeader?: { name: string; value: string };\n\n /** Whether to skip auth for this specific endpoint (override global) */\n skip?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Transform\n// ──────────────────────────────────────────────────────────────\nexport interface TransformMeta {\n /** Dot-notation path to unwrap (e.g., 'data.results') */\n root?: string;\n\n /** Map response keys (target ← source). Applied per item if array */\n map?: Record<string, string>;\n\n /** Custom transform function key */\n custom?: string;\n\n /** Flatten nested objects */\n flatten?: boolean;\n\n /** Pick only these keys from the response */\n pick?: string[];\n\n /** Omit these keys from the response */\n omit?: string[];\n\n /** Sort the response array */\n sort?: { key: string; direction?: 'asc' | 'desc' };\n}\n\n// ──────────────────────────────────────────────────────────────\n// Cache\n// ──────────────────────────────────────────────────────────────\nexport interface CacheMeta {\n /** Enable caching for this endpoint */\n enabled: boolean;\n\n /** Time-to-live in milliseconds */\n ttl?: number;\n\n /** Custom cache key. If omitted, auto-generated from URL + params */\n key?: string;\n\n /** Cache storage: memory (default), sessionStorage, localStorage */\n storage?: 'memory' | 'session' | 'local';\n\n /** If true, return stale data while revalidating (SWR pattern) */\n staleWhileRevalidate?: boolean;\n\n /** Invalidate cache when these endpoint IDs are called successfully */\n invalidateOn?: string[];\n}\n\n// ──────────────────────────────────────────────────────────────\n// Retry\n// ──────────────────────────────────────────────────────────────\nexport interface RetryMeta {\n /** Maximum number of retry attempts */\n maxRetries: number;\n\n /** Initial delay between retries (ms) */\n delay?: number;\n\n /** Use exponential backoff */\n exponential?: boolean;\n\n /** Only retry on these HTTP status codes */\n retryOn?: number[];\n\n /** Do NOT retry on these status codes */\n skipOn?: number[];\n\n /** Maximum total delay cap (ms) */\n maxDelay?: number;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Server-Side Pagination\n// ──────────────────────────────────────────────────────────────\nexport interface ApiPaginationMeta {\n /** Query param name for page number */\n pageParam?: string;\n\n /** Query param name for page size */\n sizeParam?: string;\n\n /** Query param name for sort field */\n sortParam?: string;\n\n /** Query param name for sort direction */\n directionParam?: string;\n\n /** Query param name for search term */\n searchParam?: string;\n\n /** Path in response to the data array */\n dataPath?: string;\n\n /** Path in response to total count */\n totalPath?: string;\n\n /** Path in response to total pages */\n totalPagesPath?: string;\n}\n","/**\n * AvoraMetaForge — Layout Metadata\n *\n * Extended with new layout types and environment/theme configuration.\n */\n\nimport { ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport type LayoutTypeKey =\n | 'vertical' | 'horizontal' | 'empty'\n | 'centered' | 'two-column' | 'dashboard-grid' | 'compact'\n // --- NEW layout types ---\n | 'sidebar-left' // Fixed sidebar on left\n | 'sidebar-right' // Fixed sidebar on right\n | 'split' // 50/50 split view\n | 'stacked' // Full-width stacked\n | 'masonry' // Masonry grid\n | 'holy-grail'; // Header + sidebar + content + sidebar + footer\n\nexport interface AppMeta {\n app: AppBrandingMeta;\n navigation: NavGroupMeta[];\n pages: import('./page.meta').PageMeta[];\n apis?: import('./api.meta').ApiEndpointMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Environment & Config\n // ──────────────────────────────────────────────────────────────\n /** Environment-based base URL mapping */\n environments?: Record<string, EnvironmentConfig>;\n\n /** Current active environment */\n activeEnvironment?: string;\n\n /** Global default headers for all API calls */\n defaultHeaders?: Record<string, string>;\n\n /** Global auth configuration */\n auth?: GlobalAuthMeta;\n\n /** Enable devtools overlay */\n devtools?: boolean;\n\n /** Global loading indicator configuration */\n loading?: {\n type?: 'spinner' | 'bar' | 'skeleton';\n color?: string;\n delay?: number;\n };\n\n /** Global error handler action */\n onError?: ActionMeta;\n\n /** Plugin configurations */\n plugins?: import('./plugin.meta').AvoraMetaForgePlugin[];\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface EnvironmentConfig {\n /** Base URL for API calls */\n baseUrl: string;\n /** Debug mode */\n debug?: boolean;\n /** Force mock mode for all endpoints */\n mockAll?: boolean;\n /** Additional config */\n [key: string]: any;\n}\n\nexport interface GlobalAuthMeta {\n /** Auth provider type */\n type: 'jwt' | 'oauth2' | 'session' | 'apiKey' | 'custom';\n /** Login endpoint ID */\n loginEndpoint?: string;\n /** Token refresh endpoint ID */\n refreshEndpoint?: string;\n /** Logout endpoint ID */\n logoutEndpoint?: string;\n /** Token storage location */\n tokenStorage?: 'localStorage' | 'sessionStorage' | 'memory';\n /** Token key in storage */\n tokenKey?: string;\n /** Refresh token key in storage */\n refreshTokenKey?: string;\n /** Auto-refresh token before expiry */\n autoRefresh?: boolean;\n /** Login redirect path */\n loginRedirect?: string;\n /** After-login default path */\n afterLoginRedirect?: string;\n /** Header name for token (default: 'Authorization') */\n headerName?: string;\n /** Token prefix (default: 'Bearer ') */\n tokenPrefix?: string;\n\n /**\n * Enable development mock-login mode.\n * When true, AuthService skips real API calls and generates a fake JWT locally.\n * Set this only in dev/demo configs — never in production AppMeta.\n */\n mock?: boolean;\n\n /** \n * AvoraMetaForge Built-in Native Auth UI\n * Let the framework handle auth screens for you using the AmfAuthShell.\n */\n builtInUI?: {\n enabled: boolean;\n /** Specific pages to enable. If omitted, all defaults are enabled. */\n pages?: ('login' | 'forgot-password' | 'contact-support')[];\n /** Custom brand name for auth pages. Fallbacks to app.name */\n brandName?: string;\n /** Custom tagline for auth pages */\n brandTagline?: string;\n /** Enable OTP two-step verification flow on login */\n requireOtp?: boolean;\n };\n}\n\nexport interface AppBrandingMeta {\n name: string;\n logo?: string;\n /** Logo for dark mode */\n logoDark?: string;\n /** Favicon URL */\n favicon?: string;\n defaultLayout?: LayoutTypeKey | string;\n defaultGuard?: import('./guard.meta').GuardMeta;\n copyright?: string;\n footerLinks?: FooterLinkMeta[];\n /** Theme configuration */\n theme?: ThemeMeta;\n /** App version */\n version?: string;\n /** Support URL or email */\n support?: string;\n [key: string]: any;\n}\n\nexport interface ThemeMeta {\n /** Primary color (hex or HSL) */\n primary?: string;\n /** Accent color */\n accent?: string;\n /** Default mode */\n mode?: 'light' | 'dark' | 'auto';\n /** Custom CSS variables */\n variables?: Record<string, string>;\n /** Font family */\n fontFamily?: string;\n /** Border radius scale */\n borderRadius?: string;\n}\n\nexport interface LayoutMeta {\n type: LayoutTypeKey | string;\n config?: LayoutConfigMeta;\n}\n\nexport interface LayoutConfigMeta {\n maxWidth?: string;\n verticalCenter?: boolean;\n leftWidth?: string;\n rightWidth?: string;\n collapsible?: boolean;\n gridColumns?: number;\n gridGap?: string;\n hideHeader?: boolean;\n hideFooter?: boolean;\n headerHeight?: string;\n showBreadcrumbs?: boolean;\n showPageTitle?: boolean;\n customCssClass?: string;\n /** Sidebar config */\n sidebar?: {\n width?: string;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n breakpoint?: number;\n };\n /** Padding */\n padding?: string;\n [key: string]: any;\n}\n\nexport interface NavGroupMeta {\n label: string;\n items: NavItemMeta[];\n visibleWhen?: ConditionMeta;\n /** Collapsed by default */\n collapsed?: boolean;\n /** Group icon */\n icon?: string;\n}\n\nexport interface NavItemMeta {\n label: string;\n icon?: string;\n route?: string;\n children?: NavItemMeta[];\n badge?: string;\n badgeColor?: string;\n visibleWhen?: ConditionMeta;\n roles?: string[];\n permissions?: string[];\n action?: ActionMeta;\n /** Open in new tab */\n external?: boolean;\n /** External URL */\n url?: string;\n /** Tooltip */\n tooltip?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Divider after this item */\n divider?: boolean;\n [key: string]: any;\n}\n\nexport interface FooterLinkMeta {\n label: string;\n url?: string;\n route?: string;\n external?: boolean;\n icon?: string;\n}\n","/**\n * AvoraMetaForge — Form Metadata\n *\n * Comprehensive form system supporting:\n * - 25+ field types including text, select, file, toggle, rich-text, code-editor\n * - Lifecycle hooks: onLoad, onSubmit, onCancel, onReset, onChange\n * - Multi-step wizard forms with step validation\n * - Autosave with debounced submit\n * - Dirty guard (warn on unsaved changes)\n * - Cross-field validators\n * - Field-level events: onChange, onBlur, onFocus\n * - Cascade selects (dependsOn)\n * - Input masking\n * - Computed/derived fields (watchFields)\n * - Conditional required validators\n * - Repeatable (array) field groups\n */\n\nimport { HttpMethod, ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport type FieldType =\n | 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n | 'textarea' | 'select' | 'multi-select' | 'radio'\n | 'checkbox' | 'toggle' | 'date' | 'datetime' | 'time'\n | 'file' | 'color' | 'range' | 'hidden'\n | 'divider' | 'heading'\n // --- NEW field types ---\n | 'rich-text' // WYSIWYG editor\n | 'code-editor' // Code editor (e.g., Monaco)\n | 'auto-complete' // Autocomplete search input\n | 'tags' // Tag/chip input\n | 'rating' // Star / numeric rating\n | 'slider' // Range slider with labels\n | 'switch' // On/off switch (alias for toggle)\n | 'image-upload' // Image upload with preview\n | 'signature' // Signature capture pad\n | 'otp' // One-time password input\n | 'phone' // Phone number with country code\n | 'address' // Structured address fields\n | 'date-range' // Start/end date picker\n | 'time-range' // Start/end time picker\n | 'currency' // Currency input with symbol\n | 'percentage' // Percentage input\n | 'group' // Nested field group (sub-form)\n | 'repeater' // Repeatable field group (array)\n | 'custom';\n\nexport type FormLayout = 'vertical' | 'horizontal' | 'grid' | 'inline' | 'stepper';\n\nexport interface FormMeta {\n /** Unique form identifier (used by reset-form, patch-form actions) */\n id?: string;\n\n fields: FieldMeta[];\n layout?: FormLayout;\n columns?: number;\n submitLabel?: string;\n cancelLabel?: string;\n resetLabel?: string;\n showCancel?: boolean;\n showReset?: boolean;\n\n /** Hide the submit button (useful for button-only forms) */\n hideSubmit?: boolean;\n\n /** API endpoint for direct form submission */\n apiEndpoint?: string;\n apiMethod?: HttpMethod;\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle Hooks\n // ──────────────────────────────────────────────────────────────\n /** Runs when form initializes (e.g., fetch data for edit mode) */\n onLoad?: ActionMeta;\n\n /** Runs on successful submit */\n onSubmit?: ActionMeta;\n\n /** Runs when cancel is clicked */\n onCancel?: ActionMeta;\n\n /** Runs when reset is clicked */\n onReset?: ActionMeta;\n\n /** Runs whenever any field value changes */\n onChange?: ActionMeta;\n\n /** Runs when form becomes valid */\n onValid?: ActionMeta;\n\n /** Runs when form becomes invalid */\n onInvalid?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Validation\n // ──────────────────────────────────────────────────────────────\n validators?: ValidatorMeta[];\n\n /** Cross-field validators (e.g., password must match confirm) */\n crossFieldValidators?: CrossFieldValidatorMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Advanced Features\n // ──────────────────────────────────────────────────────────────\n /** Pre-populate form values */\n initialValues?: Record<string, any>;\n\n /** Load initial values from API endpoint ID */\n initialValuesApi?: string;\n\n /** Multi-step wizard configuration */\n steps?: FormStepMeta[];\n\n /** Enable autosave */\n autosave?: AutosaveMeta;\n\n /** Warn before navigating away with unsaved changes */\n confirmUnsaved?: boolean;\n\n /** Custom unsaved changes message */\n unsavedMessage?: string;\n\n /** Disable the entire form */\n disabled?: boolean;\n\n /** Make the entire form read-only */\n readOnly?: boolean;\n\n /** CSS class for form container */\n cssClass?: string;\n\n /** Whether to scroll to first error on submit */\n scrollToError?: boolean;\n\n /** Show validation summary at top of form */\n showValidationSummary?: boolean;\n\n /** Whether to validate on field change or on submit only */\n validateOn?: 'change' | 'blur' | 'submit';\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\nexport interface FieldMeta {\n /** Unique key — maps to form control name */\n key: string;\n\n type: FieldType | string;\n label?: string;\n description?: string;\n placeholder?: string;\n defaultValue?: any;\n validators?: ValidatorMeta[];\n options?: OptionMeta[];\n\n /** Endpoint ID to load options from API */\n optionsApi?: string;\n\n /** Key in API response to use as label */\n optionsLabelKey?: string;\n\n /** Key in API response to use as value */\n optionsValueKey?: string;\n\n /** Show/hide based on condition */\n visibleWhen?: ConditionMeta;\n\n /** Disable based on condition */\n disabledWhen?: ConditionMeta;\n\n /** Custom component key for rendering */\n customComponent?: string;\n cssClass?: string;\n colSpan?: number;\n hint?: string;\n prefix?: string;\n suffix?: string;\n readOnly?: boolean;\n /** Statically disable this field */\n disabled?: boolean;\n autocomplete?: string;\n rows?: number;\n min?: number;\n max?: number;\n step?: number;\n accept?: string;\n multiple?: boolean;\n text?: string; // for headings / dividers\n\n // ──────────────────────────────────────────────────────────────\n // Field-Level Events\n // ──────────────────────────────────────────────────────────────\n /** Action to dispatch when field value changes */\n onChange?: ActionMeta;\n\n /** Action to dispatch when field loses focus */\n onBlur?: ActionMeta;\n\n /** Action to dispatch when field gains focus */\n onFocus?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Cascade / Dependency\n // ──────────────────────────────────────────────────────────────\n /** Field key this field depends on (cascade selects) */\n dependsOn?: string;\n\n /** API query params derived from dependent field value */\n dependsOnParams?: Record<string, string>;\n\n /** Clear this field when dependent field changes */\n clearOnDependencyChange?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Input Masking\n // ──────────────────────────────────────────────────────────────\n /** Input mask pattern (e.g., '(000) 000-0000', '000-00-0000') */\n mask?: string;\n\n /** Mask guide character (default: '_') */\n maskGuide?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Computed / Watch\n // ──────────────────────────────────────────────────────────────\n /** Derive this field's value from other field values. E.g., 'fullName = firstName + \" \" + lastName' */\n computeFrom?: ComputeFieldMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Conditional Required\n // ──────────────────────────────────────────────────────────────\n /** Make this field required only when condition is met */\n requiredWhen?: ConditionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Repeater / Group\n // ──────────────────────────────────────────────────────────────\n /** Fields within a group/repeater */\n children?: FieldMeta[];\n\n /** Min/max items for repeater */\n minItems?: number;\n maxItems?: number;\n\n /** Label for add button in repeater */\n addLabel?: string;\n\n // ──────────────────────────────────────────────────────────────\n // File Upload Enhancements\n // ──────────────────────────────────────────────────────────────\n /** Max file size in bytes */\n maxFileSize?: number;\n\n /** Show upload progress */\n showProgress?: boolean;\n\n /** Max number of files for multi-upload */\n maxFiles?: number;\n\n /** Show image preview */\n showPreview?: boolean;\n\n /** Drag and drop upload */\n dragDrop?: boolean;\n\n /** Button color variant */\n color?: string;\n\n /** Button style variant */\n variant?: string;\n\n /** Action to dispatch when button is clicked */\n onClick?: import('./action.meta').ActionMeta;\n\n /** Custom HTML attributes */\n customAttributes?: Record<string, string>;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Validators\n// ──────────────────────────────────────────────────────────────\nexport interface ValidatorMeta {\n type: 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'email'\n | 'url' | 'number' | 'integer'\n | 'match' // Match another field value\n | 'notMatch' // Must NOT match another field\n | 'unique' // Value must be unique (checked via API)\n | 'fileType' // Validate file extension\n | 'fileSize' // Validate file size\n | 'dateRange' // Date within range\n | 'custom' | string;\n value?: any;\n /** Custom error message */\n message?: string;\n /** Custom validator function key */\n custom?: string;\n /** Field key for 'match'/'notMatch' validators */\n matchField?: string;\n /** Validate only when this condition is met */\n when?: ConditionMeta;\n}\n\nexport interface CrossFieldValidatorMeta {\n type: 'match' | 'dateOrder' | 'atLeastOne' | 'custom' | string;\n /** Fields involved */\n fields: string[];\n message: string;\n custom?: string;\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Options\n// ──────────────────────────────────────────────────────────────\nexport interface OptionMeta {\n label: string;\n value: any;\n disabled?: boolean;\n icon?: string;\n group?: string;\n description?: string;\n color?: string;\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Multi-Step / Wizard\n// ──────────────────────────────────────────────────────────────\nexport interface FormStepMeta {\n /** Step title */\n title: string;\n /** Step description / subtitle */\n description?: string;\n /** Step icon */\n icon?: string;\n /** Field keys included in this step */\n fields: string[];\n /** Validate before allowing next step */\n validate?: boolean;\n /** Action to run when entering this step */\n onEnter?: ActionMeta;\n /** Action to run when leaving this step */\n onLeave?: ActionMeta;\n /** Condition to skip this step */\n skipWhen?: ConditionMeta;\n /** Whether the step can be manually skipped */\n optional?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Autosave\n// ──────────────────────────────────────────────────────────────\nexport interface AutosaveMeta {\n /** Debounce delay in milliseconds */\n debounceMs: number;\n /** API endpoint to auto-save to */\n endpointId?: string;\n /** Action to dispatch on autosave */\n action?: ActionMeta;\n /** Show save indicator */\n showIndicator?: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Computed Fields\n// ──────────────────────────────────────────────────────────────\nexport interface ComputeFieldMeta {\n /** Field keys to watch */\n watch: string[];\n /** Expression template. E.g., '{{firstName}} {{lastName}}' */\n expression?: string;\n /** Custom compute function key */\n custom?: string;\n}\n","/**\n * AvoraMetaForge — Table Metadata\n *\n * Comprehensive data grid system supporting:\n * - Server-side and client-side pagination, sorting, filtering\n * - Inline editing, row expansion, drag-to-reorder\n * - Column toggle, resize, pin/freeze, multi-sort\n * - Export (CSV, JSON, Excel, PDF)\n * - Virtual scroll, infinite scroll, grouped rows\n * - Aggregate rows (sum, average, count)\n * - Selection (single, multi, checkbox)\n * - Sticky header, column show/hide toggle\n * - Cell-level actions and formatting\n * - Row status/color conditions\n */\n\nimport { ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport type CellType =\n | 'text' | 'badge' | 'avatar' | 'date' | 'datetime'\n | 'currency' | 'number' | 'boolean' | 'link'\n | 'image' | 'progress' | 'actions'\n // --- NEW cell types ---\n | 'icon' // SVG icon display\n | 'color' // Color swatch\n | 'rating' // Star rating display\n | 'tags' // Tag/chip list\n | 'truncate' // Truncated text with tooltip\n | 'html' // Raw HTML content\n | 'template' // Custom inline template\n | 'time-ago' // Relative time (e.g., \"3 hours ago\")\n | 'file-size' // Formatted file size (e.g., \"2.5 MB\")\n | 'phone' // Phone number with call link\n | 'email' // Email with mailto link\n | 'url' // Clickable URL\n | 'json' // Pretty-printed JSON\n | 'copy' // Text with copy button\n | 'editable' // Inline editable cell\n | 'select' // Inline select dropdown\n | 'toggle' // Inline toggle switch\n | 'custom';\n\nexport interface TableMeta {\n /** Unique table identifier (used by reload-table action) */\n id?: string;\n\n columns: ColumnMeta[];\n dataSource: 'api' | 'static' | 'signal';\n apiEndpoint?: string;\n /** Endpoint ID registered in the API service (for mock or real endpoints) */\n endpointId?: string;\n staticData?: any[];\n pagination?: PaginationMeta;\n searchable?: boolean;\n searchPlaceholder?: string;\n searchFields?: string[];\n filterable?: boolean;\n sortable?: boolean;\n defaultSortKey?: string;\n defaultSortDirection?: 'asc' | 'desc';\n actions?: TableActionMeta[];\n bulkActions?: TableActionMeta[];\n rowClick?: ActionMeta;\n emptyMessage?: string;\n selectable?: boolean;\n showRowNumbers?: boolean;\n title?: string;\n headerActions?: TableActionMeta[];\n filters?: TableFilterMeta[];\n cssClass?: string;\n variant?: 'default' | 'striped' | 'borderless' | 'glass' | 'elevated' | 'compact' | string;\n /** Bump this number to bust the sessionStorage cache and re-seed from staticData */\n dataVersion?: number;\n striped?: boolean;\n hoverable?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Server-Side Mode\n // ──────────────────────────────────────────────────────────────\n /** Enable server-side pagination, sort, and filter */\n serverSide?: boolean;\n\n /** API pagination config (query param names, response paths) */\n serverPagination?: ServerPaginationConfig;\n\n // ──────────────────────────────────────────────────────────────\n // Export\n // ──────────────────────────────────────────────────────────────\n /** Enable data export */\n exportable?: boolean;\n\n /** Supported export formats */\n exportFormats?: ('csv' | 'json' | 'xlsx' | 'pdf')[];\n\n /** Custom export filename (without extension) */\n exportFilename?: string;\n\n /** Columns to include in export (keys). If omitted, exports all visible */\n exportColumns?: string[];\n\n // ──────────────────────────────────────────────────────────────\n // Inline Editing\n // ──────────────────────────────────────────────────────────────\n /** Enable inline row editing */\n inlineEdit?: boolean;\n\n /** Action to dispatch when an inline edit is saved */\n onInlineEditSave?: ActionMeta;\n\n /** Action to dispatch when an inline edit is cancelled */\n onInlineEditCancel?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Row Expansion\n // ──────────────────────────────────────────────────────────────\n /** Enable row expansion (detail sub-row) */\n expandable?: boolean;\n\n /** Component key to render in expanded area */\n expandComponent?: string;\n\n /** Section to render in expanded area (alternative to component) */\n expandSection?: import('./section.meta').SectionMeta;\n\n /** Only allow one expanded row at a time */\n singleExpand?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Virtual / Infinite Scroll\n // ──────────────────────────────────────────────────────────────\n /** Enable virtual scroll for large datasets */\n virtualScroll?: boolean;\n\n /** Row height for virtual scroll calculation */\n rowHeight?: number;\n\n /** Enable infinite scroll (load more on scroll) */\n infiniteScroll?: boolean;\n\n /** API endpoint for loading next page in infinite scroll */\n loadMoreEndpoint?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Column Features\n // ──────────────────────────────────────────────────────────────\n /** Show column visibility toggle */\n columnToggle?: boolean;\n\n /** Allow column reorder via drag */\n columnReorder?: boolean;\n\n /** Allow column resize via drag */\n columnResize?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Row Features\n // ──────────────────────────────────────────────────────────────\n /** Enable row drag-to-reorder */\n reorderable?: boolean;\n\n /** Action when row order changes */\n onReorder?: ActionMeta;\n\n /** Enable multi-column sort */\n multiSort?: boolean;\n\n /** Sticky header on scroll */\n stickyHeader?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Grouping & Aggregation\n // ──────────────────────────────────────────────────────────────\n /** Group rows by this column key */\n groupBy?: string;\n\n /** Collapsible groups */\n groupCollapsible?: boolean;\n\n /** Start groups collapsed */\n groupCollapsed?: boolean;\n\n /** Aggregate row configuration (footer totals) */\n aggregates?: AggregateRowMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Selection\n // ──────────────────────────────────────────────────────────────\n /** Selection mode */\n selectionMode?: 'single' | 'multi' | 'checkbox';\n\n /** Action when selection changes */\n onSelectionChange?: ActionMeta;\n\n /** Show \"Select All\" checkbox */\n showSelectAll?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // Row Styling\n // ──────────────────────────────────────────────────────────────\n /** Conditionally style rows based on data */\n rowClass?: RowClassMeta[];\n\n /** Row context menu (right-click) */\n contextMenu?: TableActionMeta[];\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle\n // ──────────────────────────────────────────────────────────────\n /** Action on data load complete */\n onDataLoad?: ActionMeta;\n\n /** Action on data load error */\n onDataError?: ActionMeta;\n\n /** Refresh interval (ms) — auto-reload data periodically */\n refreshInterval?: number;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\nexport interface ColumnMeta {\n key: string;\n label: string;\n type?: CellType | string;\n sortable?: boolean;\n filterable?: boolean;\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n align?: 'left' | 'center' | 'right';\n template?: string;\n pipe?: string;\n cssClass?: string;\n badgeMap?: Record<string, string>;\n avatarKey?: string;\n subtitleKey?: string;\n linkRoute?: string;\n currencyCode?: string;\n currencyDisplay?: string | boolean; // e.g. 'symbol', 'code', or custom string like 'Rs.'\n currencyCodeKey?: string; // read dynamic currency code from row data\n dateFormat?: string;\n visibleWhen?: ConditionMeta;\n hidden?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // NEW Column Properties\n // ──────────────────────────────────────────────────────────────\n /** Pin/freeze column to left or right */\n pin?: 'left' | 'right';\n\n /** Column is resizable */\n resizable?: boolean;\n\n /** Column is reorderable */\n reorderable?: boolean;\n\n /** Tooltip text or template */\n tooltip?: string;\n\n /** Cell-level click action */\n cellClick?: ActionMeta;\n\n /** Wrap text in cell */\n wrap?: boolean;\n\n /** Max truncation length */\n truncateAt?: number;\n\n /** Header tooltip */\n headerTooltip?: string;\n\n /** Editable configuration (for inline edit) */\n editable?: boolean;\n editType?: 'text' | 'number' | 'select' | 'date' | 'toggle';\n editOptions?: { label: string; value: any }[];\n\n /** Cell format function key (for custom formatting) */\n format?: string;\n\n /** Aggregate function for this column */\n aggregate?: 'sum' | 'avg' | 'min' | 'max' | 'count' | 'custom';\n aggregateLabel?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Inline Edit Validation\n // ──────────────────────────────────────────────────────────────\n /** Validators applied to inline-edit input before committing */\n editValidators?: ColumnEditValidatorMeta[];\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface PaginationMeta {\n enabled: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n showPageSizeSelector?: boolean;\n showTotal?: boolean;\n /** Show first/last page buttons */\n showFirstLast?: boolean;\n /** Max page buttons to show */\n maxPages?: number;\n /** Show \"Showing X-Y of Z\" text */\n showRange?: boolean;\n}\n\nexport interface ServerPaginationConfig {\n /** Query param name for page number (default: 'page') */\n pageParam?: string;\n /** Query param name for page size (default: 'size') */\n sizeParam?: string;\n /** Query param name for sort field (default: 'sort') */\n sortParam?: string;\n /** Query param name for sort direction (default: 'direction') */\n directionParam?: string;\n /** Query param name for search (default: 'search') */\n searchParam?: string;\n /** Query param name for filter (default uses filter key) */\n filterParams?: Record<string, string>;\n /** Path in response to data array (default: 'data') */\n dataPath?: string;\n /** Path in response to total count (default: 'total') */\n totalPath?: string;\n /** Path in response to total pages */\n totalPagesPath?: string;\n}\n\nexport interface TableActionMeta {\n id: string;\n label: string;\n icon?: string;\n variant?: 'primary' | 'secondary' | 'danger' | 'ghost' | 'success' | 'warning' | string;\n action: ActionMeta;\n visibleWhen?: ConditionMeta;\n disabledWhen?: ConditionMeta;\n confirm?: string;\n /** Tooltip for the action button */\n tooltip?: string;\n /** Show as dropdown menu item instead of inline button */\n menuItem?: boolean;\n /** Keyboard shortcut hint */\n shortcut?: string;\n [key: string]: any;\n}\n\nexport interface TableFilterMeta {\n key: string;\n label: string;\n type?: 'select' | 'text' | 'date' | 'date-range' | 'number-range' | 'multi-select' | 'toggle';\n options?: { label: string; value: any }[];\n defaultValue?: any;\n placeholder?: string;\n /** For server-side: query param name */\n queryParam?: string;\n}\n\nexport interface AggregateRowMeta {\n /** Column key to aggregate */\n columnKey: string;\n /** Aggregate function */\n type: 'sum' | 'avg' | 'min' | 'max' | 'count' | 'custom';\n /** Display label */\n label?: string;\n /** Format (e.g., currency, percentage) */\n format?: string;\n /** Custom aggregate function key */\n custom?: string;\n}\n\nexport interface RowClassMeta {\n /** Condition to evaluate for each row */\n condition: ConditionMeta;\n /** CSS class to apply when condition is true */\n cssClass: string;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Inline Edit Validation\n// ──────────────────────────────────────────────────────────────\nexport interface ColumnEditValidatorMeta {\n type:\n | 'required' // Value must not be empty\n | 'minLength' // Minimum string length\n | 'maxLength' // Maximum string length\n | 'min' // Minimum numeric value\n | 'max' // Maximum numeric value\n | 'pattern' // Regex pattern\n | 'email' // Valid email format\n | 'number' // Must be a valid number\n | string;\n /** Validator parameter (e.g., minLength: 3, pattern: '^[A-Z]') */\n value?: any;\n /** Custom error message shown below the inline input */\n message?: string;\n}\n","/**\n * AvoraMetaForge — Section Metadata\n *\n * Sections are the building blocks within a page. Each section has a type\n * and configuration. Extended with new section types for drawers, modals,\n * tabs, accordions, and more.\n */\n\nimport { FormMeta } from './form.meta';\nimport { TableMeta } from './table.meta';\nimport { ConditionMeta } from './condition.meta';\nimport { ActionMeta } from './action.meta';\n\nexport interface SectionMeta {\n type: 'form' | 'table' | 'card' | 'stats-grid' | 'page-header' | 'html'\n // --- NEW section types ---\n | 'stepper-form' // Multi-step wizard form\n | 'tabs' // Tabbed content\n | 'accordion' // Collapsible panels\n | 'timeline' // Vertical timeline\n | 'steps' // Step-by-step wizard\n | 'chart' // Chart/graph visualization\n | 'map' // Map display\n | 'calendar' // Calendar/scheduler\n | 'kanban' // Kanban board\n | 'tree' // Tree view\n | 'gallery' // Image/media gallery\n | 'markdown' // Markdown rendered content\n | 'iframe' // Embedded iframe\n | 'divider' // Visual separator\n | 'spacer' // Empty spacer\n | 'alert' // Alert/banner message\n | 'empty-state' // Empty state with CTA\n | 'skeleton' // Loading skeleton\n | 'custom' | string;\n\n config: FormMeta | TableMeta | CardMeta | StatsGridMeta | PageHeaderMeta | HtmlMeta\n | TabsMeta | AccordionMeta | TimelineMeta | AlertMeta | EmptyStateMeta\n | IframeMeta | DividerMeta | SpacerMeta\n | Record<string, any>;\n\n /** Section ID (referenced by actions like reload-table, reset-form) */\n id?: string;\n\n visibleWhen?: ConditionMeta;\n cssClass?: string;\n style?: Record<string, string>;\n gridArea?: string;\n gridColumn?: string;\n gridRow?: string;\n\n // ──────────────────────────────────────────────────────────────\n // Section Features\n // ──────────────────────────────────────────────────────────────\n /** Section title (rendered as a header above the section) */\n title?: string;\n\n /** Section subtitle */\n subtitle?: string;\n\n /** Collapsible section */\n collapsible?: boolean;\n\n /** Start collapsed */\n collapsed?: boolean;\n\n /** Section-level loading state */\n loading?: boolean;\n\n /** Action to dispatch when section becomes visible (lazy-load) */\n onVisible?: ActionMeta;\n\n /** Animation for section entrance */\n animation?: 'fade-in' | 'slide-up' | 'slide-left' | 'zoom-in' | 'none' | string;\n\n /** Animation delay (ms) */\n animationDelay?: number;\n\n /** Catch-all */\n [key: string]: any;\n}\n\nexport interface PageHeaderMeta {\n title: string;\n subtitle?: string;\n titleTemplate?: string;\n actions?: PageHeaderActionMeta[];\n showBack?: boolean;\n /** Breadcrumbs in header */\n breadcrumbs?: { label: string; path?: string }[];\n /** Avatar/icon next to title */\n avatar?: string;\n /** Status badge */\n status?: { label: string; color: string };\n [key: string]: any;\n}\n\nexport interface PageHeaderActionMeta {\n label: string;\n icon?: string;\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger' | 'success' | string;\n action: ActionMeta;\n visibleWhen?: ConditionMeta;\n disabledWhen?: ConditionMeta;\n tooltip?: string;\n /** Show as dropdown menu */\n children?: PageHeaderActionMeta[];\n}\n\nexport interface CardMeta {\n title?: string;\n content?: string;\n template?: string;\n actions?: PageHeaderActionMeta[];\n variant?: 'default' | 'glass' | 'outlined' | 'elevated' | 'gradient' | string;\n /** Card header icon */\n icon?: string;\n /** Image at top of card */\n image?: string;\n /** Footer content */\n footer?: string;\n /** Click action on the card */\n onClick?: ActionMeta;\n /** Nested sections inside the card */\n sections?: SectionMeta[];\n [key: string]: any;\n}\n\nexport interface StatsGridMeta {\n stats: StatCardMeta[];\n columns?: number;\n variant?: 'default' | 'glass' | 'compact' | 'outlined' | 'elevated' | string;\n [key: string]: any;\n}\n\nexport interface StatCardMeta {\n label: string;\n value: string;\n trend?: string;\n trendPositive?: boolean;\n icon?: string;\n color?: string;\n bgColor?: string;\n glowColor?: string;\n action?: ActionMeta;\n /** Sparkline data points */\n sparkline?: number[];\n /** Suffix text (e.g., '%', 'users') */\n suffix?: string;\n /** Prefix text (e.g., '$') */\n prefix?: string;\n /** Load value from API endpoint */\n apiEndpoint?: string;\n [key: string]: any;\n}\n\nexport interface HtmlMeta {\n html: string;\n /** Sanitize HTML (default: true) */\n sanitize?: boolean;\n}\n\nexport interface CustomComponentMeta {\n componentKey: string;\n inputs?: Record<string, any>;\n outputs?: Record<string, ActionMeta>;\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// NEW Section Types\n// ──────────────────────────────────────────────────────────────\n\nexport interface TabsMeta {\n tabs: TabMeta[];\n variant?: 'default' | 'pills' | 'underline' | 'vertical' | string;\n defaultTab?: number;\n /** Lazy load tab content */\n lazy?: boolean;\n /** Action when tab changes */\n onChange?: ActionMeta;\n}\n\nexport interface TabMeta {\n label: string;\n icon?: string;\n badge?: string;\n sections: SectionMeta[];\n visibleWhen?: ConditionMeta;\n disabled?: boolean;\n}\n\nexport interface AccordionMeta {\n panels: AccordionPanelMeta[];\n /** Allow multiple panels open */\n multi?: boolean;\n variant?: 'default' | 'bordered' | 'flush' | string;\n}\n\nexport interface AccordionPanelMeta {\n title: string;\n icon?: string;\n sections: SectionMeta[];\n expanded?: boolean;\n visibleWhen?: ConditionMeta;\n disabled?: boolean;\n}\n\nexport interface TimelineMeta {\n items: TimelineItemMeta[];\n variant?: 'default' | 'alternating' | 'compact' | string;\n /** Load items from API */\n apiEndpoint?: string;\n}\n\nexport interface TimelineItemMeta {\n title: string;\n description?: string;\n date?: string;\n icon?: string;\n color?: string;\n action?: ActionMeta;\n [key: string]: any;\n}\n\nexport interface AlertMeta {\n type: 'info' | 'success' | 'warning' | 'error';\n title?: string;\n message: string;\n dismissible?: boolean;\n icon?: string;\n action?: ActionMeta;\n actionLabel?: string;\n}\n\nexport interface EmptyStateMeta {\n icon?: string;\n title: string;\n description?: string;\n action?: ActionMeta;\n actionLabel?: string;\n image?: string;\n}\n\nexport interface IframeMeta {\n src: string;\n height?: string;\n width?: string;\n allowFullscreen?: boolean;\n sandbox?: string;\n title?: string;\n}\n\nexport interface DividerMeta {\n label?: string;\n variant?: 'solid' | 'dashed' | 'dotted';\n color?: string;\n spacing?: string;\n}\n\nexport interface SpacerMeta {\n height?: string;\n}\n","/**\n * AvoraMetaForge — Page Metadata\n *\n * Comprehensive page configuration supporting:\n * - Lifecycle hooks: onInit, onDestroy, onParamChange, onQueryChange\n * - Breadcrumbs with dynamic segments\n * - Deactivation guards (unsaved changes warning)\n * - SEO meta tags\n * - Page-level animations and transitions\n * - Deep link support with route param context\n */\n\nimport { SectionMeta } from './section.meta';\nimport { GuardMeta, ResolverMeta } from './guard.meta';\nimport { LayoutTypeKey, LayoutConfigMeta } from './layout.meta';\nimport { ActionMeta } from './action.meta';\nimport { ConditionMeta } from './condition.meta';\n\nexport interface PageMeta {\n id: string;\n path: string;\n title?: string;\n layout?: LayoutTypeKey | string;\n layoutConfig?: LayoutConfigMeta;\n icon?: string;\n guard?: GuardMeta;\n resolve?: Record<string, ResolverMeta>;\n sections: SectionMeta[];\n data?: Record<string, any>;\n children?: PageMeta[];\n lazyModule?: () => Promise<any>;\n showInNav?: boolean;\n navGroup?: string;\n navBadge?: string;\n navBadgeColor?: string;\n navOrder?: number;\n pathMatch?: 'full' | 'prefix';\n redirectTo?: string;\n cssClass?: string;\n customComponent?: () => Promise<any>;\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle Hooks\n // ──────────────────────────────────────────────────────────────\n /** Action to dispatch when the page initializes (e.g., load data) */\n onInit?: ActionMeta;\n\n /** Action to dispatch when the page is destroyed (e.g., cleanup) */\n onDestroy?: ActionMeta;\n\n /** Action to dispatch when route params change (for reusable pages) */\n onParamChange?: ActionMeta;\n\n /** Action to dispatch when query params change */\n onQueryChange?: ActionMeta;\n\n /** Action to dispatch when the page becomes visible (tab focus) */\n onActivate?: ActionMeta;\n\n /** Action to dispatch when the page loses visibility (tab blur) */\n onDeactivate?: ActionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Navigation Guards\n // ──────────────────────────────────────────────────────────────\n /** Whether to warn when leaving with unsaved changes */\n canDeactivate?: boolean;\n\n /** Custom deactivation message */\n deactivateMessage?: string;\n\n /** Condition that must be true to allow deactivation without prompt */\n deactivateWhen?: ConditionMeta;\n\n // ──────────────────────────────────────────────────────────────\n // Breadcrumbs\n // ──────────────────────────────────────────────────────────────\n /** Breadcrumb configuration. Auto-generated from route hierarchy if not specified */\n breadcrumbs?: BreadcrumbMeta[];\n\n /** Override parent breadcrumbs (don't inherit) */\n breadcrumbOverride?: boolean;\n\n /** Hide breadcrumbs on this page */\n hideBreadcrumbs?: boolean;\n\n // ──────────────────────────────────────────────────────────────\n // SEO\n // ──────────────────────────────────────────────────────────────\n /** Meta description for search engines */\n metaDescription?: string;\n\n /** Meta keywords */\n metaKeywords?: string[];\n\n /** Open Graph meta tags */\n og?: {\n title?: string;\n description?: string;\n image?: string;\n type?: string;\n };\n\n // ──────────────────────────────────────────────────────────────\n // Page-Level Features\n // ──────────────────────────────────────────────────────────────\n /** Page transition animation */\n animation?: 'fade' | 'slide-left' | 'slide-right' | 'slide-up' | 'zoom' | 'none' | string;\n\n /** Auto-refresh page data at this interval (ms) */\n refreshInterval?: number;\n\n /** Show loading skeleton while resolving data */\n showSkeleton?: boolean;\n\n /** Scroll to top on navigation */\n scrollToTop?: boolean;\n\n /** Page-level permissions (finer than guard) */\n permissions?: string[];\n\n /** Whether this page is a full-screen overlay */\n fullScreen?: boolean;\n\n /** Background color/gradient override */\n background?: string;\n\n /** Catch-all for future / plugin-specific properties */\n [key: string]: any;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Breadcrumbs\n// ──────────────────────────────────────────────────────────────\nexport interface BreadcrumbMeta {\n /** Display label. Supports template: '{{params.name}}' */\n label: string;\n\n /** Route path. If omitted, breadcrumb is not clickable */\n path?: string;\n\n /** Icon for the breadcrumb */\n icon?: string;\n\n /** Whether this is the active/current breadcrumb */\n active?: boolean;\n\n /** Action to dispatch on click (alternative to path) */\n action?: ActionMeta;\n}\n","/**\n * AvoraMetaForge — Plugin Metadata\n *\n * Extended plugin system with lifecycle hooks, interceptors,\n * custom transforms, and more extension points.\n */\n\nimport { Type } from '@angular/core';\nimport { ActionMeta } from './action.meta';\n\nexport interface AvoraMetaForgePlugin {\n /** Unique plugin name */\n name: string;\n\n /** Plugin version */\n version?: string;\n\n /** Plugin description */\n description?: string;\n\n /** Custom section components (rendered by MetaRendererComponent) */\n components?: Record<string, Type<any>>;\n\n /** Custom validator functions */\n validators?: Record<string, (...args: any[]) => any>;\n\n /** Custom guard functions */\n guards?: Record<string, (...args: any[]) => any>;\n\n /** Custom field type components */\n fieldTypes?: Record<string, Type<any>>;\n\n /** Custom cell type components */\n cellTypes?: Record<string, Type<any>>;\n\n /** Custom condition evaluators */\n conditions?: Record<string, (context: any, condition: any) => boolean>;\n\n /** Custom action handlers */\n actions?: Record<string, (config: any, context: any) => any>;\n\n // ──────────────────────────────────────────────────────────────\n // Extension Points\n // ──────────────────────────────────────────────────────────────\n /** Custom response transforms */\n transforms?: Record<string, (data: any, config: any) => any>;\n\n /** Custom resolver functions */\n resolvers?: Record<string, (params: any) => Promise<any>>;\n\n /** Custom formatters (for table cells, display values) */\n formatters?: Record<string, (value: any, options?: any) => string>;\n\n /** Custom pipes */\n pipes?: Record<string, (value: any, ...args: any[]) => any>;\n\n /** API interceptors */\n interceptors?: {\n request?: (config: any) => any;\n response?: (response: any) => any;\n error?: (error: any) => any;\n };\n\n /** Action middleware — runs before every action dispatch */\n actionMiddleware?: (action: ActionMeta, context: any) => ActionMeta | null;\n\n // ──────────────────────────────────────────────────────────────\n // Lifecycle\n // ──────────────────────────────────────────────────────────────\n /** Called when plugin is registered */\n initialize?: () => void;\n\n /** Called when plugin is destroyed */\n destroy?: () => void;\n\n /** Called after all plugins are registered */\n afterInit?: () => void;\n\n /** Catch-all */\n [key: string]: any;\n}\n","/**\n * AvoraMetaForge — Type Barrel\n */\n\nexport * from './action.meta';\nexport * from './condition.meta';\nexport * from './guard.meta';\nexport * from './api.meta';\nexport * from './layout.meta';\nexport * from './form.meta';\nexport * from './table.meta';\nexport * from './section.meta';\nexport * from './page.meta';\nexport * from './plugin.meta';\nexport * from './dialog.meta';\n","import { Injectable, signal } from '@angular/core';\n\nexport type NotificationType = 'success' | 'error' | 'info' | 'warning';\n\nexport interface Notification {\n id: number;\n type: NotificationType;\n message: string;\n timeout?: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationService {\n private _notifications = signal<Notification[]>([]);\n readonly notifications = this._notifications.asReadonly();\n\n private _counter = 0;\n\n /** Add a notification to the stack */\n show(type: NotificationType, message: string, timeout = 5000): void {\n const id = ++this._counter;\n const notification: Notification = { id, type, message, timeout };\n\n this._notifications.update(n => [...n, notification]);\n\n if (timeout > 0) {\n setTimeout(() => this.remove(id), timeout);\n }\n }\n\n success(message: string): void { this.show('success', message); }\n error(message: string): void { this.show('error', message); }\n info(message: string): void { this.show('info', message); }\n warning(message: string): void { this.show('warning', message); }\n\n /** Remove a notification by ID */\n remove(id: number): void {\n this._notifications.update(n => n.filter(item => item.id !== id));\n }\n}\n","/**\n * AvoraMetaForge — Meta State Service\n *\n * Global reactive state store using Angular Signals. Provides:\n * - Set / Get / Select (signal-based)\n * - Merge and patch operations\n * - Optional localStorage persistence per key\n * - Computed selectors\n * - Scoped state (page-level namespaces)\n * - State reset and clear\n * - History tracking (undo/redo) per key\n */\nimport { Injectable, signal, computed, Signal } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport interface StateChange {\n key: string;\n previousValue: any;\n newValue: any;\n timestamp: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MetaStateService {\n /** Internal state map — each key holds a signal */\n private readonly store = new Map<string, ReturnType<typeof signal<any>>>();\n private readonly persistedKeys = new Set<string>();\n private readonly _changes$ = new Subject<StateChange>();\n\n /** Observable stream of all state changes */\n readonly changes$ = this._changes$.asObservable();\n\n // ──────────────────────────────────────────────────────────────\n // Core CRUD\n // ──────────────────────────────────────────────────────────────\n\n /** Set a value in the store */\n set(key: string, value: any, persist: boolean = false): void {\n const previous = this.get(key);\n const sig = this.getOrCreateSignal(key);\n sig.set(value);\n\n if (persist) {\n this.persistedKeys.add(key);\n this.persistToStorage(key, value);\n }\n\n this._changes$.next({ key, previousValue: previous, newValue: value, timestamp: Date.now() });\n }\n\n /** Get current value of a key */\n get(key: string): any {\n return this.store.get(key)?.() ?? this.loadFromStorage(key);\n }\n\n /** Get a signal for reactive binding */\n select(key: string): Signal<any> {\n return this.getOrCreateSignal(key);\n }\n\n /** Computed signal derived from one or more keys */\n selectComputed(keys: string[], fn: (...values: any[]) => any): Signal<any> {\n const signals = keys.map(k => this.select(k));\n return computed(() => fn(...signals.map(s => s())));\n }\n\n /** Merge value with existing (for objects) */\n merge(key: string, partial: Record<string, any>, persist: boolean = false): void {\n const current = this.get(key) || {};\n const merged = { ...current, ...partial };\n this.set(key, merged, persist);\n }\n\n /** Patch a nested path within a stored object */\n patch(key: string, path: string, value: any, persist: boolean = false): void {\n const current = { ...(this.get(key) || {}) };\n const keys = path.split('.');\n let obj = current;\n for (let i = 0; i < keys.length - 1; i++) {\n obj[keys[i]] = { ...(obj[keys[i]] || {}) };\n obj = obj[keys[i]];\n }\n obj[keys[keys.length - 1]] = value;\n this.set(key, current, persist);\n }\n\n /** Check if a key exists */\n has(key: string): boolean {\n return this.store.has(key) || localStorage.getItem(this.storageKey(key)) !== null;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Clear / Reset\n // ──────────────────────────────────────────────────────────────\n\n /** Remove a key from the store */\n clear(key: string, clearPersisted: boolean = true): void {\n const sig = this.store.get(key);\n if (sig) sig.set(undefined);\n this.store.delete(key);\n\n if (clearPersisted) {\n this.persistedKeys.delete(key);\n localStorage.removeItem(this.storageKey(key));\n }\n }\n\n /** Reset entire store */\n resetAll(clearPersisted: boolean = true): void {\n for (const key of this.store.keys()) {\n this.clear(key, clearPersisted);\n }\n }\n\n /** Reset specific namespace (e.g., clear all 'page.users.*' keys) */\n clearNamespace(namespace: string, clearPersisted: boolean = true): void {\n for (const key of this.store.keys()) {\n if (key.startsWith(namespace + '.') || key === namespace) {\n this.clear(key, clearPersisted);\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Scoped State (page-level)\n // ──────────────────────────────────────────────────────────────\n\n /** Get all keys under a namespace as an object */\n getNamespace(namespace: string): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, sig] of this.store.entries()) {\n if (key.startsWith(namespace + '.')) {\n const subKey = key.substring(namespace.length + 1);\n result[subKey] = sig();\n }\n }\n return result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Bulk Operations\n // ──────────────────────────────────────────────────────────────\n\n /** Set multiple keys at once */\n setMany(entries: Record<string, any>, persist: boolean = false): void {\n for (const [key, value] of Object.entries(entries)) {\n this.set(key, value, persist);\n }\n }\n\n /** Get all keys and values as a plain object */\n snapshot(): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, sig] of this.store.entries()) {\n result[key] = sig();\n }\n return result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Context Resolution (for actions)\n // ──────────────────────────────────────────────────────────────\n\n /** Resolve a value that might be prefixed with 'state:' */\n resolveValue(value: any): any {\n if (typeof value === 'string' && value.startsWith('state:')) {\n return this.get(value.substring(6));\n }\n if (typeof value === 'string' && value.startsWith('fromContext:')) {\n return value; // handled by the dispatcher\n }\n return value;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Internals\n // ──────────────────────────────────────────────────────────────\n\n private getOrCreateSignal(key: string): ReturnType<typeof signal<any>> {\n if (!this.store.has(key)) {\n const initial = this.loadFromStorage(key);\n this.store.set(key, signal(initial));\n }\n return this.store.get(key)!;\n }\n\n private storageKey(key: string): string {\n return `amf_state_${key}`;\n }\n\n private persistToStorage(key: string, value: any): void {\n try {\n localStorage.setItem(this.storageKey(key), JSON.stringify(value));\n } catch (e) {\n console.warn(`[AvoraMetaForge] Failed to persist state key \"${key}\":`, e);\n }\n }\n\n private loadFromStorage(key: string): any {\n try {\n const raw = localStorage.getItem(this.storageKey(key));\n return raw ? JSON.parse(raw) : undefined;\n } catch {\n return undefined;\n }\n }\n}\n","/**\n * AvoraMetaForge — Meta API Service\n *\n * Production-grade HTTP service supporting:\n * - All HTTP methods (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)\n * - Auth injection (Bearer, Basic, API Key) from state or config\n * - Request/response interceptors (plugin-based)\n * - Timeout with abort controller\n * - Mock mode (return static fixtures without HTTP)\n * - Response transforms (root, map, pick, omit, sort, flatten)\n * - Caching with TTL, invalidation, and SWR pattern\n * - Retry with exponential backoff\n * - Error mapping (status code → action)\n * - Environment-based base URL resolution\n * - File upload support (multipart/form-data)\n * - Server-side pagination parameter injection\n */\nimport { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { ApiEndpointMeta, TransformMeta, CacheMeta, RetryMeta, ApiAuthMeta } from '../models/meta.types';\nimport { MetaStateService } from './meta-state.service';\nimport { firstValueFrom, timeout as rxTimeout, retry as rxRetry, timer, throwError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\n\ninterface CacheEntry {\n data: any;\n timestamp: number;\n ttl: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MetaApiService {\n private readonly http = inject(HttpClient);\n private readonly state = inject(MetaStateService);\n private endpoints = new Map<string, ApiEndpointMeta>();\n private cache = new Map<string, CacheEntry>();\n private environments = new Map<string, { baseUrl: string;[key: string]: any }>();\n private activeEnvironment: string | undefined;\n private globalHeaders: Record<string, string> = {};\n private customTransforms = new Map<string, (data: any, config: any) => any>();\n\n // ──────────────────────────────────────────────────────────────\n // Registration\n // ──────────────────────────────────────────────────────────────\n\n registerEndpoints(apis: ApiEndpointMeta[]): void {\n apis.forEach(api => this.endpoints.set(api.id, api));\n }\n\n registerEnvironments(envs: Record<string, { baseUrl: string;[key: string]: any }>, active?: string): void {\n for (const [key, config] of Object.entries(envs)) {\n this.environments.set(key, config);\n }\n if (active) this.activeEnvironment = active;\n }\n\n setActiveEnvironment(env: string): void {\n this.activeEnvironment = env;\n }\n\n setGlobalHeaders(headers: Record<string, string>): void {\n this.globalHeaders = { ...this.globalHeaders, ...headers };\n }\n\n registerTransform(key: string, fn: (data: any, config: any) => any): void {\n this.customTransforms.set(key, fn);\n }\n\n getEndpoint(id: string): ApiEndpointMeta | undefined { return this.endpoints.get(id); }\n\n // ──────────────────────────────────────────────────────────────\n // Main Call Method\n // ──────────────────────────────────────────────────────────────\n\n async call(\n id: string,\n dynamicParams?: Record<string, string>,\n dynamicBody?: any,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n paginationParams?: Record<string, string>;\n }\n ): Promise<any> {\n const meta = this.endpoints.get(id);\n if (!meta) throw new Error(`[AvoraMetaForge] API endpoint \"${id}\" not found.`);\n\n // --- Mock Mode ---\n if (meta.mock) {\n return this.handleMock(meta);\n }\n\n // --- Cache Check ---\n if (meta.cache?.enabled && meta.method === 'GET') {\n const cached = this.getCached(meta, dynamicParams);\n if (cached !== undefined) return cached;\n }\n\n // --- Build URL ---\n let url = this.resolveBaseUrl(meta) + meta.path;\n const params = { ...meta.params, ...dynamicParams };\n for (const [k, v] of Object.entries(params)) {\n if (url.includes(`:${k}`)) {\n url = url.replace(`:${k}`, encodeURIComponent(v));\n }\n }\n\n // --- Query Params ---\n let httpParams = new HttpParams();\n for (const [k, v] of Object.entries(params)) {\n if (!meta.path.includes(`:${k}`)) httpParams = httpParams.set(k, v);\n }\n if (options?.queryParams) {\n for (const [k, v] of Object.entries(options.queryParams)) {\n httpParams = httpParams.set(k, v);\n }\n }\n if (options?.paginationParams) {\n for (const [k, v] of Object.entries(options.paginationParams)) {\n httpParams = httpParams.set(k, v);\n }\n }\n\n // --- Headers ---\n let headers = new HttpHeaders({ ...this.globalHeaders, ...meta.headers, ...options?.headers });\n\n // --- Auth ---\n if (meta.auth && !meta.auth.skip) {\n headers = this.injectAuth(headers, meta.auth);\n }\n\n // --- Content Type ---\n if (meta.contentType && meta.contentType !== 'multipart/form-data') {\n headers = headers.set('Content-Type', meta.contentType);\n }\n\n // --- Body ---\n let body = dynamicBody ?? meta.body;\n if (meta.contentType === 'multipart/form-data' && body && !(body instanceof FormData)) {\n body = this.toFormData(body);\n }\n\n // --- Response Type ---\n const responseType: any = meta.responseType || 'json';\n\n // --- Build Observable ---\n let request$ = this.http.request(meta.method, url, {\n body,\n headers,\n params: httpParams,\n responseType,\n observe: 'body'\n });\n\n // --- Timeout ---\n if (meta.timeout && meta.timeout > 0) {\n request$ = request$.pipe(rxTimeout(meta.timeout));\n }\n\n // --- Retry ---\n if (meta.retry && meta.retry.maxRetries > 0) {\n request$ = request$.pipe(\n this.retryWithBackoff(meta.retry)\n );\n }\n\n // --- Execute ---\n let response = await firstValueFrom(request$);\n\n // --- Transform ---\n if (meta.transform) {\n response = this.applyTransform(response, meta.transform);\n }\n\n // --- Cache Store ---\n if (meta.cache?.enabled && meta.method === 'GET') {\n this.storeInCache(meta, dynamicParams, response);\n }\n\n return response;\n }\n\n /**\n * Direct call without registered endpoint — supports inline config\n */\n async callDirect(config: {\n url: string;\n method: HttpMethod;\n body?: any;\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n timeout?: number;\n }): Promise<any> {\n let headers = new HttpHeaders({ ...this.globalHeaders, ...config.headers });\n let httpParams = new HttpParams();\n if (config.queryParams) {\n for (const [k, v] of Object.entries(config.queryParams)) {\n httpParams = httpParams.set(k, v);\n }\n }\n\n let request$ = this.http.request(config.method, config.url, {\n body: config.body,\n headers,\n params: httpParams,\n responseType: (config.responseType || 'json') as any,\n observe: 'body'\n });\n\n if (config.timeout) {\n request$ = request$.pipe(rxTimeout(config.timeout));\n }\n\n return firstValueFrom(request$);\n }\n\n // ──────────────────────────────────────────────────────────────\n // Cache Management\n // ──────────────────────────────────────────────────────────────\n\n /** Invalidate cache for a specific endpoint */\n invalidateCache(endpointId: string): void {\n for (const key of this.cache.keys()) {\n if (key.startsWith(endpointId + ':')) {\n this.cache.delete(key);\n }\n }\n }\n\n /** Invalidate all caches */\n invalidateAllCache(): void {\n this.cache.clear();\n }\n\n /** Invalidate caches linked via invalidateOn */\n invalidateLinkedCaches(triggeredEndpointId: string): void {\n for (const [, meta] of this.endpoints) {\n if (meta.cache?.invalidateOn?.includes(triggeredEndpointId)) {\n this.invalidateCache(meta.id);\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Auth\n // ──────────────────────────────────────────────────────────────\n\n private injectAuth(headers: HttpHeaders, auth: ApiAuthMeta): HttpHeaders {\n switch (auth.type) {\n case 'bearer': {\n const token = auth.token?.startsWith('state:')\n ? this.state.get(auth.token.substring(6))\n : auth.token;\n if (token) headers = headers.set('Authorization', `Bearer ${token}`);\n break;\n }\n case 'basic': {\n const user = auth.username?.startsWith('state:') ? this.state.get(auth.username.substring(6)) : auth.username;\n const pass = auth.password?.startsWith('state:') ? this.state.get(auth.password.substring(6)) : auth.password;\n if (user && pass) {\n headers = headers.set('Authorization', `Basic ${btoa(`${user}:${pass}`)}`);\n }\n break;\n }\n case 'apiKey': {\n const key = auth.apiKey?.startsWith('state:') ? this.state.get(auth.apiKey.substring(6)) : auth.apiKey;\n const headerName = auth.headerName || 'X-API-Key';\n if (key) headers = headers.set(headerName, key);\n break;\n }\n case 'custom': {\n if (auth.customHeader) {\n const value = auth.customHeader.value.startsWith('state:')\n ? this.state.get(auth.customHeader.value.substring(6))\n : auth.customHeader.value;\n if (value) headers = headers.set(auth.customHeader.name, value);\n }\n break;\n }\n }\n return headers;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Mock\n // ──────────────────────────────────────────────────────────────\n\n private async handleMock(meta: ApiEndpointMeta): Promise<any> {\n // ── DEV WARNING ────────────────────────────────────────────────────────────\n // This endpoint is running in MOCK mode — no real HTTP request is made.\n // To connect to a real backend, remove `mock: true` from the endpoint config\n // and set the correct `baseUrl` + `path`. See FRAMEWORK_GUIDE.md §2.\n // ──────────────────────────────────────────────────────────────────────────\n console.warn(\n `[AvoraMetaForge] ⚠️ Endpoint \"${meta.id}\" is running in MOCK mode.`,\n 'Remove mock:true and configure a real baseUrl to connect to a backend.'\n );\n\n const delay = meta.mockDelay || 0;\n if (delay > 0) {\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n\n if (meta.mockError) {\n throw { status: meta.mockError.status, message: meta.mockError.message };\n }\n\n let response = meta.mockData ?? null;\n if (meta.transform) {\n response = this.applyTransform(response, meta.transform);\n }\n return response;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Transform\n // ──────────────────────────────────────────────────────────────\n\n private applyTransform(response: any, transform: TransformMeta): any {\n // Custom transform\n if (transform.custom) {\n const fn = this.customTransforms.get(transform.custom);\n if (fn) return fn(response, transform);\n }\n\n // Root extraction\n if (transform.root) {\n response = transform.root.split('.').reduce((c: any, k: string) => c?.[k], response);\n }\n\n // Pick specific keys\n if (transform.pick && typeof response === 'object' && response !== null) {\n if (Array.isArray(response)) {\n response = response.map(item => this.pickKeys(item, transform.pick!));\n } else {\n response = this.pickKeys(response, transform.pick);\n }\n }\n\n // Omit specific keys\n if (transform.omit && typeof response === 'object' && response !== null) {\n if (Array.isArray(response)) {\n response = response.map(item => this.omitKeys(item, transform.omit!));\n } else {\n response = this.omitKeys(response, transform.omit);\n }\n }\n\n // Map keys\n if (transform.map && Array.isArray(response)) {\n response = response.map((item: any) => {\n const mapped: any = {};\n for (const [targetKey, sourceKey] of Object.entries(transform.map!)) {\n mapped[targetKey] = sourceKey.split('.').reduce((c: any, k: string) => c?.[k], item);\n }\n return mapped;\n });\n }\n\n // Sort\n if (transform.sort && Array.isArray(response)) {\n const dir = transform.sort.direction === 'desc' ? -1 : 1;\n const key = transform.sort.key;\n response = [...response].sort((a, b) => {\n if (a[key] < b[key]) return -1 * dir;\n if (a[key] > b[key]) return 1 * dir;\n return 0;\n });\n }\n\n // Flatten\n if (transform.flatten && Array.isArray(response)) {\n response = response.flat(Infinity);\n }\n\n return response;\n }\n\n private pickKeys(obj: any, keys: string[]): any {\n const result: any = {};\n for (const key of keys) {\n if (key in obj) result[key] = obj[key];\n }\n return result;\n }\n\n private omitKeys(obj: any, keys: string[]): any {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Cache\n // ──────────────────────────────────────────────────────────────\n\n private getCacheKey(meta: ApiEndpointMeta, params?: Record<string, string>): string {\n if (meta.cache?.key) return meta.cache.key;\n return `${meta.id}:${JSON.stringify(params || {})}`;\n }\n\n private getCached(meta: ApiEndpointMeta, params?: Record<string, string>): any | undefined {\n const key = this.getCacheKey(meta, params);\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n const ttl = meta.cache?.ttl || 60000; // default 60s\n if (Date.now() - entry.timestamp > ttl) {\n this.cache.delete(key);\n return undefined;\n }\n\n return entry.data;\n }\n\n private storeInCache(meta: ApiEndpointMeta, params: Record<string, string> | undefined, data: any): void {\n const key = this.getCacheKey(meta, params);\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl: meta.cache?.ttl || 60000\n });\n }\n\n // ──────────────────────────────────────────────────────────────\n // Retry\n // ──────────────────────────────────────────────────────────────\n\n private retryWithBackoff(retryConfig: RetryMeta) {\n return (source: any) => source.pipe(\n catchError((error: any, caught: any) => {\n return caught;\n }),\n rxRetry({\n count: retryConfig.maxRetries,\n delay: (error: any, retryCount: number) => {\n // Check if we should retry for this status\n const status = error?.status;\n if (retryConfig.retryOn?.length && status && !retryConfig.retryOn.includes(status)) {\n return throwError(() => error);\n }\n if (retryConfig.skipOn?.length && status && retryConfig.skipOn.includes(status)) {\n return throwError(() => error);\n }\n\n let delay = retryConfig.delay || 1000;\n if (retryConfig.exponential) {\n delay = delay * Math.pow(2, retryCount - 1);\n }\n if (retryConfig.maxDelay) {\n delay = Math.min(delay, retryConfig.maxDelay);\n }\n\n console.log(`[AvoraMetaForge] Retry ${retryCount}/${retryConfig.maxRetries} in ${delay}ms`);\n return timer(delay);\n }\n })\n );\n }\n\n // ──────────────────────────────────────────────────────────────\n // Base URL\n // ──────────────────────────────────────────────────────────────\n\n private resolveBaseUrl(meta: ApiEndpointMeta): string {\n // 1. Endpoint-level environment override\n if (meta.environment && this.environments.has(meta.environment)) {\n return this.environments.get(meta.environment)!.baseUrl;\n }\n // 2. Active global environment\n if (this.activeEnvironment && this.environments.has(this.activeEnvironment)) {\n return meta.baseUrl || this.environments.get(this.activeEnvironment)!.baseUrl;\n }\n // 3. Endpoint-level baseUrl\n return meta.baseUrl || '';\n }\n\n // ──────────────────────────────────────────────────────────────\n // Form Data\n // ──────────────────────────────────────────────────────────────\n\n private toFormData(obj: Record<string, any>): FormData {\n const formData = new FormData();\n for (const [key, value] of Object.entries(obj)) {\n if (value instanceof File) {\n formData.append(key, value, value.name);\n } else if (value instanceof FileList) {\n for (let i = 0; i < value.length; i++) {\n formData.append(key, value[i], value[i].name);\n }\n } else if (typeof value === 'object' && value !== null) {\n formData.append(key, JSON.stringify(value));\n } else {\n formData.append(key, String(value));\n }\n }\n return formData;\n }\n}\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n","/**\n * AvoraMetaForge — Condition Evaluator Service\n *\n * Evaluates all 35+ condition operators with support for:\n * - Strict/loose equality, comparisons, range checks\n * - String operations (contains, startsWith, endsWith, regex)\n * - Array operations (in, notIn, arrayContains, matchesAny, matchesAll)\n * - Type checks (isArray, isObject, isString, isNumber, isNull)\n * - Length checks (lengthEquals, lengthGreaterThan, lengthLessThan)\n * - Date comparisons (dateBefore, dateAfter, dateEquals)\n * - Logical grouping (and, or, negate)\n * - Multi-source resolution (context, state, form, route, storage)\n * - Custom evaluator functions (plugin-provided)\n */\nimport { Injectable, inject } from '@angular/core';\nimport { ConditionMeta } from '../models/meta.types';\n\ntype CustomEvaluatorFn = (context: any, condition: ConditionMeta) => boolean;\n\n@Injectable({ providedIn: 'root' })\nexport class ConditionEvaluatorService {\n private customEvaluators = new Map<string, CustomEvaluatorFn>();\n\n /** Register a custom evaluator function (from plugins or app code) */\n registerEvaluator(key: string, fn: CustomEvaluatorFn): void {\n this.customEvaluators.set(key, fn);\n }\n\n /** Evaluate a condition against a context object */\n evaluate(condition: ConditionMeta | undefined, context: Record<string, any>): boolean {\n if (!condition) return true;\n\n // Logical AND\n if (condition.and?.length) {\n const result = condition.and.every(c => this.evaluate(c, context));\n return condition.negate ? !result : result;\n }\n\n // Logical OR\n if (condition.or?.length) {\n const result = condition.or.some(c => this.evaluate(c, context));\n return condition.negate ? !result : result;\n }\n\n let result: boolean;\n\n // Custom evaluator\n if (condition.operator === 'custom' && condition.custom) {\n const evaluator = this.customEvaluators.get(condition.custom);\n result = evaluator ? evaluator(context, condition) : false;\n } else {\n // Resolve field value from the appropriate source\n const fieldValue = this.resolveFieldValue(condition, context);\n result = this.compare(fieldValue, condition.operator, condition.value, condition);\n }\n\n return condition.negate ? !result : result;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Value Resolution\n // ──────────────────────────────────────────────────────────────\n\n private resolveFieldValue(condition: ConditionMeta, context: Record<string, any>): any {\n const field = condition.field || '';\n const source = condition.source || 'context';\n\n switch (source) {\n case 'state': {\n // lazy import to avoid circular dependency — reads from MetaStateService\n // State values are resolved via context.state if provided\n return this.getNestedValue(context?.['state'] || context, field);\n }\n case 'route': {\n return this.getNestedValue(context?.['params'] || context?.['queryParams'] || context, field);\n }\n case 'form': {\n return this.getNestedValue(context?.['formValue'] || context, field);\n }\n case 'storage': {\n try {\n const raw = localStorage.getItem(field) || sessionStorage.getItem(field);\n return raw ? JSON.parse(raw) : undefined;\n } catch {\n return localStorage.getItem(field) || sessionStorage.getItem(field);\n }\n }\n case 'context':\n default:\n return this.getNestedValue(context, field);\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Comparison Engine\n // ──────────────────────────────────────────────────────────────\n\n private compare(fv: any, op: string, cv: any, condition?: ConditionMeta): boolean {\n // Normalize for case-insensitive string comparisons\n const ci = condition?.caseInsensitive;\n const fvStr = ci && typeof fv === 'string' ? fv.toLowerCase() : fv;\n const cvStr = ci && typeof cv === 'string' ? cv.toLowerCase() : cv;\n\n switch (op) {\n // --- Equality ---\n case '==': return fv == cv;\n case '!=': return fv != cv;\n case '===': return fv === cv;\n case '!==': return fv !== cv;\n\n // --- Numeric Comparison ---\n case '>': return fv > cv;\n case '>=': return fv >= cv;\n case '<': return fv < cv;\n case '<=': return fv <= cv;\n\n // --- Membership ---\n case 'in': return Array.isArray(cv) && cv.includes(fv);\n case 'notIn': return Array.isArray(cv) && !cv.includes(fv);\n\n // --- String Operations ---\n case 'contains': return typeof fvStr === 'string' && fvStr.includes(cvStr);\n case 'startsWith': return typeof fvStr === 'string' && fvStr.startsWith(cvStr);\n case 'endsWith': return typeof fvStr === 'string' && fvStr.endsWith(cvStr);\n case 'regex': return new RegExp(cv).test(String(fv));\n\n // --- Truthiness ---\n case 'truthy': return !!fv;\n case 'falsy': return !fv;\n case 'empty': return fv == null || fv === '' || (Array.isArray(fv) && fv.length === 0) || (typeof fv === 'object' && fv !== null && Object.keys(fv).length === 0);\n case 'notEmpty': return fv != null && fv !== '' && !(Array.isArray(fv) && fv.length === 0) && !(typeof fv === 'object' && fv !== null && Object.keys(fv).length === 0);\n\n // --- Range ---\n case 'between': {\n const range = condition?.range || (Array.isArray(cv) ? cv : []);\n return range.length >= 2 && fv >= range[0] && fv <= range[1];\n }\n case 'notBetween': {\n const range = condition?.range || (Array.isArray(cv) ? cv : []);\n return range.length >= 2 && (fv < range[0] || fv > range[1]);\n }\n\n // --- Type Checks ---\n case 'hasKey': return typeof fv === 'object' && fv !== null && cv in fv;\n case 'isArray': return Array.isArray(fv);\n case 'isObject': return typeof fv === 'object' && fv !== null && !Array.isArray(fv);\n case 'isString': return typeof fv === 'string';\n case 'isNumber': return typeof fv === 'number' && !isNaN(fv);\n case 'isNull': return fv == null;\n case 'isNotNull': return fv != null;\n\n // --- Length Checks ---\n case 'lengthEquals': {\n const len = this.getLength(fv);\n return len !== null && len === cv;\n }\n case 'lengthGreaterThan': {\n const len = this.getLength(fv);\n return len !== null && len > cv;\n }\n case 'lengthLessThan': {\n const len = this.getLength(fv);\n return len !== null && len < cv;\n }\n\n // --- Date Comparisons ---\n case 'dateBefore': {\n const d1 = new Date(fv); const d2 = new Date(cv);\n return !isNaN(d1.getTime()) && !isNaN(d2.getTime()) && d1 < d2;\n }\n case 'dateAfter': {\n const d1 = new Date(fv); const d2 = new Date(cv);\n return !isNaN(d1.getTime()) && !isNaN(d2.getTime()) && d1 > d2;\n }\n case 'dateEquals': {\n const d1 = new Date(fv); const d2 = new Date(cv);\n return !isNaN(d1.getTime()) && !isNaN(d2.getTime()) && d1.toDateString() === d2.toDateString();\n }\n\n // --- Array Operations ---\n case 'arrayContains': {\n return Array.isArray(fv) && fv.includes(cv);\n }\n case 'arrayNotContains': {\n return Array.isArray(fv) && !fv.includes(cv);\n }\n case 'matchesAny': {\n return Array.isArray(cv) && cv.some(v => fv === v);\n }\n case 'matchesAll': {\n return Array.isArray(cv) && cv.every(v => Array.isArray(fv) ? fv.includes(v) : fv === v);\n }\n\n default:\n console.warn(`[AvoraMetaForge] Unknown condition operator: \"${op}\"`);\n return false;\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Utilities\n // ──────────────────────────────────────────────────────────────\n\n private getLength(value: any): number | null {\n if (typeof value === 'string' || Array.isArray(value)) return value.length;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length;\n return null;\n }\n\n private getNestedValue(obj: any, path: string): any {\n if (!path) return obj;\n return path.split('.').reduce((current, key) => current?.[key], obj);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { DialogConfig } from '../../models/meta.types';\n\nexport interface DialogRequest {\n config: DialogConfig;\n resolve: (value: boolean) => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AmfDialogService {\n /** Emits the current dialog request down to the AmfDialogHostComponent */\n readonly dialogState$ = new Subject<DialogRequest | null>();\n\n /** \n * Opens a confirmation dialog and waits for user's explicit choice.\n * Resolves to true if confirmed, false if cancelled.\n */\n async confirm(configOrMessage: DialogConfig | string): Promise<boolean> {\n const config: DialogConfig = typeof configOrMessage === 'string'\n ? { message: configOrMessage, title: 'Confirm Action', showCancel: true, variant: 'warning', icon: 'alert-triangle' }\n : { showCancel: true, variant: 'warning', ...configOrMessage };\n\n return new Promise<boolean>((resolve) => {\n this.dialogState$.next({ config, resolve });\n });\n }\n\n /**\n * Opens a simple alert message box.\n * Resolves when the user clicks 'OK' to dismiss it.\n */\n async alert(configOrMessage: DialogConfig | string): Promise<void> {\n const config: DialogConfig = typeof configOrMessage === 'string'\n ? { message: configOrMessage, title: 'Alert', showCancel: false, variant: 'info', icon: 'info' }\n : { showCancel: false, variant: 'info', ...configOrMessage };\n\n return new Promise<void>((resolve) => {\n this.dialogState$.next({ \n config, \n resolve: () => resolve() \n });\n });\n }\n}\n","/**\n * AvoraMetaForge — Action Dispatcher Service\n *\n * Central orchestrator that executes all declarative actions.\n * Supports 35+ built-in action types with chainable `then` / `onError`,\n * parallel fan-out, conditional branching, and plugin-provided handlers.\n *\n * Every action type from ActionMeta is wired here — no missing handlers.\n */\nimport { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport {\n ActionMeta, NavigateActionConfig, NotifyActionConfig, EmitActionConfig,\n ApiActionConfig, ConfirmActionConfig, ModalActionConfig, DrawerActionConfig,\n SetStateActionConfig, ClearStateActionConfig, ResetFormActionConfig,\n PatchFormActionConfig, SubmitFormActionConfig, ReloadTableActionConfig,\n ScrollToActionConfig, LoadingActionConfig, DownloadFileActionConfig,\n CopyToClipboardActionConfig, OpenUrlActionConfig, StorageActionConfig,\n DispatchMultipleActionConfig, DelayActionConfig, ConditionalActionConfig,\n ForEachActionConfig, TransformContextActionConfig, LogActionConfig,\n PrintActionConfig, FocusActionConfig, ToggleClassActionConfig, SetTitleActionConfig\n} from '../models/meta.types';\nimport { NotificationService } from '../../core/notifications/notification.service';\nimport { MetaApiService } from '../services/meta-api.service';\nimport { MetaStateService } from '../services/meta-state.service';\nimport { ConditionEvaluatorService } from './condition-evaluator.service';\nimport { AmfDialogService } from './services/amf-dialog.service';\nimport { Subject } from 'rxjs';\n\ntype CustomActionFn = (config: any, context: any) => any;\n\n@Injectable({ providedIn: 'root' })\nexport class ActionDispatcherService {\n private readonly router = inject(Router);\n private readonly titleService = inject(Title);\n private readonly notifications = inject(NotificationService);\n private readonly apiService = inject(MetaApiService);\n private readonly stateService = inject(MetaStateService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n private readonly dialogService = inject(AmfDialogService);\n\n private readonly customHandlers = new Map<string, CustomActionFn>();\n private readonly _events$ = new Subject<{ event: string; payload: any }>();\n private readonly _modalEvents$ = new Subject<{ action: 'open' | 'close'; config: any }>();\n private readonly _drawerEvents$ = new Subject<{ action: 'open' | 'close'; config: any }>();\n private readonly _formEvents$ = new Subject<{ action: 'reset' | 'patch' | 'submit'; config: any }>();\n private readonly _tableEvents$ = new Subject<{ action: 'reload'; config: any }>();\n private readonly _loadingState = new Map<string, boolean>();\n\n /** General event bus */\n readonly events$ = this._events$.asObservable();\n\n /** Modal open/close events */\n readonly modalEvents$ = this._modalEvents$.asObservable();\n\n /** Drawer open/close events */\n readonly drawerEvents$ = this._drawerEvents$.asObservable();\n\n /** Form manipulation events */\n readonly formEvents$ = this._formEvents$.asObservable();\n\n /** Table reload events */\n readonly tableEvents$ = this._tableEvents$.asObservable();\n\n /** Register a custom action handler */\n registerHandler(type: string, handler: CustomActionFn): void {\n this.customHandlers.set(type, handler);\n }\n\n /** Check loading state */\n isLoading(key: string = 'global'): boolean {\n return this._loadingState.get(key) || false;\n }\n\n // ──────────────────────────────────────────────────────────────\n // Main Dispatch\n // ──────────────────────────────────────────────────────────────\n\n async dispatch(action: ActionMeta, context?: any): Promise<any> {\n try {\n let result: any;\n\n switch (action.type) {\n // --- Navigation ---\n case 'navigate':\n result = await this.handleNavigate(action.config as NavigateActionConfig, context);\n break;\n\n case 'go-back':\n window.history.back();\n break;\n\n case 'go-forward':\n window.history.forward();\n break;\n\n case 'reload-page':\n window.location.reload();\n break;\n\n // --- API ---\n case 'api':\n result = await this.handleApi(action.config as ApiActionConfig, context);\n break;\n\n // --- Notifications ---\n case 'notify':\n this.handleNotify(action.config as NotifyActionConfig, context);\n break;\n\n // --- Event Bus ---\n case 'emit':\n this.handleEmit(action.config as EmitActionConfig, context);\n break;\n\n // --- Confirmation ---\n case 'confirm':\n result = await this.handleConfirm(action.config as ConfirmActionConfig, context);\n return; // confirm handles its own chaining\n\n // --- Modal ---\n case 'open-modal':\n this._modalEvents$.next({ action: 'open', config: action.config });\n break;\n\n case 'close-modal':\n this._modalEvents$.next({ action: 'close', config: action.config });\n break;\n\n // --- Drawer ---\n case 'open-drawer':\n case 'openDrawer':\n this._drawerEvents$.next({ action: 'open', config: action.config });\n break;\n\n case 'close-drawer':\n case 'closeDrawer':\n this._drawerEvents$.next({ action: 'close', config: action.config });\n break;\n\n // --- State Management ---\n case 'set-state':\n this.handleSetState(action.config as SetStateActionConfig, context);\n break;\n\n case 'clear-state':\n this.handleClearState(action.config as ClearStateActionConfig);\n break;\n\n // --- Form Manipulation ---\n case 'reset-form':\n this._formEvents$.next({ action: 'reset', config: action.config });\n break;\n\n case 'patch-form':\n const patchConfig = { ...(action.config as PatchFormActionConfig) };\n const patchValues = patchConfig.values as any;\n if (typeof patchValues === 'string' && patchValues.startsWith('fromContext:')) {\n patchConfig.values = this.resolveContextPath(context, patchValues.substring(12));\n }\n this._formEvents$.next({ action: 'patch', config: patchConfig });\n break;\n\n case 'submit-form':\n this._formEvents$.next({ action: 'submit', config: action.config });\n break;\n\n // --- Table Control ---\n case 'reload-table':\n this._tableEvents$.next({ action: 'reload', config: action.config });\n break;\n\n // --- Scroll / Focus / UI ---\n case 'scroll-to':\n this.handleScrollTo(action.config as ScrollToActionConfig);\n break;\n\n case 'focus':\n this.handleFocus(action.config as FocusActionConfig);\n break;\n\n case 'blur':\n this.handleBlur(action.config as FocusActionConfig);\n break;\n\n case 'toggle-class':\n this.handleToggleClass(action.config as ToggleClassActionConfig);\n break;\n\n case 'set-title': {\n const titleCfg = action.config as SetTitleActionConfig;\n let title = titleCfg.title;\n // Resolve context references (e.g. fromContext:formValue.appName)\n if (typeof title === 'string' && title.startsWith('fromContext:')) {\n title = this.resolveContextPath(context, title.substring('fromContext:'.length));\n }\n if (title) this.titleService.setTitle(String(title));\n break;\n }\n\n // --- Loading ---\n case 'set-loading':\n this.handleSetLoading(action.config as LoadingActionConfig, true);\n break;\n\n case 'clear-loading':\n this.handleSetLoading(action.config as LoadingActionConfig, false);\n break;\n\n // --- Download / Clipboard / URL ---\n case 'download-file':\n await this.handleDownloadFile(action.config as DownloadFileActionConfig, context);\n break;\n\n case 'copy-to-clipboard':\n await this.handleCopyToClipboard(action.config as CopyToClipboardActionConfig, context);\n break;\n\n case 'open-url':\n this.handleOpenUrl(action.config as OpenUrlActionConfig);\n break;\n\n // --- Storage ---\n case 'set-storage':\n this.handleSetStorage(action.config as StorageActionConfig, context);\n break;\n\n case 'remove-storage':\n this.handleRemoveStorage(action.config as StorageActionConfig);\n break;\n\n // --- Flow Control ---\n case 'dispatch-multiple':\n result = await this.handleDispatchMultiple(action.config as DispatchMultipleActionConfig, context);\n break;\n\n case 'delay':\n await this.handleDelay(action.config as DelayActionConfig);\n break;\n\n case 'conditional':\n const _cfg = action.config as ConditionalActionConfig;\n const conditionalResult = this.conditionEvaluator.evaluate(_cfg.condition, context);\n const nextAction = conditionalResult ? _cfg.onTrue : _cfg.onFalse;\n if (nextAction) {\n result = await this.dispatch(nextAction, context);\n }\n break;\n\n case 'for-each':\n await this.handleForEach(action.config as ForEachActionConfig, context);\n break;\n\n case 'transform-context':\n context = this.handleTransformContext(action.config as TransformContextActionConfig, context);\n break;\n\n // --- Debug ---\n case 'log':\n this.handleLog(action.config as LogActionConfig, context);\n break;\n\n case 'print':\n this.handlePrint(action.config as PrintActionConfig);\n break;\n\n // --- Legacy ---\n case 'store-data':\n this.handleStoreData(action.config as any, context);\n break;\n\n // --- Custom / Plugin ---\n default: {\n const handler = this.customHandlers.get(action.type);\n if (handler) {\n result = await handler(action.config, context);\n } else {\n console.warn(`[AvoraMetaForge] No handler registered for action type: \"${action.type}\"`);\n }\n }\n }\n\n // Chain the next action\n if (action.then) {\n const nextContext = result !== undefined ? { ...context, result } : context;\n await this.dispatch(action.then, nextContext);\n }\n\n return result;\n } catch (error) {\n console.error(`[AvoraMetaForge] Action \"${action.type}\" failed:`, error);\n if (action.onError) {\n await this.dispatch(action.onError, { ...context, error });\n } else {\n throw error;\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Handler Implementations\n // ──────────────────────────────────────────────────────────────\n\n private async handleNavigate(config: NavigateActionConfig, context?: any): Promise<void> {\n const processVars = (target: any) => {\n if (!target) return undefined;\n const result = { ...target };\n for (const [key, val] of Object.entries(result)) {\n if (typeof val === 'string' && val.startsWith('fromContext:')) {\n result[key] = this.resolveContextPath(context, val.substring(12));\n }\n }\n return result;\n };\n\n const extras: any = {\n queryParams: processVars(config.queryParams),\n replaceUrl: config.replaceUrl,\n fragment: config.fragment,\n skipLocationChange: config.skipLocationChange\n };\n\n // Merge state\n if (config.state || context) {\n extras.state = { ...processVars(config.state), ...(context.row ? { row: context.row } : {}) };\n }\n\n await this.router.navigate([config.path], extras);\n }\n\n private async handleApi(config: ApiActionConfig, context?: any): Promise<any> {\n let response: any;\n\n if (config.mock) {\n // Inline mock\n response = config.mockData;\n } else if (config.endpointId) {\n // Call registered endpoint\n const body = config.body === 'formValue' ? context?.formValue : config.body;\n response = await this.apiService.call(\n config.endpointId,\n config.pathParams,\n body,\n { headers: config.headers, queryParams: config.queryParams }\n );\n } else if (config.url) {\n // Inline call\n const body = config.body === 'formValue' ? context?.formValue : config.body;\n response = await this.apiService.callDirect({\n url: config.url,\n method: config.method || 'GET',\n body,\n headers: config.headers,\n queryParams: config.queryParams,\n responseType: config.responseType,\n });\n }\n\n // Store result in context\n if (config.storeResultAs && context) {\n context[config.storeResultAs] = response;\n }\n\n // Store result in state\n if (config.storeInState) {\n this.stateService.set(config.storeInState, response);\n }\n\n return response;\n }\n\n private handleNotify(config: NotifyActionConfig, context?: any): void {\n const message = this.interpolateTemplate(config.message, context);\n this.notifications.show(config.type, message, config.duration);\n }\n\n /** Replace {{key}} and {{key.nested}} tokens with values from context */\n private interpolateTemplate(template: string, context?: any): string {\n if (!template || !context) return template;\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_, path) => {\n const val = this.resolveContextPath(context, path.trim());\n return val !== undefined && val !== null ? String(val) : '';\n });\n }\n\n private handleEmit(config: EmitActionConfig, context?: any): void {\n const payload = config.includeContext ? { ...config.payload, context } : config.payload;\n this._events$.next({ event: config.event, payload });\n }\n\n private async handleConfirm(config: ConfirmActionConfig, context?: any): Promise<void> {\n const confirmed = await this.dialogService.confirm(config as any);\n if (confirmed) {\n await this.dispatch(config.onConfirm, context);\n } else if (config.onCancel) {\n await this.dispatch(config.onCancel, context);\n }\n }\n\n private handleSetState(config: SetStateActionConfig, context?: any): void {\n let value = config.value;\n\n // Resolve value from context\n if (typeof value === 'string' && value.startsWith('fromContext:')) {\n const path = value.substring('fromContext:'.length);\n value = this.resolveContextPath(context, path);\n }\n\n if (config.merge) {\n this.stateService.merge(config.key, value, config.persist);\n } else {\n this.stateService.set(config.key, value, config.persist);\n }\n }\n\n private handleClearState(config: ClearStateActionConfig): void {\n this.stateService.clear(config.key, config.clearPersisted);\n }\n\n private handleScrollTo(config: ScrollToActionConfig): void {\n if (config.target) {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el) {\n el.scrollIntoView({ behavior: config.behavior || 'smooth', block: config.block || 'start' });\n return;\n }\n }\n if (config.top !== undefined) {\n window.scrollTo({ top: config.top, behavior: config.behavior || 'smooth' });\n }\n }\n\n private handleFocus(config: FocusActionConfig): void {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el && el instanceof HTMLElement) {\n el.focus();\n }\n }\n\n private handleBlur(config: FocusActionConfig): void {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el && el instanceof HTMLElement) {\n el.blur();\n }\n }\n\n private handleToggleClass(config: ToggleClassActionConfig): void {\n const el = document.querySelector(config.target) || document.getElementById(config.target.replace('#', ''));\n if (el) {\n switch (config.action) {\n case 'add': el.classList.add(config.className); break;\n case 'remove': el.classList.remove(config.className); break;\n case 'toggle': el.classList.toggle(config.className); break;\n }\n }\n }\n\n private handleSetLoading(config: LoadingActionConfig, loading: boolean): void {\n const key = config.key || 'global';\n this._loadingState.set(key, loading);\n this.stateService.set(`loading.${key}`, loading);\n }\n\n private async handleDownloadFile(config: DownloadFileActionConfig, context?: any): Promise<void> {\n let blob: Blob;\n\n if (config.content) {\n // Download string content as file\n blob = new Blob([config.content], { type: config.mimeType || 'text/plain' });\n } else if (config.endpointId) {\n // Download from API endpoint\n const response = await this.apiService.call(config.endpointId);\n blob = response instanceof Blob ? response : new Blob([JSON.stringify(response)], { type: 'application/json' });\n } else if (config.url) {\n // Download from URL\n const response = await this.apiService.callDirect({\n url: config.url,\n method: 'GET',\n responseType: 'blob'\n });\n blob = response;\n } else {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = config.filename || 'download';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n\n private async handleCopyToClipboard(config: CopyToClipboardActionConfig, context?: any): Promise<void> {\n let text = config.text;\n if (typeof text === 'string' && text.startsWith('fromContext:')) {\n text = this.resolveContextPath(context, text.substring('fromContext:'.length));\n }\n\n try {\n await navigator.clipboard.writeText(String(text));\n if (config.successMessage) {\n this.notifications.show('success', config.successMessage);\n }\n } catch (err) {\n // Fallback for older browsers\n const ta = document.createElement('textarea');\n ta.value = String(text);\n ta.style.position = 'fixed';\n ta.style.left = '-9999px';\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n if (config.successMessage) {\n this.notifications.show('success', config.successMessage);\n }\n }\n }\n\n private handleOpenUrl(config: OpenUrlActionConfig): void {\n window.open(config.url, config.target || '_blank', config.features);\n }\n\n private handleSetStorage(config: StorageActionConfig, context?: any): void {\n const storage = config.storage === 'local' ? localStorage : sessionStorage;\n let value = config.value;\n if (typeof value === 'string' && value.startsWith('fromContext:')) {\n value = this.resolveContextPath(context, value.substring('fromContext:'.length));\n }\n storage.setItem(config.key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n\n private handleRemoveStorage(config: StorageActionConfig): void {\n const storage = config.storage === 'local' ? localStorage : sessionStorage;\n storage.removeItem(config.key);\n }\n\n private async handleDispatchMultiple(config: DispatchMultipleActionConfig, context?: any): Promise<any[]> {\n if (config.mode === 'sequential') {\n const results: any[] = [];\n for (const action of config.actions) {\n try {\n results.push(await this.dispatch(action, context));\n } catch (error) {\n if (config.stopOnError) throw error;\n results.push(error);\n }\n }\n return results;\n } else {\n // Parallel by default\n return Promise.all(config.actions.map(action => this.dispatch(action, context)));\n }\n }\n\n private async handleDelay(config: DelayActionConfig): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, config.duration));\n }\n\n private async handleConditional(config: ConditionalActionConfig, context?: any): Promise<void> {\n const result = this.conditionEvaluator.evaluate(config.condition, context || {});\n if (result) {\n await this.dispatch(config.onTrue, context);\n } else if (config.onFalse) {\n await this.dispatch(config.onFalse, context);\n }\n }\n\n private async handleForEach(config: ForEachActionConfig, context?: any): Promise<void> {\n const items = this.resolveContextPath(context, config.items);\n if (!Array.isArray(items)) {\n console.warn(`[AvoraMetaForge] for-each: \"${config.items}\" is not an array`);\n return;\n }\n\n if (config.mode === 'sequential') {\n for (const item of items) {\n await this.dispatch(config.action, { ...context, item });\n }\n } else {\n await Promise.all(items.map(item => this.dispatch(config.action, { ...context, item })));\n }\n }\n\n private handleTransformContext(config: TransformContextActionConfig, context?: any): any {\n const transformed: any = {};\n for (const [targetKey, sourcePath] of Object.entries(config.map)) {\n transformed[targetKey] = this.resolveContextPath(context, sourcePath);\n }\n return config.merge ? { ...context, ...transformed } : transformed;\n }\n\n private handleLog(config: LogActionConfig, context?: any): void {\n const level = config.level || 'log';\n const prefix = '[AvoraMetaForge Debug]';\n\n if (config.logContext) {\n (console as any)[level](prefix, config.message || 'Context:', context);\n } else if (config.path) {\n const value = this.resolveContextPath(context, config.path);\n (console as any)[level](prefix, config.message || config.path, value);\n } else {\n (console as any)[level](prefix, config.message || 'Action logged');\n }\n }\n\n private handlePrint(config: PrintActionConfig): void {\n if (config.target) {\n const el = document.querySelector(config.target);\n if (el) {\n const printWindow = window.open('', '_blank');\n if (printWindow) {\n printWindow.document.write(`\n <html><head><title>${config.title || 'Print'}</title>\n <style>body { font-family: system-ui, sans-serif; padding: 20px; }</style>\n </head><body>${el.innerHTML}</body></html>\n `);\n printWindow.document.close();\n printWindow.print();\n printWindow.close();\n }\n }\n } else {\n window.print();\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // Built-in Client-Side Data Store (Demo / Testbed Action)\n // ────────────────────────────────────────────────────────────────\n\n /**\n * Built-in CLIENT-SIDE CRUD SIMULATOR — for demos and testbeds only.\n *\n * This action uses `sessionStorage` as a temporary in-memory database so that\n * CRUD operations (add / edit / delete) work without any backend connection.\n * Data does NOT persist across browser sessions or tabs.\n *\n * ## When to use this\n * Use `store-data` when you want to demonstrate or test a complete CRUD flow\n * (Add → Edit → Delete) entirely in the browser, with zero backend setup.\n * It is intentionally available to any AvoraMetaForge user for rapid prototyping.\n *\n * ## How to switch to a real backend\n * Replace the `store-data` action with an `api` action pointing to your endpoint:\n *\n * ```ts\n * // BEFORE (client-side mock):\n * { type: 'store-data', config: { storageKey: 'amf_table_users', action: 'add' } }\n *\n * // AFTER (real backend):\n * { type: 'api', config: { endpointId: 'create-user', body: 'formValue',\n * storeResultAs: 'newUser' } }\n * ```\n *\n * ## Config options\n * - `storageKey` — sessionStorage key (default: 'amf_demo_data')\n * - `action` — 'add' | 'edit' | 'delete'\n * - `identifierKey` — row identity field (default: 'id')\n * - `computedFields` — derived string fields interpolated from formValue\n * - `autoTimestampField`— if set, auto-stamps this field with an ISO date on 'add'\n */\n private handleStoreData(config: any, context: any): void {\n const key = config.storageKey || 'amf_demo_data';\n let data = JSON.parse(sessionStorage.getItem(key) || '[]');\n const identifier = config.identifierKey || 'id';\n\n // Compute derived fields based on config\n const computedValues: any = {};\n if (config.computedFields && context.formValue) {\n for (const [field, template] of Object.entries(config.computedFields)) {\n if (typeof template === 'string') {\n // Simple string interpolation: ${fieldName}\n computedValues[field] = template.replace(/\\$\\{([^}]+)\\}/g, (_, k) => context.formValue[k] || '').trim();\n }\n }\n }\n\n if (config.action === 'add') {\n const formValue = { ...context.formValue, ...computedValues };\n // Auto-stamp a timestamp field if configured (config-driven, not hardcoded)\n const tsField = config.autoTimestampField || 'joinDate';\n if (!formValue[tsField]) formValue[tsField] = new Date().toISOString();\n if (!formValue.id) formValue.id = Date.now();\n data.unshift(formValue);\n } else if (config.action === 'edit') {\n const idValue = context?.state?.row?.[identifier] || context.formValue?.[identifier] || context.formValue?.email;\n const index = data.findIndex((i: any) => i[identifier] === idValue || (idValue && i.email === idValue));\n\n if (index > -1) {\n const updatedFormValue = { ...context.formValue, ...computedValues };\n data[index] = { ...data[index], ...updatedFormValue };\n } else {\n data.unshift({ ...context.formValue, ...computedValues });\n }\n } else if (config.action === 'delete') {\n const idValue = context?.row?.[identifier] || context?.row?.email;\n data = data.filter((i: any) => i[identifier] !== idValue && i.email !== idValue);\n }\n sessionStorage.setItem(key, JSON.stringify(data));\n }\n\n // ──────────────────────────────────────────────────────────────\n // Utilities\n // ──────────────────────────────────────────────────────────────\n\n private resolveContextPath(context: any, path: string): any {\n if (!context || !path) return undefined;\n return path.split('.').reduce((obj, key) => obj?.[key], context);\n }\n}\n","/**\n * AvoraMetaForge — Component Registry Service\n */\nimport { Injectable, Type } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ComponentRegistryService {\n private readonly registry = new Map<string, Type<any>>();\n\n register(key: string, component: Type<any>): void { this.registry.set(key, component); }\n registerAll(entries: Record<string, Type<any>>): void { for (const [key, component] of Object.entries(entries)) { this.register(key, component); } }\n get(key: string): Type<any> | undefined { return this.registry.get(key); }\n has(key: string): boolean { return this.registry.has(key); }\n keys(): string[] { return Array.from(this.registry.keys()); }\n unregister(key: string): boolean { return this.registry.delete(key); }\n}\n","/**\n * AvoraMetaForge — Meta Renderer Component\n */\nimport { Component, Input, ViewContainerRef, inject, OnChanges, SimpleChanges, ViewChild, OnDestroy } from '@angular/core';\nimport { ComponentRegistryService } from './component-registry.service';\nimport { ConditionEvaluatorService } from './condition-evaluator.service';\nimport { SectionMeta } from '../models/meta.types';\n\n@Component({\n selector: 'amf-renderer',\n standalone: true,\n template: `<ng-container #outlet></ng-container>`,\n styles: [`:host { display: block; }`]\n})\nexport class MetaRendererComponent implements OnChanges, OnDestroy {\n @Input() section!: SectionMeta;\n @Input() context: any = {};\n @ViewChild('outlet', { read: ViewContainerRef, static: true }) outlet!: ViewContainerRef;\n\n private readonly registry = inject(ComponentRegistryService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n\n ngOnChanges(changes: SimpleChanges): void { if (changes['section'] || changes['context']) this.render(); }\n ngOnDestroy(): void { this.outlet?.clear(); }\n\n private render(): void {\n this.outlet.clear();\n if (!this.section) return;\n\n if (this.section.visibleWhen && !this.conditionEvaluator.evaluate(this.section.visibleWhen, this.context)) return;\n\n const componentType = this.registry.get(this.section.type);\n if (!componentType) { console.warn(`[AvoraMetaForge] No component registered for type: \"${this.section.type}\"`); return; }\n\n const componentRef = this.outlet.createComponent(componentType);\n const instance = componentRef.instance;\n\n if ('config' in instance) instance.config = { ...this.section.config, _sectionId: this.section.id };\n if ('context' in instance) instance.context = this.context;\n\n const hostEl = (componentRef.location.nativeElement as HTMLElement);\n if (this.section.cssClass) hostEl.classList.add(...this.section.cssClass.split(' '));\n if (this.section.style) { for (const [prop, value] of Object.entries(this.section.style)) hostEl.style.setProperty(prop, value); }\n if (this.section.gridArea) hostEl.style.gridArea = this.section.gridArea;\n if (this.section.gridColumn) hostEl.style.gridColumn = this.section.gridColumn;\n if (this.section.gridRow) hostEl.style.gridRow = this.section.gridRow;\n }\n}\n","/**\n * AvoraMetaForge — Meta Page Component\n *\n * Generic page component that receives PageMeta from route data\n * and delegates rendering to MetaRendererComponent for each section.\n *\n * Enhanced with:\n * - Lifecycle hooks: onInit, onDestroy, onParamChange, onQueryChange\n * - Breadcrumb generation\n * - Page title management\n * - Deactivation guard support (canDeactivate with dirty check)\n * - Scroll-to-top on navigation\n * - Page-level animation support\n *\n * CRITICAL: Uses reactive route.data (toSignal) instead of snapshot\n * so the component re-renders when navigating between pages that\n * share this same component (Angular reuses component instances).\n */\nimport { Component, inject, computed, DestroyRef, OnDestroy, effect } from '@angular/core';\n\nimport { ActivatedRoute, Data, Router, NavigationEnd, Params } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { filter, distinctUntilChanged, map } from 'rxjs/operators';\nimport { PageMeta } from '../models/meta.types';\nimport { MetaRendererComponent } from './meta-renderer.component';\nimport { ActionDispatcherService } from './action-dispatcher.service';\nimport { AmfDialogService } from './services/amf-dialog.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-page',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n @if (pageMeta()) {\n <div class=\"amf-page-wrapper\" [class]=\"pageMeta()!.cssClass || ''\"\n [class.amf-animate-fade]=\"pageMeta()!.animation === 'fade'\"\n [class.amf-animate-slide-up]=\"pageMeta()!.animation === 'slide-up'\"\n [class.amf-animate-zoom]=\"pageMeta()!.animation === 'zoom'\">\n @for (section of pageMeta()!.sections; track $index) {\n <amf-renderer [section]=\"section\" [context]=\"context()\" class=\"amf-section\"></amf-renderer>\n }\n </div>\n }\n `,\n styles: [`\n .amf-page-wrapper { display: flex; flex-direction: column; gap: 24px; width: 100%; }\n .amf-section { display: block; width: 100%; }\n\n /* Page animations */\n .amf-animate-fade { animation: amfFadeIn 0.3s ease-out; }\n .amf-animate-slide-up { animation: amfSlideUp 0.3s ease-out; }\n .amf-animate-zoom { animation: amfZoom 0.3s ease-out; }\n\n @keyframes amfFadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes amfSlideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n @keyframes amfZoom { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } }\n `]\n})\nexport class MetaPageComponent implements OnDestroy {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly titleService = inject(Title);\n private readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly dialogService = inject(AmfDialogService);\n private readonly destroyRef = inject(DestroyRef);\n\n private subscriptions: Subscription[] = [];\n private previousParams: string | null = null;\n private previousQueryParams: string | null = null;\n private initDispatched = false;\n\n /** Reactive route data — updates automatically on navigation */\n private readonly routeData = toSignal(this.route.data, { initialValue: {} as Data });\n\n /** Computed PageMeta from route data */\n readonly pageMeta = computed(() => {\n const data = this.routeData();\n return (data?.['pageMeta'] as PageMeta) ?? null;\n });\n\n /** Computed context from route data */\n readonly context = computed(() => {\n const data = this.routeData();\n const meta = this.pageMeta();\n return {\n params: this.route.snapshot.params,\n queryParams: this.route.snapshot.queryParams,\n state: this.router.getCurrentNavigation()?.extras.state || history.state,\n data,\n pageMeta: meta\n };\n });\n\n constructor() {\n // React to page meta changes (fires onInit, sets title, etc.)\n effect(() => {\n const meta = this.pageMeta();\n if (meta) {\n this.onPageMetaChange(meta);\n }\n });\n\n // Watch param changes\n const paramSub = this.route.params.pipe(\n map((p: Params) => JSON.stringify(p)),\n distinctUntilChanged()\n ).subscribe(paramsStr => {\n if (this.previousParams !== null && this.previousParams !== paramsStr) {\n const meta = this.pageMeta();\n if (meta?.onParamChange) {\n this.actionDispatcher.dispatch(meta.onParamChange, this.context());\n }\n }\n this.previousParams = paramsStr;\n });\n this.subscriptions.push(paramSub);\n\n // Watch query param changes\n const querySub = this.route.queryParams.pipe(\n map((p: Params) => JSON.stringify(p)),\n distinctUntilChanged()\n ).subscribe(queryStr => {\n if (this.previousQueryParams !== null && this.previousQueryParams !== queryStr) {\n const meta = this.pageMeta();\n if (meta?.onQueryChange) {\n this.actionDispatcher.dispatch(meta.onQueryChange, this.context());\n }\n }\n this.previousQueryParams = queryStr;\n });\n this.subscriptions.push(querySub);\n }\n\n private onPageMetaChange(meta: PageMeta): void {\n // Set page title\n if (meta.title) {\n this.titleService.setTitle(meta.title);\n }\n\n // Scroll to top\n if (meta.scrollToTop !== false) {\n window.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior });\n }\n\n // Dispatch onInit (only once per navigation to this page)\n if (meta.onInit && !this.initDispatched) {\n this.initDispatched = true;\n this.actionDispatcher.dispatch(meta.onInit, this.context());\n }\n\n // Reset init flag when page changes\n this.destroyRef.onDestroy(() => {\n this.initDispatched = false;\n });\n }\n\n ngOnDestroy(): void {\n const meta = this.pageMeta();\n\n // Dispatch onDestroy\n if (meta?.onDestroy) {\n this.actionDispatcher.dispatch(meta.onDestroy, this.context());\n }\n\n // Cleanup subscriptions\n this.subscriptions.forEach(s => s.unsubscribe());\n }\n\n /**\n * canDeactivate check — called by the router guard.\n * Returns true if safe to navigate away, or a confirm dialog if dirty.\n */\n canDeactivate(): boolean | Promise<boolean> {\n const meta = this.pageMeta();\n if (meta?.canDeactivate) {\n const message = meta.deactivateMessage || 'You have unsaved changes. Are you sure you want to leave?';\n return this.dialogService.confirm(message);\n }\n return true;\n }\n}\n","import { Injectable, inject, computed, Signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { MetaStateService } from '../../avora-meta-forge/services/meta-state.service';\nimport { MetaApiService } from '../../avora-meta-forge/services/meta-api.service';\nimport { GlobalAuthMeta } from '../../avora-meta-forge/models/meta.types';\n\nexport interface AuthUser {\n id?: string;\n email?: string;\n name?: string;\n roles?: string[];\n permissions?: string[];\n avatar?: string;\n role?: string; // Kept for backwards compatibility with legacy UI templates\n [key: string]: any;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private readonly state = inject(MetaStateService);\n private readonly apiService = inject(MetaApiService);\n private readonly router = inject(Router);\n private config: GlobalAuthMeta | null = null;\n private refreshTimer: any;\n private isDevMode = false;\n\n private readonly REDIRECT_KEY = 'amf_auth_redirect';\n\n // ──────────────────────────────────────────────────────────────\n // Reactive Signals (For UI Binding)\n // ──────────────────────────────────────────────────────────────\n\n readonly user: Signal<AuthUser | null> = this.state.select('auth.user');\n readonly isAuthenticated: Signal<boolean> = computed(() => {\n const isAuth = this.state.select('auth.isAuthenticated')();\n if (!isAuth) return false;\n return !this.isTokenExpired();\n });\n\n // ──────────────────────────────────────────────────────────────\n // Configuration\n // ──────────────────────────────────────────────────────────────\n\n configure(authConfig: GlobalAuthMeta, isDevMode: boolean = false): void {\n this.config = authConfig;\n this.isDevMode = isDevMode;\n\n // Load persisted token on startup\n const token = this.getStoredToken();\n if (token) {\n this.state.set('auth.token', token);\n this.state.set('auth.isAuthenticated', true);\n\n if (authConfig.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n // Load persisted user\n const userRaw = this.getFromStorage(`${authConfig.tokenKey || 'amf_auth'}_user`);\n if (userRaw) {\n try {\n const user = JSON.parse(userRaw);\n this.state.set('auth.user', user);\n } catch { /* invalid stored user */ }\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Token Management\n // ──────────────────────────────────────────────────────────────\n\n setToken(token: string, refreshToken?: string): void {\n const storage = this.getStorage();\n const tokenKey = this.config?.tokenKey || 'amf_auth_token';\n\n storage.setItem(tokenKey, token);\n this.state.set('auth.token', token);\n this.state.set('auth.isAuthenticated', true);\n\n if (refreshToken) {\n const refreshKey = this.config?.refreshTokenKey || 'amf_auth_refresh';\n storage.setItem(refreshKey, refreshToken);\n this.state.set('auth.refreshToken', refreshToken);\n }\n\n if (this.config?.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n getToken(): string | null {\n return this.state.get('auth.token') || this.getStoredToken();\n }\n\n getRefreshToken(): string | null {\n const refreshKey = this.config?.refreshTokenKey || 'amf_auth_refresh';\n return this.getFromStorage(refreshKey);\n }\n\n // ──────────────────────────────────────────────────────────────\n // User Management\n // ──────────────────────────────────────────────────────────────\n\n setUser(user: AuthUser): void {\n this.state.set('auth.user', user);\n this.state.set('auth.roles', user.roles || []);\n this.state.set('auth.permissions', user.permissions || []);\n\n const tokenKey = this.config?.tokenKey || 'amf_auth';\n const storage = this.getStorage();\n storage.setItem(`${tokenKey}_user`, JSON.stringify(user));\n }\n\n getUserProfile(): AuthUser | null {\n return this.state.get('auth.user') || null;\n }\n\n hasRole(role: string | string[]): boolean {\n const roles: string[] = this.state.get('auth.roles') || [];\n \n // Check fallback if single role property is mapped directly \n const singleRole = this.user()?.role;\n if (singleRole && Array.isArray(role) && role.includes(singleRole)) return true;\n if (singleRole && !Array.isArray(role) && role === singleRole) return true;\n\n if (Array.isArray(role)) {\n return role.some(r => roles.includes(r));\n }\n return roles.includes(role);\n }\n\n hasPermission(permission: string): boolean {\n const permissions: string[] = this.state.get('auth.permissions') || [];\n return permissions.includes(permission);\n }\n\n // ──────────────────────────────────────────────────────────────\n // Login / Logout\n // ──────────────────────────────────────────────────────────────\n\n async login(credentials: Record<string, any>, preventRedirect = false): Promise<any> {\n // DEV MODE MOCK LOGIN\n if (this.isDevMode && (!this.config || !this.config.loginEndpoint || this.config.mock)) {\n return this._mockLogin(credentials['email'], credentials['password'], preventRedirect);\n }\n\n if (!this.config?.loginEndpoint) {\n throw new Error('[AvoraMetaForge] No login endpoint configured. Set loginEndpoint in AppMeta or enable devMode mock auth.');\n }\n\n const response = await this.apiService.call(this.config.loginEndpoint, undefined, credentials);\n\n if (response?.token) {\n this.setToken(response.token, response.refreshToken);\n }\n if (response?.user) {\n this.setUser(response.user);\n }\n\n if (!preventRedirect) {\n this.handleRedirect();\n }\n return response;\n }\n\n async logout(): Promise<void> {\n if (this.config?.logoutEndpoint && !this.isDevMode) {\n try {\n await this.apiService.call(this.config.logoutEndpoint);\n } catch { /* ignore logout errors */ }\n }\n\n const storage = this.getStorage();\n const tokenKey = this.config?.tokenKey || 'amf_auth_token';\n const refreshKey = this.config?.refreshTokenKey || 'amf_auth_refresh';\n storage.removeItem(tokenKey);\n storage.removeItem(refreshKey);\n storage.removeItem(`${this.config?.tokenKey || 'amf_auth'}_user`);\n\n this.state.clearNamespace('auth');\n\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n \n this.router.navigateByUrl('/login');\n }\n\n private _mockLogin(email: string, _password?: string, preventRedirect = false): any {\n const isStaff = email && email.toLowerCase().includes('staff');\n const role = isStaff ? 'STAFF' : 'ADMIN';\n const company = isStaff ? 'AvoraMetaForge Support' : 'AvoraMetaForge Inc.';\n\n const payload = {\n sub: isStaff ? 'user-002' : 'user-001',\n email: email || 'demo@example.com',\n name: (email || 'demo').split('@')[0].replace(/[^a-zA-Z]/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase()),\n role,\n company,\n iat: Date.now(),\n exp: Date.now() + 24 * 60 * 60 * 1000,\n };\n\n const token = `mock.${btoa(JSON.stringify(payload))}.demo-signature`;\n const profile: AuthUser = {\n id: payload.sub,\n name: payload.name,\n email: payload.email,\n avatar: '',\n roles: [payload.role],\n role: payload.role,\n company: payload.company,\n };\n\n this.setToken(token);\n this.setUser(profile);\n \n if (!preventRedirect) {\n this.handleRedirect();\n }\n \n return { token, user: profile };\n }\n\n // ──────────────────────────────────────────────────────────────\n // Navigation & Expiry\n // ──────────────────────────────────────────────────────────────\n\n storeRedirectUrl(url: string): void {\n localStorage.setItem(this.REDIRECT_KEY, url);\n }\n\n private handleRedirect(): void {\n const redirect = localStorage.getItem(this.REDIRECT_KEY) || '/dashboard';\n localStorage.removeItem(this.REDIRECT_KEY);\n this.router.navigateByUrl(redirect);\n }\n\n isTokenExpired(token?: string | null): boolean {\n const rawToken = token || this.getToken();\n if (!rawToken) return true;\n\n try {\n const parts = rawToken.split('.');\n if (parts.length < 2) return true;\n const payload = JSON.parse(atob(parts[1]));\n return payload.exp ? payload.exp * 1000 < Date.now() : false;\n } catch {\n return true;\n }\n }\n\n // ──────────────────────────────────────────────────────────────\n // Token Refresh\n // ──────────────────────────────────────────────────────────────\n\n async refreshAuthToken(): Promise<string | null> {\n if (!this.config?.refreshEndpoint) return null;\n\n const refreshToken = this.getRefreshToken();\n if (!refreshToken) return null;\n\n try {\n const response = await this.apiService.call(\n this.config.refreshEndpoint,\n undefined,\n { refreshToken }\n );\n\n if (response?.token) {\n this.setToken(response.token, response.refreshToken || refreshToken);\n return response.token;\n }\n } catch (error) {\n console.error('[AvoraMetaForge] Token refresh failed:', error);\n await this.logout();\n }\n\n return null;\n }\n\n private scheduleTokenRefresh(): void {\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n\n const token = this.getToken();\n if (!token) return;\n\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n if (payload.exp) {\n const expiresIn = payload.exp * 1000 - Date.now();\n const refreshIn = Math.max(expiresIn - 60000, 5000);\n this.refreshTimer = setTimeout(() => this.refreshAuthToken(), refreshIn);\n }\n } catch {}\n }\n\n // ──────────────────────────────────────────────────────────────\n // Storage Helpers\n // ──────────────────────────────────────────────────────────────\n\n private getStorage(): Storage {\n switch (this.config?.tokenStorage) {\n case 'sessionStorage': return sessionStorage;\n case 'localStorage':\n default: return localStorage;\n }\n }\n\n private getStoredToken(): string | null {\n const tokenKey = this.config?.tokenKey || 'amf_auth_token';\n return this.getFromStorage(tokenKey);\n }\n\n private getFromStorage(key: string): string | null {\n const storage = this.getStorage();\n return storage.getItem(key);\n }\n}\n","/**\n * AvoraMetaForge — Plugin Registry Service\n */\nimport { Injectable } from '@angular/core';\nimport { AvoraMetaForgePlugin } from '../models/meta.types';\n\n@Injectable({ providedIn: 'root' })\nexport class PluginRegistryService {\n private plugins = new Map<string, AvoraMetaForgePlugin>();\n\n register(plugin: AvoraMetaForgePlugin): void {\n this.plugins.set(plugin.name, plugin);\n if (plugin.initialize) plugin.initialize();\n }\n\n getAll(): AvoraMetaForgePlugin[] { return Array.from(this.plugins.values()); }\n get(name: string): AvoraMetaForgePlugin | undefined { return this.plugins.get(name); }\n}\n","/**\n * AvoraMetaForge — Meta Guard\n *\n * Enhanced route guard supporting:\n * - Authentication check\n * - Role-based access (user must have at least one role)\n * - Permission-based access (user must have ALL permissions)\n * - Condition-based guards (declarative)\n * - Feature flag guards\n * - Time-based access windows\n * - Custom guard functions (plugin-provided)\n * - Failure actions and messages\n * - CanDeactivate for unsaved changes\n */\nimport { inject } from '@angular/core';\nimport { CanActivateFn, CanDeactivateFn, Router, ActivatedRouteSnapshot } from '@angular/router';\nimport { AuthService } from '../../core/auth/auth.service';\nimport { GuardMeta } from '../models/meta.types';\nimport { NotificationService } from '../../core/notifications/notification.service';\nimport { PluginRegistryService } from '../plugins/plugin-registry.service';\nimport { ConditionEvaluatorService } from './condition-evaluator.service';\nimport { ActionDispatcherService } from './action-dispatcher.service';\nimport { MetaStateService } from '../services/meta-state.service';\nimport { MetaPageComponent } from './meta-page.component';\n\n/**\n * CanActivate guard — controls whether a page can be accessed\n */\nexport const metaGuard: CanActivateFn = (route: ActivatedRouteSnapshot) => {\n const router = inject(Router);\n const authService = inject(AuthService);\n const notifications = inject(NotificationService);\n const plugins = inject(PluginRegistryService);\n const conditionEvaluator = inject(ConditionEvaluatorService);\n const actionDispatcher = inject(ActionDispatcherService);\n const stateService = inject(MetaStateService);\n\n const guardMeta = route.data['guard'] as GuardMeta | undefined;\n if (!guardMeta) return true;\n\n // --- Custom Guard ---\n if (guardMeta.custom) {\n let customFn;\n for (const plugin of plugins.getAll()) {\n if (plugin.guards?.[guardMeta.custom]) { customFn = plugin.guards[guardMeta.custom]; break; }\n }\n if (customFn) return customFn(route);\n console.warn(`[AvoraMetaForge] Custom guard \"${guardMeta.custom}\" not found.`);\n }\n\n // --- Feature Flag ---\n if (guardMeta.featureFlag) {\n const flagValue = stateService.get(`features.${guardMeta.featureFlag}`);\n if (!flagValue) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'This feature is not available');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n\n // --- Time-based Access ---\n if (guardMeta.accessWindow) {\n const now = new Date();\n if (guardMeta.accessWindow.from) {\n const from = new Date(guardMeta.accessWindow.from);\n if (now < from) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Access not yet available');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n if (guardMeta.accessWindow.to) {\n const to = new Date(guardMeta.accessWindow.to);\n if (now > to) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Access has expired');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n }\n\n // --- Authentication ---\n if (guardMeta.requireAuth && !authService.isAuthenticated()) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Please login to access this page');\n return router.parseUrl(guardMeta.redirectTo || '/login');\n }\n\n // --- Roles ---\n if (guardMeta.roles?.length) {\n const userRole = authService.user()?.role || 'Guest';\n const userRoles = Array.isArray(userRole) ? userRole : [userRole];\n const hasRole = guardMeta.roles.some(r => userRoles.includes(r));\n if (!hasRole) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'You do not have permission to access this page');\n return router.parseUrl(guardMeta.redirectTo || '/unauthorized');\n }\n }\n\n // --- Permissions ---\n if (guardMeta.permissions?.length) {\n const userPerms = (authService.user() as any)?.permissions || [];\n const hasAll = guardMeta.permissions.every(p => userPerms.includes(p));\n if (!hasAll) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'You lack specific permissions for this action');\n return router.parseUrl(guardMeta.redirectTo || '/unauthorized');\n }\n }\n\n // --- Condition-based Guard ---\n if (guardMeta.condition) {\n const context = {\n user: authService.user(),\n route: route.params,\n queryParams: route.queryParams,\n state: stateService.snapshot()\n };\n const result = conditionEvaluator.evaluate(guardMeta.condition, context);\n if (!result) {\n handleGuardFailure(guardMeta, notifications, actionDispatcher, 'Access denied');\n return router.parseUrl(guardMeta.redirectTo || '/');\n }\n }\n\n return true;\n};\n\n/**\n * CanDeactivate guard — warns before leaving if page has unsaved changes\n */\nexport const metaCanDeactivateGuard: CanDeactivateFn<MetaPageComponent> = (component) => {\n return component.canDeactivate();\n};\n\n// ──────────────────────────────────────────────────────────────\n// Helper\n// ──────────────────────────────────────────────────────────────\n\nfunction handleGuardFailure(\n guardMeta: GuardMeta,\n notifications: NotificationService,\n actionDispatcher: ActionDispatcherService,\n defaultMessage: string\n): void {\n const message = guardMeta.failMessage || defaultMessage;\n notifications.show('error', message);\n\n if (guardMeta.onFail) {\n actionDispatcher.dispatch(guardMeta.onFail);\n }\n}\n","/**\n * AvoraMetaForge — Meta Router Service\n *\n * Generates Angular Routes from PageMeta[] definitions and merges them\n * into the existing Router config during APP_INITIALIZER.\n *\n * Architecture note: AppComponent always renders <app-layout>, which picks\n * a layout variant (vertical, empty, etc.) based on route data. Each layout\n * variant contains a <router-outlet>. Therefore all generated routes are\n * TOP-LEVEL (flat) — they render directly into the layout's outlet.\n */\nimport { Injectable, inject } from '@angular/core';\nimport { Route, Routes, Router } from '@angular/router';\nimport { PageMeta, AppMeta } from '../models/meta.types';\nimport { MetaPageComponent } from './meta-page.component';\nimport { metaGuard } from './meta-guard';\n\n@Injectable({ providedIn: 'root' })\nexport class MetaRouterService {\n private readonly router = inject(Router);\n\n /**\n * Called during APP_INITIALIZER to register all metadata-driven routes.\n * Preserves any existing static routes (e.g. login) already registered\n * via app.routes.ts, then appends dynamically generated routes.\n */\n registerApp(appMeta: AppMeta): void {\n const pageRoutes = this.buildPageRoutes(appMeta.pages, appMeta.app.defaultLayout);\n\n // Root redirect: go to login if auth UI is enabled, otherwise go to first page\n const defaultPath = appMeta.auth?.builtInUI?.enabled\n ? 'login'\n : (appMeta.pages?.[0]?.path ?? 'dashboard');\n\n // Keep existing static routes (e.g. login) that were registered via provideRouter\n const staticRoutes = this.router.config.filter(r =>\n r.path !== '**' && r.path !== ''\n );\n\n const finalConfig: Routes = [\n ...staticRoutes,\n ...pageRoutes,\n { path: '', redirectTo: defaultPath, pathMatch: 'full' },\n { path: '**', redirectTo: defaultPath }\n ];\n\n this.router.resetConfig(finalConfig);\n console.log('[AvoraMetaForge] Router configured with', finalConfig.length, 'routes');\n }\n\n /**\n * Recursively converts PageMeta[] into Angular Route[].\n */\n private buildPageRoutes(pages: PageMeta[], fallbackLayout?: string): Routes {\n if (!pages?.length) return [];\n\n return pages.map(page => {\n const routeData: Record<string, any> = {\n pageMeta: page,\n layout: page.layout || fallbackLayout || 'vertical'\n };\n\n // Only add guard data if guard is defined\n if (page.guard) {\n routeData['guard'] = page.guard;\n }\n\n // Merge any custom data\n if (page.data) {\n Object.assign(routeData, page.data);\n }\n\n const route: Route = {\n path: page.path,\n data: routeData\n };\n\n // Set title if provided\n if (page.title) {\n route.title = page.title;\n }\n\n // Only set pathMatch when explicitly specified (avoid 'undefined' in config)\n if (page.pathMatch) {\n route.pathMatch = page.pathMatch;\n }\n\n // Determine what component renders this route\n if (page.redirectTo) {\n route.redirectTo = page.redirectTo;\n } else if (page.customComponent) {\n route.loadComponent = page.customComponent;\n } else {\n // Default: use MetaPageComponent which iterates over page.sections\n route.component = MetaPageComponent;\n }\n\n // Attach meta guard if guard config exists\n if (page.guard) {\n route.canActivate = [metaGuard];\n }\n\n // Recurse into children\n if (page.children?.length) {\n route.children = this.buildPageRoutes(\n page.children,\n page.layout || fallbackLayout\n );\n }\n\n return route;\n });\n }\n}\n","/**\n * AvoraMetaForge — Meta Section Interface\n */\nimport { InjectionToken } from '@angular/core';\nexport const META_SECTION_CONFIG = new InjectionToken<any>('META_SECTION_CONFIG');\nexport const META_SECTION_CONTEXT = new InjectionToken<any>('META_SECTION_CONTEXT');\n\nexport interface MetaSectionComponent<T = any> {\n config: T;\n context?: any;\n}\n","import { Routes } from '@angular/router';\nimport { AppMeta } from '../models/layout.meta';\n\n/**\n * Returns the routing configuration for AvoraMetaForge's built-in auth UI.\n * Connect this output to your main `app.routes.ts`.\n * If auth UI is disabled, it returns an empty array, allowing the MetaRouterService\n * to safely handle dynamic page routes.\n */\nexport function getAmfRoutes(meta: AppMeta): Routes {\n if (!meta.auth?.builtInUI?.enabled) {\n return [];\n }\n\n const pages = meta.auth.builtInUI.pages || ['login', 'register', 'forgot-password', 'reset-password', 'contact-support'];\n const routes: Routes = [];\n\n\n if (pages.includes('login')) {\n routes.push({\n path: 'login',\n loadComponent: () => import('../pages/auth/login.page').then(m => m.LoginComponent),\n data: { layout: 'empty' },\n });\n }\n\n if (pages.includes('forgot-password')) {\n routes.push({\n path: 'forgot-password',\n loadComponent: () => import('../pages/auth/forgot-password.page').then(m => m.ForgotPasswordComponent),\n data: { layout: 'empty' },\n });\n }\n\n if (pages.includes('contact-support')) {\n routes.push({\n path: 'contact-support',\n loadComponent: () => import('../pages/auth/contact-support.page').then(m => m.ContactSupportComponent),\n data: { layout: 'empty' },\n });\n }\n\n return routes;\n}\n\n\n","/**\n * AvoraMetaForge — Accordion Section Component\n *\n * Renders AccordionMeta as expandable/collapsible panels.\n * Each panel can contain any SectionMeta[] — including forms,\n * tables, stats-grids, and other accordions.\n */\nimport {\n Component, Input, inject, OnChanges, SimpleChanges, signal\n} from '@angular/core';\n\nimport { AccordionMeta, AccordionPanelMeta } from '../../models/meta.types';\nimport { ConditionEvaluatorService } from '../condition-evaluator.service';\nimport { MetaSectionComponent } from '../meta-section.interface';\nimport { MetaRendererComponent } from '../meta-renderer.component';\n\n@Component({\n selector: 'amf-accordion-section',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n <div class=\"amf-accordion\"\n [class]=\"'variant-' + (config.variant || 'default')\"\n [class.accordion-bordered]=\"config.variant === 'bordered'\">\n @for (panel of visiblePanels(); track $index) {\n <div class=\"accordion-panel\"\n [class.open]=\"isOpen($index)\"\n [class.disabled]=\"panel.disabled\">\n\n <!-- Panel Header -->\n <button\n type=\"button\"\n class=\"accordion-header\"\n [attr.aria-expanded]=\"isOpen($index)\"\n [disabled]=\"panel.disabled\"\n (click)=\"togglePanel($index)\">\n\n <div class=\"accordion-header-left\">\n @if (panel.icon) {\n <svg class=\"panel-icon\" viewBox=\"0 0 24 24\">\n <path [attr.d]=\"panel.icon\"/>\n </svg>\n }\n <span class=\"panel-title\">{{ panel.title }}</span>\n </div>\n\n <div class=\"accordion-header-right\">\n <svg class=\"chevron-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"/>\n </svg>\n </div>\n </button>\n\n <!-- Panel Content -->\n <div class=\"accordion-body\" [class.open]=\"isOpen($index)\">\n <div class=\"accordion-body-inner\">\n @for (section of panel.sections; track $index) {\n <amf-renderer [section]=\"section\" [context]=\"context\" class=\"amf-section\">\n </amf-renderer>\n }\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n /* ─── Container ─── */\n .amf-accordion {\n display: flex;\n flex-direction: column;\n border-radius: 16px;\n overflow: hidden;\n border: 1px solid var(--app-border);\n background: var(--app-surface);\n }\n .amf-accordion.variant-flush {\n border: none;\n border-radius: 0;\n gap: 0;\n }\n .amf-accordion.variant-bordered {\n gap: 8px;\n border: none;\n background: transparent;\n overflow: visible;\n }\n\n /* ─── Panel ─── */\n .accordion-panel {\n overflow: hidden;\n transition: box-shadow 0.2s;\n }\n .variant-default .accordion-panel + .accordion-panel {\n border-top: 1px solid var(--app-border);\n }\n .variant-bordered .accordion-panel {\n border: 1px solid var(--app-border);\n border-radius: 12px;\n overflow: hidden;\n background: var(--app-surface);\n transition: box-shadow 0.25s;\n }\n .variant-bordered .accordion-panel.open {\n box-shadow: 0 4px 20px rgba(0,0,0,0.12);\n border-color: var(--app-primary);\n }\n .accordion-panel.disabled { opacity: 0.5; pointer-events: none; }\n\n /* ─── Header ─── */\n .accordion-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 16px 20px;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n transition: background 0.2s;\n gap: 12px;\n }\n .accordion-header:hover { background: var(--glass-bg); }\n .accordion-header:disabled { cursor: not-allowed; }\n\n .accordion-panel.open .accordion-header { background: var(--glass-bg); }\n\n .accordion-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n min-width: 0;\n }\n .panel-icon {\n width: 18px;\n height: 18px;\n fill: var(--app-primary);\n flex-shrink: 0;\n }\n .panel-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--app-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .accordion-header-right { flex-shrink: 0; }\n .chevron-icon {\n width: 20px;\n height: 20px;\n fill: var(--app-text-muted);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .accordion-panel.open .chevron-icon { transform: rotate(180deg); fill: var(--app-primary); }\n\n /* ─── Body ─── */\n .accordion-body {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.45s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .accordion-body.open { max-height: 4000px; }\n\n .accordion-body-inner {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 20px 20px;\n border-top: 1px solid var(--app-border);\n animation: accordionFadeIn 0.3s ease-out;\n }\n @keyframes accordionFadeIn {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n :host { display: block; }\n .amf-section { display: block; }\n `]\n})\nexport class AccordionSectionComponent implements MetaSectionComponent<AccordionMeta>, OnChanges {\n @Input() config!: AccordionMeta;\n @Input() context: any = {};\n\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n\n /** Set of open panel indices */\n openPanels = signal<Set<number>>(new Set<number>());\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.config) {\n // Expand panels that start expanded\n const defaultOpen = new Set<number>();\n this.config.panels?.forEach((panel, i) => {\n if (panel.expanded) defaultOpen.add(i);\n });\n this.openPanels.set(defaultOpen);\n }\n }\n\n visiblePanels(): AccordionPanelMeta[] {\n return (this.config?.panels ?? []).filter(panel => {\n if (!panel.visibleWhen) return true;\n return this.conditionEvaluator.evaluate(panel.visibleWhen, this.context);\n });\n }\n\n isOpen(index: number): boolean {\n return this.openPanels().has(index);\n }\n\n togglePanel(index: number): void {\n const current = new Set(this.openPanels());\n if (current.has(index)) {\n current.delete(index);\n } else {\n if (!this.config.multi) {\n // Close all others\n current.clear();\n }\n current.add(index);\n }\n this.openPanels.set(current);\n }\n}\n","import { Component, inject, signal, OnDestroy, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActionDispatcherService } from '../action-dispatcher.service';\nimport { MetaRendererComponent } from '../meta-renderer.component';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-modal-host',\n standalone: true,\n imports: [CommonModule, MetaRendererComponent],\n template: `\n @if (isOpen()) {\n <div class=\"amf-modal-backdrop\" (click)=\"closeOnBackdrop($event)\">\n <div class=\"amf-modal-dialog\" [ngClass]=\"['size-' + (config()?.size || 'md')]\" (click)=\"$event.stopPropagation()\">\n <div class=\"amf-modal-header\">\n <h3>{{ config()?.title }}</h3>\n <button class=\"amf-modal-close\" (click)=\"close()\">&times;</button>\n </div>\n <div class=\"amf-modal-content\">\n @if (config()?.content) {\n <amf-renderer [section]=\"config()!.content\" [context]=\"{}\"></amf-renderer>\n }\n </div>\n @if (config()?.actions?.length) {\n <div class=\"amf-modal-footer\">\n @for (action of config()!.actions; track action.label) {\n <button [class]=\"'btn-' + (action.color || 'primary')\" (click)=\"dispatchAction(action.action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n }\n `,\n styles: [`\n .amf-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n animation: fadeIn 0.2s ease-out;\n }\n .amf-modal-dialog {\n background: var(--glass-bg, rgba(20,25,40,0.9));\n border: 1px solid var(--app-border, rgba(255,255,255,0.1));\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0,0,0,0.5);\n width: 100%;\n max-height: 90vh;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n animation: slideUp 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n }\n .size-sm { max-width: 400px; }\n .size-md { max-width: 600px; }\n .size-lg { max-width: 800px; }\n .size-full { max-width: 95vw; height: 95vh; }\n \n .amf-modal-header {\n padding: 20px 24px;\n border-bottom: 1px solid var(--app-border, rgba(255,255,255,0.1));\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .amf-modal-header h3 {\n font-size: 1.25rem;\n margin: 0;\n color: #fff;\n }\n .amf-modal-close {\n background: transparent;\n border: none;\n color: #94a3b8;\n font-size: 1.5rem;\n cursor: pointer;\n line-height: 1;\n padding: 0 4px;\n }\n .amf-modal-close:hover { color: #fff; }\n \n .amf-modal-content {\n padding: 24px;\n flex-grow: 1;\n color: #94a3b8;\n }\n .amf-modal-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--app-border, rgba(255,255,255,0.1));\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc)); color: white; padding: 10px 20px; border-radius: 8px; border: none; cursor: pointer; font-weight: 600;}\n .btn-outline { background: transparent; border: 1px solid #475569; color: #e2e8f0; padding: 10px 20px; border-radius: 8px; cursor: pointer; font-weight: 600;}\n .btn-danger { background: #ef4444; color: white; padding: 10px 20px; border-radius: 8px; border: none; cursor: pointer; font-weight: 600;}\n \n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes slideUp { from { opacity: 0; transform: translateY(20px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } }\n `]\n})\nexport class MetaModalHostComponent implements OnInit, OnDestroy {\n private dispatcher = inject(ActionDispatcherService);\n private sub?: Subscription;\n\n isOpen = signal(false);\n config = signal<any>(null);\n\n ngOnInit() {\n this.sub = this.dispatcher.modalEvents$.subscribe(event => {\n if (event.action === 'open') {\n this.config.set(event.config);\n this.isOpen.set(true);\n } else if (event.action === 'close') {\n this.isOpen.set(false);\n setTimeout(() => this.config.set(null), 300); // clear after animation\n }\n });\n }\n\n ngOnDestroy() {\n this.sub?.unsubscribe();\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n closeOnBackdrop(e: Event) {\n if (this.config()?.disableCloseOnBackdrop) return;\n this.close();\n }\n\n dispatchAction(actionMeta: any) {\n this.dispatcher.dispatch(actionMeta, {});\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * A simple SVG icon registry so the template doesn't depend on external icon fonts.\n * Icons are registered as inline SVG path data keyed by name.\n */\n@Injectable({ providedIn: 'root' })\nexport class IconRegistryService {\n private icons = new Map<string, string>();\n\n constructor() {\n this.registerDefaults();\n }\n\n /** Register a named SVG icon (viewBox 0 0 24 24) */\n register(name: string, svgPath: string): void {\n this.icons.set(name, svgPath);\n }\n\n /** Get SVG path data for a named icon */\n getIcon(name: string): string {\n return this.icons.get(name) ?? this.icons.get('default')!;\n }\n\n /** Check if an icon exists */\n has(name: string): boolean {\n return this.icons.has(name);\n }\n\n private registerDefaults(): void {\n this.register('default', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z');\n this.register('dashboard', 'M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z');\n this.register('analytics', 'M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z');\n this.register('users', 'M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z');\n this.register('settings', 'M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 00.12-.61l-1.92-3.32a.488.488 0 00-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 00-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.07.62-.07.94s.02.64.07.94l-2.03 1.58a.49.49 0 00-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z');\n this.register('shield', 'M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z');\n this.register('bell', 'M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z');\n this.register('menu', 'M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z');\n this.register('close', 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z');\n this.register('search', 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z');\n this.register('logout', 'M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z');\n this.register('person', 'M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z');\n this.register('chevron-down', 'M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z');\n this.register('chevron-right', 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z');\n this.register('palette', 'M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-1 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z');\n\n // Status & Feedback Icons\n this.register('add', 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z');\n this.register('check-circle', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z');\n this.register('error', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z');\n this.register('info', 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z');\n this.register('warning', 'M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z');\n\n // Navigation & Action Icons (used by APP_META)\n this.register('home', 'M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z');\n this.register('bar-chart-2', 'M5 9.2h3V19H5V9.2zM10.6 5h2.8v14h-2.8V5zm5.6 8H19v6h-2.8v-6z');\n this.register('layers', 'M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27-7.38 5.74zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16z');\n this.register('download', 'M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z');\n this.register('user-plus', 'M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z');\n this.register('edit-2', 'M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z');\n this.register('trash-2', 'M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z');\n this.register('eye', 'M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z');\n this.register('clock', 'M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z');\n this.register('trending-up', 'M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6z');\n this.register('dollar-sign', 'M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z');\n this.register('activity', 'M22 12h-4l-3 9L9 3l-3 9H2');\n }\n}\n","import { Component, inject, OnDestroy, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { AmfDialogService, DialogRequest } from '../services/amf-dialog.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\n\n@Component({\n selector: 'amf-dialog-host',\n standalone: true,\n imports: [CommonModule],\n template: `\n @if (currentDialog()) {\n <div class=\"amf-dialog-backdrop\" (click)=\"onBackdropClick()\">\n <div class=\"amf-dialog-box\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"dialog-header\">\n <div class=\"dialog-icon-wrapper\" [ngClass]=\"'variant-' + (currentDialog()?.config?.variant || 'info')\">\n @if (currentDialog()?.config?.icon) {\n <svg viewBox=\"0 0 24 24\" class=\"icon-element\">\n <path [attr.d]=\"iconPath\"></path>\n </svg>\n } @else {\n <span class=\"icon-fallback\">!</span>\n }\n </div>\n @if (currentDialog()?.config?.title) {\n <h3 class=\"dialog-title\">{{ currentDialog()!.config!.title }}</h3>\n }\n </div>\n\n <div class=\"dialog-content\">\n <p class=\"dialog-message\">{{ currentDialog()!.config!.message }}</p>\n </div>\n\n <div class=\"dialog-actions\">\n @if (currentDialog()?.config?.showCancel) {\n <button class=\"btn btn-cancel\" (click)=\"close(false)\">\n {{ currentDialog()?.config?.cancelLabel || 'Cancel' }}\n </button>\n }\n <button class=\"btn btn-confirm\" [ngClass]=\"'btn-variant-' + (currentDialog()?.config?.variant || 'info')\" (click)=\"close(true)\">\n {{ currentDialog()?.config?.confirmLabel || 'OK' }}\n </button>\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n .amf-dialog-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(10, 15, 30, 0.75);\n backdrop-filter: blur(12px);\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n animation: fadeIn 0.25s ease-out;\n }\n \n .amf-dialog-box {\n background: var(--glass-bg, rgba(20,25,40,0.9));\n border: 1px solid var(--app-border, rgba(255,255,255,0.1));\n border-radius: 20px;\n box-shadow: 0 25px 50px -12px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.05) inset;\n width: 100%;\n max-width: 420px;\n display: flex;\n flex-direction: column;\n animation: popIn 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n overflow: hidden;\n }\n\n .dialog-header {\n padding: 32px 32px 16px 32px;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 16px;\n }\n\n .dialog-icon-wrapper {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n color: white;\n box-shadow: 0 8px 16px -4px rgba(0,0,0,0.3);\n }\n \n .dialog-icon-wrapper.variant-info { background: linear-gradient(135deg, #3b82f6, #2563eb); box-shadow: 0 8px 24px -6px rgba(59,130,246,0.5); }\n .dialog-icon-wrapper.variant-success { background: linear-gradient(135deg, #10b981, #059669); box-shadow: 0 8px 24px -6px rgba(16,185,129,0.5); }\n .dialog-icon-wrapper.variant-warning { background: linear-gradient(135deg, #f59e0b, #d97706); box-shadow: 0 8px 24px -6px rgba(245,158,11,0.5); }\n .dialog-icon-wrapper.variant-danger { background: linear-gradient(135deg, #ef4444, #dc2626); box-shadow: 0 8px 24px -6px rgba(239,68,68,0.5); }\n\n .icon-element { width: 32px; height: 32px; display: block; filter: drop-shadow(0 2px 2px rgba(0,0,0,0.2)); }\n .icon-fallback { font-family: monospace; font-weight: bold; }\n\n .dialog-title {\n margin: 0;\n color: var(--app-text, #ffffff);\n font-size: 1.25rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n }\n\n .dialog-content {\n padding: 0 32px 32px 32px;\n text-align: center;\n }\n\n .dialog-message {\n margin: 0;\n color: var(--app-text-muted, #94a3b8);\n font-size: 0.95rem;\n line-height: 1.5;\n }\n\n .dialog-actions {\n display: flex;\n gap: 12px;\n padding: 24px 32px;\n background: rgba(0,0,0,0.2);\n border-top: 1px solid var(--app-border, rgba(255,255,255,0.05));\n }\n\n .btn {\n flex: 1;\n padding: 12px 20px;\n border-radius: 12px;\n font-size: 0.9rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-cancel {\n background: rgba(255,255,255,0.05);\n color: var(--app-text, #ffffff);\n border: 1px solid rgba(255,255,255,0.1);\n }\n .btn-cancel:hover { background: rgba(255,255,255,0.1); }\n\n .btn-confirm { color: white; box-shadow: 0 4px 12px transparent; }\n .btn-confirm:hover { transform: translateY(-1px); }\n \n .btn-variant-info { background: #3b82f6; box-shadow: 0 4px 12px rgba(59,130,246,0.3); }\n .btn-variant-info:hover { background: #60a5fa; box-shadow: 0 6px 16px rgba(59,130,246,0.4); }\n \n .btn-variant-success { background: #10b981; box-shadow: 0 4px 12px rgba(16,185,129,0.3); }\n .btn-variant-success:hover { background: #34d399; box-shadow: 0 6px 16px rgba(16,185,129,0.4); }\n \n .btn-variant-warning { background: #f59e0b; box-shadow: 0 4px 12px rgba(245,158,11,0.3); }\n .btn-variant-warning:hover { background: #fbbf24; box-shadow: 0 6px 16px rgba(245,158,11,0.4); }\n \n .btn-variant-danger { background: #ef4444; box-shadow: 0 4px 12px rgba(239,68,68,0.3); }\n .btn-variant-danger:hover { background: #f87171; box-shadow: 0 6px 16px rgba(239,68,68,0.4); }\n\n @keyframes fadeIn { from { opacity: 0; backdrop-filter: blur(0px); } to { opacity: 1; backdrop-filter: blur(12px); } }\n @keyframes popIn { \n 0% { opacity: 0; transform: scale(0.9) translateY(10px); } \n 100% { opacity: 1; transform: scale(1) translateY(0); } \n }\n `]\n})\nexport class AmfDialogHostComponent implements OnInit, OnDestroy {\n readonly iconRegistry = inject(IconRegistryService);\n private readonly dialogService = inject(AmfDialogService);\n private sub?: Subscription;\n\n currentDialog = signal<DialogRequest | null>(null);\n\n get iconPath(): string | undefined {\n const icon = this.currentDialog()?.config?.icon;\n return icon ? this.iconRegistry.getIcon(icon) : undefined;\n }\n\n ngOnInit() {\n this.sub = this.dialogService.dialogState$.subscribe(request => {\n this.currentDialog.set(request);\n });\n }\n\n ngOnDestroy() {\n if (this.sub) this.sub.unsubscribe();\n }\n\n onBackdropClick() {\n // Only close if it's informational, or if it has a cancel button (meaning it's a choice)\n const req = this.currentDialog();\n if (req && req.config.showCancel) {\n this.close(false);\n }\n }\n\n close(result: boolean) {\n const req = this.currentDialog();\n if (req) {\n req.resolve(result); // Resolve the promise!\n this.currentDialog.set(null); // Clear the dialog visually\n }\n }\n}\n","import { Component, inject, signal, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActionDispatcherService } from '../action-dispatcher.service';\nimport { MetaRendererComponent } from '../meta-renderer.component';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-drawer-host',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n @if (isOpen()) {\n <!-- Backdrop -->\n <div class=\"amf-drawer-backdrop\" (click)=\"closeOnBackdrop()\"></div>\n }\n <!-- Drawer panel — always in DOM so the CSS slide animation works -->\n <div class=\"amf-drawer-panel\"\n [class.is-open]=\"isOpen()\"\n [style.width]=\"config()?.size || '420px'\"\n [class.position-left]=\"config()?.position === 'left'\"\n (click)=\"$event.stopPropagation()\">\n @if (isOpen() && config()) {\n <div class=\"amf-drawer-header\">\n <h3>{{ config()?.title }}</h3>\n <button class=\"amf-drawer-close\" (click)=\"close()\" aria-label=\"Close drawer\">&times;</button>\n </div>\n <div class=\"amf-drawer-content\">\n @if (config()?.content) {\n <amf-renderer [section]=\"config()!.content\" [context]=\"{}\"></amf-renderer>\n }\n </div>\n @if (config()?.actions?.length) {\n <div class=\"amf-drawer-footer\">\n @for (action of config()!.actions; track action.label) {\n <button [class]=\"'btn-' + (action.color || 'primary')\" (click)=\"dispatchAction(action.action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n }\n </div>\n `,\n styles: [`\n /* ── Backdrop ── */\n .amf-drawer-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(4px);\n z-index: 1200;\n animation: fadeIn 0.25s ease-out;\n }\n\n /* ── Panel ── */\n .amf-drawer-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100%;\n max-width: 95vw;\n background: var(--glass-bg, rgba(15, 20, 40, 0.97));\n border-left: 1px solid var(--app-border, rgba(255,255,255,0.08));\n box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);\n z-index: 1201;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);\n will-change: transform;\n overflow: hidden;\n }\n\n .amf-drawer-panel.position-left {\n right: auto;\n left: 0;\n border-left: none;\n border-right: 1px solid var(--app-border, rgba(255,255,255,0.08));\n transform: translateX(-100%);\n }\n\n .amf-drawer-panel.is-open {\n transform: translateX(0);\n }\n\n /* ── Header ── */\n .amf-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--app-border, rgba(255,255,255,0.08));\n flex-shrink: 0;\n }\n\n .amf-drawer-header h3 {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 700;\n color: var(--app-text, #f1f5f9);\n letter-spacing: -0.01em;\n }\n\n .amf-drawer-close {\n background: rgba(255,255,255,0.06);\n border: 1px solid rgba(255,255,255,0.08);\n color: var(--app-text-muted, #94a3b8);\n font-size: 1.25rem;\n line-height: 1;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n\n .amf-drawer-close:hover {\n background: rgba(255,255,255,0.12);\n color: var(--app-text, #f1f5f9);\n }\n\n /* ── Content ── */\n .amf-drawer-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n /* ── Footer ── */\n .amf-drawer-footer {\n flex-shrink: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--app-border, rgba(255,255,255,0.08));\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n background: rgba(0,0,0,0.15);\n }\n\n .btn-primary {\n background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc));\n color: white; padding: 10px 20px; border-radius: 8px; border: none; cursor: pointer; font-weight: 600;\n transition: all 0.2s;\n }\n .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 6px 20px var(--app-glow); }\n\n .btn-outline {\n background: transparent; border: 1px solid #475569; color: #e2e8f0;\n padding: 10px 20px; border-radius: 8px; cursor: pointer; font-weight: 600;\n transition: all 0.2s;\n }\n .btn-outline:hover { background: rgba(255,255,255,0.06); }\n\n .btn-danger {\n background: #ef4444; color: white; padding: 10px 20px; border-radius: 8px;\n border: none; cursor: pointer; font-weight: 600;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `]\n})\nexport class AmfDrawerHostComponent implements OnInit, OnDestroy {\n private readonly dispatcher = inject(ActionDispatcherService);\n private sub?: Subscription;\n\n isOpen = signal(false);\n config = signal<any>(null);\n\n ngOnInit(): void {\n this.sub = this.dispatcher.drawerEvents$.subscribe(event => {\n if (event.action === 'open') {\n this.config.set(event.config);\n this.isOpen.set(true);\n } else if (event.action === 'close') {\n this.isOpen.set(false);\n // Clear config after slide-out animation completes\n setTimeout(() => this.config.set(null), 400);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n close(): void {\n this.isOpen.set(false);\n setTimeout(() => this.config.set(null), 400);\n }\n\n closeOnBackdrop(): void {\n if (this.config()?.disableCloseOnBackdrop) return;\n this.close();\n }\n\n dispatchAction(actionMeta: any): void {\n this.dispatcher.dispatch(actionMeta, {});\n }\n}\n","/**\n * AvoraMetaForge — Validator Factory Service\n */\nimport { Injectable } from '@angular/core';\nimport { Validators, ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { ValidatorMeta } from '../../models/meta.types';\n\ntype CustomValidatorFn = (value: any, ...args: any[]) => ValidationErrors | null;\n\n@Injectable({ providedIn: 'root' })\nexport class ValidatorFactoryService {\n private customValidators = new Map<string, CustomValidatorFn>();\n\n registerValidator(key: string, fn: CustomValidatorFn): void { this.customValidators.set(key, fn); }\n\n createValidators(metas: ValidatorMeta[] | undefined): ValidatorFn[] {\n if (!metas?.length) return [];\n return metas.map(meta => this.createValidator(meta)).filter((v): v is ValidatorFn => v !== null);\n }\n\n private createValidator(meta: ValidatorMeta): ValidatorFn | null {\n switch (meta.type) {\n case 'required': return this.withMessage(Validators.required, meta.message || 'Required');\n case 'email': return this.withMessage(Validators.email, meta.message || 'Invalid email');\n case 'minLength': return this.withMessage(Validators.minLength(meta.value), meta.message || `Min length: ${meta.value}`);\n case 'maxLength': return this.withMessage(Validators.maxLength(meta.value), meta.message || `Max length: ${meta.value}`);\n case 'min': return this.withMessage(Validators.min(meta.value), meta.message || `Min: ${meta.value}`);\n case 'max': return this.withMessage(Validators.max(meta.value), meta.message || `Max: ${meta.value}`);\n case 'pattern': return this.withMessage(Validators.pattern(meta.value), meta.message || 'Invalid format');\n case 'custom':\n if (meta.custom) {\n const customFn = this.customValidators.get(meta.custom);\n if (customFn) {\n return (control: AbstractControl): ValidationErrors | null => {\n const errors = customFn(control.value, meta.value);\n return errors ? { custom: { message: meta.message || 'Validation failed', ...errors } } : null;\n };\n }\n }\n return null;\n default: return null;\n }\n }\n\n private withMessage(validator: ValidatorFn, message: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const result = validator(control);\n if (result) {\n const key = Object.keys(result)[0];\n return { [key]: { ...result[key], message } };\n }\n return null;\n };\n }\n\n getErrorMessage(errors: ValidationErrors | null): string {\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n const error = errors[firstKey];\n if (typeof error === 'object' && error?.message) return error.message;\n return 'Invalid field';\n }\n}\n\n","import { Component, Input, Output, EventEmitter, inject, forwardRef } from '@angular/core';\n\nimport { FormArray, FormGroup, ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { FieldMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { FieldRendererComponent } from './field-renderer.component';\n\n@Component({\n selector: 'amf-repeater-field',\n standalone: true,\n imports: [ReactiveFormsModule, forwardRef(() => FieldRendererComponent)],\n template: `\n <div class=\"amf-repeater\" [class]=\"field.cssClass\">\n <!-- ── Header & Global Add ── -->\n <div class=\"repeater-header\">\n <label class=\"repeater-label\">{{ field.label }}</label>\n @if (canAdd) {\n <button type=\"button\" class=\"btn-repeater-add\" (click)=\"addItem()\" [disabled]=\"formDisabled\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>\n {{ field.addLabel || 'Add Item' }}\n </button>\n }\n </div>\n \n @if (field.description) {\n <p class=\"repeater-description\">{{ field.description }}</p>\n }\n\n <div class=\"repeater-list\">\n @for (ctrl of formArray.controls; track $index) {\n <div class=\"repeater-item-card\">\n <div class=\"repeater-item-header\">\n <span class=\"item-title\">Item {{ $index + 1 }}</span>\n @if (canRemove) {\n <button type=\"button\" class=\"btn-repeater-remove\" (click)=\"removeItem($index)\" [disabled]=\"formDisabled\" title=\"Remove Item\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.12-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z\"/></svg>\n </button>\n }\n </div>\n \n <div class=\"repeater-item-body\">\n <div class=\"repeater-fields-grid\" [style.grid-template-columns]=\"getGridStyle(field)\">\n @for (child of field.children || []; track child.key) {\n <amf-field-renderer\n [field]=\"child\"\n [form]=\"getFormGroup(ctrl)\"\n [formDisabled]=\"formDisabled\"\n [actionDispatcher]=\"actionDispatcher\"\n [context]=\"context\"\n [style.grid-column]=\"child.colSpan ? 'span ' + child.colSpan : null\">\n </amf-field-renderer>\n }\n </div>\n </div>\n </div>\n }\n\n @if (formArray.controls.length === 0) {\n <div class=\"repeater-empty-state\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/></svg>\n <p>No items added yet. Click \"{{ field.addLabel || 'Add Item' }}\" to begin.</p>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .amf-repeater { margin-bottom: 24px; }\n .repeater-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n .repeater-label { font-size: 0.9375rem; font-weight: 600; color: var(--app-text); margin: 0; }\n .repeater-description { font-size: 0.8125rem; color: var(--app-text-muted); margin: 0 0 16px 0; }\n \n .btn-repeater-add {\n display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px;\n font-size: 0.8125rem; font-weight: 500; font-family: inherit; cursor: pointer;\n border: 1px solid rgba(59, 130, 246, 0.3); border-radius: 6px;\n background: rgba(59, 130, 246, 0.1); color: #3b82f6; transition: all 0.2s;\n }\n .btn-repeater-add svg { width: 14px; height: 14px; fill: currentColor; }\n .btn-repeater-add:hover:not(:disabled) { background: rgba(59, 130, 246, 0.2); }\n .btn-repeater-add:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .repeater-list { display: flex; flex-direction: column; gap: 16px; }\n\n .repeater-item-card {\n background: var(--app-surface-hover); border: 1px solid var(--app-border);\n border-radius: 8px; overflow: hidden; transition: box-shadow 0.2s;\n }\n .repeater-item-card:hover { border-color: rgba(59, 130, 246, 0.3); }\n\n .repeater-item-header {\n display: flex; align-items: center; justify-content: space-between;\n padding: 10px 16px; border-bottom: 1px solid var(--app-border);\n background: rgba(0, 0, 0, 0.02);\n }\n :host-context(body.amf-dark) .repeater-item-header { background: rgba(255, 255, 255, 0.02); }\n\n .item-title { font-size: 0.8125rem; font-weight: 600; color: var(--app-text); text-transform: uppercase; letter-spacing: 0.5px; }\n\n .btn-repeater-remove {\n display: flex; align-items: center; justify-content: center;\n width: 28px; height: 28px; padding: 0; border: none; border-radius: 4px;\n background: transparent; color: #ef4444; cursor: pointer; transition: background 0.2s;\n }\n .btn-repeater-remove svg { width: 18px; height: 18px; fill: currentColor; }\n .btn-repeater-remove:hover:not(:disabled) { background: rgba(239, 68, 68, 0.1); }\n .btn-repeater-remove:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .repeater-item-body { padding: 16px; }\n \n .repeater-fields-grid {\n display: grid; gap: 16px;\n }\n\n .repeater-empty-state {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n padding: 32px 16px; text-align: center; border: 1.5px dashed var(--app-border);\n border-radius: 8px; color: var(--app-text-muted); background: var(--app-surface-hover);\n }\n .repeater-empty-state svg { width: 32px; height: 32px; fill: currentColor; opacity: 0.5; margin-bottom: 12px; }\n .repeater-empty-state p { font-size: 0.875rem; margin: 0; }\n `]\n})\nexport class RepeaterFieldComponent {\n @Input() field!: FieldMeta;\n @Input() formArray!: FormArray;\n @Input() formDisabled = false;\n @Input() actionDispatcher: any;\n @Input() context: any = {};\n\n private readonly validatorFactory = inject(ValidatorFactoryService);\n\n get canAdd(): boolean {\n if (this.formDisabled) return false;\n if (this.field.maxItems !== undefined && this.formArray.length >= this.field.maxItems) return false;\n return true;\n }\n\n get canRemove(): boolean {\n if (this.formDisabled) return false;\n if (this.field.minItems !== undefined && this.formArray.length <= this.field.minItems) return false;\n return true;\n }\n\n getFormGroup(ctrl: any): FormGroup {\n return ctrl as FormGroup;\n }\n\n getGridStyle(field: FieldMeta): string {\n const cols = field['columns'] || 1;\n return `repeat(${cols}, minmax(0, 1fr))`;\n }\n\n addItem(): void {\n if (!this.canAdd) return;\n\n const groupControls: Record<string, FormControl> = {};\n for (const child of this.field.children || []) {\n const validators = this.validatorFactory.createValidators(child.validators);\n groupControls[child.key] = new FormControl(child.defaultValue ?? '', validators);\n }\n \n this.formArray.push(new FormGroup(groupControls));\n }\n\n removeItem(index: number): void {\n if (!this.canRemove) return;\n this.formArray.removeAt(index);\n }\n}\n","/**\n * AvoraMetaForge — Field Renderer Component\n */\nimport { Component, Input, inject, signal } from '@angular/core';\n\nimport { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';\nimport { FieldMeta } from '../../models/meta.types';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { RepeaterFieldComponent } from './repeater-field.component';\n\n@Component({\n selector: 'amf-field-renderer',\n standalone: true,\n imports: [ReactiveFormsModule, RepeaterFieldComponent],\n template: `\n @if (field.type !== 'hidden') {\n <div class=\"amf-field\" [class]=\"field.cssClass\" [class.has-error]=\"hasError\" [class.field-disabled]=\"isFieldDisabled\">\n @if (field.type === 'heading') { <h3 class=\"field-heading\">{{ field.text || field.label }}</h3> }\n @else if (field.type === 'divider') { <hr class=\"field-divider\" /> }\n @else {\n @if (field.label && field.type !== 'repeater') { <label class=\"field-label\" [for]=\"field.key\">{{ field.label }} @if (isRequired) { <span class=\"required-mark\">*</span> } </label> }\n <div class=\"field-input-wrapper\" [class.has-prefix]=\"!!field.prefix\" [class.has-suffix]=\"!!field.suffix\">\n @if (field.prefix) { <span class=\"field-prefix\">{{ field.prefix }}</span> }\n @switch (field.type) {\n @case ('button') {\n <button type=\"button\" class=\"field-button\" [class]=\"'btn-' + (field.color || 'primary')\" [disabled]=\"isFieldDisabled\" (click)=\"handleButtonClick()\">\n {{ field.label }}\n </button>\n }\n @case ('textarea') { <textarea class=\"field-input field-textarea\" [id]=\"field.key\" [formControl]=\"control\" [placeholder]=\"field.placeholder || ''\" [rows]=\"field.rows || 3\" [readOnly]=\"field.readOnly || false\"></textarea> }\n @case ('select') {\n <select class=\"field-input field-select\" [id]=\"field.key\" [formControl]=\"control\">\n <option value=\"\" disabled>{{ field.placeholder || 'Select...' }}</option>\n @for (opt of field.options || []; track opt.value) { <option [value]=\"opt.value\" [disabled]=\"opt.disabled || false\">{{ opt.label }}</option> }\n </select>\n }\n @case ('checkbox') {\n <label class=\"field-checkbox-label\"><input type=\"checkbox\" class=\"field-checkbox\" [id]=\"field.key\" [formControl]=\"control\" /><span>{{ field.placeholder || field.label }}</span></label>\n }\n @case ('toggle') {\n <label class=\"field-toggle-label\"><input type=\"checkbox\" class=\"field-toggle-input\" [id]=\"field.key\" [formControl]=\"control\" /><span class=\"field-toggle-track\"><span class=\"field-toggle-thumb\"></span></span>@if (field.placeholder) { <span class=\"field-toggle-text\">{{ field.placeholder }}</span> }</label>\n }\n @case ('switch') {\n <label class=\"field-toggle-label\"><input type=\"checkbox\" class=\"field-toggle-input\" [id]=\"field.key\" [formControl]=\"control\" /><span class=\"field-toggle-track\"><span class=\"field-toggle-thumb\"></span></span>@if (field.placeholder) { <span class=\"field-toggle-text\">{{ field.placeholder }}</span> }</label>\n }\n @case ('radio') {\n <div class=\"field-radio-group\">\n @for (opt of field.options || []; track opt.value) {\n <label class=\"field-radio-label\"><input type=\"radio\" [name]=\"field.key\" [value]=\"opt.value\" [formControl]=\"control\" [attr.disabled]=\"opt.disabled ? '' : null\" /><span>{{ opt.label }}</span></label>\n }\n </div>\n }\n @case ('otp') {\n <div class=\"field-otp-group\">\n @for (val of otpArray; track $index) {\n <input class=\"field-input otp-digit\" type=\"text\" inputmode=\"numeric\" [value]=\"val\" (input)=\"onOtpInput($event, $index)\" (keydown)=\"onOtpKeydown($event, $index)\" [disabled]=\"isFieldDisabled\" placeholder=\"•\" />\n }\n </div>\n }\n @case ('repeater') {\n <amf-repeater-field\n [field]=\"field\"\n [formArray]=\"getFormArray(field.key)\"\n [formDisabled]=\"isFieldDisabled\"\n [actionDispatcher]=\"actionDispatcher\"\n [context]=\"context\">\n </amf-repeater-field>\n }\n @case ('password') {\n <div class=\"password-wrapper\">\n <input\n class=\"field-input password-input\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n [id]=\"field.key\"\n [formControl]=\"control\"\n [placeholder]=\"field.placeholder || ''\"\n [readOnly]=\"field.readOnly || false\"\n [attr.autocomplete]=\"field.autocomplete\" />\n <button\n type=\"button\"\n class=\"pwd-toggle-btn\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\"\n (click)=\"togglePasswordVisibility()\">\n @if (showPassword()) {\n <!-- Eye-slash: password visible -->\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\"/>\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\"/>\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>\n </svg>\n } @else {\n <!-- Eye: password hidden -->\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n }\n </button>\n </div>\n }\n @case ('currency') {\n <div class=\"currency-wrapper\">\n <span class=\"currency-symbol\">{{ currencySymbol }}</span>\n <input\n class=\"field-input currency-input\"\n type=\"text\"\n inputmode=\"decimal\"\n [id]=\"field.key\"\n [value]=\"formattedCurrencyValue\"\n [placeholder]=\"field.placeholder || '0.00'\"\n [disabled]=\"isFieldDisabled\"\n (input)=\"onCurrencyInput($event)\"\n (blur)=\"onCurrencyBlur($event)\" />\n </div>\n }\n @default { <input class=\"field-input\" [type]=\"field.type\" [id]=\"field.key\" [formControl]=\"control\" [placeholder]=\"field.placeholder || ''\" [readOnly]=\"field.readOnly || false\" [attr.min]=\"field.min\" [attr.max]=\"field.max\" [attr.step]=\"field.step\" [attr.accept]=\"field.accept\" [attr.multiple]=\"field.multiple ? '' : null\" [attr.autocomplete]=\"field.autocomplete\" /> }\n }\n @if (field.suffix) { <span class=\"field-suffix\">{{ field.suffix }}</span> }\n </div>\n @if (field.hint && !hasError) { <span class=\"field-hint\">{{ field.hint }}</span> }\n @if (hasError) { <span class=\"field-error\">{{ errorMessage }}</span> }\n }\n </div>\n }\n `,\n styles: [`\n .amf-field { display: flex; flex-direction: column; gap: 6px; }\n .amf-field.field-disabled { opacity: 0.5; pointer-events: none; }\n .field-label { font-size: 0.875rem; font-weight: 600; color: var(--app-text); }\n .required-mark { color: #f43f5e; margin-left: 2px; }\n .field-input-wrapper { display: flex; align-items: stretch; position: relative; }\n .field-prefix, .field-suffix { padding: 10px 12px; font-size: 0.875rem; color: var(--app-text-muted); background: var(--glass-bg); border: 1px solid var(--app-border); display: flex; align-items: center; justify-content: center; white-space: nowrap; box-sizing: border-box; }\n .field-prefix { border-right: none; border-radius: 8px 0 0 8px; }\n .field-suffix { border-left: none; border-radius: 0 8px 8px 0; }\n .field-input { flex: 1; width: 100%; padding: 10px 14px; border: 1px solid var(--app-border); border-radius: 8px; background: var(--glass-bg); color: var(--app-text); font-size: 0.875rem; font-family: inherit; outline: none; transition: border-color 0.2s, box-shadow 0.2s; box-sizing: border-box; }\n .has-prefix .field-input { border-top-left-radius: 0; border-bottom-left-radius: 0; }\n .has-suffix .field-input { border-top-right-radius: 0; border-bottom-right-radius: 0; }\n .field-input:focus { border-color: var(--app-primary); box-shadow: 0 0 0 3px var(--app-primary-light); z-index: 3; position: relative; }\n .field-input::placeholder { color: var(--app-text-muted); opacity: 0.6; }\n .field-input[readonly] { opacity: 0.7; cursor: not-allowed; }\n .field-input:disabled { opacity: 0.5; cursor: not-allowed; }\n .has-error .field-input { border-color: #f43f5e; }\n .has-error .field-input:focus { box-shadow: 0 0 0 3px rgba(244, 63, 94, 0.15); }\n .field-select { appearance: none; cursor: pointer; padding-right: 36px; background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24'%3E%3Cpath fill='%2394a3b8' d='M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z'/%3E%3C/svg%3E\"); background-repeat: no-repeat; background-position: right 12px center; color-scheme: dark; }\n .field-select option { background-color: #1e1e2d; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) .field-select { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) .field-select option { background-color: #ffffff; color: #000000; }\n .field-textarea { resize: vertical; min-height: 80px; }\n .field-checkbox-label, .field-radio-label { display: flex; align-items: center; gap: 8px; font-size: 0.875rem; color: var(--app-text); cursor: pointer; }\n .field-radio-group { display: flex; flex-direction: column; gap: 8px; }\n .field-otp-group { display: flex; gap: 8px; justify-content: center; width: 100%; }\n .otp-digit { width: 44px; height: 50px; text-align: center; font-size: 1.25rem; font-weight: 600; padding: 0; letter-spacing: 0; }\n .field-toggle-label { display: flex; align-items: center; gap: 10px; cursor: pointer; }\n .field-toggle-input { display: none; }\n .field-toggle-track { width: 44px; height: 24px; background: var(--app-border); border-radius: 12px; position: relative; transition: background 0.2s; }\n .field-toggle-input:checked + .field-toggle-track { background: var(--app-primary); }\n .field-toggle-thumb { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: white; border-radius: 50%; transition: transform 0.2s; }\n .field-toggle-input:checked + .field-toggle-track .field-toggle-thumb { transform: translateX(20px); }\n .field-toggle-text { font-size: 0.875rem; color: var(--app-text); }\n .field-hint { font-size: 0.75rem; color: var(--app-text-muted); }\n .field-error { font-size: 0.75rem; color: #f43f5e; font-weight: 500; }\n .field-heading { font-size: 1.125rem; margin-top: 8px; color: var(--app-text); }\n .field-divider { border: none; border-top: 1px solid var(--app-border); margin: 8px 0; }\n .field-button { padding: 10px 20px; border-radius: 10px; font-weight: 600; font-size: 0.875rem; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); border: none; width: 100%; }\n .field-button.btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; }\n .field-button.btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .field-button.btn-secondary { background: var(--glass-bg); color: var(--app-text); border: 1px solid var(--app-border); }\n .field-button.btn-secondary:hover:not(:disabled) { background: var(--glass-bg-hover); border-color: var(--glass-border-light); }\n .field-button.btn-outline { background: transparent; color: var(--app-text); border: 1px solid var(--app-border); }\n .field-button.btn-outline:hover:not(:disabled) { background: var(--glass-bg-hover); }\n .field-button.btn-success { background: linear-gradient(135deg, #10b981, #34d399); color: white; }\n .field-button.btn-success:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px rgba(16,185,129,0.3); }\n .field-button.btn-accent { background: linear-gradient(135deg, var(--app-accent), var(--app-primary)); color: white; }\n .field-button.btn-accent:hover:not(:disabled) { transform: translateY(-2px); }\n .field-button:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n\n /* ─── Password Toggle ──────────────────────────────────────── */\n .password-wrapper { position: relative; display: flex; align-items: stretch; width: 100%; }\n .password-input { padding-right: 44px !important; }\n .pwd-toggle-btn {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--app-text-muted);\n border-radius: 0 8px 8px 0;\n transition: color 0.2s;\n z-index: 2;\n }\n .pwd-toggle-btn:hover { color: var(--app-primary); }\n .pwd-toggle-btn svg { width: 18px; height: 18px; }\n\n /* ─── Currency Formatter ───────────────────────────────────── */\n .currency-wrapper { display: flex; align-items: stretch; width: 100%; }\n .currency-symbol {\n padding: 10px 12px;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--app-text-muted);\n background: var(--glass-bg);\n border: 1px solid var(--app-border);\n border-right: none;\n border-radius: 8px 0 0 8px;\n display: flex;\n align-items: center;\n white-space: nowrap;\n box-sizing: border-box;\n }\n .currency-input { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; }\n `]\n})\nexport class FieldRendererComponent {\n @Input() field!: FieldMeta;\n @Input() form!: FormGroup;\n @Input() formDisabled: boolean = false;\n @Input() actionDispatcher!: ActionDispatcherService;\n @Input() context: any = {};\n private readonly validatorFactory = inject(ValidatorFactoryService);\n\n get control(): FormControl { return this.form.controls[this.field.key] as FormControl; }\n get hasError(): boolean { const ctrl = this.control; return ctrl ? ctrl.invalid && (ctrl.dirty || ctrl.touched) : false; }\n get isRequired(): boolean { return Array.isArray(this.field.validators) ? this.field.validators.some(v => v.type === 'required') : !!(this.field.validators as any)?.required; }\n get errorMessage(): string { const ctrl = this.control; return ctrl?.errors ? this.validatorFactory.getErrorMessage(ctrl.errors) : ''; }\n get isFieldDisabled(): boolean { return this.formDisabled || !!(this.field as any).disabled; }\n\n getFormArray(key: string): any {\n return this.form.get(key);\n }\n\n // ─── Password Toggle ────────────────────────────────────────\n showPassword = signal(false);\n togglePasswordVisibility(): void { this.showPassword.update(v => !v); }\n\n // ─── Currency Formatter ──────────────────────────────────────\n /** Read-only getters so the template never needs `(field as any)` casts */\n get currencySymbol(): string { return (this.field as any).currencySymbol || '$'; }\n get currencyLocale(): string { return (this.field as any).locale || 'en-US'; }\n\n get formattedCurrencyValue(): string {\n const raw = this.control?.value;\n if (raw === null || raw === undefined || raw === '') return '';\n const num = parseFloat(String(raw).replace(/,/g, ''));\n if (isNaN(num)) return '';\n return num.toLocaleString(this.currencyLocale, { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n }\n\n onCurrencyInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n // Strip everything except digits and decimal point\n const stripped = input.value.replace(/[^0-9.]/g, '');\n // Prevent multiple decimals\n const parts = stripped.split('.');\n const clean = parts.length > 2 ? parts[0] + '.' + parts.slice(1).join('') : stripped;\n const num = parseFloat(clean);\n // Store raw number in form control\n this.control?.setValue(isNaN(num) ? '' : num, { emitEvent: true });\n // Format display without triggering another input event\n const formatted = isNaN(num) ? clean : num.toLocaleString(this.currencyLocale, { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n // Restore formatted value in the visible input\n setTimeout(() => { input.value = formatted; });\n }\n\n onCurrencyBlur(event: Event): void {\n const input = event.target as HTMLInputElement;\n const raw = this.control?.value;\n if (raw !== null && raw !== undefined && raw !== '') {\n const num = parseFloat(String(raw));\n if (!isNaN(num)) {\n input.value = num.toLocaleString(this.currencyLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n }\n this.control?.markAsTouched();\n }\n\n // --- OTP Logic ---\n get otpArray(): string[] {\n const val = this.control?.value || '';\n const length = (this.field as any).otpLength || 6;\n return Array.from({ length }, (_, i) => val[i] || '');\n }\n\n onOtpInput(event: Event, index: number): void {\n const input = event.target as HTMLInputElement;\n let value = input.value;\n const length = (this.field as any).otpLength || 6;\n\n // Handle Paste (multiple chars)\n if (value.length > 1) {\n const pasted = value.replace(/[^0-9a-zA-Z]/g, '').slice(0, length);\n this.control.setValue(pasted);\n setTimeout(() => {\n const parent = input.parentElement;\n if (parent) {\n const nextIndex = Math.min(length - 1, pasted.length < length ? pasted.length : length - 1);\n const nextInput = parent.children[nextIndex] as HTMLInputElement;\n if (nextInput) nextInput.focus();\n }\n });\n return;\n }\n\n const currentArr = [...this.otpArray];\n currentArr[index] = value.slice(-1);\n this.control.setValue(currentArr.join(''));\n\n // Move to next input\n if (value && index < length - 1) {\n const nextInput = input.nextElementSibling as HTMLInputElement;\n if (nextInput) nextInput.focus();\n }\n }\n\n onOtpKeydown(event: KeyboardEvent, index: number): void {\n const input = event.target as HTMLInputElement;\n if (event.key === 'Backspace' && !input.value && index > 0) {\n const prev = input.previousElementSibling as HTMLInputElement;\n if (prev) {\n prev.focus();\n const currentArr = [...this.otpArray];\n currentArr[index - 1] = '';\n this.control.setValue(currentArr.join(''));\n }\n }\n }\n\n\n handleButtonClick(): void {\n if (this.isFieldDisabled) return;\n const onClick = (this.field as any).onClick;\n if (onClick && this.actionDispatcher) {\n this.actionDispatcher.dispatch(onClick, this.context);\n }\n }\n}\n\n\n","/**\n * AvoraMetaForge — Form Renderer Component\n */\nimport { Component, Input, Output, EventEmitter, inject, OnInit, OnChanges, SimpleChanges, OnDestroy } from '@angular/core';\n\nimport { ReactiveFormsModule, FormGroup, FormControl, FormArray, AbstractControl } from '@angular/forms';\nimport { FormMeta, FieldMeta } from '../../models/meta.types';\nimport { Subscription } from 'rxjs';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { ConditionEvaluatorService } from '../../core/condition-evaluator.service';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { FieldRendererComponent } from './field-renderer.component';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { MetaStateService } from '../../services/meta-state.service';\n\n@Component({\n selector: 'amf-form-renderer',\n standalone: true,\n imports: [ReactiveFormsModule, FieldRendererComponent],\n template: `\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\" class=\"amf-form\" [class]=\"config.cssClass\" [class.form-disabled]=\"config.disabled\">\n <div class=\"amf-form-fields\" [class]=\"layoutClass\" [style.grid-template-columns]=\"gridColumns\">\n @for (field of visibleFields; track field.key) {\n <amf-field-renderer [field]=\"field\" [form]=\"formGroup\" [formDisabled]=\"!!config.disabled\" [actionDispatcher]=\"actionDispatcher\" [context]=\"context\" [style.grid-column]=\"field.colSpan ? 'span ' + field.colSpan : null\"></amf-field-renderer>\n }\n </div>\n @if (!config.hideSubmit) {\n <div class=\"amf-form-actions\">\n @if (config.showCancel) { <button type=\"button\" class=\"btn-secondary\" (click)=\"handleCancel()\" [disabled]=\"config.disabled\">{{ config.cancelLabel || 'Cancel' }}</button> }\n @if (config.showReset) { <button type=\"button\" class=\"btn-secondary\" (click)=\"formGroup.reset()\" [disabled]=\"config.disabled\">Reset</button> }\n <button type=\"submit\" class=\"btn-primary\" [disabled]=\"formGroup.invalid || config.disabled\">{{ config.submitLabel || 'Submit' }}</button>\n </div>\n }\n </form>\n `,\n styles: [`\n .amf-form { display: flex; flex-direction: column; gap: 24px; }\n .amf-form.form-disabled { opacity: 0.6; pointer-events: none; }\n .amf-form-fields { display: flex; flex-direction: column; gap: 20px; }\n .amf-form-fields.layout-grid { display: grid; gap: 20px; }\n .amf-form-fields.layout-horizontal { flex-direction: row; flex-wrap: wrap; gap: 16px; }\n .amf-form-fields.layout-horizontal > * { flex: 1; min-width: 200px; }\n .amf-form-fields.layout-inline { flex-direction: row; align-items: flex-end; gap: 12px; }\n .amf-form-actions { display: flex; justify-content: flex-end; gap: 12px; padding-top: 8px; border-top: 1px solid var(--app-border); }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: var(--app-on-primary, #fff); border: none; padding: 10px 24px; border-radius: 10px; font-weight: 600; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); }\n .btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n .btn-secondary { background: var(--glass-bg); color: var(--app-text); border: 1px solid var(--app-border); padding: 10px 24px; border-radius: 10px; font-weight: 600; cursor: pointer; transition: all 0.2s; }\n .btn-secondary:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); }\n `]\n})\nexport class FormRendererComponent implements MetaSectionComponent<FormMeta>, OnInit, OnChanges, OnDestroy {\n @Input() config!: FormMeta;\n @Input() context: any = {};\n @Output() formSubmit = new EventEmitter<any>();\n @Output() formCancel = new EventEmitter<void>();\n @Output() formChange = new EventEmitter<any>();\n\n formGroup!: FormGroup;\n private readonly validatorFactory = inject(ValidatorFactoryService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly stateService = inject(MetaStateService);\n\n private sub?: Subscription;\n\n ngOnInit(): void { \n this.buildForm(); \n this.sub = this.actionDispatcher.formEvents$.subscribe(event => {\n // Match against both config.id (explicit form ID) and _sectionId (injected by MetaRendererComponent)\n const formId = this.config.id || (this.config as any)._sectionId;\n if (event.config?.formId && event.config.formId !== formId) return;\n \n if (event.action === 'reset') {\n this.formGroup.reset();\n } else if (event.action === 'patch') {\n const payload = event.config.values;\n if (payload) {\n // If a value comes from state dynamically\n const finalPatch = { ...payload };\n if (event.config.fromState) {\n // Can be extended if needed\n }\n this.formGroup.patchValue(finalPatch);\n }\n } else if (event.action === 'submit') {\n this.onSubmit();\n }\n });\n }\n \n ngOnDestroy(): void {\n if (this.sub) this.sub.unsubscribe();\n }\n\n ngOnChanges(changes: SimpleChanges): void { if (changes['config'] && !changes['config'].firstChange) { this.buildForm(); } }\n\n get visibleFields(): FieldMeta[] {\n return this.normalizedFields.filter(field => {\n if (!field.visibleWhen) return true;\n return this.conditionEvaluator.evaluate(field.visibleWhen, { ...this.context, ...this.formGroup.value });\n });\n }\n\n /** Normalize fields: ensure every field has a `key` (falling back to `name` for backward compat) */\n private get normalizedFields(): FieldMeta[] {\n return this.config.fields.map(f => ({ ...f, key: f.key || (f as any).name || f.label || '' }));\n }\n\n get layoutClass(): string { return this.config.layout ? `layout-${this.config.layout}` : ''; }\n get gridColumns(): string | null { return (this.config.layout === 'grid' && this.config.columns) ? `repeat(${this.config.columns}, 1fr)` : null; }\n\n onSubmit(): void {\n if (this.formGroup.valid) {\n const value = this.formGroup.value;\n this.formSubmit.emit(value);\n if (this.config.onSubmit) this.actionDispatcher.dispatch(this.config.onSubmit, { ...this.context, formValue: value });\n } else {\n this.markAllTouched();\n }\n }\n\n handleCancel(): void {\n this.formCancel.emit();\n if (this.config.onCancel) this.actionDispatcher.dispatch(this.config.onCancel, this.context);\n }\n\n private buildForm(): void {\n const rowData = this.context?.state?.row || this.context?.row || {};\n const controls = this.buildControls(this.normalizedFields, rowData, '');\n \n this.formGroup = new FormGroup(controls);\n\n // Emit value changes\n this.formGroup.valueChanges.subscribe(val => this.formChange.emit(val));\n\n // If entire form is disabled, disable the FormGroup\n if (this.config.disabled) {\n this.formGroup.disable();\n }\n }\n\n buildControls(fields: FieldMeta[], rowData: any, statePrefix: string): Record<string, AbstractControl> {\n const controls: Record<string, AbstractControl> = {};\n \n for (const field of fields) {\n if (field.type === 'divider' || field.type === 'heading' || field.type === 'button') continue;\n\n let value = rowData?.[field.key] ?? this.config.initialValues?.[field.key];\n\n if (value === undefined || value === null) {\n const stateNs: string | undefined = this.config['loadFromState'];\n if (stateNs) {\n const keyPath = statePrefix ? `${stateNs}.${statePrefix}.${field.key}` : `${stateNs}.${field.key}`;\n const saved = this.stateService.get(keyPath);\n value = saved !== undefined && saved !== null ? saved : field.defaultValue;\n } else {\n value = field.defaultValue;\n }\n }\n\n const validators = this.validatorFactory.createValidators(field.validators);\n const isDisabled = field.disabled || (field.disabledWhen ? this.conditionEvaluator.evaluate(field.disabledWhen, this.context) : false);\n\n if (field.type === 'repeater') {\n const initialArray = Array.isArray(value) ? value : [];\n const minItems = field.minItems || 0;\n \n // Ensure minimum items exist\n while (initialArray.length < minItems) {\n initialArray.push({});\n }\n\n const formArrayControls = initialArray.map((itemValue, idx) => {\n const groupControls = this.buildControls(field.children || [], itemValue, `${field.key}[${idx}]`);\n return new FormGroup(groupControls);\n });\n\n const formArray = new FormArray(formArrayControls, validators);\n if (isDisabled) formArray.disable();\n controls[field.key] = formArray;\n } else {\n value = value ?? '';\n controls[field.key] = new FormControl({ value, disabled: isDisabled }, validators);\n }\n }\n \n return controls;\n }\n private markAllTouched(): void { Object.values(this.formGroup.controls).forEach(c => c.markAsTouched()); }\n}\n","/**\n * AvoraMetaForge — Stepper Form Renderer Component\n *\n * Renders a FormMeta with layout: 'stepper' as an animated multi-step wizard.\n * - Builds the full FormGroup upfront (same DI as FormRendererComponent)\n * - Validates only the active step's fields before advancing\n * - Supports skipWhen conditions, onEnter/onLeave step hooks\n * - Enterprise-grade stepper UI with animated step indicators\n */\nimport {\n Component, Input, Output, EventEmitter,\n inject, OnInit, OnChanges, SimpleChanges, OnDestroy, signal, computed\n} from '@angular/core';\n\nimport { ReactiveFormsModule, FormGroup, FormControl, FormArray, AbstractControl } from '@angular/forms';\nimport { FormMeta, FieldMeta, FormStepMeta } from '../../models/meta.types';\nimport { ValidatorFactoryService } from './validator-factory.service';\nimport { ConditionEvaluatorService } from '../../core/condition-evaluator.service';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { FieldRendererComponent } from './field-renderer.component';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { MetaStateService } from '../../services/meta-state.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'amf-stepper-form-renderer',\n standalone: true,\n imports: [ReactiveFormsModule, FieldRendererComponent],\n template: `\n <div class=\"amf-stepper\" [class]=\"config.cssClass\" [class.stepper-disabled]=\"config.disabled\">\n\n <!-- ─── Step Header ──────────────────────────────────── -->\n <div class=\"stepper-header\">\n @for (step of resolvedSteps(); track $index) {\n <div class=\"step-item\"\n [class.active]=\"$index === currentStep()\"\n [class.completed]=\"isCompleted($index)\"\n [class.skipped]=\"isSkipped($index)\"\n [class.navigable]=\"canNavigateTo($index)\"\n (click)=\"canNavigateTo($index) && goToStep($index)\">\n <div class=\"step-indicator\">\n @if (isCompleted($index)) {\n <svg class=\"check-icon\" viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>\n } @else if (isSkipped($index)) {\n <svg class=\"skip-icon\" viewBox=\"0 0 24 24\"><path d=\"M6 18l8.5-6L6 6v12zm2-8.14L11.03 12 8 14.14V9.86zM16 6h2v12h-2z\"/></svg>\n } @else {\n <span class=\"step-number\">{{ $index + 1 }}</span>\n }\n </div>\n <div class=\"step-label-group\">\n <span class=\"step-title\">{{ step.title }}</span>\n @if (step.description) { <span class=\"step-description\">{{ step.description }}</span> }\n </div>\n @if ($index < resolvedSteps().length - 1) {\n <div class=\"step-connector\" [class.completed]=\"isCompleted($index)\"></div>\n }\n </div>\n }\n </div>\n\n <!-- ─── Mobile Progress Bar ───────────────────────────── -->\n <div class=\"stepper-progress-mobile\">\n <span class=\"progress-label\">Step {{ currentStep() + 1 }} of {{ resolvedSteps().length }}: {{ resolvedSteps()[currentStep()]?.title }}</span>\n <div class=\"progress-bar-track\">\n <div class=\"progress-bar-fill\" [style.width.%]=\"progressPercent()\"></div>\n </div>\n </div>\n\n <!-- ─── Step Content ─────────────────────────────────── -->\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\" class=\"stepper-form-body\">\n <div class=\"step-content\">\n <div class=\"step-fields\" [style.grid-template-columns]=\"currentGridColumns()\">\n @for (field of currentStepVisibleFields(); track field.key) {\n <amf-field-renderer\n [field]=\"field\"\n [form]=\"formGroup\"\n [formDisabled]=\"!!config.disabled\"\n [actionDispatcher]=\"actionDispatcher\"\n [context]=\"context\"\n [style.grid-column]=\"field.colSpan ? 'span ' + field.colSpan : null\">\n </amf-field-renderer>\n }\n </div>\n\n <!-- Step-level validation error summary -->\n @if (stepErrors().length) {\n <div class=\"step-error-summary\">\n <svg viewBox=\"0 0 24 24\" class=\"error-summary-icon\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\n <span>Please fix {{ stepErrors().length }} error{{ stepErrors().length > 1 ? 's' : '' }} before continuing.</span>\n </div>\n }\n </div>\n\n <!-- ─── Navigation Actions ────────────────────────────── -->\n <div class=\"stepper-actions\">\n <div class=\"stepper-actions-left\">\n @if (config.showReset) {\n <button type=\"button\" class=\"btn-reset\" (click)=\"resetForm()\" [disabled]=\"config.disabled\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/></svg>\n {{ config.resetLabel || 'Start Over' }}\n </button>\n }\n @if (currentStep() > 0) {\n <button type=\"button\" class=\"btn-back\" (click)=\"goBack()\" [disabled]=\"config.disabled\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"/></svg>\n Back\n </button>\n }\n </div>\n <div class=\"stepper-actions-right\">\n @if (resolvedSteps()[currentStep()]?.optional) {\n <button type=\"button\" class=\"btn-skip\" (click)=\"skipStep()\" [disabled]=\"config.disabled\">Skip</button>\n }\n @if (currentStep() < resolvedSteps().length - 1) {\n <button type=\"button\" class=\"btn-next\" (click)=\"goNext()\" [disabled]=\"config.disabled\">\n {{ resolvedSteps()[currentStep() + 1] ? 'Next' : 'Review' }}\n <svg viewBox=\"0 0 24 24\"><path d=\"M4 11v2h12l-5.59 5.59L12 20l8-8-8-8-1.41 1.41L16 11H4z\"/></svg>\n </button>\n } @else {\n @if (!config.hideSubmit) {\n <button type=\"submit\" class=\"btn-submit\" [disabled]=\"formGroup.invalid || config.disabled\">\n {{ config.submitLabel || 'Submit' }}\n <svg viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>\n </button>\n }\n }\n </div>\n </div>\n </form>\n </div>\n `,\n styles: [`\n /* ─── Container ─────────────────────────────────────────── */\n .amf-stepper { display: flex; flex-direction: column; gap: 0; }\n .amf-stepper.stepper-disabled { opacity: 0.6; pointer-events: none; }\n\n /* ─── Step Header ────────────────────────────────────────── */\n .stepper-header {\n display: flex;\n align-items: flex-start;\n gap: 0;\n padding: 20px 24px 0;\n overflow-x: auto;\n scrollbar-width: none;\n }\n .stepper-header::-webkit-scrollbar { display: none; }\n\n .step-item {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n cursor: default;\n position: relative;\n }\n .step-item.navigable { cursor: pointer; }\n .step-item.navigable:hover .step-indicator { border-color: var(--app-primary); }\n .step-item.navigable:hover .step-title { color: var(--app-text); }\n\n .step-indicator {\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n border: 2px solid var(--app-border);\n background: var(--app-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n z-index: 1;\n }\n .step-item.active .step-indicator {\n border-color: var(--app-primary);\n background: var(--app-primary);\n box-shadow: 0 0 0 4px rgba(var(--app-primary-rgb, 99 102 241), 0.18);\n }\n .step-item.completed .step-indicator {\n border-color: #22c55e;\n background: #22c55e;\n }\n .step-item.skipped .step-indicator {\n border-color: var(--app-text-muted);\n background: var(--glass-bg);\n }\n\n .step-number { font-size: 0.8125rem; font-weight: 700; color: var(--app-text-muted); }\n .step-item.active .step-number { color: #fff; }\n .check-icon, .skip-icon { width: 18px; height: 18px; fill: #fff; }\n .skip-icon { fill: var(--app-text-muted); }\n\n .step-label-group {\n display: flex;\n flex-direction: column;\n margin-left: 10px;\n min-width: 0;\n flex-shrink: 0;\n }\n .step-title {\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--app-text-muted);\n white-space: nowrap;\n transition: color 0.2s;\n }\n .step-item.active .step-title { color: var(--app-text); }\n .step-item.completed .step-title { color: var(--app-text-muted); }\n\n .step-description {\n font-size: 0.6875rem;\n color: var(--app-text-muted);\n opacity: 0.7;\n white-space: nowrap;\n margin-top: 1px;\n }\n\n .step-connector {\n flex: 1;\n height: 2px;\n background: var(--app-border);\n margin: 0 10px;\n margin-top: 0;\n border-radius: 1px;\n transition: background 0.4s ease;\n align-self: center;\n margin-bottom: 14px;\n }\n .step-connector.completed { background: linear-gradient(90deg, #22c55e, var(--app-primary)); }\n\n /* ─── Mobile Progress ────────────────────────────────────── */\n .stepper-progress-mobile {\n display: none;\n flex-direction: column;\n gap: 8px;\n padding: 16px 24px 0;\n }\n @media (max-width: 640px) {\n .stepper-header { display: none; }\n .stepper-progress-mobile { display: flex; }\n }\n .progress-label { font-size: 0.8125rem; font-weight: 600; color: var(--app-text); }\n .progress-bar-track {\n width: 100%;\n height: 6px;\n background: var(--app-border);\n border-radius: 3px;\n overflow: hidden;\n }\n .progress-bar-fill {\n height: 100%;\n background: linear-gradient(90deg, var(--app-primary), var(--app-accent));\n border-radius: 3px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* ─── Step Content ───────────────────────────────────────── */\n .stepper-form-body { display: flex; flex-direction: column; gap: 24px; padding: 24px; }\n\n .step-content { animation: stepFadeIn 0.3s ease-out; }\n @keyframes stepFadeIn {\n from { opacity: 0; transform: translateX(12px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .step-fields {\n display: grid;\n grid-template-columns: 1fr;\n gap: 20px;\n }\n\n /* ─── Step Error Summary ─────────────────────────────────── */\n .step-error-summary {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: rgba(244, 63, 94, 0.08);\n border: 1px solid rgba(244, 63, 94, 0.25);\n border-radius: 10px;\n margin-top: 8px;\n animation: stepFadeIn 0.2s ease-out;\n }\n .error-summary-icon { width: 18px; height: 18px; fill: #f43f5e; flex-shrink: 0; }\n .step-error-summary span { font-size: 0.8125rem; color: #f43f5e; font-weight: 500; }\n\n /* ─── Actions ────────────────────────────────────────────── */\n .stepper-actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 8px;\n border-top: 1px solid var(--app-border);\n }\n .stepper-actions-left, .stepper-actions-right { display: flex; gap: 10px; align-items: center; }\n\n .btn-reset {\n display: flex; align-items: center; gap: 6px;\n background: transparent;\n color: #ef4444; /* red-500 */\n border: 1px solid rgba(239, 68, 68, 0.3);\n padding: 10px 20px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-reset svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-reset:hover { background: rgba(239, 68, 68, 0.1); border-color: rgba(239, 68, 68, 0.5); }\n .btn-reset:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .btn-back {\n display: flex; align-items: center; gap: 6px;\n background: var(--glass-bg);\n color: var(--app-text);\n border: 1px solid var(--app-border);\n padding: 10px 20px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-back svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-back:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); }\n .btn-back:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .btn-skip {\n background: transparent;\n color: var(--app-text-muted);\n border: none;\n padding: 10px 16px;\n border-radius: 10px;\n font-weight: 500;\n font-size: 0.8125rem;\n cursor: pointer;\n transition: color 0.2s;\n }\n .btn-skip:hover { color: var(--app-primary); }\n .btn-skip:disabled { opacity: 0.5; cursor: not-allowed; }\n\n .btn-next {\n display: flex; align-items: center; gap: 6px;\n background: linear-gradient(135deg, var(--app-primary), var(--app-accent));\n color: #fff;\n border: none;\n padding: 10px 24px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .btn-next svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-next:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .btn-next:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n\n .btn-submit {\n display: flex; align-items: center; gap: 6px;\n background: linear-gradient(135deg, #22c55e, #16a34a);\n color: #fff;\n border: none;\n padding: 10px 28px;\n border-radius: 10px;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .btn-submit svg { width: 16px; height: 16px; fill: currentColor; }\n .btn-submit:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 24px -4px rgba(34, 197, 94, 0.35); }\n .btn-submit:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\n `]\n})\nexport class StepperFormRendererComponent\n implements MetaSectionComponent<FormMeta>, OnInit, OnChanges, OnDestroy {\n\n @Input() config!: FormMeta;\n @Input() context: any = {};\n @Output() formSubmit = new EventEmitter<any>();\n @Output() formCancel = new EventEmitter<void>();\n\n formGroup!: FormGroup;\n\n private readonly validatorFactory = inject(ValidatorFactoryService);\n private readonly conditionEvaluator = inject(ConditionEvaluatorService);\n readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly stateService = inject(MetaStateService);\n\n private sub?: Subscription;\n\n // ─── Step State ─────────────────────────────────────────────\n currentStep = signal(0);\n completedSteps = signal<Set<number>>(new Set());\n skippedSteps = signal<Set<number>>(new Set());\n stepErrors = signal<string[]>([]);\n\n // ─── Derived ─────────────────────────────────────────────────\n resolvedSteps = computed<FormStepMeta[]>(() => this.config?.steps ?? []);\n\n progressPercent = computed(() => {\n const total = this.resolvedSteps().length;\n return total > 0 ? Math.round(((this.currentStep() + 1) / total) * 100) : 0;\n });\n\n currentGridColumns = computed(() => {\n const cols = this.config.columns || 1;\n return `repeat(${cols}, minmax(0, 1fr))`;\n });\n\n ngOnInit(): void {\n this.buildForm();\n\n this.sub = this.actionDispatcher.formEvents$.subscribe(event => {\n const formId = this.config.id || (this.config as any)._sectionId;\n if (event.config?.formId && event.config.formId !== formId) return;\n\n if (event.action === 'reset') {\n this.resetForm();\n } else if (event.action === 'patch') {\n if (event.config.values) this.formGroup.patchValue(event.config.values);\n } else if (event.action === 'submit') {\n this.onSubmit();\n }\n });\n }\n\n resetForm(): void {\n this.formGroup.reset();\n this.currentStep.set(0);\n this.completedSteps.set(new Set());\n this.skippedSteps.set(new Set());\n this.stepErrors.set([]);\n if (this.config.onReset) {\n this.actionDispatcher.dispatch(this.config.onReset, this.context);\n }\n }\n\n ngOnDestroy(): void { this.sub?.unsubscribe(); }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) this.buildForm();\n }\n\n // ─── Fields for current step ────────────────────────────────\n currentStepVisibleFields = computed<FieldMeta[]>(() => {\n const step = this.resolvedSteps()[this.currentStep()];\n if (!step) return [];\n return this.normalizedFields\n .filter(f => step.fields.includes(f.key))\n .filter(f => {\n if (!f.visibleWhen) return true;\n return this.conditionEvaluator.evaluate(f.visibleWhen, {\n ...this.context,\n ...this.formGroup?.value\n });\n });\n });\n\n private get normalizedFields(): FieldMeta[] {\n return (this.config?.fields ?? []).map(f => ({\n ...f,\n key: f.key || (f as any).name || f.label || ''\n }));\n }\n\n // ─── Step navigation ────────────────────────────────────────\n isCompleted(index: number): boolean { return this.completedSteps().has(index); }\n isSkipped(index: number): boolean { return this.skippedSteps().has(index); }\n\n canNavigateTo(index: number): boolean {\n // Allow clicking only past (completed/skipped) steps\n return this.isCompleted(index) || this.isSkipped(index);\n }\n\n goToStep(index: number): void {\n if (index < 0 || index >= this.resolvedSteps().length) return;\n\n // Fire onLeave for current step\n const leaving = this.resolvedSteps()[this.currentStep()];\n if (leaving?.onLeave) this.actionDispatcher.dispatch(leaving.onLeave, this.context);\n\n this.currentStep.set(index);\n this.stepErrors.set([]);\n\n // Fire onEnter for new step\n const entering = this.resolvedSteps()[index];\n if (entering?.onEnter) this.actionDispatcher.dispatch(entering.onEnter, this.context);\n }\n\n goNext(): void {\n const step = this.resolvedSteps()[this.currentStep()];\n if (step?.validate !== false) {\n // Validate only the current step's field controls\n const stepFieldKeys = step?.fields ?? [];\n const errors: string[] = [];\n for (const key of stepFieldKeys) {\n const ctrl = this.formGroup.controls[key];\n if (ctrl) {\n ctrl.markAsTouched();\n ctrl.updateValueAndValidity();\n if (ctrl.invalid) {\n const field = this.normalizedFields.find(f => f.key === key);\n errors.push(field?.label || key);\n }\n }\n }\n if (errors.length) {\n this.stepErrors.set(errors);\n return;\n }\n }\n\n this.stepErrors.set([]);\n\n // Mark step as completed\n const completed = new Set(this.completedSteps());\n completed.add(this.currentStep());\n this.completedSteps.set(completed);\n\n // Find next non-skipped step\n let next = this.currentStep() + 1;\n while (next < this.resolvedSteps().length) {\n const nextStep = this.resolvedSteps()[next];\n if (nextStep.skipWhen && this.conditionEvaluator.evaluate(nextStep.skipWhen, {\n ...this.context,\n ...this.formGroup.value\n })) {\n // Auto-skip\n const skipped = new Set(this.skippedSteps());\n skipped.add(next);\n this.skippedSteps.set(skipped);\n next++;\n } else {\n break;\n }\n }\n\n if (next < this.resolvedSteps().length) {\n this.goToStep(next);\n }\n }\n\n goBack(): void {\n let prev = this.currentStep() - 1;\n while (prev >= 0 && this.isSkipped(prev)) { prev--; }\n if (prev >= 0) this.goToStep(prev);\n }\n\n skipStep(): void {\n const skipped = new Set(this.skippedSteps());\n skipped.add(this.currentStep());\n this.skippedSteps.set(skipped);\n\n let next = this.currentStep() + 1;\n if (next < this.resolvedSteps().length) this.goToStep(next);\n }\n\n // ─── Submit ─────────────────────────────────────────────────\n onSubmit(): void {\n if (this.formGroup.valid) {\n const value = this.formGroup.value;\n this.formSubmit.emit(value);\n if (this.config.onSubmit) {\n this.actionDispatcher.dispatch(this.config.onSubmit, { ...this.context, formValue: value });\n }\n // Auto-reset: allow notification/action to render first, then return to Step 1\n setTimeout(() => this.resetForm(), 500);\n } else {\n Object.values(this.formGroup.controls).forEach(c => c.markAsTouched());\n }\n }\n\n // ─── Form Building ───────────────────────────────────────────\n private buildForm(): void {\n const rowData = this.context?.state?.row || this.context?.row || {};\n const controls = this.buildControls(this.normalizedFields, rowData, '');\n \n this.formGroup = new FormGroup(controls);\n if (this.config.disabled) this.formGroup.disable();\n }\n\n private buildControls(fields: FieldMeta[], rowData: any, statePrefix: string): Record<string, AbstractControl> {\n const controls: Record<string, AbstractControl> = {};\n\n for (const field of fields) {\n if (field.type === 'divider' || field.type === 'heading' || field.type === 'button') continue;\n\n let value = rowData?.[field.key] ?? this.config.initialValues?.[field.key];\n\n if (value === undefined || value === null) {\n const stateNs: string | undefined = this.config['loadFromState'];\n if (stateNs) {\n const keyPath = statePrefix ? `${stateNs}.${statePrefix}.${field.key}` : `${stateNs}.${field.key}`;\n const saved = this.stateService.get(keyPath);\n value = saved !== undefined && saved !== null ? saved : field.defaultValue;\n } else {\n value = field.defaultValue;\n }\n }\n\n const validators = this.validatorFactory.createValidators(field.validators);\n const isDisabled = field.disabled || (field.disabledWhen ? this.conditionEvaluator.evaluate(field.disabledWhen, this.context) : false);\n\n if (field.type === 'repeater') {\n const initialArray = Array.isArray(value) ? value : [];\n const minItems = field.minItems || 0;\n \n while (initialArray.length < minItems) {\n initialArray.push({});\n }\n\n const formArrayControls = initialArray.map((itemValue, idx) => {\n const groupControls = this.buildControls(field.children || [], itemValue, `${field.key}[${idx}]`);\n return new FormGroup(groupControls);\n });\n\n const formArray = new FormArray(formArrayControls, validators);\n if (isDisabled) formArray.disable();\n controls[field.key] = formArray;\n } else {\n value = value ?? '';\n controls[field.key] = new FormControl({ value, disabled: isDisabled }, validators);\n }\n }\n \n return controls;\n }\n}\n","/**\n * AvoraMetaForge — Cell Renderer Component\n */\nimport { Component, Input } from '@angular/core';\nimport { CommonModule, TitleCasePipe, DatePipe, CurrencyPipe } from '@angular/common';\nimport { ColumnMeta } from '../../models/meta.types';\n\n@Component({\n selector: 'amf-cell-renderer',\n standalone: true,\n imports: [CommonModule, TitleCasePipe, DatePipe, CurrencyPipe],\n template: `\n @switch (column.type || 'text') {\n @case ('badge') { <span class=\"cell-badge\" [class]=\"getBadgeClass()\">{{ value | titlecase }}</span> }\n @case ('avatar') {\n <div class=\"cell-avatar\">\n <div class=\"avatar-circle\">{{ getInitial() }}</div>\n <div class=\"avatar-info\">\n <span class=\"avatar-name\">{{ value }}</span>\n @if (column.subtitleKey) { <span class=\"avatar-subtitle\">{{ getNestedValue(row, column.subtitleKey) }}</span> }\n </div>\n </div>\n }\n @case ('date') { <span>{{ value | date:(column.dateFormat || 'mediumDate') }}</span> }\n @case ('datetime') { <span>{{ value | date:(column.dateFormat || 'medium') }}</span> }\n @case ('currency') { <span>{{ value | currency:(column.currencyCodeKey ? getNestedValue(row, column.currencyCodeKey) : (column.currencyCode || 'USD')):(column.currencyDisplay !== undefined ? column.currencyDisplay : 'symbol') }}</span> }\n @case ('boolean') { <span class=\"cell-boolean\" [class.is-true]=\"value\">{{ value ? '✓' : '✗' }}</span> }\n @case ('number') { <span class=\"cell-number\">{{ value }}</span> }\n @case ('progress') {\n <div class=\"cell-progress\">\n <div class=\"progress-bar\"><div class=\"progress-fill\" [style.width.%]=\"value\"></div></div>\n <span class=\"progress-text\">{{ value }}%</span>\n </div>\n }\n @default { <span>{{ value }}</span> }\n }\n `,\n styles: [`\n :host { display: contents; }\n .cell-badge { padding: 4px 10px; border-radius: 6px; font-size: 0.75rem; font-weight: 600; display: inline-block; }\n .cell-badge.success, .cell-badge.active { background: rgba(52,211,153,0.15); color: #34d399; }\n .cell-badge.danger, .cell-badge.inactive { background: rgba(244,63,94,0.15); color: #fb7185; }\n .cell-badge.warning, .cell-badge.pending { background: rgba(251,191,36,0.15); color: #fbbf24; }\n .cell-badge.info { background: rgba(59,130,246,0.15); color: #60a5fa; }\n .cell-badge.muted { background: var(--glass-bg); color: var(--app-text-muted); }\n\n .cell-avatar { display: flex; align-items: center; gap: 12px; }\n .avatar-circle { width: 34px; height: 34px; border-radius: 50%; background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.875rem; flex-shrink: 0; }\n .avatar-info { display: flex; flex-direction: column; }\n .avatar-name { font-weight: 600; color: var(--app-text); font-size: 0.875rem; }\n .avatar-subtitle { font-size: 0.75rem; color: var(--app-text-muted); }\n\n .cell-boolean { font-weight: 700; }\n .cell-boolean.is-true { color: #34d399; }\n .cell-boolean:not(.is-true) { color: #fb7185; }\n\n .cell-number { font-variant-numeric: tabular-nums; }\n .cell-progress { display: flex; align-items: center; gap: 8px; }\n .progress-bar { flex: 1; height: 6px; background: var(--glass-bg); border-radius: 3px; overflow: hidden; }\n .progress-fill { height: 100%; background: linear-gradient(90deg, var(--app-primary), var(--app-accent)); border-radius: 3px; transition: width 0.3s; }\n .progress-text { font-size: 0.75rem; color: var(--app-text-muted); min-width: 36px; }\n `]\n})\nexport class CellRendererComponent {\n @Input() column!: ColumnMeta;\n @Input() row: any;\n @Input() value: any;\n\n getInitial(): string { return String(this.value || '').charAt(0).toUpperCase(); }\n getBadgeClass(): string {\n if (this.column.badgeMap && this.value) {\n const strVal = String(this.value);\n return this.column.badgeMap[strVal] || this.column.badgeMap[strVal.toLowerCase()] || '';\n }\n return String(this.value || '').toLowerCase();\n }\n getNestedValue(obj: any, path: string): any {\n if (!path) return '';\n return path.split('.').reduce((c, k) => c?.[k], obj) ?? '';\n }\n}\n","/**\n * AvoraMetaForge — Table Renderer Component\n */\nimport { Component, Input, Output, EventEmitter, inject, OnInit, OnDestroy, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { TableMeta, ColumnMeta, TableActionMeta, ColumnEditValidatorMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { MetaApiService } from '../../services/meta-api.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { CellRendererComponent } from './cell-renderer.component';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { Subscription } from 'rxjs';\nimport { AmfDialogService } from '../../core/services/amf-dialog.service';\n\n@Component({\n selector: 'amf-table-renderer',\n standalone: true,\n imports: [CommonModule, FormsModule, DragDropModule, CellRendererComponent],\n template: `\n <div class=\"amf-table-card\" [class]=\"'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')\">\n <div class=\"table-header\">\n <div class=\"table-header-left\">\n @if (config.searchable) {\n <div class=\"search-box\">\n <svg viewBox=\"0 0 24 24\" class=\"search-icon\"><path [attr.d]=\"iconRegistry.getIcon('search')\"></path></svg>\n <input type=\"text\" [placeholder]=\"config.searchPlaceholder || 'Search...'\" [ngModel]=\"searchQuery()\" (ngModelChange)=\"searchQuery.set($event)\" />\n </div>\n }\n @for (filter of config.filters || []; track filter.key) {\n <select class=\"filter-select\" [ngModel]=\"getFilterValue(filter.key)\" (ngModelChange)=\"setFilterValue(filter.key, $event)\">\n <option value=\"\">{{ filter.label }}</option>\n @for (opt of filter.options; track opt.value) { <option [value]=\"opt.value\">{{ opt.label }}</option> }\n </select>\n }\n </div>\n <div class=\"table-header-right\">\n @for (action of config.headerActions || []; track action.id) {\n <button class=\"btn-primary btn-sm\" (click)=\"handleAction(action, null)\">\n @if (action.icon) { <svg viewBox=\"0 0 24 24\" class=\"btn-icon\"><path [attr.d]=\"iconRegistry.getIcon(action.icon)\"></path></svg> }\n {{ action.label }}\n </button>\n }\n\n @if (config.exportable) {\n <div class=\"export-container\">\n <button class=\"btn-ghost btn-sm\" (click)=\"exportMenuOpen.set(!exportMenuOpen())\">\n <svg viewBox=\"0 0 24 24\" class=\"btn-icon\"><path [attr.d]=\"iconRegistry.getIcon('download')\"></path></svg>\n Export\n </button>\n @if (exportMenuOpen()) {\n <div class=\"dropdown-menu export-menu\">\n @for (format of config.exportFormats || ['csv', 'json']; track format) {\n <div class=\"dropdown-item\" (click)=\"exportData(format); exportMenuOpen.set(false)\">\n Export as {{ format | uppercase }}\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\" [class.striped]=\"config.striped\" [class.hoverable]=\"config.hoverable !== false\">\n <thead>\n <tr cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"dropColumn($event)\">\n @if (config.reorderable) { <th class=\"drag-col\" style=\"width: 40px; text-align: center;\"></th> }\n @if (config.selectionMode === 'checkbox') {\n <th class=\"selection-col\" style=\"width: 40px; text-align: center;\">\n @if (config.showSelectAll !== false) {\n <input type=\"checkbox\"\n class=\"amf-checkbox\"\n [checked]=\"selectedRows().size > 0 && selectedRows().size === filteredData().length\"\n (change)=\"toggleAllSelection($event)\" />\n }\n </th>\n }\n @if (config.expandable) {\n <th style=\"width: 36px;\"></th>\n }\n @for (col of visibleColumns(); track col.key) {\n <th cdkDrag [cdkDragDisabled]=\"!config.columnReorder\" [style.width]=\"col.width\" [style.min-width]=\"col.minWidth\" [style.text-align]=\"col.align || 'left'\" [class.sortable]=\"col.sortable\" (click)=\"col.sortable ? toggleSort(col.key) : null\">\n {{ col.label }} @if (col.sortable && sortKey() === col.key) { <span class=\"sort-indicator\">{{ sortDirection() === 'asc' ? '↑' : '↓' }}</span> }\n </th>\n }\n @if (config.actions?.length) { <th class=\"actions-col\">Actions</th> }\n </tr>\n </thead>\n <tbody cdkDropList (cdkDropListDropped)=\"dropRow($event)\">\n @for (row of groupedRows(); track $index) {\n @if (row.__isGroupHeader) {\n <tr class=\"group-header-row\">\n <td [attr.colspan]=\"visibleColumns().length + (config.reorderable ? 1 : 0) + (config.selectionMode === 'checkbox' ? 1 : 0) + (config.expandable ? 1 : 0) + (config.actions?.length ? 1 : 0)\">\n <button class=\"group-toggle\" (click)=\"toggleGroup(row.__groupKey)\">\n <span class=\"group-chevron\" [class.open]=\"!collapsedGroups().has(row.__groupKey)\">▶</span>\n {{ config.groupBy }}: <strong>{{ row.__groupKey }}</strong>\n <span class=\"group-count\">({{ row.__count }} items)</span>\n </button>\n </td>\n </tr>\n } @else {\n <tr cdkDrag [cdkDragDisabled]=\"!config.reorderable\" (click)=\"handleRowClick(row)\" [class.clickable]=\"config.rowClick || config.selectionMode === 'single' || config.selectionMode === 'multi'\" [class.selected]=\"selectedRows().has(row)\" [class.expanded]=\"expandedRows().has(row)\">\n @if (config.reorderable) {\n <td class=\"drag-cell\" (click)=\"$event.stopPropagation()\" cdkDragHandle>\n <svg viewBox=\"0 0 24 24\" style=\"width:16px;height:16px;fill:var(--app-text-muted)\"><path [attr.d]=\"iconRegistry.getIcon('menu')\"></path></svg>\n </td>\n }\n @if (config.selectionMode === 'checkbox') {\n <td class=\"selection-cell\" (click)=\"$event.stopPropagation(); toggleSelection(row)\">\n <input type=\"checkbox\" class=\"amf-checkbox\" [checked]=\"selectedRows().has(row)\" (click)=\"$event.stopPropagation()\" (change)=\"$event.stopPropagation(); toggleSelection(row)\" />\n </td>\n }\n @if (config.expandable) {\n <td class=\"expand-cell\" (click)=\"$event.stopPropagation(); toggleRowExpand(row)\">\n <span class=\"expand-chevron\" [class.open]=\"expandedRows().has(row)\">▶</span>\n </td>\n }\n @for (col of visibleColumns(); track col.key) {\n <td [style.text-align]=\"col.align || 'left'\" (dblclick)=\"config.inlineEdit && col.editable !== false ? startEdit(row, col.key, $event) : null\" [class.editable-cell]=\"config.inlineEdit && col.editable !== false\">\n @if (isEditing(row, col.key)) {\n <div class=\"inline-edit-wrap\" (click)=\"$event.stopPropagation()\">\n <div class=\"inline-edit-row\">\n @if (col.editType === 'select' && col.editOptions) {\n <select class=\"inline-input\" [(ngModel)]=\"editBuffer[col.key]\">\n @for (opt of col.editOptions; track opt.value) { <option [value]=\"opt.value\">{{ opt.label }}</option> }\n </select>\n } @else {\n <input class=\"inline-input\" [type]=\"col.editType || 'text'\" [(ngModel)]=\"editBuffer[col.key]\" (keydown.enter)=\"commitEdit(row, col.key)\" (keydown.escape)=\"cancelEdit()\" />\n }\n <div class=\"inline-edit-actions\">\n <button class=\"ie-btn ie-save\" title=\"Save (Enter)\" (click)=\"commitEdit(row, col.key)\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>\n </button>\n <button class=\"ie-btn ie-cancel\" title=\"Cancel (Esc)\" (click)=\"cancelEdit()\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/></svg>\n </button>\n </div>\n </div>\n @if (editError()) {\n <span class=\"inline-edit-error\">{{ editError() }}</span>\n }\n </div>\n } @else {\n <amf-cell-renderer [column]=\"col\" [row]=\"row\" [value]=\"getCellValue(row, col.key)\"></amf-cell-renderer>\n }\n </td>\n }\n @if (config.actions?.length) {\n <td class=\"actions-cell\">\n <div class=\"action-btns\">\n @for (action of config.actions; track action.id) {\n <button class=\"action-btn\" [class]=\"action.variant || 'ghost'\" [title]=\"action.label\" (click)=\"handleAction(action, row); $event.stopPropagation()\">\n @if (action.icon) { <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"iconRegistry.getIcon(action.icon)\"></path></svg> } @else { {{ action.label }} }\n </button>\n }\n </div>\n </td>\n }\n </tr>\n @if (config.expandable && expandedRows().has(row)) {\n <tr class=\"expanded-row\">\n <td [attr.colspan]=\"visibleColumns().length + (config.reorderable ? 1 : 0) + (config.selectionMode === 'checkbox' ? 1 : 0) + 1 + (config.actions?.length ? 1 : 0)\" class=\"expanded-content\">\n @if (config.expandSection) {\n <div class=\"expand-section\">Row detail: {{ row | json }}</div>\n } @else {\n <div class=\"expand-section\">\n @for (col of visibleColumns(); track col.key) {\n <div class=\"expand-field\"><span class=\"expand-label\">{{ col.label }}:</span> <span>{{ getCellValue(row, col.key) }}</span></div>\n }\n </div>\n }\n </td>\n </tr>\n }\n }\n } @empty { <tr><td [attr.colspan]=\"visibleColumns().length + (config.actions?.length ? 1 : 0)\" class=\"empty-state\">{{ config.emptyMessage || 'No data found.' }}</td></tr> }\n @if (config.aggregates?.length) {\n <tr class=\"aggregate-row\">\n @if (config.reorderable) { <td></td> }\n @if (config.selectionMode === 'checkbox') { <td></td> }\n @if (config.expandable) { <td></td> }\n @for (col of visibleColumns(); track col.key) {\n <td class=\"aggregate-cell\" [style.text-align]=\"col.align || 'right'\">\n @if (getAggregate(col.key); as agg) { <span class=\"agg-value\">{{ agg.label ? agg.label + ': ' : '' }}{{ agg.value }}</span> }\n </td>\n }\n @if (config.actions?.length) { <td></td> }\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (config.pagination?.enabled) {\n <div class=\"table-footer\">\n <div class=\"footer-left\">\n <span class=\"results-count\">Showing {{ paginatedData().length }} of {{ filteredData().length }} @if (config.pagination?.showTotal) { (total: {{ allData().length }}) }</span>\n @if ((config.pagination?.pageSizeOptions || [5, 10, 25, 50]).length > 1) {\n <div class=\"page-size-wrap\">\n <label class=\"page-size-label\">Rows:</label>\n <select class=\"page-size-select\" [ngModel]=\"activePageSize()\" (ngModelChange)=\"setPageSize($event)\">\n @for (opt of config.pagination?.pageSizeOptions || [5, 10, 25, 50]; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n }\n </div>\n <div class=\"pagination\">\n <button class=\"btn-page-nav\" [disabled]=\"currentPage() <= 1\" (click)=\"currentPage.set(currentPage() - 1)\">Previous</button>\n @for (p of pageNumbers(); track p) { <button class=\"btn-page\" [class.active]=\"p === currentPage()\" (click)=\"currentPage.set(p)\">{{ p }}</button> }\n <button class=\"btn-page-nav\" [disabled]=\"currentPage() >= totalPages()\" (click)=\"currentPage.set(currentPage() + 1)\">Next</button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .amf-table-card { background: var(--app-surface); border: 1px solid var(--app-border); border-radius: 16px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.05); }\n .table-header { padding: 16px 20px; display: flex; justify-content: space-between; align-items: center; gap: 16px; border-bottom: 1px solid var(--app-border); flex-wrap: wrap; }\n .table-header-left, .table-header-right { display: flex; align-items: center; gap: 12px; }\n .search-box { position: relative; min-width: 240px; }\n .search-icon { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; fill: var(--app-text-muted); }\n .search-box input { width: 100%; padding: 8px 12px 8px 36px; border: 1px solid var(--app-border); border-radius: 8px; font-size: 0.8125rem; outline: none; background: var(--glass-bg); color: var(--app-text); }\n .search-box input:focus { border-color: var(--app-primary); }\n .filter-select { padding: 8px 12px; border: 1px solid var(--app-border); border-radius: 8px; font-size: 0.8125rem; outline: none; background: var(--glass-bg); color: var(--app-text); color-scheme: dark; }\n .filter-select option { background-color: #1e1e2d; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) .filter-select { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) .filter-select option { background-color: #ffffff; color: #000000; }\n .table-wrapper { width: 100%; overflow-x: auto; }\n .data-table { width: 100%; border-collapse: collapse; white-space: normal; word-break: break-word; }\n .data-table th { background: var(--app-bg); padding: 10px 20px; font-size: 0.6875rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--app-text-muted); border-bottom: 1px solid var(--app-border); user-select: none; }\n .data-table th.sortable { cursor: pointer; } .data-table th.sortable:hover { color: var(--app-primary); }\n .sort-indicator { margin-left: 4px; font-size: 0.75rem; }\n .data-table td { padding: 14px 20px; border-bottom: 1px solid var(--app-border); font-size: 0.875rem; color: var(--app-text); }\n .data-table.hoverable tbody tr:hover { background: var(--glass-bg); }\n .data-table.striped tbody tr:nth-child(even) { background: var(--glass-bg); }\n \n /* Table Variants */\n .variant-striped .data-table tbody tr:nth-child(even) { background: var(--glass-bg); }\n .variant-borderless { border: none !important; box-shadow: none !important; background: transparent !important; }\n .variant-borderless .table-header { border-bottom: none; padding: 0 0 16px 0; }\n .variant-borderless .data-table th { background: transparent; border-bottom: 2px solid var(--app-border); }\n .variant-borderless .data-table td { border-bottom: 1px dashed var(--app-border); }\n .variant-borderless .table-footer { border-top: none; background: transparent; padding: 16px 0 0 0; }\n \n .variant-glass { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: 1px solid var(--glass-border); box-shadow: var(--glass-shadow-sm); }\n .variant-glass .table-header, .variant-glass .table-footer, .variant-glass .data-table th { background: transparent; border-color: var(--glass-border); }\n .variant-glass .data-table td { border-bottom: 1px solid var(--glass-border); }\n \n .variant-elevated { box-shadow: 0 20px 40px var(--glass-shadow); transform: translateY(-2px); transition: all 0.3s ease; }\n \n .variant-compact .table-header { padding: 12px 16px; }\n .variant-compact .data-table th { padding: 8px 16px; font-size: 0.625rem; }\n .variant-compact .data-table td { padding: 8px 16px; font-size: 0.8125rem; }\n .variant-compact .table-footer { padding: 8px 16px; }\n \n \n tr.clickable { cursor: pointer; }\n .amf-checkbox { width: 16px; height: 16px; cursor: pointer; accent-color: var(--app-primary); }\n .data-table tbody tr.selected { background: rgba(59, 130, 246, 0.15) !important; }\n \n .actions-col { text-align: right !important; width: 120px; } .actions-cell { text-align: right; }\n .action-btns { display: flex; justify-content: flex-end; gap: 6px; }\n .action-btn { width: 30px; height: 30px; border-radius: 6px; border: 1px solid var(--app-border); background: transparent; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s; }\n .action-btn svg { width: 14px; height: 14px; fill: var(--app-text-muted); }\n .action-btn:hover { border-color: var(--app-primary); } .action-btn:hover svg { fill: var(--app-primary); }\n .action-btn.danger:hover { border-color: #f43f5e; } .action-btn.danger:hover svg { fill: #f43f5e; }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; display: flex; align-items: center; gap: 6px; transition: all 0.2s; }\n .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 4px 12px var(--app-glow); }\n .btn-icon { width: 16px; height: 16px; fill: currentColor; }\n .btn-sm { padding: 6px 12px; font-size: 0.75rem; border-radius: 6px; }\n .btn-ghost { background: transparent; border: 1px solid var(--app-border); color: var(--app-text); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; display: flex; align-items: center; gap: 6px; cursor: pointer; transition: all 0.2s; }\n .btn-ghost:hover { background: var(--glass-bg-hover); color: var(--app-primary); }\n .export-container { position: relative; }\n .export-menu { position: absolute; top: calc(100% + 8px); right: 0; background: var(--app-surface); border: 1px solid var(--app-border); border-radius: 12px; box-shadow: 0 10px 40px rgba(0,0,0,0.5); min-width: 160px; z-index: 100; overflow: hidden; animation: slideInDown 0.2s ease-out backwards; }\n .export-menu .dropdown-item { padding: 10px 16px; font-size: 0.8125rem; font-weight: 500; cursor: pointer; color: var(--app-text); transition: background 0.2s; }\n .export-menu .dropdown-item:hover { background: var(--glass-bg-hover); color: var(--app-primary); }\n .empty-state { text-align: center; padding: 40px !important; color: var(--app-text-muted); }\n .table-footer { padding: 12px 20px; display: flex; justify-content: space-between; align-items: center; background: var(--app-bg); border-top: 1px solid var(--app-border); }\n .footer-left { display: flex; align-items: center; gap: 16px; }\n .results-count { font-size: 0.75rem; color: var(--app-text-muted); }\n .page-size-wrap { display: flex; align-items: center; gap: 6px; }\n .page-size-label { font-size: 0.75rem; color: var(--app-text-muted); white-space: nowrap; }\n .page-size-select { padding: 4px 8px; border: 1px solid var(--app-border); border-radius: 6px; font-size: 0.75rem; background: var(--glass-bg); color: var(--app-text); outline: none; cursor: pointer; color-scheme: dark; }\n .page-size-select option { background-color: #1a1a2e; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) .page-size-select { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) .page-size-select option { background-color: #ffffff; color: #000000; }\n .pagination { display: flex; gap: 4px; }\n .btn-page, .btn-page-nav { padding: 6px 10px; border: 1px solid var(--app-border); background: transparent; border-radius: 6px; font-size: 0.75rem; font-weight: 500; color: var(--app-text); cursor: pointer; }\n .btn-page.active { background: var(--app-primary); border-color: var(--app-primary); color: white; }\n .btn-page-nav:disabled { opacity: 0.4; cursor: not-allowed; }\n /* Inline Edit */\n .editable-cell { position: relative; }\n .editable-cell:hover { background: rgba(59,130,246,0.08); cursor: text; }\n .inline-edit-wrap { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n .inline-edit-row { display: flex; align-items: center; gap: 4px; }\n .inline-edit-row { display: flex; align-items: center; gap: 4px; }\n .inline-input { flex: 1; min-width: 0; padding: 5px 8px; border: 1.5px solid var(--app-primary); border-radius: 6px; background: var(--app-surface); color: var(--app-text); font-size: 0.875rem; outline: none; }\n .inline-input.input-invalid { border-color: #f43f5e; }\n .inline-edit-error { font-size: 0.6875rem; color: #f43f5e; font-weight: 500; padding: 0 2px; animation: fadeIn 0.15s ease-out; }\n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n .inline-edit-actions { display: flex; gap: 3px; flex-shrink: 0; }\n .ie-btn { width: 26px; height: 26px; border-radius: 5px; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: opacity 0.15s; }\n .ie-btn svg { width: 14px; height: 14px; fill: currentColor; }\n .ie-btn:hover { opacity: 0.85; }\n .ie-save { background: #22c55e; color: white; }\n .ie-cancel { background: var(--app-border); color: var(--app-text-muted); }\n select.inline-input { color-scheme: dark; cursor: pointer; }\n select.inline-input option { background-color: #1a1a2e; color: #ffffff; }\n :host-context([data-color-scheme=\"light\"]) select.inline-input { color-scheme: light; }\n :host-context([data-color-scheme=\"light\"]) select.inline-input option { background-color: #ffffff; color: #000000; }\n /* Row Expansion */\n .expand-cell { width: 36px; text-align: center; cursor: pointer; }\n .expand-chevron { display: inline-block; transition: transform 0.2s; font-size: 0.625rem; color: var(--app-text-muted); }\n .expand-chevron.open { transform: rotate(90deg); }\n .expanded-row td { padding: 0 !important; }\n .expanded-content { padding: 0 !important; }\n .expand-section { padding: 14px 24px; display: flex; flex-wrap: wrap; gap: 16px; background: var(--glass-bg); animation: fadeInUp 0.2s ease-out; }\n .expand-field { display: flex; gap: 8px; font-size: 0.8125rem; }\n .expand-label { color: var(--app-text-muted); font-weight: 600; }\n /* Grouping */\n .group-header-row td { background: var(--app-bg); }\n .group-toggle { display: flex; align-items: center; gap: 8px; background: none; border: none; color: var(--app-text); cursor: pointer; font-size: 0.8125rem; padding: 8px 16px; }\n .group-chevron { display: inline-block; font-size: 0.625rem; transition: transform 0.2s; color: var(--app-text-muted); }\n .group-chevron.open { transform: rotate(90deg); }\n .group-count { color: var(--app-text-muted); font-size: 0.75rem; }\n /* Aggregations Footer */\n .aggregate-row td { background: var(--app-bg); border-top: 2px solid var(--app-border); }\n .aggregate-cell { padding: 10px 20px !important; }\n .agg-value { font-size: 0.8125rem; font-weight: 700; color: var(--app-primary); }\n `]\n})\nexport class TableRendererComponent implements MetaSectionComponent<TableMeta>, OnInit, OnDestroy {\n @Input() config!: TableMeta;\n @Input() context: any = {};\n @Output() rowAction = new EventEmitter<{ actionId: string; row: any }>();\n\n readonly iconRegistry = inject(IconRegistryService);\n private readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly apiService = inject(MetaApiService);\n private readonly dialogService = inject(AmfDialogService);\n\n searchQuery = signal(''); sortKey = signal<string | null>(null); sortDirection = signal<'asc' | 'desc'>('asc'); currentPage = signal(1);\n exportMenuOpen = signal(false);\n selectedRows = signal<Set<any>>(new Set());\n expandedRows = signal<Set<any>>(new Set());\n collapsedGroups = signal<Set<string>>(new Set());\n localColumns = signal<ColumnMeta[]>([]);\n editingCell = signal<{ row: any; key: string } | null>(null);\n editBuffer: Record<string, any> = {};\n editError = signal<string | null>(null);\n pageSizeOverride = signal<number | null>(null);\n private filterValues = new Map<string, string>(); allData = signal<any[]>([]);\n private tableEventsSub?: Subscription;\n private sectionId?: string;\n\n ngOnInit(): void {\n // Capture section ID from context for reload-table matching\n this.sectionId = (this.config as any)._sectionId;\n this.localColumns.set([...this.config.columns]);\n\n // Load data from various sources\n this.loadData();\n\n // Subscribe to reload-table events\n this.tableEventsSub = this.actionDispatcher.tableEvents$.subscribe(event => {\n if (event.action === 'reload') {\n const targetId = event.config?.tableId;\n // Reload if no targetId specified, or if targetId matches our section ID or config ID\n if (!targetId || targetId === this.sectionId || targetId === (this.config as any).id) {\n this.loadData();\n }\n }\n });\n\n if (this.config.defaultSortKey) { this.sortKey.set(this.config.defaultSortKey); this.sortDirection.set(this.config.defaultSortDirection || 'asc'); }\n }\n\n ngOnDestroy(): void {\n this.tableEventsSub?.unsubscribe();\n }\n\n private async loadData(): Promise<void> {\n const storageKey = this.getStorageKey();\n const versionKey = storageKey + '_v';\n const stored = sessionStorage.getItem(storageKey);\n const storedVersion = sessionStorage.getItem(versionKey);\n const currentVersion = String(this.config.dataVersion ?? 1);\n\n // If dataVersion changed, wipe the stale cache and re-seed (only if version was previously tracked)\n if (stored && storedVersion !== null && storedVersion !== currentVersion) {\n sessionStorage.removeItem(storageKey);\n sessionStorage.removeItem(versionKey);\n }\n\n const freshStored = sessionStorage.getItem(storageKey);\n\n if (this.config.endpointId) {\n try {\n const apiData = await this.apiService.call(this.config.endpointId);\n const localData = freshStored ? JSON.parse(freshStored) : [];\n const merged = [...localData, ...(Array.isArray(apiData) ? apiData : [])];\n this.allData.set(merged);\n } catch (e) {\n console.warn(`[AvoraMetaForge] Table: failed to load from endpoint \"${this.config.endpointId}\"`, e);\n if (freshStored) this.allData.set(JSON.parse(freshStored));\n }\n } else if (this.config.staticData) {\n if (freshStored) {\n this.allData.set(JSON.parse(freshStored));\n } else {\n this.allData.set([...this.config.staticData]);\n sessionStorage.setItem(storageKey, JSON.stringify(this.config.staticData));\n sessionStorage.setItem(versionKey, currentVersion);\n }\n } else if (freshStored) {\n this.allData.set(JSON.parse(freshStored));\n }\n }\n\n private getStorageKey(): string {\n return `amf_table_${this.sectionId || (this.config as any).id || 'default'}`;\n }\n\n visibleColumns = computed(() => this.localColumns().filter(c => !c.hidden));\n\n filteredData = computed(() => {\n let data = this.allData();\n const query = this.searchQuery().toLowerCase();\n if (query) {\n const fields = this.config.searchFields || this.localColumns().map(c => c.key);\n data = data.filter(row => fields.some(f => String(this.getCellValue(row, f)).toLowerCase().includes(query)));\n }\n for (const [key, val] of this.filterValues.entries()) {\n if (val) { data = data.filter(row => String(this.getCellValue(row, key)) === val); }\n }\n const sk = this.sortKey();\n if (sk) {\n const dir = this.sortDirection() === 'asc' ? 1 : -1;\n data = [...data].sort((a, b) => {\n const va = this.getCellValue(a, sk); const vb = this.getCellValue(b, sk);\n if (va < vb) return -1 * dir; if (va > vb) return 1 * dir; return 0;\n });\n }\n return data;\n });\n\n /** Flat list with injected group-header sentinel objects for @for rendering */\n groupedRows = computed(() => {\n const data = this.paginatedData();\n if (!this.config.groupBy) return data;\n const key = this.config.groupBy;\n const groups = new Map<string, any[]>();\n for (const row of data) {\n const gk = String(this.getCellValue(row, key) ?? 'Other');\n if (!groups.has(gk)) groups.set(gk, []);\n groups.get(gk)!.push(row);\n }\n const result: any[] = [];\n for (const [gk, rows] of groups.entries()) {\n result.push({ __isGroupHeader: true, __groupKey: gk, __count: rows.length });\n if (!this.collapsedGroups().has(gk)) result.push(...rows);\n }\n return result;\n });\n\n activePageSize = computed(() => this.pageSizeOverride() ?? this.config.pagination?.pageSize ?? 10);\n\n setPageSize(size: number | string): void {\n this.pageSizeOverride.set(+size);\n this.currentPage.set(1);\n }\n\n paginatedData = computed(() => {\n const data = this.filteredData();\n if (!this.config.pagination?.enabled) return data;\n const ps = this.activePageSize();\n const start = (this.currentPage() - 1) * ps;\n return data.slice(start, start + ps);\n });\n\n totalPages = computed(() => {\n if (!this.config.pagination?.enabled) return 1;\n return Math.ceil(this.filteredData().length / this.activePageSize());\n });\n\n pageNumbers = computed(() => {\n const total = this.totalPages();\n return Array.from({ length: total }, (_, i) => i + 1);\n });\n\n toggleSort(key: string): void {\n if (this.sortKey() === key) { this.sortDirection.set(this.sortDirection() === 'asc' ? 'desc' : 'asc'); }\n else { this.sortKey.set(key); this.sortDirection.set('asc'); }\n }\n\n getCellValue(row: any, key: string): any { return key.split('.').reduce((obj, k) => obj?.[k], row) ?? ''; }\n getFilterValue(key: string): string { return this.filterValues.get(key) || ''; }\n setFilterValue(key: string, value: string): void { this.filterValues.set(key, value); this.currentPage.set(1); this.allData.update(d => [...d]); }\n\n async handleAction(action: TableActionMeta, row: any): Promise<void> {\n if (action.confirm) {\n const confirmed = await this.dialogService.confirm(action.confirm);\n if (!confirmed) return;\n }\n\n // Direct local delete for static data demo (only if no custom action is defined)\n if (action.id === 'delete' && this.config.staticData && !action.action) {\n this.allData.update(data => {\n const newData = data.filter(r => r !== row);\n sessionStorage.setItem(this.getStorageKey(), JSON.stringify(newData));\n return newData;\n });\n }\n\n this.rowAction.emit({ actionId: action.id, row });\n this.actionDispatcher.dispatch(action.action, { ...this.context, row });\n }\n\n handleRowClick(row: any): void {\n if (this.config.selectionMode === 'single' || this.config.selectionMode === 'multi') {\n this.toggleSelection(row);\n }\n if (this.config.rowClick) { this.actionDispatcher.dispatch(this.config.rowClick, { ...this.context, row }); }\n }\n\n toggleSelection(row: any): void {\n if (!this.config.selectionMode) return;\n const set = new Set(this.selectedRows());\n if (set.has(row)) {\n set.delete(row);\n } else {\n if (this.config.selectionMode === 'single') set.clear();\n set.add(row);\n }\n this.selectedRows.set(set);\n this.emitSelectionChange();\n }\n\n toggleAllSelection(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n if (checked) {\n this.selectedRows.set(new Set(this.filteredData()));\n } else {\n this.selectedRows.set(new Set());\n }\n this.emitSelectionChange();\n }\n\n private emitSelectionChange(): void {\n if (this.config.onSelectionChange) {\n this.actionDispatcher.dispatch(this.config.onSelectionChange, { ...this.context, selection: Array.from(this.selectedRows()) });\n }\n }\n\n /* ─── INLINE EDIT ─────────────────────────────── */\n isEditing(row: any, key: string): boolean {\n const ec = this.editingCell();\n return ec?.row === row && ec?.key === key;\n }\n\n startEdit(row: any, key: string, event: MouseEvent): void {\n event.stopPropagation();\n this.editError.set(null);\n this.editingCell.set({ row, key });\n this.editBuffer = { [key]: this.getCellValue(row, key) };\n }\n\n commitEdit(row: any, key: string): void {\n // Run inline edit validators before committing\n const col = this.localColumns().find(c => c.key === key);\n const validators: ColumnEditValidatorMeta[] = col?.editValidators ?? [];\n const value = this.editBuffer[key];\n const error = this.runInlineValidators(validators, value);\n if (error) {\n this.editError.set(error);\n return;\n }\n this.editError.set(null);\n row[key] = value;\n // Persist to session storage if using static data\n const storageKey = this.getStorageKey();\n sessionStorage.setItem(storageKey, JSON.stringify(this.allData()));\n if (this.config.onInlineEditSave) {\n this.actionDispatcher.dispatch(this.config.onInlineEditSave, { ...this.context, row, key, value });\n }\n this.editingCell.set(null);\n }\n\n /** Runs all validators for an inline-edit value. Returns the first error message, or null if valid. */\n private runInlineValidators(validators: ColumnEditValidatorMeta[], value: any): string | null {\n for (const v of validators) {\n const str = value == null ? '' : String(value).trim();\n switch (v.type) {\n case 'required':\n if (!str) return v.message ?? 'This field is required.';\n break;\n case 'minLength':\n if (str.length < +v.value) return v.message ?? `Minimum ${v.value} characters required.`;\n break;\n case 'maxLength':\n if (str.length > +v.value) return v.message ?? `Maximum ${v.value} characters allowed.`;\n break;\n case 'min':\n if (parseFloat(str) < +v.value) return v.message ?? `Value must be at least ${v.value}.`;\n break;\n case 'max':\n if (parseFloat(str) > +v.value) return v.message ?? `Value must be at most ${v.value}.`;\n break;\n case 'pattern': {\n if (!str) break;\n const re = new RegExp(v.value);\n if (!re.test(str)) return v.message ?? `Invalid format.`;\n break;\n }\n case 'email': {\n if (!str) break;\n const emailRe = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRe.test(str)) return v.message ?? 'Invalid email address.';\n break;\n }\n case 'number':\n if (isNaN(parseFloat(str)) || !isFinite(+str)) return v.message ?? 'Must be a valid number.';\n break;\n }\n }\n return null;\n }\n\n cancelEdit(): void {\n if (this.config.onInlineEditCancel) {\n this.actionDispatcher.dispatch(this.config.onInlineEditCancel, this.context);\n }\n this.editError.set(null);\n this.editingCell.set(null);\n }\n\n /* ─── ROW EXPANSION ───────────────────────────── */\n toggleRowExpand(row: any): void {\n const set = new Set(this.expandedRows());\n set.has(row) ? set.delete(row) : (this.config.singleExpand ? set.clear() : null, set.add(row));\n this.expandedRows.set(set);\n }\n\n /* ─── GROUPING ────────────────────────────────── */\n toggleGroup(key: string): void {\n const set = new Set(this.collapsedGroups());\n set.has(key) ? set.delete(key) : set.add(key);\n this.collapsedGroups.set(set);\n }\n\n /* ─── AGGREGATIONS ────────────────────────────── */\n getAggregate(colKey: string): { label?: string; value: string | number } | null {\n const agg = this.config.aggregates?.find(a => a.columnKey === colKey);\n if (!agg) return null;\n const vals = this.filteredData().map(r => parseFloat(this.getCellValue(r, colKey))).filter(v => !isNaN(v));\n let value: number;\n switch (agg.type) {\n case 'sum': value = vals.reduce((a, b) => a + b, 0); break;\n case 'avg': value = vals.length ? vals.reduce((a, b) => a + b, 0) / vals.length : 0; break;\n case 'min': value = Math.min(...vals); break;\n case 'max': value = Math.max(...vals); break;\n case 'count': value = this.filteredData().length; break;\n default: return null;\n }\n return { label: agg.label, value: agg.format === 'currency' ? '$' + value.toFixed(2) : agg.format === 'percent' ? value.toFixed(1) + '%' : +value.toFixed(2) };\n }\n\n exportData(format: string): void {\n const data = this.filteredData();\n const columns = this.config.exportColumns || this.visibleColumns().map(c => c.key);\n const filename = (this.config.exportFilename || 'export_data') + '.' + format;\n \n let content = '';\n let mimeType = '';\n\n if (format === 'csv') {\n const header = columns.map(k => {\n const col = this.visibleColumns().find(c => c.key === k);\n return '\"' + (col ? col.label : k).replace(/\"/g, '\"\"') + '\"';\n }).join(',');\n \n const rows = data.map(row => {\n return columns.map(k => {\n let val = this.getCellValue(row, k) ?? '';\n if (typeof val === 'object') val = JSON.stringify(val);\n return '\"' + String(val).replace(/\"/g, '\"\"') + '\"';\n }).join(',');\n }).join('\\\\n');\n \n content = header + '\\\\n' + rows;\n mimeType = 'text/csv;charset=utf-8;';\n } else if (format === 'json') {\n // Export only specified columns for JSON too\n const mappedData = data.map(row => {\n const obj: any = {};\n columns.forEach(k => obj[k] = this.getCellValue(row, k));\n return obj;\n });\n content = JSON.stringify(mappedData, null, 2);\n mimeType = 'application/json;charset=utf-8;';\n } else {\n console.warn('[AvoraMetaForge] Export format not fully implemented natively:', format);\n return;\n }\n\n // Trigger download\n const blob = new Blob([content], { type: mimeType });\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', filename);\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n dropColumn(event: CdkDragDrop<string[]>): void {\n if (!this.config.columnReorder) return;\n const cols = [...this.localColumns()];\n const visCols = this.visibleColumns();\n const prevId = visCols[event.previousIndex].key;\n const currId = visCols[event.currentIndex].key;\n const absPrev = cols.findIndex(c => c.key === prevId);\n const absCurr = cols.findIndex(c => c.key === currId);\n moveItemInArray(cols, absPrev, absCurr);\n this.localColumns.set(cols);\n }\n\n dropRow(event: CdkDragDrop<any[]>): void {\n if (!this.config.reorderable) return;\n const currentData = [...this.allData()];\n moveItemInArray(currentData, event.previousIndex, event.currentIndex);\n this.allData.set(currentData);\n if (this.config.onReorder) {\n this.actionDispatcher.dispatch(this.config.onReorder, { ...this.context, previousIndex: event.previousIndex, currentIndex: event.currentIndex });\n }\n }\n}\n\n","/**\n * AvoraMetaForge — Card Section Component\n */\nimport { Component, Input, inject } from '@angular/core';\n\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { CardMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\nimport { MetaRendererComponent } from '../../core/meta-renderer.component';\n\n@Component({\n selector: 'amf-card',\n standalone: true,\n imports: [MetaRendererComponent],\n template: `\n <div class=\"amf-card\" [class]=\"'variant-' + (config.variant || 'glass')\">\n @if (config.title) { <h2 class=\"card-title\">{{ config.title }}</h2> }\n @if (config.content) { <div class=\"card-content\" [innerHTML]=\"trustedContent\"></div> }\n @if (config.sections?.length) {\n <div class=\"card-sections\">\n @for (nested of config.sections; track nested.id) {\n <amf-renderer [section]=\"nested\" [context]=\"context\" class=\"card-nested-section\"></amf-renderer>\n }\n </div>\n }\n @if (config.actions?.length) {\n <div class=\"card-actions\">\n @for (action of config.actions; track action.label) { <button [class]=\"'btn-' + (action.variant || 'secondary')\" (click)=\"actionDispatcher.dispatch(action.action, context)\">{{ action.label }}</button> }\n </div>\n }\n </div>\n `,\n styles: [`\n .amf-card { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: 1px solid var(--glass-border); border-radius: 16px; padding: 24px; box-shadow: var(--glass-shadow-sm); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); }\n .amf-card:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); box-shadow: var(--glass-shadow); transform: translateY(-2px); }\n .variant-default { background: var(--app-surface); border: 1px solid var(--app-border); backdrop-filter: none; -webkit-backdrop-filter: none; }\n .variant-outlined { background: transparent; backdrop-filter: none; }\n .variant-elevated { box-shadow: 0 20px 40px var(--glass-shadow); transform: translateY(-4px); }\n .variant-gradient { background: linear-gradient(135deg, rgba(59, 130, 246, 0.15), rgba(139, 92, 246, 0.15)); border: 1px solid rgba(139, 92, 246, 0.3); }\n .card-title { font-size: 1.25rem; margin-bottom: 16px; }\n .card-content { color: var(--app-text-muted); font-size: 0.9375rem; line-height: 1.6; }\n .card-sections { display: flex; flex-direction: column; gap: 16px; margin-top: 16px; }\n .card-nested-section { display: block; }\n .card-actions { margin-top: 20px; display: flex; gap: 12px; }\n .btn-secondary { background: var(--glass-bg); border: 1px solid var(--app-border); color: var(--app-text); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-secondary:hover { background: var(--glass-bg-hover); }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 4px 12px var(--app-glow); }\n .btn-danger { background: linear-gradient(135deg, #ef4444, #dc2626); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-danger:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4); }\n .btn-success { background: linear-gradient(135deg, #10b981, #059669); color: white; border: none; padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-success:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4); }\n .btn-ghost { background: transparent; border: 1px solid transparent; color: var(--app-text-muted); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s; }\n .btn-ghost:hover { background: rgba(255, 255, 255, 0.05); color: var(--app-text); }\n `]\n})\nexport class CardSectionComponent implements MetaSectionComponent<CardMeta> {\n @Input() config!: CardMeta;\n @Input() context: any = {};\n readonly actionDispatcher = inject(ActionDispatcherService);\n private readonly sanitizer = inject(DomSanitizer);\n\n get trustedContent(): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(this.config.content || '');\n }\n}\n","/**\n * AvoraMetaForge — Stats Grid Section Component\n */\nimport { Component, Input, inject } from '@angular/core';\n\nimport { StatsGridMeta } from '../../models/meta.types';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\n\n@Component({\n selector: 'amf-stats-grid',\n standalone: true,\n imports: [],\n template: `\n <div class=\"amf-stats-grid\" [style.grid-template-columns]=\"gridCols\" [class]=\"'variant-' + (config.variant || 'glass')\">\n @for (stat of config.stats; track stat.label; let i = $index) {\n <div class=\"stat-card\" [style.animation-delay]=\"(i * 0.1) + 's'\">\n <div class=\"stat-glow\" [style.background]=\"stat.glowColor || stat.color\"></div>\n @if (stat.icon) {\n <div class=\"stat-icon\" [style.color]=\"stat.color\" [style.background]=\"stat.bgColor\">\n <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"iconRegistry.getIcon(stat.icon)\"></path></svg>\n </div>\n }\n <div class=\"stat-data\">\n <span class=\"stat-label\">{{ stat.label }}</span>\n <span class=\"stat-value\">{{ stat.value }}</span>\n @if (stat.trend) { <span class=\"stat-trend\" [class.positive]=\"stat.trendPositive\" [class.negative]=\"!stat.trendPositive\">{{ stat.trend }}</span> }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .amf-stats-grid { display: grid; gap: 20px; }\n .stat-card { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: 1px solid var(--glass-border); border-radius: 16px; padding: 24px; display: flex; align-items: center; gap: 20px; position: relative; overflow: hidden; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); animation: fadeInUp 0.5s ease-out backwards; }\n .stat-card:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-light); transform: translateY(-4px); box-shadow: var(--glass-shadow); }\n .variant-default .stat-card { background: var(--app-surface); border: 1px solid var(--app-border); backdrop-filter: none; -webkit-backdrop-filter: none; }\n .variant-compact .stat-card { padding: 14px 16px; gap: 14px; min-height: 80px; }\n .variant-compact .stat-icon { width: 38px; height: 38px; border-radius: 10px; }\n .variant-compact .stat-icon svg { width: 18px; height: 18px; }\n .variant-compact .stat-value { font-size: 1.25rem; font-weight: 800; }\n .variant-compact .stat-glow { width: 60px; height: 60px; top: -10px; right: -10px; }\n .variant-outlined .stat-card { background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; }\n .variant-elevated .stat-card { box-shadow: 0 20px 40px var(--glass-shadow); transform: translateY(-2px); border-color: var(--glass-border-light); }\n .stat-glow { position: absolute; width: 100px; height: 100px; border-radius: 50%; filter: blur(40px); opacity: 0.15; top: -20px; right: -20px; pointer-events: none; transition: opacity 0.3s; }\n .stat-card:hover .stat-glow { opacity: 0.3; }\n .stat-icon { width: 52px; height: 52px; border-radius: 14px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n .stat-icon svg { width: 26px; height: 26px; fill: currentColor; }\n .stat-data { display: flex; flex-direction: column; }\n .stat-label { font-size: 0.8125rem; color: var(--app-text-muted); font-weight: 500; }\n .stat-value { font-size: 1.5rem; font-weight: 700; color: var(--app-text); margin: 2px 0; }\n .stat-trend { font-size: 0.75rem; font-weight: 600; }\n .stat-trend.positive { color: #34d399; } .stat-trend.negative { color: #fb7185; }\n @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n `]\n})\nexport class StatsGridSectionComponent implements MetaSectionComponent<StatsGridMeta> {\n @Input() config!: StatsGridMeta;\n @Input() context: any = {};\n readonly iconRegistry = inject(IconRegistryService);\n\n get gridCols(): string { return `repeat(auto-fit, minmax(280px, 1fr))`; }\n}\n","/**\n * AvoraMetaForge — Page Header Section Component\n */\nimport { Component, Input, inject } from '@angular/core';\n\nimport { PageHeaderMeta } from '../../models/meta.types';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { MetaSectionComponent } from '../../core/meta-section.interface';\n\n@Component({\n selector: 'amf-page-header',\n standalone: true,\n imports: [],\n template: `\n <header class=\"amf-page-header\">\n <div class=\"header-content\">\n <h1>{{ resolvedTitle }}</h1>\n @if (config.subtitle) { <p>{{ config.subtitle }}</p> }\n </div>\n <div class=\"header-actions\">\n @for (action of config.actions || []; track action.label) {\n <button [class]=\"'btn-' + (action.variant || 'primary')\" (click)=\"actionDispatcher.dispatch(action.action, context)\">\n @if (action.icon) { <svg viewBox=\"0 0 24 24\" class=\"btn-icon\"><path [attr.d]=\"iconRegistry.getIcon(action.icon)\"></path></svg> }\n {{ action.label }}\n </button>\n }\n </div>\n </header>\n `,\n styles: [`\n .amf-page-header { display: flex; justify-content: space-between; align-items: center; animation: fadeInUp 0.4s ease-out; }\n .header-content h1 { font-size: 1.875rem; margin-bottom: 4px; }\n .header-content p { color: var(--app-text-muted); font-size: 0.9375rem; }\n .header-actions { display: flex; gap: 12px; }\n .btn-primary { background: linear-gradient(135deg, var(--app-primary), var(--app-accent)); color: white; border: none; padding: 10px 20px; border-radius: 10px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.3s; }\n .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 24px -4px var(--app-glow); }\n .btn-secondary { background: var(--glass-bg); border: 1px solid var(--app-border); color: var(--app-text); padding: 10px 20px; border-radius: 10px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.2s; }\n .btn-secondary:hover { background: var(--glass-bg-hover); }\n .btn-ghost { background: transparent; border: none; color: var(--app-text-muted); padding: 10px 20px; border-radius: 10px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.2s; }\n .btn-ghost:hover { color: var(--app-primary); background: var(--glass-bg); }\n .btn-icon { width: 18px; height: 18px; fill: currentColor; }\n @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n `]\n})\nexport class PageHeaderSectionComponent implements MetaSectionComponent<PageHeaderMeta> {\n @Input() config!: PageHeaderMeta;\n @Input() context: any = {};\n\n readonly actionDispatcher = inject(ActionDispatcherService);\n readonly iconRegistry = inject(IconRegistryService);\n\n get resolvedTitle(): string {\n if (this.config.titleTemplate && this.context) {\n return this.config.titleTemplate.replace(/\\{\\{(\\w+(?:\\.\\w+)*)\\}\\}/g, (_, key) => {\n return key.split('.').reduce((obj: any, k: string) => obj?.[k], this.context) ?? '';\n });\n }\n return this.config.title;\n }\n}\n","import { Injectable, signal, inject } from '@angular/core';\nimport { APP_META_CONFIG_TOKEN } from '../../avora-meta-forge/avora-meta-forge.provider';\nexport interface NavItem {\n label: string;\n icon?: string;\n route?: string;\n children?: NavItem[];\n badge?: string;\n badgeColor?: string;\n}\n\nexport interface NavGroup {\n label: string;\n items: NavItem[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationService {\n private readonly metaConfig: any = inject(APP_META_CONFIG_TOKEN, { optional: true });\n readonly menuItems = signal<NavGroup[]>(this.metaConfig?.navigation || []);\n\n setMenuItems(groups: NavGroup[]): void {\n this.menuItems.set(groups);\n }\n}\n","/**\n * Defines the available layout types for the application shell.\n * Used in route data to determine which layout wraps a given page.\n */\nexport enum LayoutType {\n /** Classic admin: sidebar left, header top */\n VERTICAL = 'vertical',\n /** Modern admin: horizontal menu in header */\n HORIZONTAL = 'horizontal',\n /** Blank wrapper for login, error, and standalone pages */\n EMPTY = 'empty',\n /** Centered content card — wizards, onboarding, standalone forms */\n CENTERED = 'centered',\n /** Split-pane master-detail — settings, detail views */\n TWO_COLUMN = 'two-column',\n /** CSS Grid widget layout — analytics, monitoring dashboards */\n DASHBOARD_GRID = 'dashboard-grid',\n /** Minimal chrome, auto-hiding header — data-dense, mobile-first */\n COMPACT = 'compact',\n}\n","import { Injectable, signal, computed, inject, OnDestroy } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { filter, Subscription } from 'rxjs';\nimport { LayoutType } from './layout-type.enum';\nimport { MetaStateService } from '../../avora-meta-forge/services/meta-state.service';\nimport { Title } from '@angular/platform-browser';\n\nimport { APP_META_CONFIG_TOKEN } from '../../avora-meta-forge/avora-meta-forge.provider';\n\n/** Routes that use the EMPTY layout (no sidebar/navbar chrome). */\nconst EMPTY_LAYOUT_PATHS = ['/login', '/register', '/forgot-password', '/reset-password', '/contact-support'];\n/**\n * Central configuration service for the application shell.\n * Manages layout state, branding, and global settings using Angular Signals.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppConfigService implements OnDestroy {\n private readonly metaConfig: any = inject(APP_META_CONFIG_TOKEN, { optional: true });\n\n /**\n * Current active layout type.\n * Initialized from the browser URL *before* Angular's first navigation so\n * the correct layout shell renders on the very first frame, preventing the\n * brief flash of the sidebar/navbar chrome on pages like /login.\n */\n private readonly _currentLayout = signal<LayoutType>(this.getInitialLayout());\n\n /** Application display name */\n readonly appName = signal('AvoraMetaForge');\n\n /** Copyright text for the footer */\n readonly copyrightText = signal(`© ${new Date().getFullYear()} AvoraMetaForge. All rights reserved.`);\n\n /** Sidebar collapsed state */\n readonly sidebarCollapsed = signal(false);\n\n /** Public read-only accessor for the current layout */\n readonly currentLayout = computed(() => this._currentLayout());\n\n private readonly stateService = inject(MetaStateService);\n private readonly titleService = inject(Title);\n private _settingsSub?: Subscription;\n\n /**\n * Reads window.location.pathname before Angular's first navigation to\n * determine the correct initial layout. Prevents the one-frame flash of\n * the sidebar/navbar shell when refreshing on an auth-only page like /login.\n */\n private getInitialLayout(): LayoutType {\n const path = window.location.pathname;\n const isEmptyRoute = EMPTY_LAYOUT_PATHS.some(p => path === p || path.startsWith(p + '/'));\n if (isEmptyRoute) return LayoutType.EMPTY;\n \n return (this.metaConfig?.app?.defaultLayout as LayoutType) || LayoutType.VERTICAL;\n }\n\n constructor(private router: Router) {\n this.router.events\n .pipe(filter((event): event is NavigationEnd => event instanceof NavigationEnd))\n .subscribe(() => {\n this.updateLayoutFromUrl();\n });\n\n // Apply any previously persisted settings from the Settings page\n this.applyPersistedSettings();\n\n // React to settings changes saved via the Settings page\n this._settingsSub = this.stateService.changes$.pipe(\n filter(change => change.key.startsWith('settings.'))\n ).subscribe(change => {\n this.applySettingChange(change.key, change.newValue);\n });\n }\n\n ngOnDestroy(): void {\n this._settingsSub?.unsubscribe();\n }\n\n /** Update layout based on the current activated route data */\n private updateLayoutFromUrl(): void {\n let route = this.router.routerState.snapshot.root;\n let layout: LayoutType | null = null;\n\n // Traverse the route tree and pick up the last 'layout' data found\n while (route) {\n const layoutData = route.data['layout'] as LayoutType | undefined;\n if (layoutData) {\n layout = layoutData;\n }\n route = route.firstChild!;\n }\n\n if (layout && layout !== this._currentLayout()) {\n this._currentLayout.set(layout);\n }\n }\n\n /** Set the layout type programmatically */\n setLayout(type: LayoutType): void {\n this._currentLayout.set(type);\n }\n\n /** Toggle sidebar collapsed state */\n toggleSidebar(): void {\n this.sidebarCollapsed.update(v => !v);\n }\n\n /** Walk the route tree to find the deepest activated child */\n private getDeepestRoute(route: any): any {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n }\n\n /** Apply settings persisted across sessions on startup */\n private applyPersistedSettings(): void {\n const name = this.stateService.get('settings.appName');\n if (name) this.appName.set(String(name));\n\n const compact = this.stateService.get('settings.compactSidebar');\n if (compact !== undefined && compact !== null) this.sidebarCollapsed.set(Boolean(compact));\n\n // Restore dark/light mode preference (default is dark)\n const darkMode = this.stateService.get('settings.darkMode');\n // If no preference is stored yet, default to dark (no attribute = dark variables from :root)\n if (darkMode !== undefined && darkMode !== null) {\n this.applyColorScheme(Boolean(darkMode));\n }\n }\n\n /**\n * Called whenever a settings.* state key changes (e.g. after the Settings\n * form is submitted). Maps each key to the appropriate runtime effect.\n */\n private applySettingChange(key: string, value: any): void {\n switch (key) {\n case 'settings.appName':\n if (value) {\n this.appName.set(String(value));\n this.titleService.setTitle(String(value));\n }\n break;\n\n case 'settings.compactSidebar':\n this.sidebarCollapsed.set(Boolean(value));\n break;\n\n case 'settings.darkMode':\n this.applyColorScheme(Boolean(value));\n break;\n\n case 'settings.language':\n // Language preference is stored; full i18n runtime switching requires\n // a translation library (ngx-translate / transloco) — noted for future.\n console.info(`[AvoraMetaForge] Language preference saved: ${value}. Full runtime translation requires i18n integration.`);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Toggles dark / light mode by setting data-color-scheme on <html>.\n * Dark mode = no attribute (uses :root CSS vars from _variables.scss).\n * Light mode = data-color-scheme=\"light\" (overrides via _themes.scss).\n */\n private applyColorScheme(isDark: boolean): void {\n const html = document.documentElement;\n if (isDark) {\n html.removeAttribute('data-color-scheme');\n } else {\n html.setAttribute('data-color-scheme', 'light');\n }\n }\n}\n","/**\n * AvoraMetaForge — Provider Initialization\n *\n * Provides the APP_INITIALIZER factory that bootstraps the framework:\n * 1. Registers built-in section components (form, table, card, etc.)\n * 2. Registers API endpoint definitions\n * 3. Registers environments and auth configuration\n * 4. Generates and registers dynamic routes from metadata\n * 5. Registers plugins (custom actions, validators, conditions, etc.)\n * 6. Initializes MetaStateService and MetaAuthService\n */\nimport { APP_INITIALIZER, Provider, InjectionToken } from '@angular/core';\nimport { AppMeta } from './models/meta.types';\n\nexport const APP_META_CONFIG_TOKEN = new InjectionToken<AppMeta>('APP_META_CONFIG');\nimport { MetaRouterService } from './core/meta-router.service';\nimport { ComponentRegistryService } from './core/component-registry.service';\nimport { MetaApiService } from './services/meta-api.service';\nimport { MetaStateService } from './services/meta-state.service';\nimport { AuthService } from '../core/auth/auth.service';\nimport { ActionDispatcherService } from './core/action-dispatcher.service';\nimport { ConditionEvaluatorService } from './core/condition-evaluator.service';\nimport { PluginRegistryService } from './plugins/plugin-registry.service';\nimport { NavigationService } from '../layout/api/navigation.service';\nimport { AppConfigService } from '../core/config/app-config.service';\nimport { FormRendererComponent } from './renderers/form/form-renderer.component';\nimport { StepperFormRendererComponent } from './renderers/form/stepper-form-renderer.component';\nimport { TableRendererComponent } from './renderers/table/table-renderer.component';\nimport { CardSectionComponent } from './renderers/card/card-section.component';\nimport { StatsGridSectionComponent } from './renderers/stats-grid/stats-grid-section.component';\nimport { PageHeaderSectionComponent } from './renderers/page-header/page-header-section.component';\nimport { AccordionSectionComponent } from './core/components/accordion-section.component';\n\n/**\n * Factory function invoked by APP_INITIALIZER before the app renders.\n * Returns a synchronous function — Angular waits for it to complete\n * before performing the initial navigation.\n */\nexport function initializeAvoraMetaForge(\n registry: ComponentRegistryService,\n routerService: MetaRouterService,\n apiService: MetaApiService,\n stateService: MetaStateService,\n authService: AuthService,\n actionDispatcher: ActionDispatcherService,\n conditionEvaluator: ConditionEvaluatorService,\n pluginRegistry: PluginRegistryService,\n navService: NavigationService,\n appConfigService: AppConfigService,\n config: AppMeta\n) {\n return () => {\n // 1. Register built-in section renderers\n registry.registerAll({\n 'form': FormRendererComponent,\n 'stepper-form': StepperFormRendererComponent,\n 'table': TableRendererComponent,\n 'card': CardSectionComponent,\n 'stats-grid': StatsGridSectionComponent,\n 'page-header': PageHeaderSectionComponent,\n 'accordion': AccordionSectionComponent\n });\n\n // 2. Register API endpoint definitions (if any)\n if (config.apis?.length) {\n apiService.registerEndpoints(config.apis);\n }\n\n // 3. Register environments\n if (config.environments) {\n apiService.registerEnvironments(config.environments, config.activeEnvironment);\n }\n\n // 4. Set global default headers\n if (config.defaultHeaders) {\n apiService.setGlobalHeaders(config.defaultHeaders);\n }\n\n const authConfig = config.auth;\n if (authConfig) {\n authService.configure(authConfig, authConfig.mock || false);\n }\n\n // 6. Register plugins\n if (config.plugins?.length) {\n for (const plugin of config.plugins) {\n pluginRegistry.register(plugin);\n\n // Wire plugin components\n if (plugin.components) {\n registry.registerAll(plugin.components);\n }\n\n // Wire plugin action handlers\n if (plugin.actions) {\n for (const [type, handler] of Object.entries(plugin.actions)) {\n actionDispatcher.registerHandler(type, handler);\n }\n }\n\n // Wire plugin condition evaluators\n if (plugin.conditions) {\n for (const [key, evaluator] of Object.entries(plugin.conditions)) {\n conditionEvaluator.registerEvaluator(key, evaluator);\n }\n }\n\n // Wire plugin transforms\n if (plugin.transforms) {\n for (const [key, fn] of Object.entries(plugin.transforms)) {\n apiService.registerTransform(key, fn);\n }\n }\n }\n }\n\n // 7. Generate and register dynamic routes from page metadata.\n // Angular's APP_INITIALIZER guarantees this runs before the router\n // performs initial navigation, so no manual initialNavigation() needed.\n routerService.registerApp(config);\n\n // 8. Push navigation and app branding to the layout services explicitly.\n // (NavigationService reads APP_META_CONFIG_TOKEN in its constructor,\n // but explicit push guarantees the signal is populated even if the\n // service was instantiated before providers were fully resolved.)\n if (config.navigation?.length) {\n navService.setMenuItems(config.navigation as any);\n }\n if (config.app?.name) {\n appConfigService.appName.set(config.app.name);\n }\n\n console.log('[AvoraMetaForge] Framework initialized successfully.');\n };\n}\n\n/**\n * Call this in app.config.ts to wire up AvoraMetaForge:\n *\n * provideAvoraMetaForge(APP_META)\n */\nexport function provideAvoraMetaForge(config: AppMeta): Provider[] {\n return [\n { provide: APP_META_CONFIG_TOKEN, useValue: config },\n {\n provide: APP_INITIALIZER,\n useFactory: initializeAvoraMetaForge,\n deps: [\n ComponentRegistryService,\n MetaRouterService,\n MetaApiService,\n MetaStateService,\n AuthService,\n ActionDispatcherService,\n ConditionEvaluatorService,\n PluginRegistryService,\n NavigationService,\n AppConfigService,\n APP_META_CONFIG_TOKEN\n ],\n multi: true\n }\n ];\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from './auth.service';\n\n/**\n * Functional auth guard (CanActivateFn).\n * - Checks if a valid (non-expired) token exists via AuthService.\n * - Stores the attempted URL for post-login redirect.\n * - Redirects unauthenticated users to /login.\n */\nexport const authGuard: CanActivateFn = (route, state) => {\n const authService = inject(AuthService);\n const router = inject(Router);\n\n if (authService.isAuthenticated()) {\n return true;\n }\n\n // Store the URL the user was trying to reach\n authService.storeRedirectUrl(state.url);\n return router.createUrlTree(['/login']);\n};\n","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { catchError, throwError } from 'rxjs';\nimport { AuthService } from './auth.service';\n\n/**\n * HTTP Interceptor — Bearer token injection + 401 global logout.\n */\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const authService = inject(AuthService);\n const token = authService.getToken();\n\n // Clone request and add auth header if token exists\n const authReq = token\n ? req.clone({ setHeaders: { Authorization: `Bearer ${token}` } })\n : req;\n\n return next(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n authService.logout();\n }\n return throwError(() => error);\n })\n );\n};\n","export interface ColorPreset {\n name: string;\n primary: string;\n hover: string;\n light: string;\n glow: string;\n}\n\nexport interface SurfacePreset {\n name: string;\n bg: string;\n bgSecondary: string;\n sidebarBg: string;\n navbarBg: string;\n}\n\nexport interface ThemeConfig {\n primaryPreset: string;\n surfacePreset: string;\n colorScheme: 'light' | 'dark';\n menuType: 'static' | 'overlay' | 'slim' | 'slim-plus' | 'reveal' | 'drawer' | 'horizontal';\n menuProfile: 'start' | 'end';\n}\n\nexport const THEME_PRESETS: ColorPreset[] = [\n { name: 'cyan', primary: '#06b6d4', hover: '#0891b2', light: 'rgba(6, 182, 212, 0.15)', glow: 'rgba(6, 182, 212, 0.25)' },\n { name: 'blue', primary: '#3b82f6', hover: '#2563eb', light: 'rgba(59, 130, 246, 0.15)', glow: 'rgba(59, 130, 246, 0.25)' },\n { name: 'indigo', primary: '#6366f1', hover: '#4f46e5', light: 'rgba(99, 102, 241, 0.15)', glow: 'rgba(99, 102, 241, 0.25)' },\n { name: 'violet', primary: '#8b5cf6', hover: '#7c3aed', light: 'rgba(139, 92, 246, 0.15)', glow: 'rgba(139, 92, 246, 0.25)' },\n { name: 'rose', primary: '#f43f5e', hover: '#e11d48', light: 'rgba(244, 63, 94, 0.15)', glow: 'rgba(244, 63, 94, 0.25)' },\n { name: 'orange', primary: '#f97316', hover: '#ea580c', light: 'rgba(249, 115, 22, 0.15)', glow: 'rgba(249, 115, 22, 0.25)' },\n { name: 'emerald', primary: '#10b981', hover: '#059669', light: 'rgba(16, 185, 129, 0.15)', glow: 'rgba(16, 185, 129, 0.25)' },\n { name: 'green', primary: '#22c55e', hover: '#16a34a', light: 'rgba(34, 197, 94, 0.15)', glow: 'rgba(34, 197, 94, 0.25)' },\n { name: 'amber', primary: '#f59e0b', hover: '#d97706', light: 'rgba(245, 158, 11, 0.15)', glow: 'rgba(245, 158, 11, 0.25)' }\n];\n\nexport const SURFACE_PRESETS: SurfacePreset[] = [\n { name: 'slate', bg: '#0f172a', bgSecondary: '#131d35', sidebarBg: 'rgba(15, 23, 42, 0.85)', navbarBg: 'rgba(15, 23, 42, 0.65)' },\n { name: 'gray', bg: '#111827', bgSecondary: '#1f2937', sidebarBg: 'rgba(17, 24, 39, 0.85)', navbarBg: 'rgba(17, 24, 39, 0.65)' },\n { name: 'zinc', bg: '#18181b', bgSecondary: '#27272a', sidebarBg: 'rgba(24, 24, 27, 0.85)', navbarBg: 'rgba(24, 24, 27, 0.65)' },\n { name: 'neutral', bg: '#171717', bgSecondary: '#262626', sidebarBg: 'rgba(23, 23, 23, 0.85)', navbarBg: 'rgba(23, 23, 23, 0.65)' },\n { name: 'stone', bg: '#1c1917', bgSecondary: '#292524', sidebarBg: 'rgba(28, 25, 23, 0.85)', navbarBg: 'rgba(28, 25, 23, 0.65)' }\n];\n\nexport const DEFAULT_THEME_CONFIG: ThemeConfig = {\n primaryPreset: 'cyan',\n surfacePreset: 'slate',\n colorScheme: 'dark',\n menuType: 'static',\n menuProfile: 'end'\n};\n","import { Injectable, signal, effect, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { ThemeConfig, DEFAULT_THEME_CONFIG, THEME_PRESETS, SURFACE_PRESETS, ColorPreset, SurfacePreset } from './theme.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n private readonly STORAGE_KEY = 'amf-theme-config';\n \n // Expose configuration as a signal\n public config = signal<ThemeConfig>(DEFAULT_THEME_CONFIG);\n \n // Customizer UI State\n public customizerOpen = signal<boolean>(false);\n\n constructor(@Inject(PLATFORM_ID) private platformId: Object) {\n if (isPlatformBrowser(this.platformId)) {\n this.loadConfig();\n // Sync theme signal to the DOM and persist\n effect(() => {\n const currentConfig = this.config();\n this.saveConfig(currentConfig);\n this.applyTheme(currentConfig);\n });\n }\n }\n\n updateConfig(partial: Partial<ThemeConfig>) {\n this.config.update(c => ({ ...c, ...partial }));\n }\n\n private loadConfig() {\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n // Legacy check\n const legacySaved = localStorage.getItem('app-theme');\n if (stored) {\n this.config.set({ ...DEFAULT_THEME_CONFIG, ...JSON.parse(stored) });\n } else if (legacySaved && legacySaved !== 'default') {\n // Fallback for old theme service\n this.config.update(c => ({ ...c, colorScheme: legacySaved === 'client-b' ? 'dark' : 'light' }));\n }\n } catch (e) {\n console.warn('Could not load theme config from localStorage', e);\n }\n }\n\n private saveConfig(config: ThemeConfig) {\n try {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(config));\n } catch (e) {\n console.warn('Could not save theme config to localStorage', e);\n }\n }\n\n private applyTheme(config: ThemeConfig) {\n const doc = document.documentElement;\n \n // 1. Apply Color Scheme (light/dark)\n if (config.colorScheme === 'dark') {\n doc.removeAttribute('data-color-scheme');\n } else {\n doc.setAttribute('data-color-scheme', 'light');\n }\n \n // 2. Apply Primary Colors\n const primaryPreset = THEME_PRESETS.find(p => p.name === config.primaryPreset) || THEME_PRESETS[0];\n this.applyPrimaryPalette(primaryPreset, doc);\n\n // 3. Apply Surface Colors (applicable if in dark mode)\n if (config.colorScheme === 'dark') {\n const surfacePreset = SURFACE_PRESETS.find(p => p.name === config.surfacePreset) || SURFACE_PRESETS[0];\n this.applySurfacePalette(surfacePreset, doc);\n } else {\n doc.style.removeProperty('--app-bg');\n doc.style.removeProperty('--app-bg-secondary');\n doc.style.removeProperty('--app-sidebar-bg');\n doc.style.removeProperty('--app-navbar-bg');\n }\n\n // 4. Apply Layout attributes (these will be handled by the shell layout)\n doc.setAttribute('data-menu-type', config.menuType);\n doc.setAttribute('data-menu-profile', config.menuProfile);\n }\n\n private applyPrimaryPalette(preset: ColorPreset, doc: HTMLElement) {\n doc.style.setProperty('--app-primary', preset.primary);\n doc.style.setProperty('--app-primary-hover', preset.hover);\n doc.style.setProperty('--app-primary-light', preset.light);\n doc.style.setProperty('--app-glow', preset.glow);\n doc.style.setProperty('--app-gradient-1', preset.primary);\n }\n\n private applySurfacePalette(preset: SurfacePreset, doc: HTMLElement) {\n doc.style.setProperty('--app-bg', preset.bg);\n doc.style.setProperty('--app-bg-secondary', preset.bgSecondary);\n doc.style.setProperty('--app-sidebar-bg', preset.sidebarBg);\n doc.style.setProperty('--app-navbar-bg', preset.navbarBg);\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { NavItem, NavigationService } from '../../api/navigation.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { AppConfigService } from '../../../core/config/app-config.service';\n\n@Component({\n selector: 'app-sidebar',\n standalone: true,\n imports: [CommonModule, RouterLink, RouterLinkActive],\n template: `\n <div class=\"sidebar-container\" [class.collapsed]=\"config.sidebarCollapsed()\">\n <div class=\"sidebar-header\">\n <div class=\"logo\">\n <div class=\"logo-glow\">\n <svg viewBox=\"0 0 24 24\" class=\"logo-icon\">\n <path [attr.d]=\"iconRegistry.getIcon('dashboard')\"></path>\n </svg>\n </div>\n <span class=\"logo-text\">{{ config.appName() }}</span>\n </div>\n </div>\n\n <nav class=\"sidebar-nav\">\n @for (group of navigation.menuItems(); track group.label) {\n <div class=\"nav-group\">\n <h3 class=\"group-title\">{{ group.label }}</h3>\n <ul>\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: group.items }\"></ng-container>\n </ul>\n </div>\n }\n </nav>\n\n <ng-template #menuList let-listItems>\n @for (node of listItems; track node.label) {\n <li class=\"nav-item-wrapper\">\n <div\n class=\"nav-item\"\n [routerLink]=\"node.route ? node.route : null\"\n routerLinkActive=\"active\"\n [class.has-children]=\"node.children?.length\"\n (click)=\"toggleExpand(node)\"\n >\n <div class=\"nav-link-content\">\n @if (node.icon) {\n <svg viewBox=\"0 0 24 24\" class=\"nav-icon\">\n <path [attr.d]=\"iconRegistry.getIcon(node.icon)\"></path>\n </svg>\n }\n <span class=\"nav-label\">{{ node.label }}</span>\n </div>\n\n @if (node.badge) {\n <span class=\"badge\" [style.background]=\"'linear-gradient(135deg, ' + node.badgeColor + ', ' + node.badgeColor + '88)'\">\n {{ node.badge }}\n </span>\n }\n\n @if (node.children?.length) {\n <svg viewBox=\"0 0 24 24\" class=\"chevron\" [class.rotated]=\"expandedItems.has(node)\">\n <path [attr.d]=\"iconRegistry.getIcon('chevron-right')\"></path>\n </svg>\n }\n </div>\n\n @if (node.children?.length && expandedItems.has(node)) {\n <ul class=\"sub-menu\">\n <ng-container *ngTemplateOutlet=\"menuList; context: { $implicit: node.children }\"></ng-container>\n </ul>\n }\n </li>\n }\n </ng-template>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .sidebar-container {\n width: var(--sidebar-width, 260px);\n height: 100%;\n background: var(--app-sidebar-bg);\n backdrop-filter: blur(var(--glass-blur-heavy));\n -webkit-backdrop-filter: blur(var(--glass-blur-heavy));\n border-right: 1px solid var(--glass-border);\n display: flex;\n flex-direction: column;\n transition: width var(--transition-smooth);\n overflow: hidden;\n position: relative;\n }\n\n .sidebar-container::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 1px;\n height: 100%;\n background: linear-gradient(\n to bottom,\n transparent,\n var(--app-primary-light),\n transparent\n );\n pointer-events: none;\n }\n\n .sidebar-container.collapsed {\n width: 80px;\n }\n\n .sidebar-header {\n height: 68px;\n display: flex;\n align-items: center;\n padding: 0 20px;\n border-bottom: 1px solid var(--glass-border);\n }\n\n .logo {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 700;\n font-size: 1.25rem;\n color: var(--app-text);\n white-space: nowrap;\n }\n\n .logo-glow {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n background: linear-gradient(135deg, var(--app-primary), var(--app-accent));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 0 20px var(--app-glow);\n animation: pulseGlow 4s ease-in-out infinite;\n flex-shrink: 0;\n }\n\n .logo-icon {\n width: 20px;\n height: 20px;\n fill: white;\n }\n\n .sidebar-container.collapsed .logo-text {\n display: none;\n }\n\n .sidebar-nav {\n flex: 1;\n overflow-y: auto;\n padding: 16px 0;\n }\n\n .nav-group {\n margin-top: 28px;\n }\n\n .nav-group:first-child {\n margin-top: 0;\n }\n\n .group-title {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--app-text-muted);\n padding: 0 24px 8px;\n opacity: 0.6;\n }\n\n .sidebar-container.collapsed .group-title {\n display: none;\n }\n\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n .nav-item-wrapper {\n margin-bottom: 2px;\n padding: 0 10px;\n }\n\n .nav-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 44px;\n padding: 0 14px;\n border-radius: 10px;\n color: var(--app-sidebar-text);\n cursor: pointer;\n transition: all var(--transition-smooth);\n text-decoration: none;\n position: relative;\n }\n\n .nav-item:hover {\n background: var(--glass-bg-hover);\n color: var(--app-text);\n }\n\n .nav-item.active {\n background: linear-gradient(135deg,\n var(--app-primary-light),\n var(--app-accent-light)\n );\n color: var(--app-primary);\n box-shadow: 0 0 20px var(--app-glow);\n }\n\n .nav-item.active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n width: 3px;\n height: 20px;\n border-radius: 0 3px 3px 0;\n background: linear-gradient(to bottom, var(--app-primary), var(--app-accent));\n }\n\n .nav-item.active .nav-icon {\n filter: drop-shadow(0 0 6px var(--app-glow));\n }\n\n .nav-link-content {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .nav-icon {\n width: 20px;\n height: 20px;\n fill: currentColor;\n flex-shrink: 0;\n transition: all var(--transition-fast);\n }\n\n .sidebar-container.collapsed .nav-label,\n .sidebar-container.collapsed .chevron,\n .sidebar-container.collapsed .badge {\n display: none;\n }\n\n .chevron {\n width: 16px;\n height: 16px;\n fill: currentColor;\n transition: transform var(--transition-smooth);\n opacity: 0.5;\n }\n\n .chevron.rotated {\n transform: rotate(90deg);\n }\n\n .badge {\n font-size: 10px;\n padding: 2px 8px;\n border-radius: 10px;\n color: white;\n font-weight: 600;\n backdrop-filter: blur(8px);\n }\n\n .sub-menu {\n padding-left: 24px;\n margin-top: 4px;\n animation: fadeInUp 0.2s ease-out;\n }\n\n .sidebar-container.collapsed .sub-menu {\n display: none;\n }\n `]\n})\nexport class SidebarComponent {\n readonly config = inject(AppConfigService);\n readonly navigation = inject(NavigationService);\n readonly iconRegistry = inject(IconRegistryService);\n\n expandedItems = new Set<NavItem>();\n\n toggleExpand(item: NavItem): void {\n if (item.children?.length) {\n if (this.expandedItems.has(item)) {\n this.expandedItems.delete(item);\n } else {\n this.expandedItems.add(item);\n }\n }\n }\n}\n","import { Component, inject, signal } from '@angular/core';\n\nimport { AppConfigService } from '../../../core/config/app-config.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\nimport { ThemeService } from '../../../core/config/theme.service';\nimport { AuthService } from '../../../core/auth/auth.service';\n\n@Component({\n selector: 'app-navbar',\n standalone: true,\n imports: [],\n template: `\n <header class=\"navbar-container\">\n <div class=\"left-section\">\n <button class=\"icon-btn\" (click)=\"config.toggleSidebar()\" title=\"Toggle Sidebar\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('menu')\"></path>\n </svg>\n </button>\n\n <div class=\"search-box\">\n <svg viewBox=\"0 0 24 24\" class=\"search-icon\">\n <path [attr.d]=\"iconRegistry.getIcon('search')\"></path>\n </svg>\n <input type=\"text\" placeholder=\"Search anything...\">\n </div>\n </div>\n\n <div class=\"right-section\">\n <!-- Theme Customizer Settings -->\n <button class=\"icon-btn theme-btn\" (click)=\"themeService.customizerOpen.set(true)\" title=\"Theme Settings\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('settings')\"></path>\n </svg>\n </button>\n\n <!-- User Profile -->\n <div class=\"user-profile\" (click)=\"userMenuOpen.set(!userMenuOpen())\">\n <div class=\"user-info\">\n <span class=\"user-name\">{{ auth.user()?.name }}</span>\n <span class=\"user-role\">{{ auth.user()?.role }}</span>\n </div>\n <div class=\"avatar\">\n @if (auth.user()?.avatar) {\n <img [src]=\"auth.user()?.avatar\" [alt]=\"auth.user()?.name\">\n } @else {\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('person')\"></path>\n </svg>\n }\n </div>\n\n @if (userMenuOpen()) {\n <div class=\"dropdown user-dropdown\">\n <div class=\"dropdown-header\">\n <strong>{{ auth.user()?.name }}</strong>\n <span>{{ auth.user()?.email }}</span>\n </div>\n <div class=\"divider\"></div>\n <div class=\"dropdown-item\">Your Profile</div>\n <div class=\"dropdown-item\">Settings</div>\n <div class=\"divider\"></div>\n <div class=\"dropdown-item logout\" (click)=\"auth.logout()\">\n <svg viewBox=\"0 0 24 24\" class=\"logout-icon\">\n <path [attr.d]=\"iconRegistry.getIcon('logout')\"></path>\n </svg>\n Logout\n </div>\n </div>\n }\n </div>\n </div>\n </header>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n }\n\n .navbar-container {\n height: 68px;\n padding: 0 24px;\n background: var(--app-navbar-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n border-bottom: 1px solid var(--glass-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: sticky;\n top: 0;\n z-index: 100;\n }\n\n .left-section, .right-section {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .icon-btn {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--app-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--transition-smooth);\n position: relative;\n }\n\n .icon-btn:hover {\n background: var(--glass-bg-hover);\n border-color: var(--glass-border);\n color: var(--app-primary);\n box-shadow: 0 0 16px var(--app-glow);\n }\n\n .icon-btn svg {\n width: 22px;\n height: 22px;\n fill: currentColor;\n }\n\n .search-box {\n display: flex;\n align-items: center;\n background: var(--glass-bg);\n border: 1px solid var(--glass-border);\n border-radius: 10px;\n padding: 0 14px;\n width: 300px;\n height: 40px;\n transition: all var(--transition-smooth);\n }\n\n .search-box:focus-within {\n border-color: var(--app-primary);\n background: var(--glass-bg-hover);\n box-shadow: 0 0 20px var(--app-glow);\n }\n\n .search-icon {\n width: 18px;\n height: 18px;\n fill: var(--app-text-muted);\n flex-shrink: 0;\n transition: fill var(--transition-fast);\n }\n\n .search-box:focus-within .search-icon {\n fill: var(--app-primary);\n }\n\n .search-box input {\n border: none;\n background: transparent;\n padding: 8px;\n outline: none;\n flex: 1;\n font-size: 0.875rem;\n color: var(--app-text);\n }\n\n .search-box input::placeholder {\n color: var(--app-text-muted);\n }\n\n .user-profile {\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n padding: 4px 12px;\n border-radius: 12px;\n border: 1px solid transparent;\n transition: all var(--transition-smooth);\n position: relative;\n }\n\n .user-profile:hover {\n background: var(--glass-bg-hover);\n border-color: var(--glass-border);\n }\n\n .user-info {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n .user-name {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--app-text);\n }\n\n .user-role {\n font-size: 0.6875rem;\n color: var(--app-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .avatar {\n width: 38px;\n height: 38px;\n border-radius: 12px;\n background: linear-gradient(135deg, var(--app-primary), var(--app-accent));\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n transition: box-shadow var(--transition-smooth);\n }\n\n .user-profile:hover .avatar {\n box-shadow: 0 0 20px var(--app-glow);\n }\n\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar svg {\n width: 22px;\n height: 22px;\n fill: currentColor;\n }\n\n /* ── Dropdowns ── */\n .dropdown {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\n background: var(--app-bg-secondary);\n backdrop-filter: blur(var(--glass-blur-heavy));\n -webkit-backdrop-filter: blur(var(--glass-blur-heavy));\n border: 1px solid var(--glass-border-light);\n border-radius: 14px;\n box-shadow: var(--glass-shadow), 0 0 30px rgba(0,0,0,0.4);\n min-width: 220px;\n overflow: hidden;\n animation: slideInDown 0.25s ease-out;\n }\n\n .dropdown-header {\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n }\n\n .dropdown-header strong {\n color: var(--app-text);\n font-size: 0.9375rem;\n }\n\n .dropdown-header span {\n font-size: 0.75rem;\n color: var(--app-text-muted);\n margin-top: 2px;\n }\n\n .dropdown-item {\n padding: 10px 16px;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all var(--transition-fast);\n color: var(--app-text-muted);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .dropdown-item:hover {\n background: var(--glass-bg-hover);\n color: var(--app-primary);\n }\n\n .dropdown-item.active {\n background: var(--app-primary-light);\n color: var(--app-primary);\n font-weight: 600;\n }\n\n .theme-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .divider {\n height: 1px;\n background: var(--glass-border);\n margin: 4px 0;\n }\n\n .logout {\n color: #f43f5e !important;\n }\n\n .logout:hover {\n background: rgba(244, 63, 94, 0.1) !important;\n color: #fb7185 !important;\n }\n\n .logout-icon {\n width: 18px;\n height: 18px;\n fill: currentColor;\n }\n `]\n})\nexport class NavbarComponent {\n readonly config = inject(AppConfigService);\n readonly iconRegistry = inject(IconRegistryService);\n readonly themeService = inject(ThemeService);\n readonly auth = inject(AuthService);\n\n userMenuOpen = signal(false);\n\n}\n","import { Component, inject } from '@angular/core';\n\nimport { AppConfigService } from '../../../core/config/app-config.service';\n\n@Component({\n selector: 'app-footer',\n standalone: true,\n imports: [],\n template: `\n <footer class=\"footer-container\">\n <div class=\"footer-content\">\n <p class=\"copyright\">{{ config.copyrightText() }}</p>\n <div class=\"links\">\n <a href=\"#\">Terms</a>\n <a href=\"#\">Privacy</a>\n <a href=\"#\">Support</a>\n </div>\n </div>\n </footer>\n `,\n styles: [`\n .footer-container {\n height: 52px;\n padding: 0 28px;\n background: var(--app-navbar-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n border-top: 1px solid var(--glass-border);\n display: flex;\n align-items: center;\n margin-top: auto;\n position: relative;\n }\n\n .footer-container::before {\n content: '';\n position: absolute;\n top: 0;\n left: 10%;\n right: 10%;\n height: 1px;\n background: linear-gradient(\n to right,\n transparent,\n var(--app-primary-light),\n transparent\n );\n }\n\n .footer-content {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .copyright {\n font-size: 0.8125rem;\n color: var(--app-text-muted);\n opacity: 0.6;\n }\n\n .links {\n display: flex;\n gap: 20px;\n }\n\n .links a {\n font-size: 0.8125rem;\n color: var(--app-text-muted);\n text-decoration: none;\n transition: all var(--transition-fast);\n opacity: 0.6;\n }\n\n .links a:hover {\n color: var(--app-primary);\n opacity: 1;\n }\n `]\n})\nexport class FooterComponent {\n readonly config = inject(AppConfigService);\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\nimport { SidebarComponent } from '../../common/sidebar/sidebar.component';\nimport { NavbarComponent } from '../../common/navbar/navbar.component';\nimport { FooterComponent } from '../../common/footer/footer.component';\nimport { AppConfigService } from '../../../core/config/app-config.service';\n\n@Component({\n selector: 'app-vertical-layout',\n standalone: true,\n imports: [RouterOutlet, SidebarComponent, NavbarComponent, FooterComponent],\n template: `\n <div class=\"layout-wrapper\" [class.collapsed]=\"config.sidebarCollapsed()\">\n <!-- Animated Gradient Mesh Background -->\n <div class=\"gradient-mesh\" aria-hidden=\"true\">\n <div class=\"blob blob-1\"></div>\n <div class=\"blob blob-2\"></div>\n <div class=\"blob blob-3\"></div>\n </div>\n\n <!-- Sidebar -->\n <app-sidebar class=\"layout-sidebar\"></app-sidebar>\n\n <!-- Main Content Area -->\n <div class=\"layout-main\">\n <app-navbar></app-navbar>\n\n <main class=\"content-body\">\n <router-outlet></router-outlet>\n </main>\n\n <app-footer></app-footer>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100vh;\n width: 100%;\n }\n\n .layout-wrapper {\n display: flex;\n height: 100vh;\n overflow: hidden;\n background: var(--app-bg);\n position: relative;\n }\n\n /* ── Animated Gradient Mesh ── */\n .gradient-mesh {\n position: fixed;\n inset: 0;\n z-index: 0;\n overflow: hidden;\n pointer-events: none;\n }\n\n .blob {\n position: absolute;\n border-radius: 50%;\n filter: blur(80px);\n opacity: 0.35;\n will-change: transform;\n }\n\n .blob-1 {\n width: 500px;\n height: 500px;\n background: var(--app-gradient-1);\n top: -10%;\n right: -5%;\n animation: blobMove1 20s ease-in-out infinite;\n }\n\n .blob-2 {\n width: 400px;\n height: 400px;\n background: var(--app-gradient-2);\n bottom: -10%;\n left: 10%;\n animation: blobMove2 25s ease-in-out infinite;\n }\n\n .blob-3 {\n width: 350px;\n height: 350px;\n background: var(--app-gradient-3);\n top: 40%;\n left: 40%;\n animation: blobMove3 22s ease-in-out infinite;\n }\n\n /* ── Layout ── */\n .layout-sidebar {\n flex-shrink: 0;\n z-index: 100;\n position: relative;\n }\n\n .layout-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n position: relative;\n z-index: 1;\n transition: margin-left var(--transition-smooth);\n }\n\n .content-body {\n padding: 28px;\n flex: 1;\n max-width: 1600px;\n width: 100%;\n margin: 0 auto;\n animation: fadeInUp 0.4s ease-out;\n }\n `]\n})\nexport class VerticalLayoutComponent {\n readonly config = inject(AppConfigService);\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';\nimport { NavbarComponent } from '../../common/navbar/navbar.component';\nimport { FooterComponent } from '../../common/footer/footer.component';\nimport { NavigationService } from '../../api/navigation.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\n\n@Component({\n selector: 'app-horizontal-layout',\n standalone: true,\n imports: [RouterOutlet, NavbarComponent, FooterComponent, RouterLink, RouterLinkActive],\n template: `\n <div class=\"layout-wrapper\">\n <app-navbar>\n <!-- Horizontal Menu Injection (Conceptual - in a full app we'd use a dedicated component or slot) -->\n </app-navbar>\n\n <nav class=\"horizontal-nav\">\n <div class=\"nav-container\">\n <ul>\n @for (group of navigation.menuItems(); track group.label) {\n @for (item of group.items; track item.label) {\n <li class=\"nav-item\">\n <a [routerLink]=\"item.route\" routerLinkActive=\"active\" class=\"nav-link\">\n @if (item.icon) {\n <svg viewBox=\"0 0 24 24\" class=\"nav-icon\">\n <path [attr.d]=\"iconRegistry.getIcon(item.icon)\"></path>\n </svg>\n }\n {{ item.label }}\n </a>\n </li>\n }\n }\n </ul>\n </div>\n </nav>\n\n <main class=\"content-body\">\n <router-outlet></router-outlet>\n </main>\n\n <app-footer></app-footer>\n </div>\n `,\n styles: [`\n .layout-wrapper {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--app-bg, #f9fafb);\n }\n\n .horizontal-nav {\n background: var(--app-navbar-bg, #ffffff);\n border-bottom: 1px solid var(--app-border, #e5e7eb);\n height: 48px;\n }\n\n .nav-container {\n max-width: 1600px;\n margin: 0 auto;\n height: 100%;\n padding: 0 24px;\n }\n\n ul {\n display: flex;\n list-style: none;\n padding: 0;\n margin: 0;\n height: 100%;\n gap: 32px;\n }\n\n .nav-item {\n height: 100%;\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 100%;\n color: var(--app-text, #374151);\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n transition: all 0.2s;\n }\n\n .nav-link:hover {\n color: var(--app-primary, #3b82f6);\n }\n\n .nav-link.active {\n color: var(--app-primary, #3b82f6);\n border-bottom-color: var(--app-primary, #3b82f6);\n }\n\n .nav-icon {\n width: 18px;\n height: 18px;\n fill: currentColor;\n }\n\n .content-body {\n padding: 24px;\n flex: 1;\n max-width: 1600px;\n width: 100%;\n margin: 0 auto;\n }\n `]\n})\nexport class HorizontalLayoutComponent {\n readonly navigation = inject(NavigationService);\n readonly iconRegistry = inject(IconRegistryService);\n}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-empty-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"empty-layout-container\">\n <router-outlet></router-outlet>\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .empty-layout-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--app-bg, #f9fafb);\n color: var(--app-text, #111827);\n }\n `]\n})\nexport class EmptyLayoutComponent { }\n","import { Component, inject } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-centered-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"centered-container\">\n <div class=\"centered-content glass-panel\">\n <router-outlet></router-outlet>\n </div>\n </div>\n `,\n styles: [`\n .centered-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n background: var(--app-bg, #f9fafb);\n padding: 2rem;\n }\n .centered-content {\n width: 100%;\n max-width: 600px;\n padding: 2rem;\n border-radius: 1rem;\n }\n .glass-panel {\n background: var(--glass-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n border: 1px solid var(--glass-border);\n box-shadow: var(--glass-shadow);\n }\n `]\n})\nexport class CenteredLayoutComponent {}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-two-column-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"two-column-container\">\n <aside class=\"left-panel glass-panel\">\n <!-- Master list or secondary navigation ideally goes here -->\n <div class=\"placeholder-nav\">Navigation / List</div>\n </aside>\n <main class=\"right-panel\">\n <router-outlet></router-outlet>\n </main>\n </div>\n `,\n styles: [`\n .two-column-container {\n display: flex;\n min-height: 100vh;\n background: var(--app-bg);\n }\n .left-panel {\n width: 300px;\n flex-shrink: 0;\n border-right: 1px solid var(--glass-border);\n padding: 1rem;\n display: flex;\n flex-direction: column;\n }\n .right-panel {\n flex: 1;\n padding: 2rem;\n overflow-y: auto;\n }\n .glass-panel {\n background: var(--glass-bg);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n }\n .placeholder-nav {\n color: var(--app-text-muted);\n font-size: 0.875rem;\n text-align: center;\n margin-top: 2rem;\n }\n `]\n})\nexport class TwoColumnLayoutComponent {}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-dashboard-grid-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"dashboard-grid-container\">\n <router-outlet></router-outlet>\n </div>\n `,\n styles: [`\n .dashboard-grid-container {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n gap: 1.5rem;\n padding: 2rem;\n min-height: 100vh;\n background: var(--app-bg);\n }\n /* Children will define their own gridColumn spans */\n `]\n})\nexport class DashboardGridLayoutComponent {}\n","import { Component } from '@angular/core';\n\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-compact-layout',\n standalone: true,\n imports: [RouterOutlet],\n template: `\n <div class=\"compact-container\">\n <!-- Minimal or no header -->\n <main class=\"compact-content\">\n <router-outlet></router-outlet>\n </main>\n </div>\n `,\n styles: [`\n .compact-container {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--app-bg);\n }\n .compact-content {\n flex: 1;\n padding: 1rem;\n max-width: 100%;\n overflow-x: hidden;\n }\n `]\n})\nexport class CompactLayoutComponent {}\n","import { Component, inject } from '@angular/core';\n\nimport { NotificationService } from '../../../core/notifications/notification.service';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\n\n@Component({\n selector: 'app-notification-container',\n standalone: true,\n imports: [],\n template: `\n <div class=\"notification-wrapper\">\n @for (n of service.notifications(); track n.id) {\n <div class=\"toast\" [class]=\"n.type\" (click)=\"service.remove(n.id)\">\n <div class=\"toast-icon\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"getIcon(n.type)\"></path>\n </svg>\n </div>\n <div class=\"toast-content\">\n {{ n.message }}\n </div>\n <button class=\"toast-close\">\n <svg viewBox=\"0 0 24 24\">\n <path [attr.d]=\"iconRegistry.getIcon('close')\"></path>\n </svg>\n </button>\n </div>\n }\n </div>\n `,\n styles: [`\n .notification-wrapper {\n position: fixed;\n top: 24px;\n right: 24px;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n gap: 12px;\n pointer-events: none;\n }\n\n .toast {\n pointer-events: auto;\n min-width: 300px;\n max-width: 450px;\n background: var(--app-surface, #ffffff);\n border-radius: 12px;\n padding: 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n border-left: 4px solid #e5e7eb;\n cursor: pointer;\n animation: slideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transition: all 0.2s;\n }\n\n .toast:hover {\n transform: translateY(-2px);\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n }\n\n .toast.success { border-left-color: #10b981; }\n .toast.error { border-left-color: #ef4444; }\n .toast.warning { border-left-color: #f59e0b; }\n .toast.info { border-left-color: #3b82f6; }\n\n .toast-icon {\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n }\n\n .toast.success .toast-icon { fill: #10b981; }\n .toast.error .toast-icon { fill: #ef4444; }\n .toast.warning .toast-icon { fill: #f59e0b; }\n .toast.info .toast-icon { fill: #3b82f6; }\n\n .toast-content {\n flex: 1;\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--app-text, #1f2937);\n line-height: 1.4;\n }\n\n .toast-close {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--app-text-muted, #6b7280);\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .toast-close:hover {\n opacity: 1;\n }\n\n .toast-close svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(100%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n `]\n})\nexport class NotificationContainerComponent {\n readonly service = inject(NotificationService);\n readonly iconRegistry = inject(IconRegistryService);\n\n getIcon(type: string): string {\n switch (type) {\n case 'success': return this.iconRegistry.getIcon('check-circle');\n case 'error': return this.iconRegistry.getIcon('error');\n case 'warning': return this.iconRegistry.getIcon('warning');\n default: return this.iconRegistry.getIcon('info');\n }\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { TitleCasePipe } from '@angular/common';\nimport { ThemeService } from '../../../core/config/theme.service';\nimport { THEME_PRESETS, SURFACE_PRESETS } from '../../../core/config/theme.types';\nimport { IconRegistryService } from '../../../core/icons/icon-registry.service';\n\n@Component({\n selector: 'app-theme-customizer',\n standalone: true,\n imports: [TitleCasePipe],\n template: `\n <!-- Overlay -->\n @if (themeService.customizerOpen()) {\n <div class=\"customizer-overlay\" (click)=\"close()\"></div>\n }\n\n <!-- Drawer -->\n <div class=\"customizer-drawer\" [class.open]=\"themeService.customizerOpen()\">\n <div class=\"drawer-header\">\n <h2>Settings</h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"iconRegistry.getIcon('close')\"></path></svg>\n </button>\n </div>\n\n <div class=\"drawer-body\">\n \n <!-- Primary Colors -->\n <div class=\"section\">\n <h3>Primary</h3>\n <div class=\"color-grid\">\n @for (preset of presets; track preset.name) {\n <button \n class=\"color-swatch\"\n [style.background]=\"preset.primary\"\n [class.active]=\"themeService.config().primaryPreset === preset.name\"\n (click)=\"setPrimary(preset.name)\"\n [title]=\"preset.name\"\n ></button>\n }\n </div>\n </div>\n\n <!-- Surface Colors -->\n <div class=\"section\">\n <h3>Surface</h3>\n <div class=\"color-grid surface-grid\">\n @for (surface of surfaces; track surface.name) {\n <button \n class=\"color-swatch\"\n [style.background]=\"surface.bgSecondary\"\n [class.active]=\"themeService.config().surfacePreset === surface.name\"\n (click)=\"setSurface(surface.name)\"\n [title]=\"surface.name\"\n ></button>\n }\n </div>\n </div>\n\n <!-- Color Scheme -->\n <div class=\"section\">\n <h3>Color Scheme</h3>\n <div class=\"toggle-group\">\n <button \n [class.active]=\"themeService.config().colorScheme === 'light'\"\n (click)=\"setScheme('light')\">Light</button>\n <button \n [class.active]=\"themeService.config().colorScheme === 'dark'\"\n (click)=\"setScheme('dark')\">Dark</button>\n </div>\n </div>\n\n <!-- Menu Type -->\n <div class=\"section\">\n <h3>Menu Type</h3>\n <div class=\"radio-group\">\n @for (type of menuTypes; track type) {\n <label class=\"radio-label\">\n <input type=\"radio\" name=\"menuType\" \n [value]=\"type\" \n [checked]=\"themeService.config().menuType === type\"\n (change)=\"setMenuType(type)\">\n <span class=\"radio-custom\"></span>\n {{ type | titlecase }}\n </label>\n }\n </div>\n </div>\n\n <!-- Menu Profile -->\n <div class=\"section\">\n <h3>Menu Profile</h3>\n <div class=\"radio-group row-group\">\n <label class=\"radio-label\">\n <input type=\"radio\" name=\"menuProfile\" value=\"start\" \n [checked]=\"themeService.config().menuProfile === 'start'\"\n (change)=\"setMenuProfile('start')\">\n <span class=\"radio-custom\"></span>\n Start\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\" name=\"menuProfile\" value=\"end\" \n [checked]=\"themeService.config().menuProfile === 'end'\"\n (change)=\"setMenuProfile('end')\">\n <span class=\"radio-custom\"></span>\n End\n </label>\n </div>\n </div>\n\n </div>\n </div>\n `,\n styles: [`\n .customizer-overlay {\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 999;\n animation: fadeIn 0.2s ease;\n }\n\n .customizer-drawer {\n position: fixed;\n top: 0; right: -360px;\n width: 340px;\n height: 100vh;\n background: var(--app-bg-secondary, #fff);\n color: var(--app-text, #333);\n z-index: 1000;\n box-shadow: -4px 0 24px rgba(0,0,0,0.15);\n transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n }\n\n .customizer-drawer.open {\n right: 0;\n }\n\n .drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--app-border, #eee);\n }\n\n .drawer-header h2 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n .close-btn {\n background: transparent;\n border: none;\n color: var(--app-text-muted);\n cursor: pointer;\n width: 32px; height: 32px;\n display: flex; align-items: center; justify-content: center;\n border-radius: 50%;\n transition: background 0.2s;\n }\n\n .close-btn:hover {\n background: var(--app-surface-hover);\n }\n\n .close-btn svg {\n width: 20px; height: 20px; fill: currentColor;\n }\n\n .drawer-body {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 32px;\n }\n\n .section h3 {\n margin: 0 0 16px 0;\n font-size: 0.95rem;\n font-weight: 600;\n }\n\n .color-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 12px;\n }\n\n .color-swatch {\n width: 32px; height: 32px;\n border-radius: 50%;\n border: none;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s;\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n\n .color-swatch:hover {\n transform: scale(1.1);\n }\n\n .color-swatch.active {\n outline-color: currentColor;\n }\n\n .toggle-group {\n display: flex;\n background: var(--app-surface);\n border-radius: 8px;\n padding: 4px;\n border: 1px solid var(--app-border);\n }\n\n .toggle-group button {\n flex: 1;\n padding: 10px;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--app-text-muted);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .toggle-group button.active {\n background: var(--app-primary-light);\n color: var(--app-primary);\n }\n\n .radio-group {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n }\n \n .radio-group.row-group {\n grid-template-columns: auto auto;\n justify-content: flex-start;\n gap: 32px;\n }\n\n .radio-label {\n display: flex;\n align-items: center;\n gap: 10px;\n cursor: pointer;\n font-size: 0.9rem;\n color: var(--app-text);\n }\n\n .radio-label input {\n display: none;\n }\n\n .radio-custom {\n width: 20px; height: 20px;\n border: 2px solid var(--app-border);\n border-radius: 50%;\n position: relative;\n transition: all 0.2s;\n }\n\n .radio-label input:checked + .radio-custom {\n border-color: var(--app-primary);\n }\n\n .radio-label input:checked + .radio-custom::after {\n content: '';\n position: absolute;\n top: 50%; left: 50%;\n transform: translate(-50%, -50%);\n width: 10px; height: 10px;\n background: var(--app-primary);\n border-radius: 50%;\n }\n \n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `]\n})\nexport class ThemeCustomizerComponent {\n themeService = inject(ThemeService);\n iconRegistry = inject(IconRegistryService);\n\n presets = THEME_PRESETS;\n surfaces = SURFACE_PRESETS;\n \n menuTypes = ['static', 'overlay', 'slim', 'reveal', 'drawer', 'horizontal'];\n\n close() {\n this.themeService.customizerOpen.set(false);\n }\n\n setPrimary(name: string) {\n this.themeService.updateConfig({ primaryPreset: name });\n }\n\n setSurface(name: string) {\n this.themeService.updateConfig({ surfacePreset: name });\n }\n\n setScheme(scheme: 'light' | 'dark') {\n this.themeService.updateConfig({ colorScheme: scheme });\n }\n\n setMenuType(type: any) {\n this.themeService.updateConfig({ menuType: type });\n }\n\n setMenuProfile(profile: any) {\n this.themeService.updateConfig({ menuProfile: profile });\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { AppConfigService } from '../core/config/app-config.service';\nimport { LayoutType } from '../core/config/layout-type.enum';\nimport { VerticalLayoutComponent } from './layouts/vertical/vertical-layout.component';\nimport { HorizontalLayoutComponent } from './layouts/horizontal/horizontal-layout.component';\nimport { EmptyLayoutComponent } from './layouts/empty/empty-layout.component';\nimport { CenteredLayoutComponent } from './layouts/centered/centered-layout.component';\nimport { TwoColumnLayoutComponent } from './layouts/two-column/two-column-layout.component';\nimport { DashboardGridLayoutComponent } from './layouts/dashboard-grid/dashboard-grid-layout.component';\nimport { CompactLayoutComponent } from './layouts/compact/compact-layout.component';\nimport { NotificationContainerComponent } from './common/notifications/notification-container.component';\nimport { MetaModalHostComponent } from '../avora-meta-forge/core/components/meta-modal-host.component';\nimport { AmfDialogHostComponent } from '../avora-meta-forge/core/components/amf-dialog-host.component';\nimport { AmfDrawerHostComponent } from '../avora-meta-forge/core/components/amf-drawer-host.component';\nimport { ThemeCustomizerComponent } from './common/theme-customizer/theme-customizer.component';\n\n/**\n * The Root Renderer (Traffic Controller).\n * Decides which layout to load based on the currentLayout signal from AppConfigService.\n */\n@Component({\n selector: 'app-layout',\n standalone: true,\n imports: [\n VerticalLayoutComponent,\n HorizontalLayoutComponent,\n EmptyLayoutComponent,\n CenteredLayoutComponent,\n TwoColumnLayoutComponent,\n DashboardGridLayoutComponent,\n CompactLayoutComponent,\n NotificationContainerComponent,\n MetaModalHostComponent,\n AmfDialogHostComponent,\n AmfDrawerHostComponent,\n ThemeCustomizerComponent\n],\n template: `\n <app-notification-container></app-notification-container>\n <amf-modal-host></amf-modal-host>\n <amf-dialog-host></amf-dialog-host>\n <amf-drawer-host></amf-drawer-host>\n <app-theme-customizer></app-theme-customizer>\n @switch (config.currentLayout()) {\n @case (LayoutType.VERTICAL) {\n <app-vertical-layout></app-vertical-layout>\n }\n @case (LayoutType.HORIZONTAL) {\n <app-horizontal-layout></app-horizontal-layout>\n }\n @case (LayoutType.EMPTY) {\n <app-empty-layout></app-empty-layout>\n }\n @case (LayoutType.CENTERED) {\n <app-centered-layout></app-centered-layout>\n }\n @case (LayoutType.TWO_COLUMN) {\n <app-two-column-layout></app-two-column-layout>\n }\n @case (LayoutType.DASHBOARD_GRID) {\n <app-dashboard-grid-layout></app-dashboard-grid-layout>\n }\n @case (LayoutType.COMPACT) {\n <app-compact-layout></app-compact-layout>\n }\n @default {\n <app-vertical-layout></app-vertical-layout>\n }\n }\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n `]\n})\nexport class LayoutComponent {\n readonly config = inject(AppConfigService);\n readonly LayoutType = LayoutType;\n}\n","/**\n * AvoraMetaForge — Public API Surface\n *\n * This is the single entry point for all consumers of the @avora/meta-forge library.\n * Import from this path to use the framework in any Angular application.\n */\n\n// ─── Engine: Models (all meta-type interfaces) ───────────────────────────────\nexport * from './lib/avora-meta-forge/models/meta.types';\n\n// ─── Engine: Core Services ────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/core/action-dispatcher.service';\nexport * from './lib/avora-meta-forge/core/condition-evaluator.service';\nexport * from './lib/avora-meta-forge/core/component-registry.service';\nexport * from './lib/avora-meta-forge/core/meta-router.service';\nexport * from './lib/avora-meta-forge/core/meta-section.interface';\nexport * from './lib/avora-meta-forge/core/meta-guard';\nexport * from './lib/avora-meta-forge/core/amf.routes';\n\n// ─── Engine: Core Components ─────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/core/meta-renderer.component';\nexport * from './lib/avora-meta-forge/core/meta-page.component';\nexport * from './lib/avora-meta-forge/core/components/accordion-section.component';\nexport * from './lib/avora-meta-forge/core/components/meta-modal-host.component';\nexport * from './lib/avora-meta-forge/core/components/amf-dialog-host.component';\nexport * from './lib/avora-meta-forge/core/components/amf-drawer-host.component';\n\n// ─── Engine: Services ────────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/services/meta-api.service';\nexport * from './lib/avora-meta-forge/services/meta-state.service';\n// AuthService is exported via the Core: Auth block below\n\n// ─── Engine: Plugins ─────────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/plugins/plugin-registry.service';\n\n// ─── Engine: Renderers ───────────────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/renderers/form/form-renderer.component';\nexport * from './lib/avora-meta-forge/renderers/form/stepper-form-renderer.component';\nexport * from './lib/avora-meta-forge/renderers/form/repeater-field.component';\nexport * from './lib/avora-meta-forge/renderers/table/table-renderer.component';\nexport * from './lib/avora-meta-forge/renderers/card/card-section.component';\nexport * from './lib/avora-meta-forge/renderers/stats-grid/stats-grid-section.component';\nexport * from './lib/avora-meta-forge/renderers/page-header/page-header-section.component';\n\n// ─── Engine: Provider (bootstrap) ────────────────────────────────────────────\nexport * from './lib/avora-meta-forge/avora-meta-forge.provider';\n\n// ─── Core: Auth ──────────────────────────────────────────────────────────────\nexport * from './lib/core/auth/auth.service';\nexport * from './lib/core/auth/auth.guard';\nexport * from './lib/core/auth/auth.interceptor';\n\n// ─── Core: Config ────────────────────────────────────────────────────────────\nexport * from './lib/core/config/app-config.service';\nexport * from './lib/core/config/layout-type.enum';\nexport * from './lib/core/config/theme.types';\nexport * from './lib/core/config/theme.service';\n\n// ─── Core: Notifications ─────────────────────────────────────────────────────\nexport * from './lib/core/notifications/notification.service';\n\n// ─── Layout Shell ────────────────────────────────────────────────────────────\nexport * from './lib/layout/layout.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["rxTimeout","rxRetry","i1","i3","catchError"],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;AAQG;;ACRH;;;;;;;;;;;AAWG;;ACXH;;;;;;;;;;AAUG;;ACVH;;;;;;;;;;;;;AAaG;;ACbH;;;;AAIG;;ACJH;;;;;;;;;;;;;;;;AAgBG;;AChBH;;;;;;;;;;;;;;AAcG;;ACdH;;;;;;AAMG;;ACNH;;;;;;;;;;AAUG;;ACVH;;;;;AAKG;;ACLH;;AAEG;;MCYU,mBAAmB,CAAA;AACpB,IAAA,cAAc,GAAG,MAAM,CAAiB,EAAE,qFAAC;AAC1C,IAAA,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;IAEjD,QAAQ,GAAG,CAAC;;AAGpB,IAAA,IAAI,CAAC,IAAsB,EAAE,OAAe,EAAE,OAAO,GAAG,IAAI,EAAA;AACxD,QAAA,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ;QAC1B,MAAM,YAAY,GAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;AAEjE,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;AAErD,QAAA,IAAI,OAAO,GAAG,CAAC,EAAE;AACb,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;QAC9C;IACJ;AAEA,IAAA,OAAO,CAAC,OAAe,EAAA,EAAU,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAChE,IAAA,KAAK,CAAC,OAAe,EAAA,EAAU,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5D,IAAA,IAAI,CAAC,OAAe,EAAA,EAAU,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1D,IAAA,OAAO,CAAC,OAAe,EAAA,EAAU,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;;AAGhE,IAAA,MAAM,CAAC,EAAU,EAAA;QACb,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE;wGA1BS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFhB,MAAM,EAAA,CAAA;;4FAET,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ACbD;;;;;;;;;;;AAWG;MAYU,gBAAgB,CAAA;;AAEV,IAAA,KAAK,GAAG,IAAI,GAAG,EAA0C;AACzD,IAAA,aAAa,GAAG,IAAI,GAAG,EAAU;AACjC,IAAA,SAAS,GAAG,IAAI,OAAO,EAAe;;AAG9C,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;;;;;AAOjD,IAAA,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,UAAmB,KAAK,EAAA;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;AACvC,QAAA,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;QAEd,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3B,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC;QACnC;QAEA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/F;;AAGA,IAAA,GAAG,CAAC,GAAW,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IAC7D;;AAGA,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;IACpC;;IAGA,cAAc,CAAC,IAAc,EAAE,EAA6B,EAAA;AAC1D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD;;AAGA,IAAA,KAAK,CAAC,GAAW,EAAE,OAA4B,EAAE,UAAmB,KAAK,EAAA;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;QACnC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE;QACzC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC;IAChC;;IAGA,KAAK,CAAC,GAAW,EAAE,IAAY,EAAE,KAAU,EAAE,UAAmB,KAAK,EAAA;AACnE,QAAA,MAAM,OAAO,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5B,IAAI,GAAG,GAAG,OAAO;AACjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE;YAC1C,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB;AACA,QAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK;QAClC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;IACjC;;AAGA,IAAA,GAAG,CAAC,GAAW,EAAA;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;IACnF;;;;;AAOA,IAAA,KAAK,CAAC,GAAW,EAAE,cAAA,GAA0B,IAAI,EAAA;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/B,QAAA,IAAI,GAAG;AAAE,YAAA,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QAEtB,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YAC9B,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/C;IACF;;IAGA,QAAQ,CAAC,iBAA0B,IAAI,EAAA;QACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACnC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC;QACjC;IACF;;AAGA,IAAA,cAAc,CAAC,SAAiB,EAAE,cAAA,GAA0B,IAAI,EAAA;QAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACnC,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,SAAS,EAAE;AACxD,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC;YACjC;QACF;IACF;;;;;AAOA,IAAA,YAAY,CAAC,SAAiB,EAAA;QAC5B,MAAM,MAAM,GAAwB,EAAE;AACtC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,CAAC,EAAE;AACnC,gBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAClD,gBAAA,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE;YACxB;QACF;AACA,QAAA,OAAO,MAAM;IACf;;;;;AAOA,IAAA,OAAO,CAAC,OAA4B,EAAE,OAAA,GAAmB,KAAK,EAAA;AAC5D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAClD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QAC/B;IACF;;IAGA,QAAQ,GAAA;QACN,MAAM,MAAM,GAAwB,EAAE;AACtC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;AAC7C,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;QACrB;AACA,QAAA,OAAO,MAAM;IACf;;;;;AAOA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACrC;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;YACjE,OAAO,KAAK,CAAC;QACf;AACA,QAAA,OAAO,KAAK;IACd;;;;AAMQ,IAAA,iBAAiB,CAAC,GAAW,EAAA;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AACzC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE;IAC7B;AAEQ,IAAA,UAAU,CAAC,GAAW,EAAA;QAC5B,OAAO,CAAA,UAAA,EAAa,GAAG,CAAA,CAAE;IAC3B;IAEQ,gBAAgB,CAAC,GAAW,EAAE,KAAU,EAAA;AAC9C,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnE;QAAE,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,CAAA,8CAAA,EAAiD,GAAG,CAAA,EAAA,CAAI,EAAE,CAAC,CAAC;QAC3E;IACF;AAEQ,IAAA,eAAe,CAAC,GAAW,EAAA;AACjC,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACtD,YAAA,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS;QAC1C;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;QAClB;IACF;wGAtLW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACtBlC;;;;;;;;;;;;;;;;AAgBG;MAeU,cAAc,CAAA;AACR,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACzC,IAAA,SAAS,GAAG,IAAI,GAAG,EAA2B;AAC9C,IAAA,KAAK,GAAG,IAAI,GAAG,EAAsB;AACrC,IAAA,YAAY,GAAG,IAAI,GAAG,EAAkD;AACxE,IAAA,iBAAiB;IACjB,aAAa,GAA2B,EAAE;AAC1C,IAAA,gBAAgB,GAAG,IAAI,GAAG,EAA2C;;;;AAM7E,IAAA,iBAAiB,CAAC,IAAuB,EAAA;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtD;IAEA,oBAAoB,CAAC,IAA4D,EAAE,MAAe,EAAA;AAChG,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAChD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;QACpC;AACA,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM;IAC7C;AAEA,IAAA,oBAAoB,CAAC,GAAW,EAAA;AAC9B,QAAA,IAAI,CAAC,iBAAiB,GAAG,GAAG;IAC9B;AAEA,IAAA,gBAAgB,CAAC,OAA+B,EAAA;AAC9C,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,OAAO,EAAE;IAC5D;IAEA,iBAAiB,CAAC,GAAW,EAAE,EAAmC,EAAA;QAChE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;IACpC;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA,EAAiC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;;;;IAMtF,MAAM,IAAI,CACR,EAAU,EACV,aAAsC,EACtC,WAAiB,EACjB,OAIC,EAAA;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,CAAA,YAAA,CAAc,CAAC;;AAG9E,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9B;;AAGA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC;YAClD,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,OAAO,MAAM;QACzC;;AAGA,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;QAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,EAAE;AACnD,QAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC3C,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC,EAAE;AACzB,gBAAA,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACnD;QACF;;AAGA,QAAA,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE;AACjC,QAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;gBAAE,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE;AACA,QAAA,IAAI,OAAO,EAAE,WAAW,EAAE;AACxB,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;gBACxD,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC;QACF;AACA,QAAA,IAAI,OAAO,EAAE,gBAAgB,EAAE;AAC7B,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;gBAC7D,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC;QACF;;QAGA,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;;QAG9F,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAChC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QAC/C;;QAGA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,qBAAqB,EAAE;YAClE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC;QACzD;;AAGA,QAAA,IAAI,IAAI,GAAG,WAAW,IAAI,IAAI,CAAC,IAAI;AACnC,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,qBAAqB,IAAI,IAAI,IAAI,EAAE,IAAI,YAAY,QAAQ,CAAC,EAAE;AACrF,YAAA,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9B;;AAGA,QAAA,MAAM,YAAY,GAAQ,IAAI,CAAC,YAAY,IAAI,MAAM;;AAGrD,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACjD,IAAI;YACJ,OAAO;AACP,YAAA,MAAM,EAAE,UAAU;YAClB,YAAY;AACZ,YAAA,OAAO,EAAE;AACV,SAAA,CAAC;;QAGF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE;AACpC,YAAA,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAACA,OAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD;;AAGA,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE;AAC3C,YAAA,QAAQ,GAAG,QAAQ,CAAC,IAAI,CACtB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAClC;QACH;;AAGA,QAAA,IAAI,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC;;AAG7C,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QAC1D;;AAGA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YAChD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC;QAClD;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;IACH,MAAM,UAAU,CAAC,MAQhB,EAAA;AACC,QAAA,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;AAC3E,QAAA,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE;AACjC,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;gBACvD,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC;QACF;AAEA,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE;YAC1D,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO;AACP,YAAA,MAAM,EAAE,UAAU;AAClB,YAAA,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAQ;AACpD,YAAA,OAAO,EAAE;AACV,SAAA,CAAC;AAEF,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAACA,OAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD;AAEA,QAAA,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC;;;;;AAOA,IAAA,eAAe,CAAC,UAAkB,EAAA;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;YACnC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC,EAAE;AACpC,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;YACxB;QACF;IACF;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;;AAGA,IAAA,sBAAsB,CAAC,mBAA2B,EAAA;QAChD,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;YACrC,IAAI,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE;AAC3D,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B;QACF;IACF;;;;IAMQ,UAAU,CAAC,OAAoB,EAAE,IAAiB,EAAA;AACxD,QAAA,QAAQ,IAAI,CAAC,IAAI;YACf,KAAK,QAAQ,EAAE;gBACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ;AAC3C,sBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACxC,sBAAE,IAAI,CAAC,KAAK;AACd,gBAAA,IAAI,KAAK;oBAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAC;gBACpE;YACF;YACA,KAAK,OAAO,EAAE;AACZ,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;AAC7G,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;AAC7G,gBAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAChB,oBAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,MAAA,EAAS,IAAI,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,EAAE,CAAC,CAAA,CAAE,CAAC;gBAC5E;gBACA;YACF;YACA,KAAK,QAAQ,EAAE;AACb,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;AACtG,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW;AACjD,gBAAA,IAAI,GAAG;oBAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;gBAC/C;YACF;YACA,KAAK,QAAQ,EAAE;AACb,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;oBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ;AACvD,0BAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACrD,0BAAE,IAAI,CAAC,YAAY,CAAC,KAAK;AAC3B,oBAAA,IAAI,KAAK;AAAE,wBAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;gBACjE;gBACA;YACF;;AAEF,QAAA,OAAO,OAAO;IAChB;;;;IAMQ,MAAM,UAAU,CAAC,IAAqB,EAAA;;;;;;QAM5C,OAAO,CAAC,IAAI,CACV,CAAA,+BAAA,EAAkC,IAAI,CAAC,EAAE,CAAA,0BAAA,CAA4B,EACrE,wEAAwE,CACzE;AAED,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC;AACjC,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1D;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;QAC1E;AAEA,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI;AACpC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QAC1D;AACA,QAAA,OAAO,QAAQ;IACjB;;;;IAMQ,cAAc,CAAC,QAAa,EAAE,SAAwB,EAAA;;AAE5D,QAAA,IAAI,SAAS,CAAC,MAAM,EAAE;AACpB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;AACtD,YAAA,IAAI,EAAE;AAAE,gBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;QACxC;;AAGA,QAAA,IAAI,SAAS,CAAC,IAAI,EAAE;YAClB,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,CAAS,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;QACtF;;AAGA,QAAA,IAAI,SAAS,CAAC,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE;AACvE,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC3B,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,IAAK,CAAC,CAAC;YACvE;iBAAO;gBACL,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC;YACpD;QACF;;AAGA,QAAA,IAAI,SAAS,CAAC,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE;AACvE,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC3B,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,IAAK,CAAC,CAAC;YACvE;iBAAO;gBACL,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC;YACpD;QACF;;QAGA,IAAI,SAAS,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC5C,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAS,KAAI;gBACpC,MAAM,MAAM,GAAQ,EAAE;AACtB,gBAAA,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,GAAI,CAAC,EAAE;AACnE,oBAAA,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,CAAS,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;gBACtF;AACA,gBAAA,OAAO,MAAM;AACf,YAAA,CAAC,CAAC;QACJ;;QAGA,IAAI,SAAS,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC7C,YAAA,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;AACxD,YAAA,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG;AAC9B,YAAA,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;gBACrC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AAAE,oBAAA,OAAO,CAAC,CAAC,GAAG,GAAG;gBACpC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;oBAAE,OAAO,CAAC,GAAG,GAAG;AACnC,gBAAA,OAAO,CAAC;AACV,YAAA,CAAC,CAAC;QACJ;;QAGA,IAAI,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAChD,YAAA,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC;AAEA,QAAA,OAAO,QAAQ;IACjB;IAEQ,QAAQ,CAAC,GAAQ,EAAE,IAAc,EAAA;QACvC,MAAM,MAAM,GAAQ,EAAE;AACtB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,IAAI,GAAG,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;QACxC;AACA,QAAA,OAAO,MAAM;IACf;IAEQ,QAAQ,CAAC,GAAQ,EAAE,IAAc,EAAA;AACvC,QAAA,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE;AACzB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB;AACA,QAAA,OAAO,MAAM;IACf;;;;IAMQ,WAAW,CAAC,IAAqB,EAAE,MAA+B,EAAA;AACxE,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG;AAC1C,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;IACrD;IAEQ,SAAS,CAAC,IAAqB,EAAE,MAA+B,EAAA;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;QAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC;QACrC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE;AACtC,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AACtB,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,KAAK,CAAC,IAAI;IACnB;AAEQ,IAAA,YAAY,CAAC,IAAqB,EAAE,MAA0C,EAAE,IAAS,EAAA;QAC/F,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,YAAA,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI;AACzB,SAAA,CAAC;IACJ;;;;AAMQ,IAAA,gBAAgB,CAAC,WAAsB,EAAA;AAC7C,QAAA,OAAO,CAAC,MAAW,KAAK,MAAM,CAAC,IAAI,CACjC,UAAU,CAAC,CAAC,KAAU,EAAE,MAAW,KAAI;AACrC,YAAA,OAAO,MAAM;QACf,CAAC,CAAC,EACFC,KAAO,CAAC;YACN,KAAK,EAAE,WAAW,CAAC,UAAU;AAC7B,YAAA,KAAK,EAAE,CAAC,KAAU,EAAE,UAAkB,KAAI;;AAExC,gBAAA,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM;AAC5B,gBAAA,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,IAAI,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAClF,oBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;gBAChC;AACA,gBAAA,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC/E,oBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;gBAChC;AAEA,gBAAA,IAAI,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,IAAI;AACrC,gBAAA,IAAI,WAAW,CAAC,WAAW,EAAE;AAC3B,oBAAA,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;gBAC7C;AACA,gBAAA,IAAI,WAAW,CAAC,QAAQ,EAAE;oBACxB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC;gBAC/C;AAEA,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,EAAI,WAAW,CAAC,UAAU,CAAA,IAAA,EAAO,KAAK,CAAA,EAAA,CAAI,CAAC;AAC3F,gBAAA,OAAO,KAAK,CAAC,KAAK,CAAC;YACrB;AACD,SAAA,CAAC,CACH;IACH;;;;AAMQ,IAAA,cAAc,CAAC,IAAqB,EAAA;;AAE1C,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC/D,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAE,CAAC,OAAO;QACzD;;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAC3E,YAAA,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAE,CAAC,OAAO;QAC/E;;AAEA,QAAA,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE;IAC3B;;;;AAMQ,IAAA,UAAU,CAAC,GAAwB,EAAA;AACzC,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC9C,YAAA,IAAI,KAAK,YAAY,IAAI,EAAE;gBACzB,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;YACzC;AAAO,iBAAA,IAAI,KAAK,YAAY,QAAQ,EAAE;AACpC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,oBAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/C;YACF;iBAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AACtD,gBAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7C;iBAAO;gBACL,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC;QACF;AACA,QAAA,OAAO,QAAQ;IACjB;wGArdW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cADD,MAAM,EAAA,CAAA;;4FACnB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC9BlC;;;;;;;;;;;;;AAaG;MAOU,yBAAyB,CAAA;AAC5B,IAAA,gBAAgB,GAAG,IAAI,GAAG,EAA6B;;IAG/D,iBAAiB,CAAC,GAAW,EAAE,EAAqB,EAAA;QAClD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;IACpC;;IAGA,QAAQ,CAAC,SAAoC,EAAE,OAA4B,EAAA;AACzE,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;;AAG3B,QAAA,IAAI,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE;YACzB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAClE,YAAA,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM;QAC5C;;AAGA,QAAA,IAAI,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE;YACxB,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAChE,YAAA,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM;QAC5C;AAEA,QAAA,IAAI,MAAe;;QAGnB,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE;AACvD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;AAC7D,YAAA,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,KAAK;QAC5D;aAAO;;YAEL,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC7D,YAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;QACnF;AAEA,QAAA,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM;IAC5C;;;;IAMQ,iBAAiB,CAAC,SAAwB,EAAE,OAA4B,EAAA;AAC9E,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE;AACnC,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS;QAE5C,QAAQ,MAAM;YACZ,KAAK,OAAO,EAAE;;;AAGZ,gBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,OAAO,EAAE,KAAK,CAAC;YAClE;YACA,KAAK,OAAO,EAAE;gBACZ,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,OAAO,GAAG,aAAa,CAAC,IAAI,OAAO,EAAE,KAAK,CAAC;YAC/F;YACA,KAAK,MAAM,EAAE;AACX,gBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC,IAAI,OAAO,EAAE,KAAK,CAAC;YACtE;YACA,KAAK,SAAS,EAAE;AACd,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;AACxE,oBAAA,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS;gBAC1C;AAAE,gBAAA,MAAM;AACN,oBAAA,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;gBACrE;YACF;AACA,YAAA,KAAK,SAAS;AACd,YAAA;gBACE,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC;;IAEhD;;;;AAMQ,IAAA,OAAO,CAAC,EAAO,EAAE,EAAU,EAAE,EAAO,EAAE,SAAyB,EAAA;;AAErE,QAAA,MAAM,EAAE,GAAG,SAAS,EAAE,eAAe;AACrC,QAAA,MAAM,KAAK,GAAG,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;AAClE,QAAA,MAAM,KAAK,GAAG,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QAElE,QAAQ,EAAE;;AAER,YAAA,KAAK,IAAI,EAAG,OAAO,EAAE,IAAI,EAAE;AAC3B,YAAA,KAAK,IAAI,EAAG,OAAO,EAAE,IAAI,EAAE;AAC3B,YAAA,KAAK,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;AAC5B,YAAA,KAAK,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;;AAG5B,YAAA,KAAK,GAAG,EAAI,OAAO,EAAE,GAAG,EAAE;AAC1B,YAAA,KAAK,IAAI,EAAG,OAAO,EAAE,IAAI,EAAE;AAC3B,YAAA,KAAK,GAAG,EAAI,OAAO,EAAE,GAAG,EAAE;AAC1B,YAAA,KAAK,IAAI,EAAG,OAAO,EAAE,IAAI,EAAE;;AAG3B,YAAA,KAAK,IAAI,EAAK,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AACzD,YAAA,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;;AAG1D,YAAA,KAAK,UAAU,EAAI,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC5E,YAAA,KAAK,YAAY,EAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;AAC9E,YAAA,KAAK,UAAU,EAAI,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC5E,YAAA,KAAK,OAAO,EAAO,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;;AAGzD,YAAA,KAAK,QAAQ,EAAK,OAAO,CAAC,CAAC,EAAE;AAC7B,YAAA,KAAK,OAAO,EAAM,OAAO,CAAC,EAAE;YAC5B,KAAK,OAAO,EAAM,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YACrK,KAAK,UAAU,EAAG,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;;YAGvK,KAAK,SAAS,EAAE;gBACd,MAAM,KAAK,GAAG,SAAS,EAAE,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAC/D,gBAAA,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC;YAC9D;YACA,KAAK,YAAY,EAAE;gBACjB,MAAM,KAAK,GAAG,SAAS,EAAE,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC/D,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9D;;AAGA,YAAA,KAAK,QAAQ,EAAK,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE;YAC1E,KAAK,SAAS,EAAI,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,KAAK,UAAU,EAAG,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpF,KAAK,UAAU,EAAG,OAAO,OAAO,EAAE,KAAK,QAAQ;AAC/C,YAAA,KAAK,UAAU,EAAG,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7D,YAAA,KAAK,QAAQ,EAAK,OAAO,EAAE,IAAI,IAAI;AACnC,YAAA,KAAK,WAAW,EAAE,OAAO,EAAE,IAAI,IAAI;;YAGnC,KAAK,cAAc,EAAE;gBACnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAC9B,gBAAA,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;YACnC;YACA,KAAK,mBAAmB,EAAE;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAC9B,gBAAA,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE;YACjC;YACA,KAAK,gBAAgB,EAAE;gBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAC9B,gBAAA,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE;YACjC;;YAGA,KAAK,YAAY,EAAE;AACjB,gBAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AAAE,gBAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;YAChE;YACA,KAAK,WAAW,EAAE;AAChB,gBAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AAAE,gBAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;YAChE;YACA,KAAK,YAAY,EAAE;AACjB,gBAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AAAE,gBAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE;YAChG;;YAGA,KAAK,eAAe,EAAE;AACpB,gBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C;YACA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C;YACA,KAAK,YAAY,EAAE;AACjB,gBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpD;YACA,KAAK,YAAY,EAAE;AACjB,gBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1F;AAEA,YAAA;AACE,gBAAA,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,CAAA,CAAA,CAAG,CAAC;AACpE,gBAAA,OAAO,KAAK;;IAElB;;;;AAMQ,IAAA,SAAS,CAAC,KAAU,EAAA;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,MAAM;AAC1E,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;AACjF,QAAA,OAAO,IAAI;IACb;IAEQ,cAAc,CAAC,GAAQ,EAAE,IAAY,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,GAAG;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC;IACtE;wGAhMW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cADZ,MAAM,EAAA,CAAA;;4FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCTrB,gBAAgB,CAAA;;AAElB,IAAA,YAAY,GAAG,IAAI,OAAO,EAAwB;AAE3D;;;AAGG;IACH,MAAM,OAAO,CAAC,eAAsC,EAAA;AAClD,QAAA,MAAM,MAAM,GAAiB,OAAO,eAAe,KAAK;cACpD,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB;AACnH,cAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE;AAEhE,QAAA,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,KAAI;YACtC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7C,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;IACH,MAAM,KAAK,CAAC,eAAsC,EAAA;AAChD,QAAA,MAAM,MAAM,GAAiB,OAAO,eAAe,KAAK;cACpD,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;AAC9F,cAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE;AAE9D,QAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACrB,MAAM;AACN,gBAAA,OAAO,EAAE,MAAM,OAAO;AACvB,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;wGAjCW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACTlC;;;;;;;;AAQG;MAyBU,uBAAuB,CAAA;AACjB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,IAAA,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC3C,IAAA,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;AACnC,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACvC,IAAA,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC;AACtD,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAExC,IAAA,cAAc,GAAG,IAAI,GAAG,EAA0B;AAClD,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAmC;AACzD,IAAA,aAAa,GAAG,IAAI,OAAO,EAA6C;AACxE,IAAA,cAAc,GAAG,IAAI,OAAO,EAA6C;AACzE,IAAA,YAAY,GAAG,IAAI,OAAO,EAAyD;AACnF,IAAA,aAAa,GAAG,IAAI,OAAO,EAAqC;AAChE,IAAA,aAAa,GAAG,IAAI,GAAG,EAAmB;;AAGlD,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;;AAGtC,IAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;;AAGhD,IAAA,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;;AAGlD,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;;AAG9C,IAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;;IAGzD,eAAe,CAAC,IAAY,EAAE,OAAuB,EAAA;QACnD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;IACxC;;IAGA,SAAS,CAAC,MAAc,QAAQ,EAAA;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK;IAC7C;;;;AAMA,IAAA,MAAM,QAAQ,CAAC,MAAkB,EAAE,OAAa,EAAA;AAC9C,QAAA,IAAI;AACF,YAAA,IAAI,MAAW;AAEf,YAAA,QAAQ,MAAM,CAAC,IAAI;;AAEjB,gBAAA,KAAK,UAAU;AACb,oBAAA,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAA8B,EAAE,OAAO,CAAC;oBAClF;AAEF,gBAAA,KAAK,SAAS;AACZ,oBAAA,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;oBACrB;AAEF,gBAAA,KAAK,YAAY;AACf,oBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;oBACxB;AAEF,gBAAA,KAAK,aAAa;AAChB,oBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;oBACxB;;AAGF,gBAAA,KAAK,KAAK;AACR,oBAAA,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAyB,EAAE,OAAO,CAAC;oBACxE;;AAGF,gBAAA,KAAK,QAAQ;oBACX,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAA4B,EAAE,OAAO,CAAC;oBAC/D;;AAGF,gBAAA,KAAK,MAAM;oBACT,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAA0B,EAAE,OAAO,CAAC;oBAC3D;;AAGF,gBAAA,KAAK,SAAS;AACZ,oBAAA,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAA6B,EAAE,OAAO,CAAC;AAChF,oBAAA,OAAO;;AAGT,gBAAA,KAAK,YAAY;AACf,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClE;AAEF,gBAAA,KAAK,aAAa;AAChB,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnE;;AAGF,gBAAA,KAAK,aAAa;AAClB,gBAAA,KAAK,YAAY;AACf,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnE;AAEF,gBAAA,KAAK,cAAc;AACnB,gBAAA,KAAK,aAAa;AAChB,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACpE;;AAGF,gBAAA,KAAK,WAAW;oBACd,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAA8B,EAAE,OAAO,CAAC;oBACnE;AAEF,gBAAA,KAAK,aAAa;AAChB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAgC,CAAC;oBAC9D;;AAGF,gBAAA,KAAK,YAAY;AACf,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClE;AAEF,gBAAA,KAAK,YAAY;oBACf,MAAM,WAAW,GAAG,EAAE,GAAI,MAAM,CAAC,MAAgC,EAAE;AACnE,oBAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAa;AAC7C,oBAAA,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AAC7E,wBAAA,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAClF;AACA,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBAChE;AAEF,gBAAA,KAAK,aAAa;AAChB,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnE;;AAGF,gBAAA,KAAK,cAAc;AACjB,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACpE;;AAGF,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAA8B,CAAC;oBAC1D;AAEF,gBAAA,KAAK,OAAO;AACV,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAA2B,CAAC;oBACpD;AAEF,gBAAA,KAAK,MAAM;AACT,oBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAA2B,CAAC;oBACnD;AAEF,gBAAA,KAAK,cAAc;AACjB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAiC,CAAC;oBAChE;gBAEF,KAAK,WAAW,EAAE;AAChB,oBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,MAA8B;AACtD,oBAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK;;AAE1B,oBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AACjE,wBAAA,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;oBAClF;AACA,oBAAA,IAAI,KAAK;wBAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACpD;gBACF;;AAGA,gBAAA,KAAK,aAAa;oBAChB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAA6B,EAAE,IAAI,CAAC;oBACjE;AAEF,gBAAA,KAAK,eAAe;oBAClB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAA6B,EAAE,KAAK,CAAC;oBAClE;;AAGF,gBAAA,KAAK,eAAe;oBAClB,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAkC,EAAE,OAAO,CAAC;oBACjF;AAEF,gBAAA,KAAK,mBAAmB;oBACtB,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAqC,EAAE,OAAO,CAAC;oBACvF;AAEF,gBAAA,KAAK,UAAU;AACb,oBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAA6B,CAAC;oBACxD;;AAGF,gBAAA,KAAK,aAAa;oBAChB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAA6B,EAAE,OAAO,CAAC;oBACpE;AAEF,gBAAA,KAAK,gBAAgB;AACnB,oBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAA6B,CAAC;oBAC9D;;AAGF,gBAAA,KAAK,mBAAmB;AACtB,oBAAA,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAsC,EAAE,OAAO,CAAC;oBAClG;AAEF,gBAAA,KAAK,OAAO;oBACV,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAA2B,CAAC;oBAC1D;AAEF,gBAAA,KAAK,aAAa;AAChB,oBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAiC;AACrD,oBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;AACnF,oBAAA,MAAM,UAAU,GAAG,iBAAiB,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO;oBACjE,IAAI,UAAU,EAAE;wBACd,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;oBACnD;oBACA;AAEF,gBAAA,KAAK,UAAU;oBACb,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAA6B,EAAE,OAAO,CAAC;oBACvE;AAEF,gBAAA,KAAK,mBAAmB;oBACtB,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAsC,EAAE,OAAO,CAAC;oBAC7F;;AAGF,gBAAA,KAAK,KAAK;oBACR,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAyB,EAAE,OAAO,CAAC;oBACzD;AAEF,gBAAA,KAAK,OAAO;AACV,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAA2B,CAAC;oBACpD;;AAGF,gBAAA,KAAK,YAAY;oBACf,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAa,EAAE,OAAO,CAAC;oBACnD;;gBAGF,SAAS;AACP,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;oBACpD,IAAI,OAAO,EAAE;wBACX,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAChD;yBAAO;wBACL,OAAO,CAAC,IAAI,CAAC,CAAA,yDAAA,EAA4D,MAAM,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC;oBAC1F;gBACF;;;AAIF,YAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,gBAAA,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;gBAC3E,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC;YAC/C;AAEA,YAAA,OAAO,MAAM;QACf;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA4B,MAAM,CAAC,IAAI,CAAA,SAAA,CAAW,EAAE,KAAK,CAAC;AACxE,YAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,gBAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5D;iBAAO;AACL,gBAAA,MAAM,KAAK;YACb;QACF;IACF;;;;AAMQ,IAAA,MAAM,cAAc,CAAC,MAA4B,EAAE,OAAa,EAAA;AACtE,QAAA,MAAM,WAAW,GAAG,CAAC,MAAW,KAAI;AAClC,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,SAAS;AAC7B,YAAA,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE;AAC5B,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC/C,gBAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AAC7D,oBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACnE;YACF;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;AAED,QAAA,MAAM,MAAM,GAAQ;AAClB,YAAA,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC;YAC5C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,kBAAkB,EAAE,MAAM,CAAC;SAC5B;;AAGD,QAAA,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE;AAC3B,YAAA,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE;QAC/F;AAEA,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACnD;AAEQ,IAAA,MAAM,SAAS,CAAC,MAAuB,EAAE,OAAa,EAAA;AAC5D,QAAA,IAAI,QAAa;AAEjB,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;;AAEf,YAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ;QAC5B;AAAO,aAAA,IAAI,MAAM,CAAC,UAAU,EAAE;;AAE5B,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,GAAG,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC,IAAI;AAC3E,YAAA,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACnC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,EACjB,IAAI,EACJ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAC7D;QACH;AAAO,aAAA,IAAI,MAAM,CAAC,GAAG,EAAE;;AAErB,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,GAAG,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC,IAAI;AAC3E,YAAA,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAC1C,GAAG,EAAE,MAAM,CAAC,GAAG;AACf,gBAAA,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;gBAC9B,IAAI;gBACJ,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;AAClC,aAAA,CAAC;QACJ;;AAGA,QAAA,IAAI,MAAM,CAAC,aAAa,IAAI,OAAO,EAAE;AACnC,YAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ;QAC1C;;AAGA,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC;QACtD;AAEA,QAAA,OAAO,QAAQ;IACjB;IAEQ,YAAY,CAAC,MAA0B,EAAE,OAAa,EAAA;AAC5D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;AACjE,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC;IAChE;;IAGQ,mBAAmB,CAAC,QAAgB,EAAE,OAAa,EAAA;AACzD,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,QAAQ;QAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,IAAI,KAAI;AACtD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACzD,YAAA,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;AAC7D,QAAA,CAAC,CAAC;IACJ;IAEQ,UAAU,CAAC,MAAwB,EAAE,OAAa,EAAA;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO;AACvF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IACtD;AAEQ,IAAA,MAAM,aAAa,CAAC,MAA2B,EAAE,OAAa,EAAA;QACpE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAa,CAAC;QACjE,IAAI,SAAS,EAAE;YACb,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;QAChD;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;YAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC/C;IACF;IAEQ,cAAc,CAAC,MAA4B,EAAE,OAAa,EAAA;AAChE,QAAA,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK;;AAGxB,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;YACjE,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC;YACnD,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC;QAChD;AAEA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;QAC5D;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;QAC1D;IACF;AAEQ,IAAA,gBAAgB,CAAC,MAA8B,EAAA;AACrD,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;IAC5D;AAEQ,IAAA,cAAc,CAAC,MAA4B,EAAA;AACjD,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;YACjB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3G,IAAI,EAAE,EAAE;gBACN,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5F;YACF;QACF;AACA,QAAA,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE;AAC5B,YAAA,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAC7E;IACF;AAEQ,IAAA,WAAW,CAAC,MAAyB,EAAA;QAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC3G,QAAA,IAAI,EAAE,IAAI,EAAE,YAAY,WAAW,EAAE;YACnC,EAAE,CAAC,KAAK,EAAE;QACZ;IACF;AAEQ,IAAA,UAAU,CAAC,MAAyB,EAAA;QAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC3G,QAAA,IAAI,EAAE,IAAI,EAAE,YAAY,WAAW,EAAE;YACnC,EAAE,CAAC,IAAI,EAAE;QACX;IACF;AAEQ,IAAA,iBAAiB,CAAC,MAA+B,EAAA;QACvD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3G,IAAI,EAAE,EAAE;AACN,YAAA,QAAQ,MAAM,CAAC,MAAM;AACnB,gBAAA,KAAK,KAAK;oBAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;oBAAE;AAChD,gBAAA,KAAK,QAAQ;oBAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;oBAAE;AACtD,gBAAA,KAAK,QAAQ;oBAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;oBAAE;;QAE1D;IACF;IAEQ,gBAAgB,CAAC,MAA2B,EAAE,OAAgB,EAAA;AACpE,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,QAAQ;QAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,EAAE,OAAO,CAAC;IAClD;AAEQ,IAAA,MAAM,kBAAkB,CAAC,MAAgC,EAAE,OAAa,EAAA;AAC9E,QAAA,IAAI,IAAU;AAEd,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;;YAElB,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAC;QAC9E;AAAO,aAAA,IAAI,MAAM,CAAC,UAAU,EAAE;;AAE5B,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AAC9D,YAAA,IAAI,GAAG,QAAQ,YAAY,IAAI,GAAG,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;QACjH;AAAO,aAAA,IAAI,MAAM,CAAC,GAAG,EAAE;;YAErB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAChD,GAAG,EAAE,MAAM,CAAC,GAAG;AACf,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,YAAY,EAAE;AACf,aAAA,CAAC;YACF,IAAI,GAAG,QAAQ;QACjB;aAAO;YACL;QACF;QAEA,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG;QACZ,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,UAAU;AAC1C,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,KAAK,EAAE;AACT,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5B,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;AAEQ,IAAA,MAAM,qBAAqB,CAAC,MAAmC,EAAE,OAAa,EAAA;AACpF,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI;AACtB,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AAC/D,YAAA,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChF;AAEA,QAAA,IAAI;YACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjD,YAAA,IAAI,MAAM,CAAC,cAAc,EAAE;gBACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC;YAC3D;QACF;QAAE,OAAO,GAAG,EAAE;;YAEZ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AAC7C,YAAA,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AACvB,YAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAC3B,YAAA,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS;AACzB,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,MAAM,EAAE;AACX,YAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;AAC5B,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AAC7B,YAAA,IAAI,MAAM,CAAC,cAAc,EAAE;gBACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC;YAC3D;QACF;IACF;AAEQ,IAAA,aAAa,CAAC,MAA2B,EAAA;AAC/C,QAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IACrE;IAEQ,gBAAgB,CAAC,MAA2B,EAAE,OAAa,EAAA;AACjE,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,GAAG,YAAY,GAAG,cAAc;AAC1E,QAAA,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK;AACxB,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AACjE,YAAA,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClF;AACA,QAAA,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChG;AAEQ,IAAA,mBAAmB,CAAC,MAA2B,EAAA;AACrD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,GAAG,YAAY,GAAG,cAAc;AAC1E,QAAA,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;IAChC;AAEQ,IAAA,MAAM,sBAAsB,CAAC,MAAoC,EAAE,OAAa,EAAA;AACtF,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE;YAChC,MAAM,OAAO,GAAU,EAAE;AACzB,YAAA,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE;AACnC,gBAAA,IAAI;AACF,oBAAA,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACpD;gBAAE,OAAO,KAAK,EAAE;oBACd,IAAI,MAAM,CAAC,WAAW;AAAE,wBAAA,MAAM,KAAK;AACnC,oBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBACrB;YACF;AACA,YAAA,OAAO,OAAO;QAChB;aAAO;;YAEL,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAClF;IACF;IAEQ,MAAM,WAAW,CAAC,MAAyB,EAAA;AACjD,QAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpE;AAEQ,IAAA,MAAM,iBAAiB,CAAC,MAA+B,EAAE,OAAa,EAAA;AAC5E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;QAChF,IAAI,MAAM,EAAE;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QAC7C;AAAO,aAAA,IAAI,MAAM,CAAC,OAAO,EAAE;YACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;QAC9C;IACF;AAEQ,IAAA,MAAM,aAAa,CAAC,MAA2B,EAAE,OAAa,EAAA;AACpE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,CAAA,4BAAA,EAA+B,MAAM,CAAC,KAAK,CAAA,iBAAA,CAAmB,CAAC;YAC5E;QACF;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE;AAChC,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1D;QACF;aAAO;AACL,YAAA,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1F;IACF;IAEQ,sBAAsB,CAAC,MAAoC,EAAE,OAAa,EAAA;QAChF,MAAM,WAAW,GAAQ,EAAE;AAC3B,QAAA,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;AAChE,YAAA,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC;QACvE;AACA,QAAA,OAAO,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,WAAW;IACpE;IAEQ,SAAS,CAAC,MAAuB,EAAE,OAAa,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK;QACnC,MAAM,MAAM,GAAG,wBAAwB;AAEvC,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACpB,YAAA,OAAe,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,UAAU,EAAE,OAAO,CAAC;QACxE;AAAO,aAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;AAC1D,YAAA,OAAe,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;QACvE;aAAO;AACJ,YAAA,OAAe,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC;QACpE;IACF;AAEQ,IAAA,WAAW,CAAC,MAAyB,EAAA;AAC3C,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;YACjB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;YAChD,IAAI,EAAE,EAAE;gBACN,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;gBAC7C,IAAI,WAAW,EAAE;AACf,oBAAA,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;iCACJ,MAAM,CAAC,KAAK,IAAI,OAAO,CAAA;;AAE7B,yBAAA,EAAA,EAAE,CAAC,SAAS,CAAA;AAC5B,UAAA,CAAA,CAAC;AACF,oBAAA,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE;oBAC5B,WAAW,CAAC,KAAK,EAAE;oBACnB,WAAW,CAAC,KAAK,EAAE;gBACrB;YACF;QACF;aAAO;YACL,MAAM,CAAC,KAAK,EAAE;QAChB;IACF;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;IACK,eAAe,CAAC,MAAW,EAAE,OAAY,EAAA;AAC/C,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,eAAe;AAChD,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC1D,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI;;QAG/C,MAAM,cAAc,GAAQ,EAAE;QAC9B,IAAI,MAAM,CAAC,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE;AAC9C,YAAA,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;AACrE,gBAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;;AAEhC,oBAAA,cAAc,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBACzG;YACF;QACF;AAEA,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE;YAC3B,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,cAAc,EAAE;;AAE7D,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,IAAI,UAAU;AACvD,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtE,IAAI,CAAC,SAAS,CAAC,EAAE;AAAE,gBAAA,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AAC5C,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACzB;AAAO,aAAA,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;YACnC,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,UAAU,CAAC,IAAI,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK;AAChH,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;AAEvG,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACd,MAAM,gBAAgB,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,cAAc,EAAE;AACpE,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,gBAAgB,EAAE;YACvD;iBAAO;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,cAAc,EAAE,CAAC;YAC3D;QACF;AAAO,aAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AACrC,YAAA,MAAM,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,UAAU,CAAC,IAAI,OAAO,EAAE,GAAG,EAAE,KAAK;YACjE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;QAClF;AACA,QAAA,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnD;;;;IAMQ,kBAAkB,CAAC,OAAY,EAAE,IAAY,EAAA;AACnD,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,SAAS;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC;IAClE;wGAxqBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA;;4FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AChClC;;AAEG;MAIU,wBAAwB,CAAA;AAClB,IAAA,QAAQ,GAAG,IAAI,GAAG,EAAqB;AAExD,IAAA,QAAQ,CAAC,GAAW,EAAE,SAAoB,EAAA,EAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;AACvF,IAAA,WAAW,CAAC,OAAkC,EAAA,EAAU,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAAE,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;AAAE,IAAA,CAAC,CAAC;AACnJ,IAAA,GAAG,CAAC,GAAW,EAAA,EAA2B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACzE,IAAA,GAAG,CAAC,GAAW,EAAA,EAAa,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,IAAA,IAAI,GAAA,EAAe,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5D,IAAA,UAAU,CAAC,GAAW,EAAA,EAAa,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;wGAR1D,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;4FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACLlC;;AAEG;MAYU,qBAAqB,CAAA;AACvB,IAAA,OAAO;IACP,OAAO,GAAQ,EAAE;AACqC,IAAA,MAAM;AAEpD,IAAA,QAAQ,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC3C,IAAA,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAEvE,IAAA,WAAW,CAAC,OAAsB,EAAA,EAAU,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC;AAAE,QAAA,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzG,WAAW,GAAA,EAAW,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpC,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC;YAAE;AAE3G,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1D,IAAI,CAAC,aAAa,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,CAAA,oDAAA,EAAuD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC;YAAE;QAAQ;QAEzH,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC;AAC/D,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ;QAEtC,IAAI,QAAQ,IAAI,QAAQ;AAAE,YAAA,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;QACnG,IAAI,SAAS,IAAI,QAAQ;AAAE,YAAA,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AAE1D,QAAA,MAAM,MAAM,GAAI,YAAY,CAAC,QAAQ,CAAC,aAA6B;AACnE,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACpF,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAAE,YAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE;AACjI,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;AACxE,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU;AAC9E,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;IACvE;wGAhCW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAGH,gBAAgB,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EANnC,CAAA,qCAAA,CAAuC,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA;;4FAGtC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,QAAA,EACN,CAAA,qCAAA,CAAuC,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;;sBAIhD;;sBACA;;sBACA,SAAS;uBAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE;;;ACjB/D;;;;;;;;;;;;;;;;;AAiBG;MA2CU,iBAAiB,CAAA;AACX,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAClD,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAExC,aAAa,GAAmB,EAAE;IAClC,cAAc,GAAkB,IAAI;IACpC,mBAAmB,GAAkB,IAAI;IACzC,cAAc,GAAG,KAAK;;AAGb,IAAA,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,EAAU,EAAE,CAAC;;AAG3E,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,OAAQ,IAAI,GAAG,UAAU,CAAc,IAAI,IAAI;AACjD,IAAA,CAAC,+EAAC;;AAGO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC5B,OAAO;AACL,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;AAClC,YAAA,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW;AAC5C,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;YACxE,IAAI;AACJ,YAAA,QAAQ,EAAE;SACX;AACH,IAAA,CAAC,8EAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC5B,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CACrC,GAAG,CAAC,CAAC,CAAS,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACrC,oBAAoB,EAAE,CACvB,CAAC,SAAS,CAAC,SAAS,IAAG;AACtB,YAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;AACrE,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,gBAAA,IAAI,IAAI,EAAE,aAAa,EAAE;AACvB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpE;YACF;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AACjC,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAGjC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAC1C,GAAG,CAAC,CAAC,CAAS,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACrC,oBAAoB,EAAE,CACvB,CAAC,SAAS,CAAC,QAAQ,IAAG;AACrB,YAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,IAAI,IAAI,CAAC,mBAAmB,KAAK,QAAQ,EAAE;AAC9E,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,gBAAA,IAAI,IAAI,EAAE,aAAa,EAAE;AACvB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpE;YACF;AACA,YAAA,IAAI,CAAC,mBAAmB,GAAG,QAAQ;AACrC,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;IACnC;AAEQ,IAAA,gBAAgB,CAAC,IAAc,EAAA;;AAErC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC;;AAGA,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;AAC9B,YAAA,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,SAA2B,EAAE,CAAC;QACpE;;QAGA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACvC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7D;;AAGA,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC7B,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;;AAG5B,QAAA,IAAI,IAAI,EAAE,SAAS,EAAE;AACnB,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChE;;AAGA,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD;AAEA;;;AAGG;IACH,aAAa,GAAA;AACX,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,IAAI,IAAI,EAAE,aAAa,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,IAAI,2DAA2D;YACrG,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5C;AACA,QAAA,OAAO,IAAI;IACb;wGAzHW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1BlB;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yfAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAZS,qBAAqB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA2BpB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBA9B7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cACR,IAAI,EAAA,OAAA,EACP,CAAC,qBAAqB,CAAC,EAAA,QAAA,EACtB;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,yfAAA,CAAA,EAAA;;;MC3BU,WAAW,CAAA;AACL,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;AACnC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC,MAAM,GAA0B,IAAI;AACpC,IAAA,YAAY;IACZ,SAAS,GAAG,KAAK;IAER,YAAY,GAAG,mBAAmB;;;;IAM1C,IAAI,GAA4B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;AAC9D,IAAA,eAAe,GAAoB,QAAQ,CAAC,MAAK;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE;AAC1D,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACzB,QAAA,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE;AACjC,IAAA,CAAC,sFAAC;;;;AAMF,IAAA,SAAS,CAAC,UAA0B,EAAE,SAAA,GAAqB,KAAK,EAAA;AAC9D,QAAA,IAAI,CAAC,MAAM,GAAG,UAAU;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAG1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;QACnC,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC;AAE5C,YAAA,IAAI,UAAU,CAAC,WAAW,EAAE;gBAC1B,IAAI,CAAC,oBAAoB,EAAE;YAC7B;QACF;;AAGA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA,EAAG,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAA,KAAA,CAAO,CAAC;QAChF,IAAI,OAAO,EAAE;AACX,YAAA,IAAI;gBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;YACnC;AAAE,YAAA,MAAM,4BAA4B;QACtC;IACF;;;;IAMA,QAAQ,CAAC,KAAa,EAAE,YAAqB,EAAA;AAC3C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,gBAAgB;AAE1D,QAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC;QAE5C,IAAI,YAAY,EAAE;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,IAAI,kBAAkB;AACrE,YAAA,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC;QACnD;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE;YAC5B,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE;IAC9D;IAEA,eAAe,GAAA;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,IAAI,kBAAkB;AACrE,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;IACxC;;;;AAMA,IAAA,OAAO,CAAC,IAAc,EAAA;QACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC9C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,UAAU;AACpD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,OAAO,CAAC,OAAO,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3D;IAEA,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI;IAC5C;AAEA,IAAA,OAAO,CAAC,IAAuB,EAAA;AAC7B,QAAA,MAAM,KAAK,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE;;QAG1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI;AACpC,QAAA,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,IAAI;AAC/E,QAAA,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,UAAU;AAAE,YAAA,OAAO,IAAI;AAE1E,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1C;AACA,QAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,aAAa,CAAC,UAAkB,EAAA;AAC9B,QAAA,MAAM,WAAW,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;AACtE,QAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;IACzC;;;;AAMA,IAAA,MAAM,KAAK,CAAC,WAAgC,EAAE,eAAe,GAAG,KAAK,EAAA;;QAEnE,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AACpF,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;QAC1F;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,0GAA0G,CAAC;QAC7H;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,CAAC;AAE9F,QAAA,IAAI,QAAQ,EAAE,KAAK,EAAE;YACnB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC;QACtD;AACA,QAAA,IAAI,QAAQ,EAAE,IAAI,EAAE;AAClB,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7B;QAEA,IAAI,CAAC,eAAe,EAAE;YACpB,IAAI,CAAC,cAAc,EAAE;QACvB;AACA,QAAA,OAAO,QAAQ;IACjB;AAEA,IAAA,MAAM,MAAM,GAAA;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAClD,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YACxD;AAAE,YAAA,MAAM,6BAA6B;QACvC;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,gBAAgB;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,IAAI,kBAAkB;AACrE,QAAA,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC5B,QAAA,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;AAC9B,QAAA,OAAO,CAAC,UAAU,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,UAAU,CAAA,KAAA,CAAO,CAAC;AAEjE,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;AAEjC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;IACrC;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAE,SAAkB,EAAE,eAAe,GAAG,KAAK,EAAA;AAC3E,QAAA,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9D,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO;QACxC,MAAM,OAAO,GAAG,OAAO,GAAG,wBAAwB,GAAG,qBAAqB;AAE1E,QAAA,MAAM,OAAO,GAAG;YACZ,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU;YACtC,KAAK,EAAE,KAAK,IAAI,kBAAkB;AAClC,YAAA,IAAI,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACvG,IAAI;YACJ,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;SACxC;AAED,QAAA,MAAM,KAAK,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,iBAAiB;AACpE,QAAA,MAAM,OAAO,GAAa;YACtB,EAAE,EAAE,OAAO,CAAC,GAAG;YACf,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SAC3B;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAErB,IAAI,CAAC,eAAe,EAAE;YACpB,IAAI,CAAC,cAAc,EAAE;QACvB;AAEA,QAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;IACjC;;;;AAMA,IAAA,gBAAgB,CAAC,GAAW,EAAA;QAC1B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC;IAC9C;IAEQ,cAAc,GAAA;AACpB,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,YAAY;AACxE,QAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;IACrC;AAEA,IAAA,cAAc,CAAC,KAAqB,EAAA;QAClC,MAAM,QAAQ,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;AACzC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;AAE1B,QAAA,IAAI;YACA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACjC,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI;AACjC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;QAChE;AAAE,QAAA,MAAM;AACJ,YAAA,OAAO,IAAI;QACf;IACF;;;;AAMA,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe;AAAE,YAAA,OAAO,IAAI;AAE9C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;AAC3C,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,IAAI;AAE9B,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACzC,IAAI,CAAC,MAAM,CAAC,eAAe,EAC3B,SAAS,EACT,EAAE,YAAY,EAAE,CACjB;AAED,YAAA,IAAI,QAAQ,EAAE,KAAK,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAC;gBACpE,OAAO,QAAQ,CAAC,KAAK;YACvB;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC;AAC9D,YAAA,MAAM,IAAI,CAAC,MAAM,EAAE;QACrB;AAEA,QAAA,OAAO,IAAI;IACb;IAEQ,oBAAoB,GAAA;QAC1B,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAEtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,YAAA,IAAI,OAAO,CAAC,GAAG,EAAE;AACf,gBAAA,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;AACjD,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,EAAE,IAAI,CAAC;AACnD,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,CAAC;YAC1E;QACF;QAAE,MAAM,EAAC;IACX;;;;IAMQ,UAAU,GAAA;AAChB,QAAA,QAAQ,IAAI,CAAC,MAAM,EAAE,YAAY;AAC/B,YAAA,KAAK,gBAAgB,EAAE,OAAO,cAAc;AAC5C,YAAA,KAAK,cAAc;AACnB,YAAA,SAAS,OAAO,YAAY;;IAEhC;IAEQ,cAAc,GAAA;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,gBAAgB;AAC1D,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;IACtC;AAEQ,IAAA,cAAc,CAAC,GAAW,EAAA;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7B;wGA7SW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cADE,MAAM,EAAA,CAAA;;4FACnB,WAAW,EAAA,UAAA,EAAA,CAAA;kBADvB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACjBlC;;AAEG;MAKU,qBAAqB,CAAA;AACxB,IAAA,OAAO,GAAG,IAAI,GAAG,EAAgC;AAEzD,IAAA,QAAQ,CAAC,MAA4B,EAAA;QACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;QACrC,IAAI,MAAM,CAAC,UAAU;YAAE,MAAM,CAAC,UAAU,EAAE;IAC5C;AAEA,IAAA,MAAM,GAAA,EAA6B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7E,IAAA,GAAG,CAAC,IAAY,EAAA,EAAsC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;wGAT1E,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACNlC;;;;;;;;;;;;;AAaG;AAYH;;AAEG;AACI,MAAM,SAAS,GAAkB,CAAC,KAA6B,KAAI;AACxE,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACvC,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC7C,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC5D,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACxD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAE7C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAA0B;AAC9D,IAAA,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,IAAI;;AAG3B,IAAA,IAAI,SAAS,CAAC,MAAM,EAAE;AACpB,QAAA,IAAI,QAAQ;QACZ,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE;YACrC,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE;gBAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE;YAAO;QAC9F;AACA,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ,CAAC,KAAK,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAA,+BAAA,EAAkC,SAAS,CAAC,MAAM,CAAA,YAAA,CAAc,CAAC;IAChF;;AAGA,IAAA,IAAI,SAAS,CAAC,WAAW,EAAE;AACzB,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,SAAS,CAAC,WAAW,CAAA,CAAE,CAAC;QACvE,IAAI,CAAC,SAAS,EAAE;YACd,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,+BAA+B,CAAC;YAC/F,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,GAAG,CAAC;QACrD;IACF;;AAGA,IAAA,IAAI,SAAS,CAAC,YAAY,EAAE;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,IAAI,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC;AAClD,YAAA,IAAI,GAAG,GAAG,IAAI,EAAE;gBACd,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,0BAA0B,CAAC;gBAC1F,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,GAAG,CAAC;YACrD;QACF;AACA,QAAA,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE;YAC7B,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;AAC9C,YAAA,IAAI,GAAG,GAAG,EAAE,EAAE;gBACZ,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;gBACpF,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,GAAG,CAAC;YACrD;QACF;IACF;;IAGA,IAAI,SAAS,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE;QAC3D,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,kCAAkC,CAAC;QAClG,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,QAAQ,CAAC;IAC1D;;AAGA,IAAA,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE;QAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,OAAO;AACpD,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACjE,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,EAAE;YACZ,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gDAAgD,CAAC;YAChH,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,eAAe,CAAC;QACjE;IACF;;AAGA,IAAA,IAAI,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE;QACjC,MAAM,SAAS,GAAI,WAAW,CAAC,IAAI,EAAU,EAAE,WAAW,IAAI,EAAE;AAChE,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE;YACX,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,+CAA+C,CAAC;YAC/G,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,eAAe,CAAC;QACjE;IACF;;AAGA,IAAA,IAAI,SAAS,CAAC,SAAS,EAAE;AACvB,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE;YACxB,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,KAAK,CAAC,WAAW;AAC9B,YAAA,KAAK,EAAE,YAAY,CAAC,QAAQ;SAC7B;AACD,QAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE;YACX,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,CAAC;YAC/E,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,GAAG,CAAC;QACrD;IACF;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACI,MAAM,sBAAsB,GAAuC,CAAC,SAAS,KAAI;AACtF,IAAA,OAAO,SAAS,CAAC,aAAa,EAAE;AAClC;AAEA;AACA;AACA;AAEA,SAAS,kBAAkB,CACzB,SAAoB,EACpB,aAAkC,EAClC,gBAAyC,EACzC,cAAsB,EAAA;AAEtB,IAAA,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,IAAI,cAAc;AACvD,IAAA,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;AAEpC,IAAA,IAAI,SAAS,CAAC,MAAM,EAAE;AACpB,QAAA,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;IAC7C;AACF;;AClJA;;;;;;;;;;AAUG;MAQU,iBAAiB,CAAA;AACX,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAExC;;;;AAIG;AACH,IAAA,WAAW,CAAC,OAAgB,EAAA;AAC1B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;;QAGjF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE;AAC3C,cAAE;AACF,eAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,WAAW,CAAC;;QAG7C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAC9C,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CACjC;AAED,QAAA,MAAM,WAAW,GAAW;AAC1B,YAAA,GAAG,YAAY;AACf,YAAA,GAAG,UAAU;YACb,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE;AACxD,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW;SACtC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC;IACtF;AAEA;;AAEG;IACK,eAAe,CAAC,KAAiB,EAAE,cAAuB,EAAA;QAChE,IAAI,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,EAAE;AAE7B,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAG;AACtB,YAAA,MAAM,SAAS,GAAwB;AACrC,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,cAAc,IAAI;aAC1C;;AAGD,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,gBAAA,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK;YACjC;;AAGA,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;YACrC;AAEA,YAAA,MAAM,KAAK,GAAU;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,IAAI,EAAE;aACP;;AAGD,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,gBAAA,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;YAC1B;;AAGA,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;YAClC;;AAGA,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;YACpC;AAAO,iBAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AAC/B,gBAAA,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe;YAC5C;iBAAO;;AAEL,gBAAA,KAAK,CAAC,SAAS,GAAG,iBAAiB;YACrC;;AAGA,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,gBAAA,KAAK,CAAC,WAAW,GAAG,CAAC,SAAS,CAAC;YACjC;;AAGA,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AACzB,gBAAA,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CACnC,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,IAAI,cAAc,CAC9B;YACH;AAEA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,CAAC;IACJ;wGA9FW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACjBlC;;AAEG;MAEU,mBAAmB,GAAG,IAAI,cAAc,CAAM,qBAAqB;MACnE,oBAAoB,GAAG,IAAI,cAAc,CAAM,sBAAsB;;ACFlF;;;;;AAKG;AACG,SAAU,YAAY,CAAC,IAAa,EAAA;IACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE;AAClC,QAAA,OAAO,EAAE;IACX;IAEA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;IACxH,MAAM,MAAM,GAAW,EAAE;AAGzB,IAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,CAAC,IAAI,CAAC;AACV,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,aAAa,EAAE,MAAM,OAAO,iDAA0B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC;AACnF,YAAA,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;AAC1B,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC;AACV,YAAA,IAAI,EAAE,iBAAiB;AACvB,YAAA,aAAa,EAAE,MAAM,OAAO,2DAAoC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC;AACtG,YAAA,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;AAC1B,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC;AACV,YAAA,IAAI,EAAE,iBAAiB;AACvB,YAAA,aAAa,EAAE,MAAM,OAAO,2DAAoC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC;AACtG,YAAA,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;AAC1B,SAAA,CAAC;IACJ;AAEA,IAAA,OAAO,MAAM;AACf;;AC3CA;;;;;;AAMG;MAkLU,yBAAyB,CAAA;AAC3B,IAAA,MAAM;IACN,OAAO,GAAQ,EAAE;AAET,IAAA,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC;;AAGvE,IAAA,UAAU,GAAG,MAAM,CAAc,IAAI,GAAG,EAAU,iFAAC;AAEnD,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;;AAEpC,YAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;gBACvC,IAAI,KAAK,CAAC,QAAQ;AAAE,oBAAA,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC;QAClC;IACF;IAEA,aAAa,GAAA;AACX,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,KAAK,IAAG;YAChD,IAAI,CAAC,KAAK,CAAC,WAAW;AAAE,gBAAA,OAAO,IAAI;AACnC,YAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC;AAC1E,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAC1C,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACvB;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;;gBAEtB,OAAO,CAAC,KAAK,EAAE;YACjB;AACA,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACpB;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;IAC9B;wGA3CW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApK1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ilEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA9CS,qBAAqB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAqKpB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAxKrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cACrB,IAAI,EAAA,OAAA,EACP,CAAC,qBAAqB,CAAC,EAAA,QAAA,EACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,ilEAAA,CAAA,EAAA;;sBAwHA;;sBACA;;;MC7EU,sBAAsB,CAAA;AACzB,IAAA,UAAU,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC5C,IAAA,GAAG;AAEX,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AACtB,IAAA,MAAM,GAAG,MAAM,CAAM,IAAI,6EAAC;IAE1B,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,IAAG;AACxD,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;gBAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;AAC7B,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;AAAO,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;AACnC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/C;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;IACzB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;AAEA,IAAA,eAAe,CAAC,CAAQ,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB;YAAE;QAC3C,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,cAAc,CAAC,UAAe,EAAA;QAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;IAC1C;wGAlCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnGvB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6zDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1BS,YAAY,6HAAE,qBAAqB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAoGlC,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAvGlC,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,qBAAqB,CAAC,EAAA,QAAA,EACpC;;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,6zDAAA,CAAA,EAAA;;;ACjCH;;;AAGG;MAEU,mBAAmB,CAAA;AACpB,IAAA,KAAK,GAAG,IAAI,GAAG,EAAkB;AAEzC,IAAA,WAAA,GAAA;QACI,IAAI,CAAC,gBAAgB,EAAE;IAC3B;;IAGA,QAAQ,CAAC,IAAY,EAAE,OAAe,EAAA;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;IACjC;;AAGA,IAAA,OAAO,CAAC,IAAY,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAE;IAC7D;;AAGA,IAAA,GAAG,CAAC,IAAY,EAAA;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;IAEQ,gBAAgB,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,uHAAuH,CAAC;AACjJ,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,+DAA+D,CAAC;AAC3F,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,2HAA2H,CAAC;AACvJ,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,mSAAmS,CAAC;AAC3T,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,irBAAirB,CAAC;AAC5sB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,qHAAqH,CAAC;AAC9I,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,kKAAkK,CAAC;AACzL,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,+CAA+C,CAAC;AACtE,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,uGAAuG,CAAC;AAC/H,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,4OAA4O,CAAC;AACrQ,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,gHAAgH,CAAC;AACzI,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,+GAA+G,CAAC;AACxI,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,yDAAyD,CAAC;AACxF,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,gDAAgD,CAAC;AAChF,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,ocAAoc,CAAC;;AAG9d,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,qCAAqC,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,uHAAuH,CAAC;AACtJ,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,kGAAkG,CAAC;AAC1H,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,kGAAkG,CAAC;AACzH,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,oDAAoD,CAAC;;AAG9E,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,qCAAqC,CAAC;AAC5D,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,8DAA8D,CAAC;AAC5F,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,6GAA6G,CAAC;AACtI,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,2CAA2C,CAAC;AACtE,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,+IAA+I,CAAC;AAC3K,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,uJAAuJ,CAAC;AAChL,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,+EAA+E,CAAC;AACzG,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,mNAAmN,CAAC;AACzO,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,wLAAwL,CAAC;AAChN,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,yEAAyE,CAAC;AACvG,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,2VAA2V,CAAC;AACzX,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;IAC1D;wGA3DS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;4FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCyKrB,sBAAsB,CAAA;AACxB,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAClC,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjD,IAAA,GAAG;AAEX,IAAA,aAAa,GAAG,MAAM,CAAuB,IAAI,oFAAC;AAElD,IAAA,IAAI,QAAQ,GAAA;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI;AAC/C,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAC3D;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,IAAG;AAC7D,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,GAAG;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;IACtC;IAEA,eAAe,GAAA;;AAEb,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACnB;IACF;AAEA,IAAA,KAAK,CAAC,MAAe,EAAA;AACnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B;IACF;wGApCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArKvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2oGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAtCS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAsKX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAzKlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,2oGAAA,CAAA,EAAA;;;MCyHU,sBAAsB,CAAA;AAChB,IAAA,UAAU,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACrD,IAAA,GAAG;AAEX,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AACtB,IAAA,MAAM,GAAG,MAAM,CAAM,IAAI,6EAAC;IAE1B,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,IAAG;AACzD,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;gBAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;AAC7B,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;AAAO,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;AACnC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEtB,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;YAC9C;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;IACzB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IAC9C;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB;YAAE;QAC3C,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,cAAc,CAAC,UAAe,EAAA;QAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;IAC1C;wGApCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9JvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wxEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjCS,qBAAqB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA+JpB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAlKlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,qBAAqB,CAAC,EAAA,QAAA,EACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wxEAAA,CAAA,EAAA;;;AC1CH;;AAEG;MAQU,uBAAuB,CAAA;AAC1B,IAAA,gBAAgB,GAAG,IAAI,GAAG,EAA6B;AAE/D,IAAA,iBAAiB,CAAC,GAAW,EAAE,EAAqB,EAAA,EAAU,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAElG,IAAA,gBAAgB,CAAC,KAAkC,EAAA;QACjD,IAAI,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,EAAE;QAC7B,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAuB,CAAC,KAAK,IAAI,CAAC;IAClG;AAEQ,IAAA,eAAe,CAAC,IAAmB,EAAA;AACzC,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC;AACzF,YAAA,KAAK,OAAO,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;YACxF,KAAK,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAA,YAAA,EAAe,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;YACxH,KAAK,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAA,YAAA,EAAe,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;YACxH,KAAK,KAAK,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;YACrG,KAAK,KAAK,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;YACrG,KAAK,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;AACzG,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;oBACvD,IAAI,QAAQ,EAAE;wBACZ,OAAO,CAAC,OAAwB,KAA6B;AAC3D,4BAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;4BAClD,OAAO,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,mBAAmB,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI;AAChG,wBAAA,CAAC;oBACH;gBACF;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,SAAS,OAAO,IAAI;;IAExB;IAEQ,WAAW,CAAC,SAAsB,EAAE,OAAe,EAAA;QACzD,OAAO,CAAC,OAAwB,KAA6B;AAC3D,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;YACjC,IAAI,MAAM,EAAE;gBACV,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAA,OAAO,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE;YAC/C;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;AAEA,IAAA,eAAe,CAAC,MAA+B,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC9B,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE,OAAO;YAAE,OAAO,KAAK,CAAC,OAAO;AACrE,QAAA,OAAO,eAAe;IACxB;wGAnDW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA;;4FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCmHrB,sBAAsB,CAAA;AACxB,IAAA,KAAK;AACL,IAAA,SAAS;IACT,YAAY,GAAG,KAAK;AACpB,IAAA,gBAAgB;IAChB,OAAO,GAAQ,EAAE;AAET,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAEnE,IAAA,IAAI,MAAM,GAAA;QACR,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,KAAK;AACnC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;AACnG,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,KAAK;AACnC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;AACnG,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,YAAY,CAAC,IAAS,EAAA;AACpB,QAAA,OAAO,IAAiB;IAC1B;AAEA,IAAA,YAAY,CAAC,KAAgB,EAAA;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;QAClC,OAAO,CAAA,OAAA,EAAU,IAAI,CAAA,iBAAA,CAAmB;IAC1C;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;QAElB,MAAM,aAAa,GAAgC,EAAE;QACrD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE;AAC7C,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC;AAC3E,YAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,UAAU,CAAC;QAClF;QAEA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;IACnD;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;IAChC;wGA7CW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhHvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+rEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAvDS,mBAAmB,oDAAmB,sBAAsB,CAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAiH3D,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBApHlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,UAAU,CAAC,MAAM,sBAAsB,CAAC,CAAC,EAAA,QAAA,EAC9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,+rEAAA,CAAA,EAAA;;sBA2DA;;sBACA;;sBACA;;sBACA;;sBACA;;;ACjIH;;AAEG;MAyNU,sBAAsB,CAAA;AACxB,IAAA,KAAK;AACL,IAAA,IAAI;IACJ,YAAY,GAAY,KAAK;AAC7B,IAAA,gBAAgB;IAChB,OAAO,GAAQ,EAAE;AACT,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAEnE,IAAA,IAAI,OAAO,GAAA,EAAkB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC,CAAC;AACvF,IAAA,IAAI,QAAQ,GAAA,EAAc,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,IAAI,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACzH,IAAI,UAAU,KAAc,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,UAAkB,EAAE,QAAQ,CAAC,CAAC;AAC/K,IAAA,IAAI,YAAY,GAAA,EAAa,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACvI,IAAA,IAAI,eAAe,GAAA,EAAc,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,CAAE,IAAI,CAAC,KAAa,CAAC,QAAQ,CAAC,CAAC;AAE7F,IAAA,YAAY,CAAC,GAAW,EAAA;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3B;;AAGA,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC5B,IAAA,wBAAwB,KAAW,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;;;AAItE,IAAA,IAAI,cAAc,GAAA,EAAa,OAAQ,IAAI,CAAC,KAAa,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC;AACjF,IAAA,IAAI,cAAc,GAAA,EAAc,OAAQ,IAAI,CAAC,KAAa,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC;AAE9E,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK;QAC/B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;AAC9D,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;AACzB,QAAA,OAAO,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;IACxG;AAEA,IAAA,eAAe,CAAC,KAAY,EAAA;AAC1B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;;AAE9C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;;QAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACjC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,QAAQ;AACpF,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC;;QAE7B,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;AAElE,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;;AAEtI,QAAA,UAAU,CAAC,MAAK,EAAG,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK;AAC/B,QAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE;YACnD,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACnC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACf,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;YAC/G;QACF;AACA,QAAA,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;IAC/B;;AAGA,IAAA,IAAI,QAAQ,GAAA;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,MAAM,GAAI,IAAI,CAAC,KAAa,CAAC,SAAS,IAAI,CAAC;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD;IAEA,UAAU,CAAC,KAAY,EAAE,KAAa,EAAA;AACpC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK;QACvB,MAAM,MAAM,GAAI,IAAI,CAAC,KAAa,CAAC,SAAS,IAAI,CAAC;;AAGjD,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;AAClE,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7B,UAAU,CAAC,MAAK;AACd,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa;gBAClC,IAAI,MAAM,EAAE;AACV,oBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;oBAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAqB;AAChE,oBAAA,IAAI,SAAS;wBAAE,SAAS,CAAC,KAAK,EAAE;gBAClC;AACF,YAAA,CAAC,CAAC;YACF;QACF;QAEA,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACrC,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;QAG1C,IAAI,KAAK,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE;AAC/B,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAsC;AAC9D,YAAA,IAAI,SAAS;gBAAE,SAAS,CAAC,KAAK,EAAE;QAClC;IACF;IAEA,YAAY,CAAC,KAAoB,EAAE,KAAa,EAAA;AAC9C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE;AAC1D,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,sBAA0C;YAC7D,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,KAAK,EAAE;gBACZ,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AACrC,gBAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE;AAC1B,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5C;QACF;IACF;IAGA,iBAAiB,GAAA;QACf,IAAI,IAAI,CAAC,eAAe;YAAE;AAC1B,QAAA,MAAM,OAAO,GAAI,IAAI,CAAC,KAAa,CAAC,OAAO;AAC3C,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACpC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;QACvD;IACF;wGAzHW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5MvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8GT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,47KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA/GS,mBAAmB,srDAAE,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA6M1C,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAhNlC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAC5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8GT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,47KAAA,CAAA,EAAA;;sBA+FA;;sBACA;;sBACA;;sBACA;;sBACA;;;AChOH;;AAEG;MAiDU,qBAAqB,CAAA;AACvB,IAAA,MAAM;IACN,OAAO,GAAQ,EAAE;AAChB,IAAA,UAAU,GAAG,IAAI,YAAY,EAAO;AACpC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAO;AAE9C,IAAA,SAAS;AACQ,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAClD,IAAA,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC9D,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC1C,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEhD,IAAA,GAAG;IAEX,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,IAAG;;AAE7D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAK,IAAI,CAAC,MAAc,CAAC,UAAU;AAChE,YAAA,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM;gBAAE;AAE5D,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;AAC5B,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YACxB;AAAO,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;AACnC,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM;gBACnC,IAAI,OAAO,EAAE;;AAEX,oBAAA,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE;AACjC,oBAAA,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE;;oBAE5B;AACA,oBAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC;gBACvC;YACF;AAAO,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACpC,IAAI,CAAC,QAAQ,EAAE;YACjB;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,GAAG;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;IACtC;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA,EAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;QAAE,IAAI,CAAC,SAAS,EAAE;AAAE,IAAA,CAAC,CAAC;AAE3H,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAG;YAC1C,IAAI,CAAC,KAAK,CAAC,WAAW;AAAE,gBAAA,OAAO,IAAI;YACnC,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;AAC1G,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,IAAY,gBAAgB,GAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAK,CAAS,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;IAChG;IAEA,IAAI,WAAW,GAAA,EAAa,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,CAAE,GAAG,EAAE,CAAC,CAAC;AAC7F,IAAA,IAAI,WAAW,GAAA,EAAoB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAA,OAAA,EAAU,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,MAAA,CAAQ,GAAG,IAAI,CAAC,CAAC;IAEjJ,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAClC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACvH;aAAO;YACL,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;IAC9F;IAEQ,SAAS,GAAA;AACf,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE;AACnE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;QAEvE,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC;;QAGxC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;AAGvE,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;QAC1B;IACF;AAEA,IAAA,aAAa,CAAC,MAAmB,EAAE,OAAY,EAAE,WAAmB,EAAA;QAClE,MAAM,QAAQ,GAAoC,EAAE;AAEpD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE;YAErF,IAAI,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC;YAE1E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzC,MAAM,OAAO,GAAuB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gBAChE,IAAI,OAAO,EAAE;oBACX,MAAM,OAAO,GAAG,WAAW,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAA,CAAE,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAA,CAAE;oBAClG,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAC5C,oBAAA,KAAK,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,YAAY;gBAC5E;qBAAO;AACL,oBAAA,KAAK,GAAG,KAAK,CAAC,YAAY;gBAC5B;YACF;AAEA,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC;AAC3E,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;AAEtI,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;AAC7B,gBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACtD,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC;;AAGpC,gBAAA,OAAO,YAAY,CAAC,MAAM,GAAG,QAAQ,EAAE;AACrC,oBAAA,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB;gBAEA,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,KAAI;oBAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAC;AACjG,oBAAA,OAAO,IAAI,SAAS,CAAC,aAAa,CAAC;AACrC,gBAAA,CAAC,CAAC;gBAEF,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,UAAU,CAAC;AAC9D,gBAAA,IAAI,UAAU;oBAAE,SAAS,CAAC,OAAO,EAAE;AACnC,gBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS;YACjC;iBAAO;AACL,gBAAA,KAAK,GAAG,KAAK,IAAI,EAAE;AACnB,gBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,UAAU,CAAC;YACpF;QACF;AAEA,QAAA,OAAO,QAAQ;IACjB;IACQ,cAAc,GAAA,EAAW,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;wGA1I9F,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhCtB;;;;;;;;;;;;;;;GAeT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uuCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhBS,mBAAmB,ucAAE,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAiC1C,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBApCjC,SAAS;+BACE,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAC5C;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,uuCAAA,CAAA,EAAA;;sBAkBA;;sBACA;;sBACA;;sBACA;;sBACA;;;ACxDH;;;;;;;;AAQG;MA+WU,4BAA4B,CAAA;AAG9B,IAAA,MAAM;IACN,OAAO,GAAQ,EAAE;AAChB,IAAA,UAAU,GAAG,IAAI,YAAY,EAAO;AACpC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AAE/C,IAAA,SAAS;AAEQ,IAAA,gBAAgB,GAAK,MAAM,CAAC,uBAAuB,CAAC;AACpD,IAAA,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC9D,IAAA,gBAAgB,GAAa,MAAM,CAAC,uBAAuB,CAAC;AACpD,IAAA,YAAY,GAAS,MAAM,CAAC,gBAAgB,CAAC;AAEtD,IAAA,GAAG;;AAGX,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,kFAAC;AACvB,IAAA,cAAc,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,qFAAC;AAC/C,IAAA,YAAY,GAAK,MAAM,CAAc,IAAI,GAAG,EAAE,mFAAC;AAC/C,IAAA,UAAU,GAAO,MAAM,CAAW,EAAE,iFAAC;;AAGrC,IAAA,aAAa,GAAG,QAAQ,CAAiB,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,oFAAC;AAExE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM;AACzC,QAAA,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;AAC7E,IAAA,CAAC,sFAAC;AAEF,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC;QACrC,OAAO,CAAA,OAAA,EAAU,IAAI,CAAA,iBAAA,CAAmB;AAC1C,IAAA,CAAC,yFAAC;IAEF,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,EAAE;AAEhB,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,IAAG;AAC7D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAK,IAAI,CAAC,MAAc,CAAC,UAAU;AAChE,YAAA,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM;gBAAE;AAE5D,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;gBAC5B,IAAI,CAAC,SAAS,EAAE;YAClB;AAAO,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;AACnC,gBAAA,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM;oBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YACzE;AAAO,iBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACpC,IAAI,CAAC,QAAQ,EAAE;YACjB;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;QACnE;IACF;IAEA,WAAW,GAAA,EAAW,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;AAE/C,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW;YAAE,IAAI,CAAC,SAAS,EAAE;IAC3E;;AAGA,IAAA,wBAAwB,GAAG,QAAQ,CAAc,MAAK;AACpD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,OAAO,IAAI,CAAC;AACT,aAAA,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;aACvC,MAAM,CAAC,CAAC,IAAG;YACV,IAAI,CAAC,CAAC,CAAC,WAAW;AAAE,gBAAA,OAAO,IAAI;YAC/B,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE;gBACrD,GAAG,IAAI,CAAC,OAAO;AACf,gBAAA,GAAG,IAAI,CAAC,SAAS,EAAE;AACpB,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,+FAAC;AAEF,IAAA,IAAY,gBAAgB,GAAA;AAC1B,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK;AAC3C,YAAA,GAAG,CAAC;AACJ,YAAA,GAAG,EAAE,CAAC,CAAC,GAAG,IAAK,CAAS,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI;AAC7C,SAAA,CAAC,CAAC;IACL;;AAGA,IAAA,WAAW,CAAC,KAAa,EAAA,EAAa,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/E,IAAA,SAAS,CAAC,KAAa,EAAA,EAAe,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAE7E,IAAA,aAAa,CAAC,KAAa,EAAA;;AAEzB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACzD;AAEA,IAAA,QAAQ,CAAC,KAAa,EAAA;QACpB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM;YAAE;;AAGvD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACxD,IAAI,OAAO,EAAE,OAAO;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;AAEnF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;;QAGvB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC;QAC5C,IAAI,QAAQ,EAAE,OAAO;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;IACvF;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACrD,QAAA,IAAI,IAAI,EAAE,QAAQ,KAAK,KAAK,EAAE;;AAE5B,YAAA,MAAM,aAAa,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE;YACxC,MAAM,MAAM,GAAa,EAAE;AAC3B,YAAA,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACzC,IAAI,IAAI,EAAE;oBACR,IAAI,CAAC,aAAa,EAAE;oBACpB,IAAI,CAAC,sBAAsB,EAAE;AAC7B,oBAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,wBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;wBAC5D,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC;oBAClC;gBACF;YACF;AACA,YAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC3B;YACF;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;;QAGvB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;;QAGlC,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QACjC,OAAO,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;AAC3C,YAAA,IAAI,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBAC3E,GAAG,IAAI,CAAC,OAAO;AACf,gBAAA,GAAG,IAAI,CAAC,SAAS,CAAC;AACnB,aAAA,CAAC,EAAE;;gBAEF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAC5C,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAC9B,gBAAA,IAAI,EAAE;YACR;iBAAO;gBACL;YACF;QACF;QAEA,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB;IACF;IAEA,MAAM,GAAA;QACJ,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QACjC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;AAAE,YAAA,IAAI,EAAE;QAAE;QACpD,IAAI,IAAI,IAAI,CAAC;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACpC;IAEA,QAAQ,GAAA;QACN,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;QAE9B,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;AACjC,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC7D;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAClC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACxB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC7F;;YAEA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC;QACzC;aAAO;YACL,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACxE;IACF;;IAGQ,SAAS,GAAA;AACf,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE;AACnE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;QAEvE,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;IACpD;AAEQ,IAAA,aAAa,CAAC,MAAmB,EAAE,OAAY,EAAE,WAAmB,EAAA;QAC1E,MAAM,QAAQ,GAAoC,EAAE;AAEpD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE;YAErF,IAAI,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC;YAE1E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzC,MAAM,OAAO,GAAuB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gBAChE,IAAI,OAAO,EAAE;oBACX,MAAM,OAAO,GAAG,WAAW,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAA,CAAE,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAA,CAAE;oBAClG,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAC5C,oBAAA,KAAK,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,YAAY;gBAC5E;qBAAO;AACL,oBAAA,KAAK,GAAG,KAAK,CAAC,YAAY;gBAC5B;YACF;AAEA,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC;AAC3E,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;AAEtI,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;AAC7B,gBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACtD,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC;AAEpC,gBAAA,OAAO,YAAY,CAAC,MAAM,GAAG,QAAQ,EAAE;AACrC,oBAAA,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB;gBAEA,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,KAAI;oBAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAC;AACjG,oBAAA,OAAO,IAAI,SAAS,CAAC,aAAa,CAAC;AACrC,gBAAA,CAAC,CAAC;gBAEF,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,UAAU,CAAC;AAC9D,gBAAA,IAAI,UAAU;oBAAE,SAAS,CAAC,OAAO,EAAE;AACnC,gBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS;YACjC;iBAAO;AACL,gBAAA,KAAK,GAAG,KAAK,IAAI,EAAE;AACnB,gBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,UAAU,CAAC;YACpF;QACF;AAEA,QAAA,OAAO,QAAQ;IACjB;wGA7PW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3V7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsGT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,g2KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAvGS,mBAAmB,ucAAE,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA4V1C,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBA/VxC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAC5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,g2KAAA,CAAA,EAAA;;sBAwPA;;sBACA;;sBACA;;sBACA;;;AC7XH;;AAEG;MA6DU,qBAAqB,CAAA;AACvB,IAAA,MAAM;AACN,IAAA,GAAG;AACH,IAAA,KAAK;IAEd,UAAU,GAAA,EAAa,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,aAAa,GAAA;QACX,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YACjC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QACzF;QACA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;IAC/C;IACA,cAAc,CAAC,GAAQ,EAAE,IAAY,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE;IAC5D;wGAhBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,GAAA,EAAA,KAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApDtB;;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,27CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1BS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;4FAqDX,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAxDjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAA,QAAA,EACpD;;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,27CAAA,CAAA,EAAA;;sBA4BA;;sBACA;;sBACA;;;AClEH;;AAEG;MA4UU,sBAAsB,CAAA;AACxB,IAAA,MAAM;IACN,OAAO,GAAQ,EAAE;AAChB,IAAA,SAAS,GAAG,IAAI,YAAY,EAAkC;AAE/D,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAClC,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAClD,IAAA,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;AACnC,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEzD,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;AAAE,IAAA,OAAO,GAAG,MAAM,CAAgB,IAAI,8EAAC;AAAE,IAAA,aAAa,GAAG,MAAM,CAAiB,KAAK,oFAAC;AAAE,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,kFAAC;AACvI,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAC9B,IAAA,YAAY,GAAG,MAAM,CAAW,IAAI,GAAG,EAAE,mFAAC;AAC1C,IAAA,YAAY,GAAG,MAAM,CAAW,IAAI,GAAG,EAAE,mFAAC;AAC1C,IAAA,eAAe,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,sFAAC;AAChD,IAAA,YAAY,GAAG,MAAM,CAAe,EAAE,mFAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAmC,IAAI,kFAAC;IAC5D,UAAU,GAAwB,EAAE;AACpC,IAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,gFAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,uFAAC;AACtC,IAAA,YAAY,GAAG,IAAI,GAAG,EAAkB;AAAE,IAAA,OAAO,GAAG,MAAM,CAAQ,EAAE,8EAAC;AACrE,IAAA,cAAc;AACd,IAAA,SAAS;IAEjB,QAAQ,GAAA;;QAEN,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,MAAc,CAAC,UAAU;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;QAG/C,IAAI,CAAC,QAAQ,EAAE;;AAGf,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,IAAG;AACzE,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC7B,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO;;AAEtC,gBAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,SAAS,IAAI,QAAQ,KAAM,IAAI,CAAC,MAAc,CAAC,EAAE,EAAE;oBACpF,IAAI,CAAC,QAAQ,EAAE;gBACjB;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,KAAK,CAAC;QAAE;IACrJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE;IACpC;AAEQ,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI;QACpC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC;QACjD,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC;AACxD,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;;QAG3D,IAAI,MAAM,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,cAAc,EAAE;AACxE,YAAA,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC;AACrC,YAAA,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC;QACvC;QAEA,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC;AAEtD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAC1B,YAAA,IAAI;AACF,gBAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AAClE,gBAAA,MAAM,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;gBAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;AACzE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1B;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,sDAAA,EAAyD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC;AACnG,gBAAA,IAAI,WAAW;AAAE,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5D;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YACjC,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3C;iBAAO;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC7C,gBAAA,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC1E,gBAAA,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC;YACpD;QACF;aAAO,IAAI,WAAW,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3C;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,OAAO,CAAA,UAAA,EAAa,IAAI,CAAC,SAAS,IAAK,IAAI,CAAC,MAAc,CAAC,EAAE,IAAI,SAAS,EAAE;IAC9E;IAEA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE3E,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE;QAC9C,IAAI,KAAK,EAAE;YACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AAC9E,YAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9G;AACA,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE;YACpD,IAAI,GAAG,EAAE;gBAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;YAAE;QACrF;AACA,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QACzB,IAAI,EAAE,EAAE;AACN,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AACnD,YAAA,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;gBAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC;gBACxE,IAAI,EAAE,GAAG,EAAE;AAAE,oBAAA,OAAO,CAAC,CAAC,GAAG,GAAG;gBAAE,IAAI,EAAE,GAAG,EAAE;oBAAE,OAAO,CAAC,GAAG,GAAG;AAAE,gBAAA,OAAO,CAAC;AACrE,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,mFAAC;;AAGF,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB;AACvC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC;AACzD,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,gBAAA,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B;QACA,MAAM,MAAM,GAAU,EAAE;AACxB,QAAA,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE;AACzC,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC3D;AACA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,kFAAC;IAEF,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAElG,IAAA,WAAW,CAAC,IAAqB,EAAA;QAC/B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB;AAEA,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO;AAAE,YAAA,OAAO,IAAI;AACjD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,CAAC;AACtC,IAAA,CAAC,oFAAC;AAEF,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO;AAAE,YAAA,OAAO,CAAC;AAC9C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACtE,IAAA,CAAC,iFAAC;AAEF,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvD,IAAA,CAAC,kFAAC;AAEF,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;QAAE;aAClG;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE;IAC/D;AAEA,IAAA,YAAY,CAAC,GAAQ,EAAE,GAAW,IAAS,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1G,IAAA,cAAc,CAAC,GAAW,EAAA,EAAY,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,cAAc,CAAC,GAAW,EAAE,KAAa,IAAU,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjJ,IAAA,MAAM,YAAY,CAAC,MAAuB,EAAE,GAAQ,EAAA;AAClD,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;AAClE,YAAA,IAAI,CAAC,SAAS;gBAAE;QAClB;;AAGA,QAAA,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACtE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAG;AACzB,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;AAC3C,gBAAA,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACrE,gBAAA,OAAO,OAAO;AAChB,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;IACzE;AAEA,IAAA,cAAc,CAAC,GAAQ,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,OAAO,EAAE;AACnF,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC3B;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QAAE;IAC9G;AAEA,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE;QAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACxC,QAAA,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAChB,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QACjB;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,QAAQ;gBAAE,GAAG,CAAC,KAAK,EAAE;AACvD,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACd;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAC1D,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACrD;aAAO;YACL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAClC;QACA,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;QAChI;IACF;;IAGA,SAAS,CAAC,GAAQ,EAAE,GAAW,EAAA;AAC7B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;QAC7B,OAAO,EAAE,EAAE,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,GAAG,KAAK,GAAG;IAC3C;AAEA,IAAA,SAAS,CAAC,GAAQ,EAAE,GAAW,EAAE,KAAiB,EAAA;QAChD,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;IAC1D;IAEA,UAAU,CAAC,GAAQ,EAAE,GAAW,EAAA;;AAE9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACxD,QAAA,MAAM,UAAU,GAA8B,GAAG,EAAE,cAAc,IAAI,EAAE;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC;QACzD,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;;AAEhB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAClE,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAChC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACpG;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;;IAGQ,mBAAmB,CAAC,UAAqC,EAAE,KAAU,EAAA;AAC3E,QAAA,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;AAC1B,YAAA,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AACrD,YAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,gBAAA,KAAK,UAAU;AACb,oBAAA,IAAI,CAAC,GAAG;AAAE,wBAAA,OAAO,CAAC,CAAC,OAAO,IAAI,yBAAyB;oBACvD;AACF,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;wBAAE,OAAO,CAAC,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC,KAAK,CAAA,qBAAA,CAAuB;oBACxF;AACF,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;wBAAE,OAAO,CAAC,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC,KAAK,CAAA,oBAAA,CAAsB;oBACvF;AACF,gBAAA,KAAK,KAAK;oBACR,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;wBAAE,OAAO,CAAC,CAAC,OAAO,IAAI,0BAA0B,CAAC,CAAC,KAAK,CAAA,CAAA,CAAG;oBACxF;AACF,gBAAA,KAAK,KAAK;oBACR,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;wBAAE,OAAO,CAAC,CAAC,OAAO,IAAI,yBAAyB,CAAC,CAAC,KAAK,CAAA,CAAA,CAAG;oBACvF;gBACF,KAAK,SAAS,EAAE;AACd,oBAAA,IAAI,CAAC,GAAG;wBAAE;oBACV,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9B,oBAAA,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;AAAE,wBAAA,OAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB;oBACxD;gBACF;gBACA,KAAK,OAAO,EAAE;AACZ,oBAAA,IAAI,CAAC,GAAG;wBAAE;oBACV,MAAM,OAAO,GAAG,4BAA4B;AAC5C,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAAE,wBAAA,OAAO,CAAC,CAAC,OAAO,IAAI,wBAAwB;oBACpE;gBACF;AACA,gBAAA,KAAK,QAAQ;AACX,oBAAA,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC;AAAE,wBAAA,OAAO,CAAC,CAAC,OAAO,IAAI,yBAAyB;oBAC5F;;QAEN;AACA,QAAA,OAAO,IAAI;IACb;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAClC,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC;QAC9E;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;;AAGA,IAAA,eAAe,CAAC,GAAQ,EAAA;QACtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACxC,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9F,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B;;AAGA,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/B;;AAGA,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC;AACrE,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1G,QAAA,IAAI,KAAa;AACjB,QAAA,QAAQ,GAAG,CAAC,IAAI;AACd,YAAA,KAAK,KAAK;AAAI,gBAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAE;AACvD,YAAA,KAAK,KAAK;AAAI,gBAAA,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE;AACvF,YAAA,KAAK,KAAK;gBAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAAE;AACzC,YAAA,KAAK,KAAK;gBAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAAE;AACzC,YAAA,KAAK,OAAO;AAAE,gBAAA,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;gBAAE;AAClD,YAAA,SAAc,OAAO,IAAI;;QAE3B,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,KAAK,UAAU,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;IAChK;AAEA,IAAA,UAAU,CAAC,MAAc,EAAA;AACvB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AAClF,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,aAAa,IAAI,GAAG,GAAG,MAAM;QAE7E,IAAI,OAAO,GAAG,EAAE;QAChB,IAAI,QAAQ,GAAG,EAAE;AAEjB,QAAA,IAAI,MAAM,KAAK,KAAK,EAAE;YACpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;AAC7B,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;gBACxD,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG;AAC9D,YAAA,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAG;AAC1B,gBAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;AACrB,oBAAA,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE;oBACzC,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,wBAAA,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACtD,oBAAA,OAAO,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG;AACpD,gBAAA,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACd,YAAA,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAEd,YAAA,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;YAC/B,QAAQ,GAAG,yBAAyB;QACtC;AAAO,aAAA,IAAI,MAAM,KAAK,MAAM,EAAE;;YAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAG;gBAChC,MAAM,GAAG,GAAQ,EAAE;gBACnB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACxD,gBAAA,OAAO,GAAG;AACZ,YAAA,CAAC,CAAC;YACF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,QAAQ,GAAG,iCAAiC;QAC9C;aAAO;AACL,YAAA,OAAO,CAAC,IAAI,CAAC,gEAAgE,EAAE,MAAM,CAAC;YACtF;QACF;;AAGA,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC;AACvC,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AAChC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACjC;AAEA,IAAA,UAAU,CAAC,KAA4B,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE;QAChC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC;AACrD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC;AACrD,QAAA,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,OAAO,CAAC,KAAyB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE;QAC9B,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACvC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AACrE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAC7B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;QAClJ;IACF;wGAtZW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1TvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+2RAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAtMS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,ooCAAE,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;4FA2T/D,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA9TlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,qBAAqB,CAAC,EAAA,QAAA,EACjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqMT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,+2RAAA,CAAA,EAAA;;sBAsHA;;sBACA;;sBACA;;;ACjVH;;AAEG;MAuDU,oBAAoB,CAAA;AACtB,IAAA,MAAM;IACN,OAAO,GAAQ,EAAE;AACjB,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC1C,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAEjD,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1E;wGARW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1CrB;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,06EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAlBS,qBAAqB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA2CpB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA9ChC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cACR,IAAI,EAAA,OAAA,EACP,CAAC,qBAAqB,CAAC,EAAA,QAAA,EACtB;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,06EAAA,CAAA,EAAA;;sBA0BA;;sBACA;;;AC3DH;;AAEG;MAsDU,yBAAyB,CAAA;AAC3B,IAAA,MAAM;IACN,OAAO,GAAQ,EAAE;AACjB,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAEnD,IAAA,IAAI,QAAQ,GAAA,EAAa,OAAO,CAAA,oCAAA,CAAsC,CAAC,CAAC;wGAL7D,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3C1B;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ygEAAA,CAAA,EAAA,CAAA;;4FAyBU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA/CrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EACD;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,ygEAAA,CAAA,EAAA;;sBA0BA;;sBACA;;;AC1DH;;AAEG;MA2CU,0BAA0B,CAAA;AAC5B,IAAA,MAAM;IACN,OAAO,GAAQ,EAAE;AAEjB,IAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAClD,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAEnD,IAAA,IAAI,aAAa,GAAA;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE;AAC7C,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,GAAG,KAAI;AAC9E,gBAAA,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACrF,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;IAC1B;wGAdW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/B3B;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ixCAAA,CAAA,EAAA,CAAA;;4FAgBU,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAnCtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EACD;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,ixCAAA,CAAA,EAAA;;sBAiBA;;sBACA;;;MC9BU,iBAAiB,CAAA;IACT,UAAU,GAAQ,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3E,SAAS,GAAG,MAAM,CAAa,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE1E,IAAA,YAAY,CAAC,MAAkB,EAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;IAC9B;wGANS,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AChBlC;;;AAGG;IACS;AAAZ,CAAA,UAAY,UAAU,EAAA;;AAEpB,IAAA,UAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;;AAErB,IAAA,UAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;;AAEzB,IAAA,UAAA,CAAA,OAAA,CAAA,GAAA,OAAe;;AAEf,IAAA,UAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;;AAErB,IAAA,UAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;;AAEzB,IAAA,UAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;;AAEjC,IAAA,UAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EAfW,UAAU,KAAV,UAAU,GAAA,EAAA,CAAA,CAAA;;ACKtB;AACA,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;AAC7G;;;AAGG;MAEU,gBAAgB,CAAA;AAwCL,IAAA,MAAA;IAvCH,UAAU,GAAQ,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEpF;;;;;AAKG;IACc,cAAc,GAAG,MAAM,CAAa,IAAI,CAAC,gBAAgB,EAAE,qFAAC;;AAGpE,IAAA,OAAO,GAAG,MAAM,CAAC,gBAAgB,8EAAC;;AAGlC,IAAA,aAAa,GAAG,MAAM,CAAC,CAAA,EAAA,EAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA,qCAAA,CAAuC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAG5F,IAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,uFAAC;;IAGhC,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE7C,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACvC,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;AACrC,IAAA,YAAY;AAEpB;;;;AAIG;IACK,gBAAgB,GAAA;AACpB,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ;QACrC,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AACzF,QAAA,IAAI,YAAY;YAAE,OAAO,UAAU,CAAC,KAAK;QAEzC,OAAQ,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,aAA4B,IAAI,UAAU,CAAC,QAAQ;IACrF;AAEA,IAAA,WAAA,CAAoB,MAAc,EAAA;QAAd,IAAA,CAAA,MAAM,GAAN,MAAM;QACtB,IAAI,CAAC,MAAM,CAAC;AACP,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAA6B,KAAK,YAAY,aAAa,CAAC;aAC9E,SAAS,CAAC,MAAK;YACZ,IAAI,CAAC,mBAAmB,EAAE;AAC9B,QAAA,CAAC,CAAC;;QAGN,IAAI,CAAC,sBAAsB,EAAE;;AAG7B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAC/C,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CACvD,CAAC,SAAS,CAAC,MAAM,IAAG;YACjB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC;AACxD,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE;IACpC;;IAGQ,mBAAmB,GAAA;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI;QACjD,IAAI,MAAM,GAAsB,IAAI;;QAGpC,OAAO,KAAK,EAAE;YACV,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA2B;YACjE,IAAI,UAAU,EAAE;gBACZ,MAAM,GAAG,UAAU;YACvB;AACA,YAAA,KAAK,GAAG,KAAK,CAAC,UAAW;QAC7B;QAEA,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,EAAE;AAC5C,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QACnC;IACJ;;AAGA,IAAA,SAAS,CAAC,IAAgB,EAAA;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;;IAGA,aAAa,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC;;AAGQ,IAAA,eAAe,CAAC,KAAU,EAAA;AAC9B,QAAA,OAAO,KAAK,CAAC,UAAU,EAAE;AACrB,YAAA,KAAK,GAAG,KAAK,CAAC,UAAU;QAC5B;AACA,QAAA,OAAO,KAAK;IAChB;;IAGQ,sBAAsB,GAAA;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC;AACtD,QAAA,IAAI,IAAI;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,yBAAyB,CAAC;AAChE,QAAA,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;YAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;;QAG1F,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC;;QAE3D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE;YAC7C,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C;IACJ;AAEA;;;AAGG;IACK,kBAAkB,CAAC,GAAW,EAAE,KAAU,EAAA;QAC9C,QAAQ,GAAG;AACP,YAAA,KAAK,kBAAkB;gBACnB,IAAI,KAAK,EAAE;oBACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7C;gBACA;AAEJ,YAAA,KAAK,yBAAyB;gBAC1B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzC;AAEJ,YAAA,KAAK,mBAAmB;gBACpB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACrC;AAEJ,YAAA,KAAK,mBAAmB;;;AAGpB,gBAAA,OAAO,CAAC,IAAI,CAAC,+CAA+C,KAAK,CAAA,qDAAA,CAAuD,CAAC;gBACzH;AAEJ,YAAA;gBACI;;IAEZ;AAEA;;;;AAIG;AACK,IAAA,gBAAgB,CAAC,MAAe,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;QACrC,IAAI,MAAM,EAAE;AACR,YAAA,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC;QAC7C;aAAO;AACH,YAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC;QACnD;IACJ;wGA/JS,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACflC;;;;;;;;;;AAUG;MAIU,qBAAqB,GAAG,IAAI,cAAc,CAAU,iBAAiB;AAmBlF;;;;AAIG;AACG,SAAU,wBAAwB,CACtC,QAAkC,EAClC,aAAgC,EAChC,UAA0B,EAC1B,YAA8B,EAC9B,WAAwB,EACxB,gBAAyC,EACzC,kBAA6C,EAC7C,cAAqC,EACrC,UAA6B,EAC7B,gBAAkC,EAClC,MAAe,EAAA;AAEf,IAAA,OAAO,MAAK;;QAEV,QAAQ,CAAC,WAAW,CAAC;AACnB,YAAA,MAAM,EAAE,qBAAqB;AAC7B,YAAA,cAAc,EAAE,4BAA4B;AAC5C,YAAA,OAAO,EAAE,sBAAsB;AAC/B,YAAA,MAAM,EAAE,oBAAoB;AAC5B,YAAA,YAAY,EAAE,yBAAyB;AACvC,YAAA,aAAa,EAAE,0BAA0B;AACzC,YAAA,WAAW,EAAE;AACd,SAAA,CAAC;;AAGF,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE;AACvB,YAAA,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3C;;AAGA,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,UAAU,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAAC;QAChF;;AAGA,QAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACzB,YAAA,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC;QACpD;AAEE,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI;QAC9B,IAAI,UAAU,EAAE;YACd,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC;QAC7D;;AAGF,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE;AAC1B,YAAA,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE;AACnC,gBAAA,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAG/B,gBAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,oBAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;gBACzC;;AAGA,gBAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,oBAAA,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;AAC5D,wBAAA,gBAAgB,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;oBACjD;gBACF;;AAGA,gBAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,oBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;AAChE,wBAAA,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC;oBACtD;gBACF;;AAGA,gBAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,oBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;AACzD,wBAAA,UAAU,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC;oBACvC;gBACF;YACF;QACF;;;;AAKA,QAAA,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC;;;;;AAMjC,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE;AAC7B,YAAA,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,UAAiB,CAAC;QACnD;AACA,QAAA,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE;YACpB,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/C;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC;AACrE,IAAA,CAAC;AACH;AAEA;;;;AAIG;AACG,SAAU,qBAAqB,CAAC,MAAe,EAAA;IACnD,OAAO;AACL,QAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE;AACpD,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,UAAU,EAAE,wBAAwB;AACpC,YAAA,IAAI,EAAE;gBACJ,wBAAwB;gBACxB,iBAAiB;gBACjB,cAAc;gBACd,gBAAgB;gBAChB,WAAW;gBACX,uBAAuB;gBACvB,yBAAyB;gBACzB,qBAAqB;gBACrB,iBAAiB;gBACjB,gBAAgB;gBAChB;AACD,aAAA;AACD,YAAA,KAAK,EAAE;AACR;KACF;AACH;;AC/JA;;;;;AAKG;MACU,SAAS,GAAkB,CAAC,KAAK,EAAE,KAAK,KAAI;AACrD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACvC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAE7B,IAAA,IAAI,WAAW,CAAC,eAAe,EAAE,EAAE;AAC/B,QAAA,OAAO,IAAI;IACf;;AAGA,IAAA,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;IACvC,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC3C;;AChBA;;AAEG;MACU,eAAe,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;AAC5D,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACvC,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE;;IAGpC,MAAM,OAAO,GAAG;AACZ,UAAE,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,EAAE,EAAE;UAC9D,GAAG;AAET,IAAA,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACrBE,YAAU,CAAC,CAAC,KAAwB,KAAI;AACpC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;YACtB,WAAW,CAAC,MAAM,EAAE;QACxB;AACA,QAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,CACL;AACL;;ACDO,MAAM,aAAa,GAAkB;AAC1C,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,yBAAyB,EAAE;AACzH,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,0BAA0B,EAAE;AAC3H,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,0BAA0B,EAAE;AAC7H,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,0BAA0B,EAAE;AAC7H,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,yBAAyB,EAAE;AACzH,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,0BAA0B,EAAE;AAC7H,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,0BAA0B,EAAE;AAC9H,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,yBAAyB,EAAE;AAC1H,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,0BAA0B;;AAGrH,MAAM,eAAe,GAAoB;AAC9C,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,QAAQ,EAAE,wBAAwB,EAAE;AACjI,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,QAAQ,EAAE,wBAAwB,EAAE;AAChI,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,QAAQ,EAAE,wBAAwB,EAAE;AAChI,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,QAAQ,EAAE,wBAAwB,EAAE;AACnI,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,QAAQ,EAAE,wBAAwB;;AAG1H,MAAM,oBAAoB,GAAgB;AAC/C,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,aAAa,EAAE,OAAO;AACtB,IAAA,WAAW,EAAE,MAAM;AACnB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,WAAW,EAAE;;;MC1CF,YAAY,CAAA;AASkB,IAAA,UAAA;IARxB,WAAW,GAAG,kBAAkB;;AAG1C,IAAA,MAAM,GAAG,MAAM,CAAc,oBAAoB,6EAAC;;AAGlD,IAAA,cAAc,GAAG,MAAM,CAAU,KAAK,qFAAC;AAE9C,IAAA,WAAA,CAAyC,UAAkB,EAAA;QAAlB,IAAA,CAAA,UAAU,GAAV,UAAU;AACjD,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,IAAI,CAAC,UAAU,EAAE;;YAEjB,MAAM,CAAC,MAAK;AACV,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE;AACnC,gBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC9B,gBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAChC,YAAA,CAAC,CAAC;QACJ;IACF;AAEA,IAAA,YAAY,CAAC,OAA6B,EAAA;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACjD;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;;YAErD,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;YACrD,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,oBAAoB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACrE;AAAO,iBAAA,IAAI,WAAW,IAAI,WAAW,KAAK,SAAS,EAAE;;AAEnD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,WAAW,KAAK,UAAU,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC,CAAC;YACjG;QACF;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,CAAC,CAAC;QAClE;IACF;AAEQ,IAAA,UAAU,CAAC,MAAmB,EAAA;AACpC,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChE;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,CAAC,CAAC;QAChE;IACF;AAEQ,IAAA,UAAU,CAAC,MAAmB,EAAA;AACpC,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe;;AAGpC,QAAA,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM,EAAE;AACjC,YAAA,GAAG,CAAC,eAAe,CAAC,mBAAmB,CAAC;QAC1C;aAAO;AACL,YAAA,GAAG,CAAC,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC;QAChD;;QAGA,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;AAClG,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,GAAG,CAAC;;AAG5C,QAAA,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM,EAAE;YACjC,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,aAAa,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;AACtG,YAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,GAAG,CAAC;QAC9C;aAAO;AACL,YAAA,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;AACpC,YAAA,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC;AAC9C,YAAA,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC;AAC5C,YAAA,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC;QAC7C;;QAGA,GAAG,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC;QACnD,GAAG,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3D;IAEQ,mBAAmB,CAAC,MAAmB,EAAE,GAAgB,EAAA;QAC/D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC;QAC1D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC;QAC1D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC;QAChD,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC;IAC3D;IAEQ,mBAAmB,CAAC,MAAqB,EAAE,GAAgB,EAAA;QACjE,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC;QAC3D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3D;AA5FW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,kBASH,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AATpB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAUc,MAAM;2BAAC,WAAW;;;MCqRpB,gBAAgB,CAAA;AAClB,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjC,IAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAEnD,IAAA,aAAa,GAAG,IAAI,GAAG,EAAW;AAElC,IAAA,YAAY,CAAC,IAAa,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;YACzB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAChC,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;YACjC;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;QACF;IACF;wGAfW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1RjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,mjGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAlES,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA2RzC,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBA9R5B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiET,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,mjGAAA,CAAA,EAAA;;;MCsPU,eAAe,CAAA;AACjB,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,IAAA,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;AAEnC,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;wGANjB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvThB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woHAAA,CAAA,EAAA,CAAA;;4FAyPU,eAAe,EAAA,UAAA,EAAA,CAAA;kBA3T3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,woHAAA,CAAA,EAAA;;;MCQU,eAAe,CAAA;AACjB,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;wGAD/B,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAzEhB;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,izBAAA,CAAA,EAAA,CAAA;;4FA8DU,eAAe,EAAA,UAAA,EAAA,CAAA;kBA7E3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EACD;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,izBAAA,CAAA,EAAA;;;MCuGU,uBAAuB,CAAA;AACzB,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;wGAD/B,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9GxB;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wgCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAxBS,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,uDAAE,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA;;4FA+G/D,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAlHnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC,EAAA,QAAA,EACjE;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wgCAAA,CAAA,EAAA;;;MCkFU,yBAAyB,CAAA;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;wGAFxC,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAzG1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,w2BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAlCS,YAAY,+KAAE,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,oOAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA0G3E,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA7GrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,UAAA,EACrB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAC7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,w2BAAA,CAAA,EAAA;;;MCjBU,oBAAoB,CAAA;wGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApBnB;;;;AAIX,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,iMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EALW,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAqBb,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAxBhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;AAIX,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,iMAAA,CAAA,EAAA;;;MC2BU,uBAAuB,CAAA;wGAAvB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/BxB;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gaAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAPS,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAgCX,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAnCnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;AAMT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,gaAAA,CAAA,EAAA;;;MCqCU,wBAAwB,CAAA;wGAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3CzB;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,oeAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAXS,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FA4CX,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA/CpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cACrB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,oeAAA,CAAA,EAAA;;;MCOU,4BAA4B,CAAA;wGAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAjB7B;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,kJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EALS,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAkBX,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBArBxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,cACzB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;AAIT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,kJAAA,CAAA,EAAA;;;MCmBU,sBAAsB,CAAA;wGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvBvB;;;;;;;AAOT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EARS,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAwBX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA3BlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;AAOT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,0KAAA,CAAA,EAAA;;;MCyGU,8BAA8B,CAAA;AAC9B,IAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACrC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAEnD,IAAA,OAAO,CAAC,IAAY,EAAA;QAChB,QAAQ,IAAI;AACR,YAAA,KAAK,SAAS,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC;AAChE,YAAA,KAAK,OAAO,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;AACvD,YAAA,KAAK,SAAS,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;YAC3D,SAAS,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;;IAEzD;wGAXS,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/G7B;;;;;;;;;;;;;;;;;;;;AAoBX,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,81CAAA,CAAA,EAAA,CAAA;;4FA2FU,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAnH1C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EACD;;;;;;;;;;;;;;;;;;;;AAoBX,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,81CAAA,CAAA,EAAA;;;MCqQU,wBAAwB,CAAA;AACnC,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAE1C,OAAO,GAAG,aAAa;IACvB,QAAQ,GAAG,eAAe;AAE1B,IAAA,SAAS,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC;IAE3E,KAAK,GAAA;QACH,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7C;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;QACrB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACzD;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;QACrB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACzD;AAEA,IAAA,SAAS,CAAC,MAAwB,EAAA;QAChC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACzD;AAEA,IAAA,WAAW,CAAC,IAAS,EAAA;QACnB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpD;AAEA,IAAA,cAAc,CAAC,OAAY,EAAA;QACzB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAC1D;wGA/BW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxRzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,u+EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAvGS,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAyRZ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA5RpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,IAAI,EAAA,OAAA,EACP,CAAC,aAAa,CAAC,EAAA,QAAA,EACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,u+EAAA,CAAA,EAAA;;;AC/FH;;;AAGG;MA4DU,eAAe,CAAA;AACjB,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACjC,UAAU,GAAG,UAAU;wGAFrB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1ChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,oEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA7CC,uBAAuB,gEACvB,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,wBAAwB,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,4BAA4B,sEAC5B,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,8BAA8B,EAAA,QAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,sBAAsB,2DACtB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,CAAA;;4FA4Cf,eAAe,EAAA,UAAA,EAAA,CAAA;kBA3D3B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP;wBACP,uBAAuB;wBACvB,yBAAyB;wBACzB,oBAAoB;wBACpB,uBAAuB;wBACvB,wBAAwB;wBACxB,4BAA4B;wBAC5B,sBAAsB;wBACtB,8BAA8B;wBAC9B,sBAAsB;wBACtB,sBAAsB;wBACtB,sBAAsB;wBACtB;qBACH,EAAA,QAAA,EACW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,oEAAA,CAAA,EAAA;;;ACtEH;;;;;AAKG;AAEH;;ACPA;;AAEG;;;;"}