@aslaluroba/help-center 4.0.12 → 4.0.13

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":"aslaluroba-help-center.mjs","sources":["../../../src/app/services/action-handler.service.ts","../../../src/app/services/api.service.ts","../../../src/app/services/ably.service.ts","../../../src/app/services/chat-session.service.ts","../../../src/app/services/translation.service.ts","../../../src/app/language.service.ts","../../../src/app/services/file-upload.service.ts","../../../src/app/services/theme.service.ts","../../../src/app/help-center-widget/components/arrow-animation/arrow-animation.component.ts","../../../src/app/help-center-widget/components/arrow-animation/arrow-animation.component.html","../../../src/app/pipes/translate.pipe.ts","../../../src/app/shared/components/button/button.component.ts","../../../src/app/shared/components/button/button.component.html","../../../src/app/shared/components/icon/icon.component.ts","../../../src/app/shared/components/icon/icon.component.html","../../../src/app/help-center-widget/components/chat-action-buttons/chat-action-buttons.component.ts","../../../src/app/help-center-widget/components/chat-action-buttons/chat-action-buttons.component.html","../../../src/app/chat/components/chat-avatar/chat-avatar.component.ts","../../../src/app/chat/components/chat-avatar/chat-avatar.component.html","../../../src/app/chat/components/image-attachment/image-attachment.component.ts","../../../src/app/chat/components/image-attachment/image-attachment.component.html","../../../src/app/chat/components/image-preview-dialog/image-preview-dialog.component.ts","../../../src/app/chat/components/image-preview-dialog/image-preview-dialog.component.html","../../../src/app/shared/components/markdown-renderer/markdown-renderer.component.ts","../../../src/app/shared/components/markdown-renderer/markdown-renderer.component.html","../../../src/app/chat/components/chat-message/chat-message.component.ts","../../../src/app/chat/components/chat-message/chat-message.component.html","../../../src/app/chat/components/chat-separator/chat-separator.component.ts","../../../src/app/chat/components/chat-separator/chat-separator.component.html","../../../src/app/chat/components/chat-typing-indicator/chat-typing-indicator.component.ts","../../../src/app/chat/components/chat-typing-indicator/chat-typing-indicator.component.html","../../../src/app/chat/components/review-message/review-message.component.ts","../../../src/app/chat/components/review-message/review-message.component.html","../../../src/app/chat/chat.component.ts","../../../src/app/chat/chat.component.html","../../../src/app/shared/components/back-button/back-button.component.ts","../../../src/app/shared/components/back-button/back-button.component.html","../../../src/app/shared/components/close-button/close-button.component.ts","../../../src/app/shared/components/close-button/close-button.component.html","../../../src/app/shared/components/minimize-button/minimize-button.component.ts","../../../src/app/shared/components/minimize-button/minimize-button.component.html","../../../src/app/shared/components/chat-header/chat-header.component.ts","../../../src/app/shared/components/chat-header/chat-header.component.html","../../../src/app/shared/components/header/header.component.ts","../../../src/app/shared/components/header/header.component.html","../../../src/app/shared/components/card/card/card.component.ts","../../../src/app/shared/components/card/card/card.component.html","../../../src/app/shared/components/card/card-header/card-header.component.ts","../../../src/app/shared/components/card/card-header/card-header.component.html","../../../src/app/shared/components/card/card-title/card-title.component.ts","../../../src/app/shared/components/card/card-title/card-title.component.html","../../../src/app/shared/components/card/card-description/card-description.component.ts","../../../src/app/shared/components/card/card-description/card-description.component.html","../../../src/app/shared/components/card/card-content/card-content.component.ts","../../../src/app/shared/components/card/card-content/card-content.component.html","../../../src/app/shared/components/card/card-footer/card-footer.component.ts","../../../src/app/shared/components/card/card-footer/card-footer.component.html","../../../src/app/help-center-widget/components/footer/footer.component.ts","../../../src/app/help-center-widget/components/footer/footer.component.html","../../../src/app/shared/components/loading/loading.component.ts","../../../src/app/shared/components/loading/loading.component.html","../../../src/app/shared/components/base-dialog/base-dialog.component.ts","../../../src/app/shared/components/base-dialog/base-dialog.component.html","../../../src/app/shared/components/confirmation-dialog/confirmation-dialog.component.ts","../../../src/app/shared/components/confirmation-dialog/confirmation-dialog.component.html","../../../src/app/shared/components/review-dialog/review-dialog.component.ts","../../../src/app/shared/components/review-dialog/review-dialog.component.html","../../../src/app/shared/components/index.ts","../../../src/app/chat/components/chat-input/chat-input.component.ts","../../../src/app/chat/components/chat-input/chat-input.component.html","../../../src/app/help-center-widget/components/chat-screen/chat-screen.component.ts","../../../src/app/help-center-widget/components/chat-screen/chat-screen.component.html","../../../src/app/help-center-widget/components/company-card/company-card.component.ts","../../../src/app/help-center-widget/components/company-card/company-card.component.html","../../../src/app/help-center-widget/components/help-button/help-button.component.ts","../../../src/app/help-center-widget/components/help-button/help-button.component.html","../../../src/app/shared/components/error-state/error-state.component.ts","../../../src/app/shared/components/error-state/error-state.component.html","../../../src/app/help-screen-list/components/helpscreen-option/helpscreen-option.component.ts","../../../src/app/help-screen-list/components/helpscreen-option/helpscreen-option.component.html","../../../src/app/help-screen-list/helpscreen-list.component.ts","../../../src/app/help-screen-list/helpscreen-list.component.html","../../../src/app/help-center-widget/components/home-screen/home-screen.component.ts","../../../src/app/help-center-widget/components/home-screen/home-screen.component.html","../../../src/app/help-center-widget/components/help-popup/help-popup.component.ts","../../../src/app/help-center-widget/components/help-popup/help-popup.component.html","../../../src/app/help-center-widget/help-center-widget.component.ts","../../../src/app/help-center-widget/help-center-widget.component.html","../../../src/app/services/help-center-config.service.ts","../../../src/app/services/token.service.ts","../../../public_api.ts","../../../aslaluroba-help-center.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n/**\n * Type definition for action handlers\n */\nexport type ActionHandler = (messageData: any) => void | Promise<void>;\n\n/**\n * Service for managing AI response action handlers in an extensible way.\n *\n * This service provides a registry pattern for handling different action types\n * from realtime AI responses, making it easy to add new actions without\n * modifying existing code.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ActionHandlerService {\n private actionHandlers = new Map<string, ActionHandler>();\n private defaultHandler?: ActionHandler;\n\n constructor() {\n // Register default handler for unknown actions\n this.setDefaultHandler((messageData) => {\n const actionType = messageData?.actionType || '';\n if (actionType && actionType !== '') {\n console.warn(\n `[ActionHandlerService] Unknown action type received: \"${actionType}\". ` +\n `Message data:`,\n messageData,\n );\n }\n });\n }\n\n /**\n * Registers a handler for a specific action type\n *\n * @param actionType The action type string (e.g., 'needs_agent', 'end_session')\n * @param handler The handler function to execute when this action is received\n */\n registerHandler(actionType: string, handler: ActionHandler): void {\n if (this.actionHandlers.has(actionType)) {\n console.warn(\n `[ActionHandlerService] Handler for action type \"${actionType}\" already exists. ` +\n `Overwriting with new handler.`,\n );\n }\n this.actionHandlers.set(actionType, handler);\n }\n\n /**\n * Unregisters a handler for a specific action type\n *\n * @param actionType The action type to unregister\n */\n unregisterHandler(actionType: string): void {\n this.actionHandlers.delete(actionType);\n }\n\n /**\n * Sets the default handler for unknown action types\n *\n * @param handler The default handler function\n */\n setDefaultHandler(handler: ActionHandler): void {\n this.defaultHandler = handler;\n }\n\n /**\n * Handles an action type by executing the registered handler or default handler\n *\n * @param actionType The action type to handle\n * @param messageData The message data containing the action\n * @returns Promise that resolves when handling is complete\n */\n async handleAction(\n actionType: string | undefined | null,\n messageData: any,\n ): Promise<void> {\n // Handle empty string or null/undefined - do nothing as per requirements\n if (!actionType || actionType === '') {\n return;\n }\n\n const handler = this.actionHandlers.get(actionType);\n\n if (handler) {\n try {\n await handler(messageData);\n } catch (error) {\n console.error(\n `[ActionHandlerService] Error executing handler for action type \"${actionType}\":`,\n error,\n );\n }\n } else if (this.defaultHandler) {\n // Use default handler for unknown actions\n try {\n await this.defaultHandler(messageData);\n } catch (error) {\n console.error(\n `[ActionHandlerService] Error executing default handler for action type \"${actionType}\":`,\n error,\n );\n }\n }\n }\n\n /**\n * Gets all registered action types\n *\n * @returns Array of registered action type strings\n */\n getRegisteredActions(): string[] {\n return Array.from(this.actionHandlers.keys());\n }\n\n /**\n * Clears all registered handlers (useful for testing or cleanup)\n */\n clearHandlers(): void {\n this.actionHandlers.clear();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiConfig } from '../../../public_api';\n\n/**\n * Service for handling API requests with automatic authentication token management.\n *\n * Features:\n * - Automatic token refresh on expiry\n * - Token validation and format checking\n * - Secure token storage using sessionStorage\n * - Endpoint validation to prevent SSRF attacks\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ApiService {\n private getTokenFunction: (() => Promise<string>) | null = null;\n private baseUrl: string = 'https://babylai.net/api';\n\n /**\n * Initialize the API service with authentication configuration.\n *\n * This must be called before making any API requests. The service will use\n * the provided token function to fetch and refresh tokens automatically.\n *\n * @param config Configuration object containing token function and optional base URL\n * @throws Error if getToken function is not provided\n *\n * @example\n * ```typescript\n * apiService.initialize({\n * getToken: async () => {\n * const response = await fetch('/auth/token');\n * const data = await response.json();\n * return data.token;\n * },\n * baseUrl: 'https://api.example.com'\n * });\n * ```\n */\n initialize(config: ApiConfig) {\n if (!config.getToken) {\n throw new Error('getToken function is required for API initialization');\n }\n\n this.getTokenFunction = config.getToken;\n if (config.baseUrl) {\n // Enforce HTTPS for API calls when app is served over HTTPS\n // Allow localhost for development\n if (\n typeof window !== 'undefined' &&\n window.location.protocol === 'https:'\n ) {\n const baseUrl = config.baseUrl.toLowerCase();\n const isLocalhost =\n baseUrl.includes('localhost') || baseUrl.includes('127.0.0.1');\n\n // If the app is running on HTTPS, enforce HTTPS for API calls (except localhost)\n if (!config.baseUrl.startsWith('https://') && !isLocalhost) {\n throw new Error(\n 'Security violation: API base URL must use HTTPS when app is served over HTTPS. ' +\n 'Non-HTTPS URLs are only allowed for localhost in development.',\n );\n }\n }\n this.baseUrl = config.baseUrl;\n }\n }\n\n /**\n * Validate token format\n * JWT tokens must have exactly 3 parts separated by dots (header.payload.signature)\n */\n private validateToken(token: string): boolean {\n if (!token || typeof token !== 'string') {\n return false;\n }\n\n // Basic validation - ensure token is not empty\n const trimmedToken = token.trim();\n if (trimmedToken.length === 0) {\n return false;\n }\n\n // JWT tokens must have exactly 3 parts separated by dots (header.payload.signature)\n const parts = trimmedToken.split('.');\n if (parts.length !== 3) {\n return false;\n }\n\n // Each part should be non-empty\n if (\n parts[0].length === 0 ||\n parts[1].length === 0 ||\n parts[2].length === 0\n ) {\n return false;\n }\n\n // Basic length check - JWT tokens are typically much longer than 10 characters\n // Header and payload are base64url encoded, signature is typically longer\n if (trimmedToken.length < 20) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Retrieves a valid authentication token, fetching a new one if expired.\n *\n * Tokens are cached for 15 minutes. The service provides backward compatibility:\n * - Checks localStorage first for existing tokens (backward compatibility)\n * - Falls back to sessionStorage if no token found in localStorage\n * - New tokens are stored in sessionStorage (preferred) or localStorage (fallback)\n * - Automatically migrates tokens from localStorage to sessionStorage when found\n *\n * After expiry, a new token is automatically fetched using the configured getToken function.\n *\n * @param forceRefresh If true, forces a new token fetch even if current token is valid\n * @returns Promise resolving to a valid authentication token\n * @throws Error if API service is not initialized or token format is invalid\n */\n async getValidToken(forceRefresh = false): Promise<string> {\n if (!this.getTokenFunction) {\n throw new Error(\n 'API service not initialized. Call initialize({ getToken }) first.',\n );\n }\n\n // Determine storage mechanism - prefer sessionStorage for new tokens (more secure)\n // but check localStorage first for backward compatibility\n const sessionStorageAvailable =\n typeof window !== 'undefined' &&\n typeof window.sessionStorage !== 'undefined';\n const localStorageAvailable =\n typeof window !== 'undefined' &&\n typeof window.localStorage !== 'undefined';\n const sessionStore: Storage | null = sessionStorageAvailable\n ? window.sessionStorage\n : localStorageAvailable\n ? window.localStorage\n : null;\n const localStore: Storage | null = localStorageAvailable\n ? window.localStorage\n : null;\n\n const currentTime = Math.floor(Date.now() / 1000);\n let storedToken: string | null = null;\n let storedExpiry: string | null = null;\n\n // Backward compatibility: Check localStorage first for existing tokens\n if (localStore) {\n const localToken = localStore.getItem('chatbot-token');\n const localExpiry = localStore.getItem('chatbot-token-expiry');\n\n if (localToken && localExpiry && currentTime < Number(localExpiry)) {\n // Validate stored token format\n if (this.validateToken(localToken)) {\n storedToken = localToken;\n storedExpiry = localExpiry;\n\n // Migrate to sessionStorage for future use (if available)\n if (sessionStore && !forceRefresh) {\n sessionStore.setItem('chatbot-token', localToken);\n sessionStore.setItem('chatbot-token-expiry', localExpiry);\n }\n } else {\n // Invalid token in localStorage, clear it\n localStore.removeItem('chatbot-token');\n localStore.removeItem('chatbot-token-expiry');\n }\n }\n }\n\n // If no valid token found in localStorage, check sessionStorage\n if (!storedToken && sessionStore) {\n const sessionToken = sessionStore.getItem('chatbot-token');\n const sessionExpiry = sessionStore.getItem('chatbot-token-expiry');\n\n if (\n sessionToken &&\n sessionExpiry &&\n currentTime < Number(sessionExpiry)\n ) {\n // Validate stored token format\n if (this.validateToken(sessionToken)) {\n storedToken = sessionToken;\n storedExpiry = sessionExpiry;\n } else {\n // Invalid token in sessionStorage, clear it\n sessionStore.removeItem('chatbot-token');\n sessionStore.removeItem('chatbot-token-expiry');\n }\n }\n }\n\n // Fetch new token if needed\n if (\n !storedToken ||\n !storedExpiry ||\n currentTime >= Number(storedExpiry) ||\n forceRefresh\n ) {\n const tokenResponse = await this.getTokenFunction();\n\n if (!tokenResponse) {\n throw new Error('Invalid token response from getToken function');\n }\n\n // Validate token format before storing\n if (!this.validateToken(tokenResponse)) {\n throw new Error('Invalid token format received from getToken function');\n }\n\n storedToken = tokenResponse;\n storedExpiry = String(currentTime + 900); // 15 minutes expiry\n\n // Store new tokens in sessionStorage (preferred) or localStorage (fallback)\n const targetStorage = sessionStore || localStore;\n if (targetStorage) {\n targetStorage.setItem('chatbot-token', storedToken);\n targetStorage.setItem('chatbot-token-expiry', storedExpiry);\n\n // Clean up old localStorage token if it exists (migration)\n if (localStore && targetStorage === sessionStore) {\n localStore.removeItem('chatbot-token');\n localStore.removeItem('chatbot-token-expiry');\n }\n }\n }\n\n return storedToken!;\n }\n\n private async fetchWithAuth(\n url: string,\n options: RequestInit,\n retry = true,\n ): Promise<Response> {\n if (!options.headers) {\n options.headers = {};\n }\n\n const headers = options.headers as Record<string, string>;\n headers['Authorization'] = `Bearer ${await this.getValidToken()}`;\n\n let response = await fetch(url, options);\n\n if ((response.status === 401 || response.status === 403) && retry) {\n console.warn('Token expired. Fetching new token...');\n\n const newToken = await this.getValidToken(true);\n headers['Authorization'] = `Bearer ${newToken}`;\n\n response = await fetch(url, options);\n }\n\n return response;\n }\n\n /**\n * Validate endpoint to prevent SSRF vulnerabilities\n *\n * Protects against:\n * - Absolute URLs with any protocol (case-insensitive)\n * - Protocol-relative URLs\n * - Dangerous protocols (ftp, file, data, javascript, etc.)\n * - URL-encoded path traversal\n * - Double-encoded attacks\n */\n private validateEndpoint(endpoint: string): void {\n // Ensure endpoint is not empty\n if (!endpoint || endpoint.trim().length === 0) {\n throw new Error('Invalid endpoint: endpoint cannot be empty');\n }\n\n // Normalize endpoint for case-insensitive checks\n const normalized = endpoint.trim();\n const lowercased = normalized.toLowerCase();\n\n // Prevent protocol-relative URLs (//example.com)\n if (normalized.startsWith('//')) {\n throw new Error('Invalid endpoint: protocol-relative URLs not allowed');\n }\n\n // Check for dangerous protocols (case-insensitive)\n // List of dangerous protocols that could be used for SSRF\n const dangerousProtocols = [\n 'http://',\n 'https://',\n 'ftp://',\n 'file://',\n 'data:',\n 'javascript:',\n 'mailto:',\n 'tel:',\n 'ws://',\n 'wss://',\n 'gopher://',\n 'ldap://',\n 'ldaps://',\n ];\n\n for (const protocol of dangerousProtocols) {\n if (lowercased.startsWith(protocol)) {\n throw new Error(\n `Invalid endpoint: absolute URLs with protocol '${protocol}' not allowed`,\n );\n }\n }\n\n // Decode URL-encoded strings to catch encoded attacks\n let decodedEndpoint: string;\n try {\n // Decode once to catch single-encoded attacks\n decodedEndpoint = decodeURIComponent(normalized);\n // Decode twice to catch double-encoded attacks\n decodedEndpoint = decodeURIComponent(decodedEndpoint);\n } catch {\n // If decoding fails, it might be malicious - reject it\n throw new Error('Invalid endpoint: malformed URL encoding detected');\n }\n\n // Check decoded endpoint for path traversal patterns\n const decodedLowercased = decodedEndpoint.toLowerCase();\n\n // Check for path traversal in various forms\n const pathTraversalPatterns = [\n '..',\n '%2e%2e',\n '%2e%2e/',\n '../',\n '..\\\\',\n '%2f',\n '%5c',\n ];\n\n for (const pattern of pathTraversalPatterns) {\n if (\n decodedLowercased.includes(pattern) ||\n normalized.toLowerCase().includes(pattern)\n ) {\n throw new Error('Invalid endpoint: path traversal detected');\n }\n }\n\n // Check for dangerous protocols in decoded string\n for (const protocol of dangerousProtocols) {\n if (decodedLowercased.startsWith(protocol)) {\n throw new Error(\n `Invalid endpoint: dangerous protocol detected in URL-encoded string`,\n );\n }\n }\n\n // Prevent control characters and other dangerous characters\n // Check for control characters (0x00-0x1F) and DEL (0x7F) using character codes\n for (let i = 0; i < normalized.length; i++) {\n const charCode = normalized.charCodeAt(i);\n if ((charCode >= 0x00 && charCode <= 0x1f) || charCode === 0x7f) {\n throw new Error('Invalid endpoint: control characters not allowed');\n }\n }\n }\n\n /**\n * Makes an authenticated API request with automatic token management.\n *\n * This method automatically:\n * - Validates the endpoint to prevent SSRF attacks\n * - Adds authentication headers with a valid token\n * - Retries with a fresh token if authentication fails\n * - Handles errors and returns appropriate error messages\n *\n * @param endpoint API endpoint path (relative to baseUrl)\n * @param method HTTP method (default: 'GET')\n * @param body Request body object (will be JSON stringified)\n * @param customHeaders Additional headers to include in the request\n * @returns Promise resolving to the Response object\n * @throws Error if endpoint validation fails, request fails, or authentication fails\n *\n * @example\n * ```typescript\n * // GET request\n * const response = await apiService.apiRequest('client/help-screens/123');\n * const data = await response.json();\n *\n * // POST request\n * const response = await apiService.apiRequest(\n * 'client/chat-sessions',\n * 'POST',\n * { helpScreenId: '123' }\n * );\n * ```\n */\n async apiRequest<T = unknown>(\n endpoint: string,\n method = 'GET',\n body: T | null = null,\n customHeaders: Record<string, string> = {},\n ): Promise<Response> {\n // Validate endpoint before making request\n this.validateEndpoint(endpoint);\n\n const url = `${this.baseUrl}/${endpoint}`;\n\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders,\n },\n body: body ? JSON.stringify(body) : null,\n };\n\n const response = await this.fetchWithAuth(url, options);\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.message || 'API request failed');\n }\n\n return response;\n }\n}\n","// Note: Using namespace import for tree-shaking support\n// Modern bundlers (webpack, esbuild) should tree-shake unused exports\n// Only Realtime class and related types are used, so tree-shaking should work\nimport * as Ably from 'ably';\n\ntype MessageReceivedCallback = (\n message: string | { content: string; attachments?: string[] },\n senderType: number,\n needsAgent: boolean,\n) => void;\n\ntype ActionHandlerCallback = (\n actionType: string,\n messageData: any,\n) => void | Promise<void>;\n\nexport class ClientAblyService {\n private static client: Ably.Realtime | null = null;\n private static channel: Ably.RealtimeChannel | null = null;\n private static isConnected: boolean = false;\n private static sessionId: string | null = null;\n private static messageUnsubscribe: (() => void) | null = null;\n private static connectionTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * Normalize backend attachments to string[] of image sources (URLs or file IDs).\n * Handles: array of strings/objects (downloadUrl, url, id), JSON strings, or empty strings.\n * URLs are used directly; IDs are presigned by ImageAttachmentComponent.\n */\n private static normalizeAttachmentIds(raw: unknown): string[] {\n if (raw == null) return [];\n // Handle empty strings (backend sends \"\" when no attachments)\n if (typeof raw === 'string') {\n if (raw === '') return [];\n // Try parsing as JSON in case backend sends JSON string\n try {\n const parsed = JSON.parse(raw);\n return this.normalizeAttachmentIds(parsed);\n } catch {\n // Not valid JSON; treat as single source (URL or ID)\n return [raw];\n }\n }\n if (Array.isArray(raw)) {\n if (raw.length === 0) return [];\n const sources: string[] = [];\n for (const attachment of raw) {\n if (typeof attachment === 'string') {\n sources.push(attachment);\n } else if (attachment && typeof attachment === 'object') {\n const o = attachment as {\n downloadUrl?: string;\n url?: string;\n id?: string;\n };\n if (o.downloadUrl && typeof o.downloadUrl === 'string') {\n sources.push(o.downloadUrl);\n } else if (o.url && typeof o.url === 'string') {\n sources.push(o.url);\n } else if (o.id && typeof o.id === 'string') {\n sources.push(o.id);\n }\n }\n }\n return sources;\n }\n if (typeof raw === 'object' && raw !== null) {\n const o = raw as Record<string, unknown>;\n const arr = (o['ids'] ?? o['fileIds'] ?? o['attachmentIds']) as unknown;\n return this.normalizeAttachmentIds(arr);\n }\n return [];\n }\n\n static async startConnection(\n sessionId: string,\n ablyToken: string,\n onMessageReceived: MessageReceivedCallback,\n tenantId: string,\n getAblyToken?: (\n tokenParams: Ably.TokenParams,\n ) => Promise<Ably.TokenDetails | string>,\n onActionReceived?: ActionHandlerCallback,\n ) {\n // Prevent multiple connections\n if (this.isConnected && this.sessionId === sessionId) {\n return;\n }\n\n // Close existing connection if connecting to a different session\n if (this.isConnected && this.sessionId !== sessionId) {\n await this.stopConnection();\n }\n\n try {\n // Initialize Ably client with token refresh support\n const clientOptions: Ably.ClientOptions = {\n autoConnect: true,\n token: ablyToken, // Use initial token for immediate connection\n };\n\n if (getAblyToken) {\n // Use authCallback for token renewal when callback is provided\n // When both token and authCallback are provided, token is used for initial connection\n // and authCallback is used for token refresh\n clientOptions.authCallback = getAblyToken;\n }\n\n this.client = new Ably.Realtime(clientOptions);\n\n // Wait for connection to be established\n await new Promise<void>((resolve, reject) => {\n if (!this.client) {\n reject(new Error('Failed to initialize Ably client'));\n return;\n }\n\n this.client.connection.once('connected', () => {\n // Clear connection timeout if connection succeeds\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n this.isConnected = true;\n this.sessionId = sessionId;\n resolve();\n });\n\n this.client.connection.once('failed', (stateChange) => {\n // Clear connection timeout on failure\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n console.error('Ably connection failed:', stateChange);\n reject(\n new Error(\n `Ably connection failed: ${\n stateChange.reason?.message || 'Unknown error'\n }`,\n ),\n );\n });\n\n this.client.connection.once('disconnected', (stateChange) => {\n // Clear connection timeout on disconnect\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n console.error('Ably connection disconnected:', stateChange);\n reject(\n new Error(\n `Ably connection disconnected: ${\n stateChange.reason?.message || 'Unknown error'\n }`,\n ),\n );\n });\n\n // Set a timeout for connection\n this.connectionTimeout = setTimeout(() => {\n if (!this.isConnected) {\n // Clean up resources on timeout\n const clientToCleanup = this.client;\n this.connectionTimeout = undefined;\n\n // Close and clear the client connection\n if (clientToCleanup) {\n try {\n clientToCleanup.close();\n } catch (cleanupError) {\n console.error('Error closing client on timeout:', cleanupError);\n }\n this.client = null;\n }\n\n // Reset connection state\n this.isConnected = false;\n this.sessionId = null;\n this.channel = null;\n this.messageUnsubscribe = null;\n\n reject(new Error('Ably connection timeout'));\n }\n }, 10000);\n });\n\n // Subscribe to the session room\n await this.joinChannel(\n sessionId,\n onMessageReceived,\n tenantId,\n onActionReceived,\n );\n } catch (error) {\n console.error('Error during Ably connection setup:', error);\n\n // Clean up resources on error (including timeout)\n if (this.client) {\n try {\n this.client.close();\n } catch (cleanupError) {\n console.error('Error closing client on error:', cleanupError);\n }\n this.client = null;\n }\n\n // Clear connection timeout if still pending\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n\n // Reset all connection state\n this.isConnected = false;\n this.sessionId = null;\n this.channel = null;\n this.messageUnsubscribe = null;\n\n throw error;\n }\n }\n\n private static async joinChannel(\n sessionId: string,\n onMessageReceived: MessageReceivedCallback,\n tenantId: string,\n onActionReceived?: ActionHandlerCallback,\n ) {\n if (!this.client) {\n throw new Error('Chat client not initialized');\n }\n\n const roomName = `session:${tenantId}:${sessionId}`;\n\n // Set up raw channel subscription for server messages\n if (this.client) {\n this.channel = this.client.channels.get(roomName);\n\n // Subscribe to assistant/system responses\n this.channel.subscribe('ReceiveMessage', (message) => {\n try {\n const messageData =\n typeof message.data === 'string'\n ? { content: message.data }\n : message.data || {};\n const messageContent =\n typeof messageData === 'string'\n ? messageData\n : messageData?.content || messageData?.message || '';\n const senderType = messageData?.senderType || 3; // Assistant\n // Extract attachments from backend (can be array of strings/objects or empty string)\n // Backend sends attachments as array when present, empty string when none\n const attachmentsRaw = messageData?.attachments;\n const attachmentIdsRaw = messageData?.attachmentIds;\n // Prioritize attachments array if it exists and has items, otherwise check attachmentIds field\n // If attachments is an array with items, use it; else if attachmentIds is an array, use it; else use attachmentsRaw (might be empty string)\n const rawAttachments =\n Array.isArray(attachmentsRaw) && attachmentsRaw.length > 0\n ? attachmentsRaw\n : Array.isArray(attachmentIdsRaw) && attachmentIdsRaw.length > 0\n ? attachmentIdsRaw\n : (attachmentsRaw ?? attachmentIdsRaw);\n const attachmentIds = this.normalizeAttachmentIds(rawAttachments);\n const actionType = messageData?.actionType;\n\n // Handle action type using extensible action handler\n // This supports all action types (known and unknown) in a safe, extensible way\n if (\n onActionReceived &&\n actionType !== undefined &&\n actionType !== null\n ) {\n // Execute action handler (may be async, but we don't await to avoid blocking message processing)\n Promise.resolve(onActionReceived(actionType, messageData)).catch(\n (error) => {\n console.error('Error handling action type:', actionType, error);\n },\n );\n }\n\n // Extract needsAgent flag (for backward compatibility)\n // This is separate from action handling to maintain existing behavior\n const needsAgent =\n messageData?.needsAgent ||\n messageData?.actionType == 'needs_agent' ||\n false;\n\n // Pass message as object if it has attachments, otherwise as string for backward compatibility\n const messageToPass =\n attachmentIds.length > 0\n ? { content: messageContent, attachments: attachmentIds }\n : messageContent;\n\n onMessageReceived(messageToPass, senderType, needsAgent);\n } catch (error) {\n console.error('Error processing ReceiveMessage:', error);\n }\n });\n\n await this.channel.attach();\n }\n }\n\n static async stopConnection() {\n try {\n // Clear connection timeout if still pending\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n\n // Unsubscribe from room messages\n if (this.messageUnsubscribe) {\n this.messageUnsubscribe();\n this.messageUnsubscribe = null;\n }\n\n // Unsubscribe and detach from raw channel\n if (this.channel) {\n this.channel.unsubscribe();\n await this.channel.detach();\n this.channel = null;\n }\n\n // Close Ably connection\n if (this.client) {\n this.client.close();\n this.client = null;\n }\n\n this.isConnected = false;\n this.sessionId = null;\n } catch (error) {\n console.error('Error stopping Ably connection:', error);\n // Reset state even if there's an error\n this.isConnected = false;\n this.sessionId = null;\n this.client = null;\n this.channel = null;\n this.messageUnsubscribe = null;\n this.connectionTimeout = undefined;\n }\n }\n\n static isConnectionActive(): boolean {\n return this.isConnected && this.client?.connection.state === 'connected';\n }\n\n static getConnectionState(): string {\n return this.client?.connection.state || 'disconnected';\n }\n\n // Method to manually send a message (if needed for debugging or direct messaging)\n static async sendMessage(messageContent: string, senderType: number = 1) {\n if (!this.channel || !this.isConnected) {\n throw new Error('Connection not active');\n }\n\n try {\n const messageData = {\n text: messageContent,\n metadata: {\n senderType,\n sentAt: new Date().toISOString(),\n },\n };\n\n await this.channel.publish('message', messageData);\n } catch (error) {\n console.error('Error sending message:', error);\n throw error;\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport * as Ably from 'ably';\nimport { Option } from '../types';\nimport { ClientAblyService } from './ably.service';\nimport { ActionHandlerService } from './action-handler.service';\nimport { ApiService } from './api.service';\n\n/**\n * Service for managing chat session lifecycle and operations.\n *\n * Handles:\n * - Chat session creation and management\n * - Ably connection management\n * - Message sending operations\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ChatSessionService {\n private apiService = inject(ApiService);\n private actionHandlerService = inject(ActionHandlerService);\n\n /**\n * Creates a new chat session with the specified option.\n *\n * @param option The help screen option to create a chat session for\n * @param helpScreenId The help screen ID\n * @param currentLang Current language code for API headers\n * @returns Promise resolving to session data including sessionId and ablyToken\n * @throws Error if session creation fails\n */\n async createSession(\n option: Option,\n helpScreenId: string,\n currentLang: string,\n ): Promise<{ chatSession: { id: string }; ablyToken: string }> {\n const chatSessionCreateDto = {\n optionId: option.id,\n helpScreenId: helpScreenId,\n };\n\n const response = await this.apiService.apiRequest(\n 'Client/ClientChatSession/create-session',\n 'POST',\n chatSessionCreateDto,\n {\n 'Accept-Language': currentLang,\n },\n );\n\n return await response.json();\n }\n\n /**\n * Establishes Ably real-time connection for a chat session.\n *\n * @param sessionId The chat session ID\n * @param ablyToken The Ably authentication token\n * @param onMessageReceived Callback function for received messages\n * @param tenantId The tenant ID for the connection\n * @param option Optional option for token refresh (needed for token renewal)\n * @param helpScreenId Optional help screen ID for token refresh\n * @param currentLang Optional current language for token refresh\n * @param onActionReceived Optional callback function for handling action types\n */\n async establishAblyConnection(\n sessionId: string,\n ablyToken: string,\n onMessageReceived: (\n message: string | { content: string; attachments?: string[] },\n senderType: number,\n needsAgent: boolean,\n ) => void,\n tenantId: string,\n option?: Option,\n helpScreenId?: string,\n currentLang?: string,\n onActionReceived?: (\n actionType: string,\n messageData: any,\n ) => void | Promise<void>,\n ): Promise<void> {\n // Create token refresh callback if context is provided\n let getAblyToken:\n | ((tokenParams: Ably.TokenParams) => Promise<Ably.TokenDetails | string>)\n | undefined;\n\n if (option && helpScreenId && currentLang) {\n getAblyToken = async () => {\n try {\n // This callback is only called when the token needs to be refreshed\n // The initial token is provided via the 'token' option in Ably client options\n // Create a new session to get a fresh token\n // Note: This will create a new session, but we keep using the original sessionId\n // In the future, if there's a dedicated refresh endpoint, use that instead\n const sessionData = await this.createSession(\n option,\n helpScreenId,\n currentLang,\n );\n return sessionData.ablyToken;\n } catch (error) {\n console.error('Error refreshing Ably token:', error);\n throw error;\n }\n };\n }\n\n // Create action handler callback that uses the ActionHandlerService\n const actionHandler =\n onActionReceived ||\n ((actionType: string, messageData: any) => {\n this.actionHandlerService.handleAction(actionType, messageData);\n });\n\n await ClientAblyService.startConnection(\n sessionId,\n ablyToken,\n onMessageReceived,\n tenantId,\n getAblyToken,\n actionHandler,\n );\n }\n\n /**\n * Sends a message in an active chat session.\n *\n * @param sessionId The chat session ID\n * @param messageContent The message content to send\n * @param currentLang Current language code for API headers\n * @throws Error if message sending fails\n */\n async sendMessage(\n sessionId: string,\n messageContent: string,\n currentLang: string,\n attachmentIds?: string[],\n ): Promise<void> {\n const messageDto: { messageContent: string; attachmentIds?: string[] } = {\n messageContent,\n };\n if (attachmentIds && attachmentIds.length > 0) {\n messageDto.attachmentIds = attachmentIds;\n }\n\n await this.apiService.apiRequest(\n `Client/ClientChatSession/${sessionId}/send-message`,\n 'POST',\n messageDto,\n {\n 'Accept-Language': currentLang,\n },\n );\n }\n\n /**\n * Closes a chat session.\n *\n * @param sessionId The chat session ID to close\n * @param currentLang Current language code for API headers\n * @returns Promise resolving to the close response\n * @throws Error if session closing fails\n */\n async closeSession(sessionId: string, currentLang: string): Promise<unknown> {\n const response = await this.apiService.apiRequest(\n `Client/ClientChatSession/${sessionId}/close`,\n 'POST',\n null,\n {\n 'Accept-Language': currentLang,\n },\n );\n\n return await response.json();\n }\n\n /**\n * Submits a review for a chat session.\n *\n * @param sessionId The chat session ID\n * @param rating Rating value (1-5)\n * @param comment Review comment (10-500 characters)\n * @param currentLang Current language code for API headers\n * @throws Error if review submission fails\n */\n async submitReview(\n sessionId: string,\n rating: number,\n comment: string,\n currentLang: string,\n ): Promise<void> {\n const reviewPayload = {\n rating,\n comment,\n };\n\n await this.apiService.apiRequest(\n `Client/ClientChatSession/${sessionId}/review`,\n 'POST',\n reviewPayload,\n {\n 'Accept-Language': currentLang,\n },\n );\n }\n\n /**\n * Stops the Ably connection.\n */\n async stopConnection(): Promise<void> {\n await ClientAblyService.stopConnection();\n }\n\n /**\n * Checks if Ably connection is active.\n *\n * @returns True if connection is active, false otherwise\n */\n isConnectionActive(): boolean {\n return ClientAblyService.isConnectionActive();\n }\n}\n","// src/app/services/translation.service.ts\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Language } from '../types';\n\nexport type TranslationKey =\n | 'ChatIntroMessage'\n | 'BabylaiTitle'\n | 'BabylaiDescription'\n | 'ChatNow'\n | 'TryBableAI'\n | 'ContactUs'\n | 'HelpCenter'\n | 'BabylAI'\n | 'ChatPlaceholder'\n | 'PoweredByBabylAI'\n | 'EndChat'\n | 'LeavingDialogTitle'\n | 'LeavingDialogBody'\n | 'StartNewChatDialogTitle'\n | 'StartNewChatDialogBody'\n | 'ReviewDialogTitle'\n | 'ReviewDialogDescription'\n | 'ReviewDialogRatingLabel'\n | 'ReviewDialogCommentLabel'\n | 'ReviewDialogCommentPlaceholder'\n | 'ReviewDialogSubmitButton'\n | 'ReviewDialogSkipButton'\n | 'Confirm'\n | 'Cancel'\n | 'Close'\n | 'Back'\n | 'title'\n | 'ErrorFetchingHelpScreen'\n | 'ErrorSendingMessage'\n | 'ErrorStartingChat'\n | 'ErrorEndingChat'\n | 'ErrorSubmittingReview'\n | 'ErrorClosingChat'\n | 'ErrorCreatingSession'\n | 'ErrorNetworkFailure'\n | 'ErrorUnknown'\n | 'ErrorMessageTooLong'\n | 'ErrorMessageEmpty'\n | 'CloseChat'\n | 'Continue';\n/**\n * Service for managing translations and language switching.\n *\n * Supports multiple languages (currently English and Arabic) with RTL support.\n * Provides reactive language changes through Observable pattern.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationService {\n private translations = {\n en: {\n ChatIntroMessage: 'Chat with BabylAI 🚀',\n BabylaiTitle: 'BabylAI',\n BabylaiDescription: \"Hey there! 👋 I'm BabylAI, here to assist you.\",\n ChatNow: 'Chat Now',\n TryBableAI: 'Try BabylAI for Free 🎉',\n ContactUs: \"Contact us, Let's Talk! 💬\",\n HelpCenter: 'Help Center',\n BabylAI: 'BabylAI',\n ChatPlaceholder: 'Type your message...',\n PoweredByBabylAI: 'Powered by',\n EndChat: 'End Chat',\n LeavingDialogTitle: 'Leaving so soon? 👋',\n LeavingDialogBody:\n \"Don't worry, you can come back anytime. We're always here if you need help or have questions.\",\n StartNewChatDialogTitle: 'End and Start New Chat',\n StartNewChatDialogBody:\n 'Are you sure you want to end the current conversation and start a new one?',\n ReviewDialogTitle: \"We'd Love Your Feedback!\",\n ReviewDialogDescription:\n 'Your opinion helps us improve and deliver better support. Please rate your experience with our service and let us know how we did.',\n ReviewDialogRatingLabel: 'Rating:',\n ReviewDialogCommentLabel:\n 'Awesome! We’re glad you enjoyed chatting with us. Could you rate your overall experience to help us keep it that way?',\n ReviewDialogCommentPlaceholder: 'Write your comment here...',\n ReviewDialogSubmitButton: 'Submit Review',\n ReviewDialogSkipButton: 'Skip',\n Confirm: 'Confirm',\n Cancel: 'Cancel',\n Close: 'Close',\n Back: 'Back',\n title: 'Help Center',\n ErrorFetchingHelpScreen: 'Failed to load help screen. Please try again.',\n ErrorSendingMessage: 'Failed to send the message. Please try again.',\n ErrorStartingChat: 'Failed to start chat. Please try again.',\n ErrorEndingChat: 'Failed to end chat. Please try again.',\n ErrorSubmittingReview: 'Failed to submit review. Please try again.',\n ErrorClosingChat: 'Failed to close chat session.',\n ErrorCreatingSession: 'Failed to create chat session. Please try again.',\n ErrorNetworkFailure:\n 'Network error. Please check your connection and try again.',\n ErrorUnknown: 'An unexpected error occurred. Please try again.',\n ErrorMessageTooLong:\n 'Message is too long. Maximum 5000 characters allowed.',\n ErrorMessageEmpty: 'Message cannot be empty.',\n CloseChat: 'Close Chat',\n Continue: 'Continue',\n },\n ar: {\n ChatIntroMessage: 'دردش مع BabylAI 🚀',\n BabylaiTitle: 'BabylAI',\n BabylaiDescription: 'مرحبا! 👋 أنا BabylAI، هنا لتساعدك.',\n ChatNow: 'دعنا نتحدث',\n TryBableAI: 'جرب BabylAI مجانا 🎉',\n ContactUs: 'تواصل معنا, دعنا نتحدث! 💬',\n HelpCenter: 'مركز المساعدة',\n BabylAI: 'BabylAI',\n ChatPlaceholder: 'اكتب رسالتك...',\n PoweredByBabylAI: 'مدعوم من',\n EndChat: 'إنهاء الدردشة',\n LeavingDialogTitle: 'هل تغادر بالفعل؟ 👋',\n LeavingDialogBody:\n 'لا تقلق، يمكنك العودة في أي وقت. نحن دائماً هنا إذا كنت بحاجة إلى مساعدة أو لديك أسئلة.',\n StartNewChatDialogTitle: 'إنهاء وبدء دردشة جديدة',\n StartNewChatDialogBody:\n 'هل أنت متأكد من أنك تريد إنهاء المحادثة الحالية وبدء محادثة جديدة؟',\n ReviewDialogTitle: 'كيف كانت تجربتك معنا؟',\n ReviewDialogDescription:\n 'نقدر ملاحظاتك! يرجى قضاء لحظة لتقييم تجربتك ومشاركة أفكارك في قسم التعليقات أدناه. تقييمك يساعدنا في تحسين خدماتنا ويساعد المستخدمين الآخرين في اتخاذ قرارات مدروسة. شكراً لك!',\n ReviewDialogRatingLabel: 'التقييم:',\n ReviewDialogCommentLabel:\n 'شكراً لك! يرجى قضاء لحظة لتقييم تجربتك ومشاركة أفكارك في قسم التعليقات أدناه. تقييمك يساعدنا في تحسين خدماتنا ويساعد المستخدمين الآخرين في اتخاذ قرارات مدروسة.',\n ReviewDialogCommentPlaceholder: 'اكتب تعليقك هنا...',\n ReviewDialogSubmitButton: 'إرسال التقييم',\n ReviewDialogSkipButton: 'تخطي',\n Confirm: 'تأكيد',\n Cancel: 'إلغاء',\n Close: 'إغلاق',\n Back: 'رجوع',\n title: 'مركز المساعدة',\n ErrorFetchingHelpScreen:\n 'فشل في تحميل شاشة المساعدة. يرجى المحاولة مرة أخرى.',\n ErrorSendingMessage: 'لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',\n ErrorStartingChat: 'فشل في بدء المحادثة. يرجى المحاولة مرة أخرى.',\n ErrorEndingChat: 'فشل في إنهاء المحادثة. يرجى المحاولة مرة أخرى.',\n ErrorSubmittingReview: 'فشل في إرسال التقييم. يرجى المحاولة مرة أخرى.',\n ErrorClosingChat: 'فشل في إغلاق جلسة الدردشة.',\n ErrorCreatingSession:\n 'فشل في إنشاء جلسة الدردشة. يرجى المحاولة مرة أخرى.',\n ErrorNetworkFailure:\n 'خطأ في الشبكة. يرجى التحقق من الاتصال والمحاولة مرة أخرى.',\n ErrorUnknown: 'حدث خطأ غير متوقع. يرجى المحاولة مرة أخرى.',\n ErrorMessageTooLong: 'الرسالة طويلة جداً. الحد الأقصى 5000 حرف.',\n ErrorMessageEmpty: 'لا يمكن أن تكون الرسالة فارغة.',\n CloseChat: 'إغلاق الدردشة',\n Continue: 'متابعة',\n },\n };\n\n private _currentLang = new BehaviorSubject<Language>('en');\n public readonly currentLang: Observable<Language> =\n this._currentLang.asObservable();\n\n /**\n * Translates a translation key to the current language.\n *\n * @param key Translation key to look up\n * @returns Translated string in the current language, or the key itself if translation not found\n *\n * @example\n * ```typescript\n * const message = translationService.translate('ChatNow');\n * // Returns 'Let\\'s Chat' in English or 'دعنا نتحدث' in Arabic\n * ```\n */\n translate(key: TranslationKey): string {\n const lang = this._currentLang.value as Language;\n return this.translations[lang][key] || key;\n }\n\n /**\n * Sets the current language for translations.\n *\n * @param lang Language code ('en' or 'ar')\n *\n * @example\n * ```typescript\n * translationService.setLanguage('ar'); // Switch to Arabic\n * ```\n */\n setLanguage(lang: Language) {\n this._currentLang.next(lang);\n }\n\n /**\n * Gets the current language code.\n *\n * @returns Current language code ('en' or 'ar')\n */\n getCurrentLang(): Language {\n return this._currentLang.value;\n }\n}\n","// src/app/language.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { TranslationService } from './services/translation.service';\nimport { Language } from './types';\n\n/**\n * Service for managing language switching.\n *\n * Provides a simplified interface for switching between supported languages.\n * This service wraps TranslationService for easier language management.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LanguageService {\n private translationService = inject(TranslationService);\n\n /**\n * Switches the application language.\n *\n * @param language Language code to switch to ('en' or 'ar')\n *\n * @example\n * ```typescript\n * languageService.switchLanguage('ar'); // Switch to Arabic\n * ```\n */\n switchLanguage(language: Language) {\n this.translationService.setLanguage(language);\n }\n\n /**\n * Gets the current application language.\n *\n * @returns Current language code ('en' or 'ar')\n */\n getCurrentLang(): Language {\n return this.translationService.getCurrentLang();\n }\n}\n","import {\n HttpClient,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n} from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, forkJoin, from, throwError } from 'rxjs';\nimport { catchError, filter, map, switchMap } from 'rxjs/operators';\nimport { LanguageService } from '../language.service';\nimport {\n PresignDownloadResponse,\n PresignUploadRequestDto,\n PresignUploadResponse,\n UploadResult,\n} from '../types';\nimport { ApiService } from './api.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FileUploadService {\n private readonly http = inject(HttpClient);\n private readonly apiService = inject(ApiService);\n private readonly languageService = inject(LanguageService);\n\n /**\n * Get presigned upload URL from the API\n */\n presignUpload(\n chatSessionId: string,\n file: File,\n ): Observable<PresignUploadResponse> {\n const request: PresignUploadRequestDto = {\n name: file.name,\n contentType: file.type,\n sizeBytes: file.size,\n pathData: {\n type: 1,\n chatSessionId,\n },\n };\n\n return from(\n this.apiService.apiRequest('NewFile/presign-upload', 'POST', request, {\n 'Accept-Language': this.languageService.getCurrentLang(),\n }),\n ).pipe(\n switchMap(async (response) => await response.json()),\n map((data: PresignUploadResponse) => data),\n catchError((error) => {\n console.error('Error getting presigned upload URL:', error);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Upload file to S3 using presigned URL\n * Returns Observable with progress events\n */\n uploadToS3(uploadUrl: string, file: File): Observable<HttpEvent<any>> {\n const headers = new HttpHeaders({\n 'Content-Type': file.type,\n });\n\n return this.http\n .put(uploadUrl, file, {\n headers,\n reportProgress: true,\n observe: 'events',\n })\n .pipe(\n catchError((error) => {\n if (error.status === 0) {\n console.error(\n 'CORS error - S3 bucket needs CORS configuration',\n error,\n );\n }\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Get presigned download URL for a file\n */\n presignDownload(fileId: string): Observable<PresignDownloadResponse> {\n return from(\n this.apiService.apiRequest(\n `NewFile/${fileId}/presign-download`,\n 'GET',\n null,\n {\n 'Accept-Language': this.languageService.getCurrentLang(),\n },\n ),\n ).pipe(\n switchMap(async (response) => await response.json()),\n map((data: PresignDownloadResponse) => data),\n catchError((error) => {\n console.error(`Failed to get download URL for ${fileId}`, error);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Upload multiple files in parallel\n * Returns array of upload results\n */\n uploadFiles(\n chatSessionId: string,\n files: File[],\n ): Observable<UploadResult[]> {\n if (files.length === 0) {\n return new Observable((observer) => {\n observer.next([]);\n observer.complete();\n });\n }\n\n // Upload files in parallel\n const uploadObservables = files.map((file) =>\n this.uploadSingleFile(chatSessionId, file),\n );\n\n // Use forkJoin to wait for all uploads to complete\n return forkJoin(uploadObservables);\n }\n\n /**\n * Upload a single file\n */\n private uploadSingleFile(\n chatSessionId: string,\n file: File,\n ): Observable<UploadResult> {\n return this.presignUpload(chatSessionId, file).pipe(\n switchMap((presignResponse) =>\n this.uploadToS3(presignResponse.uploadUrl, file).pipe(\n // Filter to get only the final response event\n filter((event) => event.type === HttpEventType.Response),\n map((event) => {\n if (event.status === 200 || event.status === 204) {\n return {\n fileId: presignResponse.id,\n success: true,\n } as UploadResult;\n }\n return {\n fileId: presignResponse.id,\n success: false,\n error: `Upload failed with status ${event.status}`,\n } as UploadResult;\n }),\n catchError((error) => {\n return new Observable<UploadResult>((observer) => {\n observer.next({\n fileId: presignResponse.id,\n success: false,\n error: error.message || 'Upload failed',\n });\n observer.complete();\n });\n }),\n ),\n ),\n catchError((error) => {\n return new Observable<UploadResult>((observer) => {\n observer.next({\n fileId: '',\n success: false,\n error: error.message || 'Failed to get presigned URL',\n });\n observer.complete();\n });\n }),\n );\n }\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeService {\n private primaryColor: string = '#ad49e1';\n private logoUrl: string = '';\n private isDarkMode = signal(false);\n private mediaQuery?: MediaQueryList;\n private mediaQueryListener?: (event: MediaQueryListEvent) => void;\n\n constructor() {\n this.initializeDarkModeDetection();\n }\n\n /**\n * Initialize dark mode detection based on browser preferences\n */\n private initializeDarkModeDetection(): void {\n // Check initial preference\n this.updateDarkModeState();\n\n // Listen for changes in color scheme preference\n if (typeof window !== 'undefined' && window.matchMedia) {\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n // Store listener reference for cleanup\n this.mediaQueryListener = () => {\n this.updateDarkModeState();\n };\n\n // Add listener for changes\n this.mediaQuery.addEventListener('change', this.mediaQueryListener);\n }\n }\n\n /**\n * Cleanup method to remove event listeners\n * Should be called when service is no longer needed (e.g., in tests or if service scope changes)\n */\n cleanup(): void {\n if (this.mediaQuery && this.mediaQueryListener) {\n this.mediaQuery.removeEventListener('change', this.mediaQueryListener);\n this.mediaQuery = undefined;\n this.mediaQueryListener = undefined;\n }\n }\n\n /**\n * Update dark mode state based on current browser preference\n */\n private updateDarkModeState(): void {\n if (typeof window !== 'undefined' && window.matchMedia) {\n const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n this.isDarkMode.set(isDark);\n }\n }\n\n /**\n * Get current dark mode state\n */\n getDarkModeState() {\n return this.isDarkMode.asReadonly();\n }\n\n /**\n * Check if dark mode is currently active\n */\n isDarkModeActive(): boolean {\n return this.isDarkMode();\n }\n\n setPrimaryColor(color: string): void {\n this.primaryColor = color;\n this.updateCSSVariables();\n }\n\n setLogoUrl(url: string): void {\n this.logoUrl = url;\n }\n\n getPrimaryColor(): string {\n return this.primaryColor;\n }\n\n getLogoUrl(): string {\n return this.logoUrl;\n }\n\n private updateCSSVariables(): void {\n const root = document.documentElement;\n\n // Generate color variations based on the primary color\n const colorVariations = this.generateColorVariations(this.primaryColor);\n\n // Set CSS custom properties\n root.style.setProperty('--babylai-primary-color', this.primaryColor);\n root.style.setProperty('--babylai-primary-color-100', colorVariations[100]);\n root.style.setProperty('--babylai-primary-color-200', colorVariations[200]);\n root.style.setProperty('--babylai-primary-color-300', colorVariations[300]);\n root.style.setProperty('--babylai-primary-color-400', colorVariations[400]);\n root.style.setProperty('--babylai-primary-color-500', colorVariations[500]);\n root.style.setProperty('--babylai-primary-color-600', colorVariations[600]);\n root.style.setProperty('--babylai-primary-color-700', colorVariations[700]);\n root.style.setProperty('--babylai-primary-color-800', colorVariations[800]);\n root.style.setProperty('--babylai-primary-color-900', colorVariations[900]);\n root.style.setProperty('--babylai-primary-color-950', colorVariations[950]);\n }\n\n private generateColorVariations(baseColor: string): {\n [key: number]: string;\n } {\n // Generate variations by adjusting lightness\n const variations: { [key: number]: string } = {};\n\n variations[100] = this.lightenColor(baseColor, 0.85);\n variations[200] = this.lightenColor(baseColor, 0.65);\n variations[300] = this.lightenColor(baseColor, 0.45);\n variations[400] = this.lightenColor(baseColor, 0.25);\n variations[500] = baseColor; // Base color\n variations[600] = this.darkenColor(baseColor, 0.35);\n variations[700] = this.darkenColor(baseColor, 0.55);\n variations[800] = this.darkenColor(baseColor, 0.75);\n variations[900] = this.darkenColor(baseColor, 0.85);\n variations[950] = this.darkenColor(baseColor, 0.92);\n\n return variations;\n }\n\n /**\n * Lighten a color by a percentage\n */\n private lightenColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n // Use HSL-like approach for more natural lightening\n const newR = Math.round(r + (255 - r) * amount);\n const newG = Math.round(g + (255 - g) * amount);\n const newB = Math.round(b + (255 - b) * amount);\n\n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\n }\n\n /**\n * Darken a color by a percentage\n */\n private darkenColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n // Use HSL-like approach for more natural darkening\n const newR = Math.round(r * (1 - amount));\n const newG = Math.round(g * (1 - amount));\n const newB = Math.round(b * (1 - amount));\n\n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\n }\n\n initializeTheme(primaryColor: string, logoUrl: string): void {\n this.setPrimaryColor(primaryColor);\n this.setLogoUrl(logoUrl);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\n\n@Component({\n selector: 'app-arrow-animation',\n templateUrl: './arrow-animation.component.html',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ArrowAnimationComponent {\n showArrowAnimation = input<boolean>(false);\n isPopupOpen = input<boolean>(false);\n messageLabel = input<string | null>(null);\n closeArrowAnimation = output<void>();\n\n handleCloseArrowAnimation() {\n this.closeArrowAnimation.emit();\n }\n}\n","@if (showArrowAnimation() && !isPopupOpen()) {\n<div class=\"babylai:fixed babylai:bottom-20 babylai:right-6 babylai:z-9997 animate-float\">\n <div class=\"babylai:relative babylai:bg-primary babylai:rounded-full babylai:mb-4 babylai:shadow-lg babylai:px-4 babylai:py-3 babylai:max-w-xs\">\n <p class=\"babylai:text-xs babylai:mb-0 babylai:text-white babylai:max-w-40\">\n {{ messageLabel() || \"Need assistance Or You want to try the Product? Click here\" }}\n </p>\n <button \n class=\"babylai:absolute babylai:-top-2 babylai:right-0 babylai:w-5 babylai:h-5 babylai:cursor-pointer babylai:p-1.5 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:hover:bg-secondary babylai:text-card-foreground babylai:transition-colors babylai:bg-card babylai:shadow-lg babylai:border babylai:border-black-white-200\" \n (click)=\"handleCloseArrowAnimation()\"\n type=\"button\"\n [attr.aria-label]=\"'Close'\"\n >\n <svg class=\"babylai:w-3 babylai:h-3\" viewBox=\"0 0 12 12\">\n <path\n d=\"M1 1L11 11M1 11L11 1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n </svg>\n </button>\n <div class=\"babylai:absolute babylai:bottom-[-8px] babylai:right-6 babylai:w-0 babylai:h-0 babylai:border-l-8 babylai:border-r-8 babylai:border-t-8 babylai:border-l-transparent babylai:border-r-transparent babylai:border-t-primary\"></div>\n </div>\n</div>\n}\n","// src/app/pipes/translate.pipe.ts\nimport { Pipe, PipeTransform, inject } from '@angular/core';\nimport {\n TranslationKey,\n TranslationService,\n} from '../services/translation.service';\n\n/**\n * Angular pipe for translating keys in templates.\n *\n * Usage in templates:\n * ```html\n * {{ 'ChatNow' | translate }}\n * ```\n *\n * @publicApi\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n})\nexport class TranslatePipe implements PipeTransform {\n private translationService = inject(TranslationService) as TranslationService;\n\n /**\n * Transforms a translation key into the translated string for the current language.\n *\n * @param key Translation key to look up\n * @returns Translated string in the current language\n */\n transform(key: TranslationKey): string {\n return this.translationService.translate(key);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\n\ntype ButtonVariant = 'default' | 'icon-bg' | 'icon-only' | 'outline';\ntype ButtonType = 'button' | 'submit' | 'reset';\n\n@Component({\n selector: 'app-button',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonComponent {\n variant = input<ButtonVariant>();\n type = input<ButtonType>('button');\n disabled = input<boolean>(false);\n fullWidth = input<boolean>(false);\n className = input<string>('');\n size = input<'default' | 'small' | 'medium'>('default');\n onClick = output<MouseEvent>();\n\n getButtonClasses = computed(() => {\n const classes = [\n 'babylai:border babylai:disabled:bg-black-white-300 babylai:cursor-pointer babylai:text-xl! babylai:transition-all babylai:w-full babylai:disabled:border-black-white-300 babylai:disabled:cursor-not-allowed babylai:disabled:text-white babylai:duration-200 babylai:ease-out babylai:flex babylai:gap-1 babylai:items-center babylai:justify-center babylai:p-3 babylai:relative babylai:rounded-2xl',\n ];\n\n // Add variant-specific classes\n if (this.variant() === 'default') {\n classes.push(\n 'babylai:bg-primary babylai:border-primary babylai:text-white babylai:hover:bg-primary-600 babylai:hover:border-primary-600',\n );\n } else if (this.variant() === 'outline') {\n classes.push(\n 'babylai:bg-transparent babylai:border-primary babylai:text-primary babylai:hover:bg-primary-100 babylai:hover:border-primary-200',\n );\n } else if (this.variant() === 'icon-bg') {\n if (this.className().includes('babylai:white-bg')) {\n classes.push('babylai:bg-white');\n } else if (this.className().includes('babylai:light-bg')) {\n // Will be handled by CSS variables\n }\n if (this.size() === 'small') {\n classes.push('babylai:p-2', 'babylai:w-7', 'babylai:h-7');\n } else {\n classes.push('babylai:p-3');\n }\n } else if (this.variant() === 'icon-only') {\n classes.push(\n 'babylai:bg-transparent',\n 'babylai:border-none',\n 'babylai:p-1',\n 'babylai:flex',\n 'babylai:items-center',\n 'babylai:justify-center',\n );\n }\n\n // Add full width class if needed\n if (this.fullWidth()) {\n classes.push('babylai:w-full', 'babylai:flex');\n }\n\n // Add custom classes\n if (this.className()) {\n classes.push(this.className());\n }\n\n return classes.join(' ');\n });\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"disabled()\"\n [class]=\"getButtonClasses()\"\n (click)=\"onClick.emit($event)\"\n dir=\"auto\"\n>\n <ng-content></ng-content>\n</button>\n\n","import {\n ChangeDetectionStrategy,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n input,\n} from '@angular/core';\n\n// Import iconify-icon to register the custom element\nimport 'iconify-icon';\n\n@Component({\n selector: 'app-icon',\n imports: [],\n templateUrl: './icon.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class IconComponent {\n // Icon name from Solar icon set (e.g., 'solar:home-bold', 'solar:chat-round-bold')\n name = input.required<string>();\n\n // Size of the icon (can be a number or string like '24px', '1em', etc.)\n size = input<string | number>('1.2em');\n\n // Color of the icon (CSS color value)\n color = input<string>('currentColor');\n\n // Additional CSS classes\n className = input<string>('babylai:flex');\n\n // Whether the icon should be inline\n inline = input<boolean>(false);\n\n // Flip the icon horizontally\n flip = input<'horizontal' | 'vertical' | 'both' | undefined>(undefined);\n\n // Rotate the icon (degrees or '90deg', '180deg', etc.)\n rotate = input<string | number | undefined>(undefined);\n}\n","<iconify-icon\n [icon]=\"name()\"\n [style.width]=\"typeof size() === 'number' ? size() + 'px' : size()\"\n [style.height]=\"typeof size() === 'number' ? size() + 'px' : size()\"\n [style.font-size]=\"typeof size() === 'number' ? size() + 'px' : size()\"\n [style.color]=\"color()\"\n [class]=\"className()\"\n [attr.inline]=\"inline() ? '' : null\"\n [attr.flip]=\"flip() || null\"\n [attr.rotate]=\"rotate() ? (typeof rotate() === 'number' ? rotate() + 'deg' : rotate()) : null\"\n></iconify-icon>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { ButtonComponent } from '../../../shared/components/button';\nimport { IconComponent } from '../../../shared/components/icon';\n\ninterface Option {\n id: string;\n helpScreenId: string;\n parentOptionId: string | null;\n nestedOptions: Option[];\n title: string;\n paragraphs: string[];\n chatWithUs: boolean;\n assistantId?: string;\n assistant?: {\n id: string;\n tenantId: string;\n tenant: {\n id: string;\n name: string;\n key: string;\n };\n name: string;\n openAIAssistantId: string;\n greeting: string;\n closing: string;\n };\n hasNestedOptions: boolean;\n order: number;\n}\n\n@Component({\n selector: 'app-chat-action-buttons',\n templateUrl: './chat-action-buttons.component.html',\n standalone: true,\n imports: [CommonModule, TranslatePipe, ButtonComponent, IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatActionButtonsComponent {\n selectedOption = input<Option | null>(null);\n\n closeChat = output<Option>();\n continueChat = output<void>();\n\n handleCloseChat() {\n const option = this.selectedOption();\n if (option) {\n this.closeChat.emit(option);\n }\n }\n\n handleContinueChat() {\n this.continueChat.emit();\n }\n}\n","<section class=\"babylai:flex babylai:justify-between babylai:gap-3 babylai:px-4 babylai:py-6 babylai:absolute babylai:left-0 babylai:right-0 babylai:bottom-11 babylai:z-20 babylai:bg-linear-to-t babylai:from-card babylai:to-transparent babylai:from-[28.32%] babylai:to-[112.59%]\">\n <app-button\n variant=\"outline\"\n [fullWidth]=\"true\"\n (onClick)=\"handleCloseChat()\"\n class=\"babylai:w-full\"\n >\n {{ \"CloseChat\" | translate }}\n </app-button>\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n (onClick)=\"handleContinueChat()\"\n class=\"babylai:w-full\"\n >\n {{ \"Continue\" | translate }}\n <app-icon name=\"solar:plain-2-bold-duotone\" class=\"babylai:flex\" size=\"24px\" />\n </app-button>\n</section>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { IconComponent } from '../../../shared/components/icon';\n\n@Component({\n selector: 'app-chat-avatar',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './chat-avatar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatAvatarComponent {\n senderType = input<number>(1);\n needsAgent = input<boolean>(false);\n isHidden = input<boolean>(false);\n}\n","<div\n [class.babylai:invisible]=\"isHidden()\"\n role=\"img\"\n [attr.aria-label]=\"\n senderType() === 3\n ? 'Assistant avatar'\n : needsAgent() || senderType() === 2\n ? 'Agent avatar'\n : 'User avatar'\n \"\n>\n @if (senderType() === 3) {\n <span\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:w-8 babylai:h-8 babylai:rounded-full babylai:p-2 babylai:bg-primary babylai:text-primary\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 13 13\"\n fill=\"currentColor\"\n >\n <path\n d=\"M0 3.32671C0 1.48942 1.48942 0 3.32672 0H8.87124C10.7085 0 12.198 1.48942 12.198 3.32672V8.87124C12.198 10.7085 10.7085 12.198 8.87124 12.198H0V3.32671Z\"\n fill=\"white\"\n />\n <path\n d=\"M3.84993 4.07931C3.85024 4.07821 3.85039 4.07767 3.85047 4.07741C3.89874 3.90812 4.13867 3.90812 4.18695 4.07741C4.18702 4.07767 4.18718 4.07821 4.18749 4.07931C4.1883 4.0822 4.18871 4.08365 4.1891 4.085C4.41343 4.87717 5.03256 5.49631 5.82473 5.72064C5.82608 5.72102 5.82753 5.72143 5.83042 5.72224C5.83152 5.72255 5.83207 5.72271 5.83232 5.72278C6.00162 5.77106 6.00162 6.01099 5.83232 6.05927C5.83207 6.05934 5.83152 6.05949 5.83042 6.0598C5.82753 6.06062 5.82608 6.06103 5.82473 6.06141C5.03256 6.28574 4.41343 6.90488 4.1891 7.69704C4.18871 7.6984 4.1883 7.69984 4.18749 7.70273C4.18718 7.70383 4.18702 7.70438 4.18695 7.70463C4.13867 7.87393 3.89874 7.87393 3.85047 7.70463C3.85039 7.70438 3.85024 7.70383 3.84993 7.70273C3.84911 7.69984 3.84871 7.6984 3.84832 7.69704C3.62399 6.90488 3.00486 6.28574 2.21269 6.06141C2.21133 6.06103 2.20989 6.06062 2.207 6.0598C2.2059 6.05949 2.20535 6.05934 2.2051 6.05927C2.0358 6.01099 2.0358 5.77106 2.2051 5.72278C2.20535 5.72271 2.2059 5.72255 2.207 5.72224C2.20989 5.72143 2.21133 5.72102 2.21269 5.72064C3.00486 5.49631 3.62399 4.87717 3.84832 4.085C3.84871 4.08365 3.84911 4.0822 3.84993 4.07931Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M9.84056 5.85655C9.84056 6.6795 9.18894 7.34664 8.38513 7.34664C7.58131 7.34664 6.92969 6.6795 6.92969 5.85655C6.92969 5.03359 7.58131 4.36646 8.38513 4.36646C9.18894 4.36646 9.84056 5.03359 9.84056 5.85655Z\"\n fill=\"currentColor\"\n />\n </svg>\n </span>\n } @else if (needsAgent() || senderType() === 2) {\n <span\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:w-8 babylai:h-8 babylai:rounded-full babylai:p-2 babylai:bg-black-white-50 babylai:text-primary\"\n >\n <app-icon name=\"solar:user-bold\" class=\"babylai:flex\" />\n </span>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n inject,\n signal,\n} from '@angular/core';\nimport { catchError, of } from 'rxjs';\nimport { FileUploadService } from '../../../services/file-upload.service';\n\n@Component({\n selector: 'app-image-attachment',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './image-attachment.component.html',\n})\nexport class ImageAttachmentComponent implements OnInit, OnDestroy {\n @Input() fileId: string = '';\n @Input() enablePreview: boolean = true;\n @Input() className: string = '';\n @Output() imageClick = new EventEmitter<void>();\n\n private readonly fileUploadService = inject(FileUploadService);\n\n imageUrl = signal<string | null>(null);\n isLoading = signal<boolean>(true);\n hasError = signal<boolean>(false);\n\n ngOnInit(): void {\n if (this.fileId) {\n const isDirectUrl =\n this.fileId.startsWith('http://') || this.fileId.startsWith('https://');\n if (isDirectUrl) {\n this.imageUrl.set(this.fileId);\n this.isLoading.set(false);\n } else {\n this.loadImage();\n }\n }\n }\n\n ngOnDestroy(): void {\n // Clean up object URL if created\n const url = this.imageUrl();\n if (url && url.startsWith('blob:')) {\n URL.revokeObjectURL(url);\n }\n }\n\n private loadImage(): void {\n this.isLoading.set(true);\n this.hasError.set(false);\n\n this.fileUploadService\n .presignDownload(this.fileId)\n .pipe(\n catchError((error) => {\n console.error('Error loading image:', error);\n this.hasError.set(true);\n this.isLoading.set(false);\n return of(null);\n }),\n )\n .subscribe((response) => {\n if (response?.downloadUrl) {\n this.imageUrl.set(response.downloadUrl);\n this.isLoading.set(false);\n } else {\n this.hasError.set(true);\n this.isLoading.set(false);\n }\n });\n }\n\n handleClick(): void {\n if (this.enablePreview && this.imageUrl()) {\n this.imageClick.emit();\n }\n }\n}\n","<div\n class=\"babylai:inline-flex babylai:items-center babylai:justify-center babylai:w-[50px] babylai:h-[50px] babylai:rounded-md babylai:overflow-hidden babylai:shrink-0\"\n [style.background-color]=\"'var(--muted)'\"\n [class]=\"className\"\n (click)=\"handleClick()\"\n [class.babylai:cursor-pointer]=\"enablePreview && imageUrl()\"\n [class.babylai:transition-opacity]=\"enablePreview && imageUrl()\"\n [class.babylai:duration-200]=\"enablePreview && imageUrl()\"\n>\n @if (isLoading()) {\n <div class=\"babylai:text-sm\" [style.color]=\"'var(--muted-foreground)'\">...</div>\n } @else if (hasError()) {\n <div class=\"babylai:text-sm babylai:font-semibold\" [style.color]=\"'var(--destructive)'\">!</div>\n } @else if (imageUrl()) {\n <img\n [src]=\"imageUrl()!\"\n [alt]=\"'Image attachment'\"\n class=\"babylai:w-full babylai:h-full babylai:object-cover babylai:block\"\n [class.babylai:opacity-80]=\"enablePreview\"\n loading=\"lazy\"\n />\n }\n</div>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n OnChanges,\n OnInit,\n SimpleChanges,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\n\n@Component({\n selector: 'app-image-preview-dialog',\n imports: [CommonModule],\n templateUrl: './image-preview-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:keydown)': 'handleKeydown($event)',\n },\n})\nexport class ImagePreviewDialogComponent implements OnInit, OnChanges {\n imageUrls = input<string[]>([]);\n initialIndex = input<number>(0);\n isOpen = input<boolean>(false);\n close = output<void>();\n\n currentIndex = signal<number>(0);\n currentImageUrl = computed(() => {\n const index = this.currentIndex();\n return this.imageUrls()[index] || null;\n });\n imageCounter = computed(() => {\n return `${this.currentIndex() + 1} / ${this.imageUrls().length}`;\n });\n hasMultipleImages = computed(() => this.imageUrls().length > 1);\n canGoPrevious = computed(() => this.currentIndex() > 0);\n canGoNext = computed(() => this.currentIndex() < this.imageUrls().length - 1);\n\n ngOnInit(): void {\n this.currentIndex.set(this.initialIndex());\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['initialIndex'] && this.isOpen()) {\n this.currentIndex.set(this.initialIndex());\n }\n if (changes['isOpen'] && this.isOpen()) {\n this.currentIndex.set(this.initialIndex());\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n if (!this.isOpen()) return;\n\n switch (event.key) {\n case 'Escape':\n this.handleClose();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.handlePrevious();\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.handleNext();\n break;\n }\n }\n\n handleClose(): void {\n this.close.emit();\n }\n\n handleBackdropClick(event: MouseEvent): void {\n // Close if clicking on the backdrop (not the image)\n if (\n (event.target as HTMLElement).classList.contains(\n 'image-preview-dialog__backdrop',\n )\n ) {\n this.handleClose();\n }\n }\n\n handlePrevious(): void {\n if (this.canGoPrevious()) {\n this.currentIndex.update((index) => index - 1);\n }\n }\n\n handleNext(): void {\n if (this.canGoNext()) {\n this.currentIndex.update((index) => index + 1);\n }\n }\n}\n","@if (isOpen()) {\n <div\n class=\"image-preview-dialog__backdrop babylai:fixed babylai:inset-0 babylai:bg-black/90 babylai:flex babylai:items-center babylai:justify-center babylai:z-9999 babylai:p-4\"\n (click)=\"handleBackdropClick($event)\"\n >\n <div class=\"image-preview-dialog__container babylai:relative babylai:w-full babylai:h-full babylai:flex babylai:items-center babylai:justify-center babylai:max-w-[90vw] babylai:max-h-[90vh] babylai:z-1\">\n <button\n class=\"image-preview-dialog__close babylai:absolute babylai:top-4 babylai:right-4 babylai:z-10001 babylai:w-10 babylai:h-10 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:bg-white/10 babylai:border babylai:border-white/20 babylai:text-white babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:pointer-events-auto babylai:hover:bg-white/20 babylai:hover:scale-110\"\n (click)=\"handleClose()\"\n type=\"button\"\n aria-label=\"Close preview\"\n >\n <svg\n class=\"babylai:w-6 babylai:h-6 babylai:pointer-events-none\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n @if (hasMultipleImages()) {\n <button\n class=\"babylai:absolute babylai:top-1/2 babylai:-translate-y-1/2 babylai:z-10001 babylai:w-12 babylai:h-12 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:bg-white/10 babylai:border babylai:border-white/20 babylai:text-white babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:pointer-events-auto babylai:left-4\"\n [class.babylai:opacity-30]=\"!canGoPrevious()\"\n [class.babylai:cursor-not-allowed]=\"!canGoPrevious()\"\n (click)=\"handlePrevious()\"\n type=\"button\"\n aria-label=\"Previous image\"\n [disabled]=\"!canGoPrevious()\"\n >\n <svg\n class=\"babylai:w-6 babylai:h-6 babylai:pointer-events-none\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <button\n class=\"babylai:absolute babylai:top-1/2 babylai:-translate-y-1/2 babylai:z-10001 babylai:w-12 babylai:h-12 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:bg-white/10 babylai:border babylai:border-white/20 babylai:text-white babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:pointer-events-auto babylai:right-4\"\n [class.babylai:opacity-30]=\"!canGoNext()\"\n [class.babylai:cursor-not-allowed]=\"!canGoNext()\"\n (click)=\"handleNext()\"\n type=\"button\"\n aria-label=\"Next image\"\n [disabled]=\"!canGoNext()\"\n >\n <svg\n class=\"babylai:w-6 babylai:h-6 babylai:pointer-events-none\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n\n <div class=\"babylai:relative babylai:w-full babylai:h-full babylai:flex babylai:items-center babylai:justify-center babylai:overflow-hidden babylai:z-1\">\n @if (currentImageUrl()) {\n <img\n [src]=\"currentImageUrl()!\"\n [alt]=\"'Image preview'\"\n class=\"babylai:max-w-full babylai:max-h-full babylai:object-contain babylai:rounded-md babylai:pointer-events-none\"\n />\n }\n </div>\n\n @if (hasMultipleImages()) {\n <div class=\"babylai:absolute babylai:bottom-4 babylai:left-1/2 babylai:-translate-x-1/2 babylai:py-2 babylai:px-4 babylai:bg-black/60 babylai:text-white babylai:rounded-full babylai:text-sm babylai:font-medium babylai:z-10001 babylai:pointer-events-none\">\n {{ imageCounter() }}\n </div>\n }\n </div>\n </div>\n}\n\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n effect,\n EffectRef,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n SecurityContext,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { marked } from 'marked';\n\n// Configure marked with safe options\nmarked.setOptions({\n breaks: true,\n gfm: true,\n silent: false, // Log warnings for debugging\n // Note: We don't use marked's sanitize option as we handle sanitization with Angular's DomSanitizer\n});\n\n// Type declaration for Prism.js on window object\ndeclare global {\n interface Window {\n Prism?: {\n highlightAllUnder: (element: HTMLElement) => void;\n highlight: (code: string, grammar: unknown, language: string) => string;\n languages: Record<string, unknown>;\n };\n }\n}\n\n@Component({\n selector: 'app-markdown-renderer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './markdown-renderer.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MarkdownRendererComponent\n implements OnInit, AfterViewInit, OnDestroy\n{\n content = input<string>('');\n inline = input<boolean>(false);\n cssClass = input<string>(\n 'babylai:m-0 babylai:leading-snug babylai:text-sm babylai:font-sans babylai:wrap-break-word babylai:text-start',\n );\n dir = input<string>('ltr');\n @ViewChild('markdownContainer') markdownContainer!: ElementRef;\n\n private sanitizer = inject(DomSanitizer);\n sanitizedContent = signal<SafeHtml>('');\n private contentEffectRef?: EffectRef;\n\n constructor() {\n // Effect to re-render content when input changes\n this.contentEffectRef = effect(() => {\n const contentValue = this.content();\n // Track inline() to re-render when it changes\n void this.inline();\n if (contentValue) {\n this.renderContent();\n } else {\n this.sanitizedContent.set('');\n }\n });\n }\n\n ngOnInit(): void {\n this.renderContent();\n }\n\n ngAfterViewInit(): void {\n this.highlightCode();\n // Lazy load Prism.js if code blocks are detected\n this.loadPrismIfNeeded();\n }\n\n /**\n * Lazy loads Prism.js syntax highlighter only if code blocks are detected\n */\n private async loadPrismIfNeeded(): Promise<void> {\n // Check if Prism is already loaded\n if (typeof window !== 'undefined' && window.Prism) {\n return;\n }\n\n // Check if content contains code blocks (```)\n const contentValue = this.content();\n if (!contentValue || !contentValue.includes('```')) {\n return;\n }\n\n try {\n // Dynamically import Prism.js and its commonly used components\n await Promise.all([\n import('prismjs'),\n import('prismjs/components/prism-typescript'),\n import('prismjs/components/prism-javascript'),\n import('prismjs/components/prism-css'),\n import('prismjs/components/prism-json'),\n ]);\n\n // Re-highlight after loading\n this.highlightCode();\n } catch (error) {\n console.warn('Failed to load Prism.js:', error);\n }\n }\n\n private renderContent(): void {\n const contentValue = this.content();\n if (!contentValue) {\n this.sanitizedContent.set('');\n return;\n }\n\n try {\n // Parse markdown to HTML\n // Use parseInline() for inline content (titles, labels, etc.) and parse() for block-level content\n const html = this.inline()\n ? (marked.parseInline(contentValue) as string)\n : (marked.parse(contentValue) as string);\n\n // Additional validation: ensure we have a string\n if (typeof html !== 'string') {\n console.warn('Marked parsing returned non-string value');\n this.sanitizedContent.set('');\n return;\n }\n\n // Sanitize the HTML content to prevent XSS attacks\n // Angular's DomSanitizer removes dangerous HTML/JavaScript while preserving safe formatting\n const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, html);\n\n if (!sanitized) {\n // If sanitization removed everything (likely due to dangerous content), return empty\n this.sanitizedContent.set('');\n return;\n }\n\n // Use bypassSecurityTrustHtml only for the sanitized content\n // This is safe because we've already sanitized it with Angular's DomSanitizer\n this.sanitizedContent.set(\n this.sanitizer.bypassSecurityTrustHtml(sanitized),\n );\n } catch (error) {\n console.warn('Error parsing markdown:', error);\n // On error, sanitize the raw content as fallback\n const sanitized = this.sanitizer.sanitize(\n SecurityContext.HTML,\n contentValue,\n );\n this.sanitizedContent.set(\n sanitized ? this.sanitizer.bypassSecurityTrustHtml(sanitized) : '',\n );\n }\n }\n\n private highlightCode(): void {\n if (typeof window !== 'undefined' && window.Prism) {\n if (this.markdownContainer?.nativeElement) {\n window.Prism.highlightAllUnder(this.markdownContainer.nativeElement);\n }\n }\n }\n\n ngOnDestroy(): void {\n // Clean up effect\n if (this.contentEffectRef) {\n this.contentEffectRef.destroy();\n this.contentEffectRef = undefined;\n }\n }\n}\n","<div \n #markdownContainer\n [class]=\"cssClass()\"\n [dir]=\"dir()\"\n [innerHTML]=\"sanitizedContent()\"\n></div>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { catchError, forkJoin, of } from 'rxjs';\nimport { FileUploadService } from '../../../services/file-upload.service';\nimport { ChatAvatarComponent } from '../chat-avatar/chat-avatar.component';\nimport { ImageAttachmentComponent } from '../image-attachment/image-attachment.component';\nimport { ImagePreviewDialogComponent } from '../image-preview-dialog/image-preview-dialog.component';\nimport { MarkdownRendererComponent } from './../../../shared/components/markdown-renderer/markdown-renderer.component';\nimport { Message } from './../../../types';\n\n@Component({\n selector: 'app-chat-message',\n standalone: true,\n imports: [\n CommonModule,\n MarkdownRendererComponent,\n ChatAvatarComponent,\n ImageAttachmentComponent,\n ImagePreviewDialogComponent,\n ],\n templateUrl: './chat-message.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatMessageComponent {\n message = input.required<Message>();\n needsAgent = input<boolean>(false);\n currentLang = input<string>('en');\n isHidden = input<boolean>(false);\n\n private readonly fileUploadService = inject(FileUploadService);\n\n previewImageUrls = signal<string[]>([]);\n previewImageIndex = signal<number>(-1);\n isPreviewOpen = signal<boolean>(false);\n\n hasAttachments = computed(() => {\n const currentMessage = this.message();\n return !!currentMessage.attachmentIds?.length;\n });\n\n cleanMessageContent(content: string): string {\n return content.replace(/```/g, '\\\\`\\\\`\\\\`');\n }\n\n handleImageClick(clickedIndex: number): void {\n const currentMessage = this.message();\n if (\n !currentMessage.attachmentIds ||\n currentMessage.attachmentIds.length === 0\n ) {\n return;\n }\n\n // Each item can be a direct URL or a file ID (needs presign)\n const downloadObservables = currentMessage.attachmentIds.map((idOrUrl) => {\n const isUrl =\n idOrUrl.startsWith('http://') || idOrUrl.startsWith('https://');\n if (isUrl) {\n return of({ downloadUrl: idOrUrl });\n }\n return this.fileUploadService.presignDownload(idOrUrl).pipe(\n catchError((error) => {\n console.error(`Error loading image ${idOrUrl}:`, error);\n return of(null);\n }),\n );\n });\n\n forkJoin(downloadObservables).subscribe(\n (responses: Array<{ downloadUrl: string } | null>) => {\n const urls = responses\n .filter((r): r is { downloadUrl: string } => r !== null)\n .map((r) => r.downloadUrl);\n this.previewImageUrls.set(urls);\n this.previewImageIndex.set(clickedIndex);\n this.isPreviewOpen.set(true);\n },\n );\n }\n\n closePreview(): void {\n this.isPreviewOpen.set(false);\n this.previewImageUrls.set([]);\n this.previewImageIndex.set(-1);\n }\n}\n","<div\n class=\"babylai:flex babylai:items-start babylai:gap-3\"\n [class.babylai:flex-row-reverse]=\"message().senderType === 1\"\n>\n @if (message().senderType !== 1) {\n <app-chat-avatar\n [senderType]=\"message().senderType\"\n [needsAgent]=\"needsAgent()\"\n [isHidden]=\"isHidden()\"\n />\n }\n\n <div\n class=\"babylai:rounded-2xl babylai:p-4 babylai:flex babylai:flex-col babylai:gap-2\"\n [dir]=\"\n (currentLang() === 'ar') !== (message().senderType === 1) ? 'rtl' : 'ltr'\n \"\n [class]=\"\n message().senderType === 1\n ? 'babylai:bg-primary-500 babylai:text-black-white-50 babylai:max-w-[220px]'\n : 'babylai:bg-card'\n \"\n >\n @if (hasAttachments()) {\n <div class=\"babylai:flex babylai:flex-wrap babylai:gap-2\">\n @for (\n fileId of message().attachmentIds!;\n track fileId;\n let i = $index\n ) {\n <app-image-attachment\n [fileId]=\"fileId\"\n [enablePreview]=\"true\"\n (imageClick)=\"handleImageClick(i)\"\n class=\"babylai:flex babylai:flex-col\"\n />\n }\n </div>\n }\n <app-markdown-renderer\n [content]=\"cleanMessageContent(message().messageContent)\"\n [inline]=\"false\"\n [dir]=\"'auto'\"\n >\n </app-markdown-renderer>\n </div>\n</div>\n\n<app-image-preview-dialog\n [imageUrls]=\"previewImageUrls()\"\n [initialIndex]=\"previewImageIndex()\"\n [isOpen]=\"isPreviewOpen()\"\n (close)=\"closePreview()\"\n/>\n","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'app-chat-separator',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './chat-separator.component.html',\n})\nexport class ChatSeparatorComponent {}\n","<div class=\"chat__separator babylai:w-full babylai:text-black-white-300\">\n <svg\n class=\"babylai:w-full\"\n height=\"14\"\n viewBox=\"0 0 327 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <line x1=\"132.5\" y1=\"7.5\" y2=\"7.5\" stroke=\"currentColor\" />\n <path\n d=\"M162.891 0.464864C162.892 0.460907 162.893 0.458928 162.893 0.458012C163.067 -0.152671 163.933 -0.152671 164.107 0.458012C164.107 0.458928 164.108 0.460907 164.109 0.464864C164.112 0.475291 164.113 0.480505 164.115 0.4854C164.924 3.34287 167.157 5.57619 170.015 6.38539C170.019 6.38678 170.025 6.38825 170.035 6.39119C170.039 6.3923 170.041 6.39286 170.042 6.39312C170.653 6.56727 170.653 7.43274 170.042 7.60688C170.041 7.60714 170.039 7.6077 170.035 7.60881C170.025 7.61175 170.019 7.61322 170.015 7.61461C167.157 8.42381 164.924 10.6571 164.115 13.5146C164.113 13.5195 164.112 13.5247 164.109 13.5351C164.108 13.5391 164.107 13.5411 164.107 13.542C163.933 14.1527 163.067 14.1527 162.893 13.542C162.893 13.5411 162.892 13.5391 162.891 13.5351C162.888 13.5247 162.887 13.5195 162.885 13.5146C162.076 10.6571 159.843 8.42381 156.985 7.61461C156.981 7.61322 156.975 7.61175 156.965 7.60881C156.961 7.6077 156.959 7.60714 156.958 7.60688C156.347 7.43274 156.347 6.56727 156.958 6.39312C156.959 6.39286 156.961 6.3923 156.965 6.39119C156.975 6.38825 156.981 6.38678 156.985 6.38539C159.843 5.57619 162.076 3.34287 162.885 0.4854C162.887 0.480505 162.888 0.475291 162.891 0.464864Z\"\n fill=\"currentColor\"\n />\n <line x1=\"327\" y1=\"7.5\" x2=\"194.5\" y2=\"7.5\" stroke=\"currentColor\" />\n </svg>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { ChatAvatarComponent } from '../chat-avatar/chat-avatar.component';\n\n@Component({\n selector: 'app-chat-typing-indicator',\n standalone: true,\n imports: [CommonModule, ChatAvatarComponent],\n templateUrl: './chat-typing-indicator.component.html',\n})\nexport class ChatTypingIndicatorComponent {}\n","<div class=\"babylai:mb-4 babylai:flex\">\n <div class=\"babylai:shrink-0 babylai:me-3\">\n <div\n class=\"babylai:w-8 babylai:h-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:bg-primary\"\n >\n <app-chat-avatar\n [senderType]=\"3\"\n [needsAgent]=\"false\"\n [isHidden]=\"false\"\n />\n </div>\n </div>\n <div\n class=\"babylai:max-w-[80%] babylai:rounded-2xl babylai:p-4 babylai:bg-card\"\n >\n <p\n class=\"babylai:text-sm babylai:text-muted-foreground babylai:m-0 babylai:flex babylai:gap-0.5 babylai:items-center\"\n aria-hidden=\"true\"\n >\n <span\n class=\"babylai-typing-dot babylai:inline-block babylai:w-1.5 babylai:h-1.5 babylai:rounded-full babylai:bg-current\"\n >\n </span>\n <span\n class=\"babylai-typing-dot babylai:inline-block babylai:w-1.5 babylai:h-1.5 babylai:rounded-full babylai:bg-current\"\n >\n </span>\n <span\n class=\"babylai-typing-dot babylai:inline-block babylai:w-1.5 babylai:h-1.5 babylai:rounded-full babylai:bg-current\"\n >\n </span>\n </p>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { ButtonComponent } from '../../../shared/components/button';\nimport { IconComponent } from '../../../shared/components/icon';\n\n@Component({\n selector: 'app-review-message',\n templateUrl: './review-message.component.html',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonComponent,\n TranslatePipe,\n IconComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReviewMessageComponent {\n isSubmitting = input<boolean>(false);\n currentLang = input<string>('en');\n\n rating = signal<number>(0);\n comment = signal<string>('');\n\n // Validation errors\n ratingError = signal<string>('');\n commentError = signal<string>('');\n\n ratingChange = output<number>();\n commentChange = output<string>();\n submitReview = output<{ rating: number; comment: string }>();\n skip = output<void>();\n\n onRatingClick(starIndex: number): void {\n this.rating.set(starIndex + 1);\n this.clearRatingError();\n this.ratingChange.emit(this.rating());\n }\n\n onCommentChange(): void {\n this.clearCommentError();\n this.commentChange.emit(this.comment());\n }\n\n onSubmitReview(): void {\n if (this.validateForm() && !this.isSubmitting()) {\n this.submitReview.emit({\n rating: this.rating(),\n comment: this.comment().trim(),\n });\n }\n }\n\n onSkip(): void {\n if (!this.isSubmitting()) {\n this.skip.emit();\n this.resetForm();\n }\n }\n\n private validateForm(): boolean {\n let isValid = true;\n\n // Validate rating\n if (this.rating() < 1 || this.rating() > 5) {\n this.ratingError.set('Rating must be between 1 and 5.');\n isValid = false;\n }\n\n // Validate comment (optional - only check max length if provided)\n const trimmedComment = this.comment().trim();\n if (trimmedComment.length > 0 && trimmedComment.length > 500) {\n this.commentError.set('Comment must not exceed 500 characters.');\n isValid = false;\n } else {\n // Clear any existing error if comment is valid or empty\n this.commentError.set('');\n }\n\n return isValid;\n }\n\n private clearRatingError(): void {\n this.ratingError.set('');\n }\n\n private clearCommentError(): void {\n this.commentError.set('');\n }\n\n private resetForm(): void {\n this.rating.set(0);\n this.comment.set('');\n this.ratingError.set('');\n this.commentError.set('');\n }\n\n getStarsArray(): number[] {\n return Array(5)\n .fill(0)\n .map((_, index) => index);\n }\n\n isStarFilled(starIndex: number): boolean {\n return starIndex < this.rating();\n }\n\n getCommentLength(): number {\n return this.comment().trim().length;\n }\n\n getCommentMaxLength(): number {\n return 500;\n }\n\n getCommentMinLength(): number {\n return 10;\n }\n}\n","<div class=\"babylai:flex babylai:flex-col babylai:gap-2.5\">\n <h2 class=\"babylai:font-normal babylai:text-card-foreground\">\n {{ \"ReviewDialogTitle\" | translate }}\n </h2>\n <p class=\"babylai:text-sm babylai:text-muted-foreground\">\n {{ \"ReviewDialogDescription\" | translate }}\n </p>\n\n <div class=\"\">\n <label class=\"babylai:sr-only\" aria-label=\"review message stars label\">\n {{ \"ReviewDialogRatingLabel\" | translate }}\n </label>\n <div\n class=\"babylai:inline-flex babylai:bg-muted babylai:rounded-3xl babylai:p-3 babylai:gap-2\"\n aria-labelledby=\"review message stars\"\n >\n @for (star of getStarsArray(); track star) {\n <button\n class=\"babylai:hover:text-[#F49E00] babylai:border-0 babylai:bg-transparent babylai:p-0\"\n [class.babylai:text-black-white-200]=\"!isStarFilled(star)\"\n [class.babylai:dark:text-muted-foreground]=\"!isStarFilled(star)\"\n [class.babylai:text-[#F49E00]]=\"isStarFilled(star)\"\n [disabled]=\"isSubmitting()\"\n (click)=\"onRatingClick(star)\"\n [attr.aria-label]=\"'Rate ' + (star + 1) + ' out of 5 stars'\"\n [attr.aria-pressed]=\"isStarFilled(star)\"\n role=\"button\"\n type=\"button\"\n (keydown.enter)=\"onRatingClick(star)\"\n (keydown.space)=\"$event.preventDefault(); onRatingClick(star)\"\n >\n <app-icon name=\"solar:star-bold\" class=\"babylai:flex\" size=\"28px\" />\n </button>\n }\n </div>\n @if (ratingError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ ratingError() }}\n </div>\n }\n </div>\n\n @if (rating() > 0) {\n <div class=\"babylai:flex babylai:flex-col babylai:gap-2.5\">\n <label class=\"babylai:text-card-foreground\">\n {{ \"ReviewDialogCommentLabel\" | translate }}\n </label>\n <textarea\n class=\"babylai:resize-none babylai:w-full babylai:bg-secondary babylai:border babylai:rounded-xl babylai:text-card-foreground babylai:text-sm babylai:p-3 babylai:resize-vertical babylai:min-h-20 babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed babylai:disabled:bg-secondary babylai:border-black-white-200\"\n [class.babylai:border-destructive]=\"commentError()\"\n [ngModel]=\"comment()\"\n (ngModelChange)=\"comment.set($event); onCommentChange()\"\n [placeholder]=\"'ReviewDialogCommentPlaceholder' | translate\"\n [maxlength]=\"getCommentMaxLength()\"\n [disabled]=\"isSubmitting()\"\n rows=\"4\"\n ></textarea>\n <div class=\"babylai:flex babylai:flex-col\">\n <div\n class=\"babylai:text-card-foreground babylai:text-sm babylai:whitespace-nowrap babylai:opacity-70\"\n >\n {{ getCommentLength() }}/{{ getCommentMaxLength() }} characters\n </div>\n @if (commentError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ commentError() }}\n </div>\n }\n </div>\n </div>\n\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting()\"\n (onClick)=\"onSubmitReview()\"\n >\n @if (isSubmitting()) {\n Submitting...\n } @else {\n {{ \"ReviewDialogSubmitButton\" | translate }}\n }\n </app-button>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n EffectRef,\n ElementRef,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewChild,\n} from '@angular/core';\nimport { Message } from '../types';\nimport { ChatAvatarComponent } from './components/chat-avatar/chat-avatar.component';\nimport { ChatMessageComponent } from './components/chat-message/chat-message.component';\nimport { ChatSeparatorComponent } from './components/chat-separator/chat-separator.component';\nimport { ChatTypingIndicatorComponent } from './components/chat-typing-indicator/chat-typing-indicator.component';\nimport { ReviewMessageComponent } from './components/review-message/review-message.component';\n\n@Component({\n selector: 'app-chat',\n standalone: true,\n imports: [\n CommonModule,\n ChatMessageComponent,\n ChatSeparatorComponent,\n ChatTypingIndicatorComponent,\n ReviewMessageComponent,\n ChatAvatarComponent,\n ],\n templateUrl: './chat.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatComponent implements OnInit, AfterViewInit, OnDestroy {\n // Using input() signals - automatically trigger change detection on updates\n messages = input<Message[]>([]);\n needsAgent = input<boolean>(false);\n assistantStatus = input<string>('');\n currentLang = input<string>('en');\n loading = input<boolean>(false);\n isSubmittingReview = input<boolean>(false);\n @ViewChild('chatMessagesContainer') chatMessagesContainer!: ElementRef;\n\n reviewSubmit = output<{ rating: number; comment: string }>();\n reviewSkip = output<void>();\n\n // Computed signal for first agent message index\n firstAgentMessageIndex = computed(() => {\n return this.messages().findIndex((message) => message.senderType === 2);\n });\n\n private previousMessagesLength = 0;\n private scrollTimeouts: ReturnType<typeof setTimeout>[] = [];\n private messagesEffectRef?: EffectRef;\n\n constructor() {\n // Effect to handle scrolling when messages change\n this.messagesEffectRef = effect(() => {\n const messages = this.messages();\n const currentLength = messages.length;\n\n // Only scroll if messages array length changed (new message added)\n if (currentLength !== this.previousMessagesLength) {\n this.previousMessagesLength = currentLength;\n // Use setTimeout to ensure DOM is updated\n const timeoutId = setTimeout(() => this.scrollToBottom(), 0);\n this.scrollTimeouts.push(timeoutId);\n }\n });\n }\n\n ngOnInit(): void {\n this.previousMessagesLength = this.messages().length;\n }\n\n ngAfterViewInit(): void {\n // Initial scroll to bottom after view init\n const timeoutId = setTimeout(() => this.scrollToBottom(), 0);\n this.scrollTimeouts.push(timeoutId);\n }\n\n ngOnDestroy(): void {\n // Clean up effect\n if (this.messagesEffectRef) {\n this.messagesEffectRef.destroy();\n this.messagesEffectRef = undefined;\n }\n // Clear all pending scroll timeouts\n this.scrollTimeouts.forEach((timeoutId) => clearTimeout(timeoutId));\n this.scrollTimeouts = [];\n }\n\n scrollToBottom(): void {\n try {\n this.chatMessagesContainer.nativeElement.scrollTop =\n this.chatMessagesContainer.nativeElement.scrollHeight;\n } catch (err) {\n console.error('Error scrolling to bottom:', err);\n }\n }\n\n handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n this.reviewSubmit.emit(reviewData);\n }\n\n handleReviewSkip() {\n this.reviewSkip.emit();\n }\n}\n","<div\n class=\"babylai:flex-1 babylai:flex babylai:flex-col babylai:gap-4\"\n #chatMessagesContainer\n>\n @for (message of messages(); track message.id; let i = $index) {\n <div class=\"babylai:flex babylai:flex-col babylai:gap-2\">\n @if (i === firstAgentMessageIndex() && message.senderType === 2 && !message.isReviewMessage) {\n <app-chat-separator class=\"babylai:py-4\" />\n }\n @if (message.isReviewMessage) {\n <app-chat-separator class=\"babylai:py-4\" />\n <div class=\"babylai:flex babylai:items-start babylai:gap-3\">\n <app-chat-avatar\n [senderType]=\"message.senderType\"\n [needsAgent]=\"needsAgent()\"\n [isHidden]=\"false\"\n />\n <div\n class=\"babylai:relative babylai:rounded-2xl babylai:p-5! babylai:text-sm babylai:bg-card babylai:max-w-[80%]\"\n >\n <app-review-message\n [isSubmitting]=\"isSubmittingReview()\"\n [currentLang]=\"currentLang()\"\n (submitReview)=\"handleReviewSubmit($event)\"\n (skip)=\"handleReviewSkip()\"\n />\n </div>\n </div>\n } @else {\n <app-chat-message\n [message]=\"message\"\n [needsAgent]=\"needsAgent()\"\n [currentLang]=\"currentLang()\"\n [isHidden]=\"\n i > 0 && messages()[i - 1].senderType === message.senderType\n \"\n />\n }\n </div>\n }\n @if (assistantStatus() === \"typing\" && firstAgentMessageIndex() === -1) {\n <app-chat-typing-indicator />\n }\n @if (loading()) {\n <div\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:h-full\"\n >\n loading status here\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n output,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { TranslationService } from '../../../services/translation.service';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-back-button',\n standalone: true,\n imports: [CommonModule, TranslatePipe, IconComponent],\n templateUrl: './back-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BackButtonComponent {\n onBack = output<void>();\n\n private translationService = inject(TranslationService);\n private currentLang = toSignal(this.translationService.currentLang, {\n initialValue: 'en',\n });\n\n protected isArabic = computed(() => this.currentLang() === 'ar');\n}\n","<button\n class=\"babylai:bg-card babylai:text-card-foreground babylai:h-6 babylai:w-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:font-bold babylai:text-base babylai:cursor-pointer babylai:border-0\"\n (click)=\"onBack.emit()\"\n [attr.aria-label]=\"'Back' | translate\"\n type=\"button\"\n>\n <app-icon\n name=\"solar:alt-arrow-left-linear\"\n class=\"babylai:flex\"\n [style.transform]=\"isArabic() ? 'rotate(180deg)' : 'none'\"\n />\n</button>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, output } from '@angular/core';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-close-button',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './close-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CloseButtonComponent {\n onClose = output<void>();\n}\n","<button\n (click)=\"onClose.emit()\"\n class=\"babylai:bg-card babylai:text-card-foreground babylai:h-6 babylai:w-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:font-bold babylai:text-base babylai:cursor-pointer babylai:border-0\"\n [attr.aria-label]=\"'Close'\"\n type=\"button\"\n>\n <app-icon name=\"material-symbols:close-small-outline-rounded\" class=\"babylai:flex\" />\n</button>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, output } from '@angular/core';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-minimize-button',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './minimize-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MinimizeButtonComponent {\n onMinimize = output<void>();\n}\n","<button\n (click)=\"onMinimize.emit()\"\n class=\"babylai:bg-card babylai:text-card-foreground babylai:h-6 babylai:w-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:font-bold babylai:text-base babylai:cursor-pointer babylai:border-0\"\n [attr.aria-label]=\"'Minimize'\"\n type=\"button\"\n>\n <app-icon name=\"fa7-solid:subtract\" class=\"babylai:flex\" />\n</button>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { BackButtonComponent } from '../back-button';\nimport { CloseButtonComponent } from '../close-button';\nimport { MinimizeButtonComponent } from '../minimize-button';\n\n@Component({\n selector: 'app-chat-header',\n standalone: true,\n imports: [\n CommonModule,\n BackButtonComponent,\n CloseButtonComponent,\n MinimizeButtonComponent,\n ],\n templateUrl: './chat-header.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatHeaderComponent {\n showBackButton = input<boolean>(false);\n language = input<string>('en');\n selectedOptionTitle = input<string | null>(null);\n onBack = output<void>();\n onClose = output<void>();\n onMinimize = output<void>();\n\n isRtl = computed(() => this.language() === 'ar');\n}\n","<header\n class=\"bg-header babylai:flex babylai:items-center babylai:justify-between babylai:p-6 babylai:gap-4 babylai:border-b babylai:border-black-white-200\">\n <div class=\"babylai:flex babylai:items-center babylai:gap-2\">\n <app-back-button (onBack)=\"onBack.emit()\" />\n\n <app-close-button (onClose)=\"onClose.emit()\" />\n </div>\n\n <h1 class=\"babylai:text-lg! babylai:font-semibold! babylai:text-card-foreground\">\n {{ selectedOptionTitle() }}\n </h1>\n\n <app-minimize-button (onMinimize)=\"onMinimize.emit()\"></app-minimize-button>\n</header>","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, output } from '@angular/core';\nimport { MinimizeButtonComponent } from '../minimize-button';\n\n@Component({\n selector: 'app-header',\n standalone: true,\n imports: [CommonModule, MinimizeButtonComponent],\n templateUrl: './header.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderComponent {\n onMinimize = output<void>();\n}\n","<div class=\"bg-header babylai:flex babylai:items-center babylai:justify-end babylai:p-6 babylai:border-b babylai:border-black-white-200\">\n <app-minimize-button (onMinimize)=\"onMinimize.emit()\"></app-minimize-button>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardComponent {\n variant = input<'default' | 'rounded'>('default');\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = ['babylai:z-1', 'babylai:w-full', 'babylai:box-border'];\n\n // Add variant-specific classes\n if (this.variant() === 'default') {\n classes.push(\n 'babylai:rounded-lg',\n 'babylai:border',\n 'babylai:block',\n 'babylai:border-black-white-200',\n 'babylai:bg-card',\n 'babylai:text-card-foreground',\n );\n } else if (this.variant() === 'rounded') {\n classes.push(\n 'babylai:rounded-3xl',\n 'babylai:p-1',\n 'babylai:px-2',\n 'babylai:block',\n 'babylai:bg-card',\n );\n }\n\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-header',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-header.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardHeaderComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:flex',\n 'babylai:flex-col',\n 'babylai:gap-1.5',\n 'babylai:p-6',\n 'babylai:w-full',\n 'babylai:text-card-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-title',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-title.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardTitleComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:font-semibold',\n 'babylai:leading-none',\n 'babylai:tracking-tight',\n 'babylai:w-full',\n 'babylai:text-card-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-description',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-description.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardDescriptionComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:text-sm',\n 'babylai:w-full',\n 'babylai:text-muted-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-content',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-content.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardContentComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:p-0',\n 'babylai:pt-0',\n 'babylai:w-full',\n 'babylai:box-border',\n 'babylai:text-start',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-footer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-footer.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardFooterComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:flex',\n 'babylai:items-center',\n 'babylai:p-6',\n 'babylai:pt-0',\n 'babylai:w-full',\n 'babylai:text-card-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { TranslatePipe } from './../../../pipes/translate.pipe';\n\n@Component({\n selector: 'app-footer',\n templateUrl: './footer.component.html',\n standalone: true,\n imports: [CommonModule, TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FooterComponent {}\n","<footer class=\"babylai:flex babylai:items-center babylai:justify-center babylai:p-3 babylai:border-t babylai:border-border\">\n <a\n href=\"https://babylai.net\"\n target=\"_blank\"\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:gap-2 babylai:text-sm babylai:text-card-foreground babylai:no-underline babylai:transition-opacity babylai:duration-200 babylai:hover:opacity-80\"\n >\n <span>\n {{ \"PoweredByBabylAI\" | translate }}\n </span>\n <span>|</span>\n <svg viewBox=\"0 0 54 19\" fill=\"none\" class=\"babylai:w-15\">\n <path\n d=\"M0 4.97873C0 2.22905 2.22908 0 4.97879 0H13.2768C16.0265 0 18.2556 2.22905 18.2556 4.97873V13.2766C18.2556 16.0263 16.0265 18.2554 13.2768 18.2554H0V4.97873Z\"\n fill=\"#606060\"\n />\n <path\n d=\"M5.76107 6.10571C5.76153 6.10407 5.76177 6.10325 5.76187 6.10287C5.83413 5.8495 6.19321 5.8495 6.26546 6.10287C6.26557 6.10325 6.2658 6.10407 6.26627 6.10571C6.26749 6.11004 6.26809 6.1122 6.26867 6.11423C6.60441 7.29978 7.53101 8.22637 8.71657 8.5621C8.7186 8.56268 8.72076 8.56329 8.72509 8.56451C8.72673 8.56497 8.72755 8.5652 8.72793 8.56531C8.98131 8.63756 8.98131 8.99664 8.72793 9.06889C8.72755 9.069 8.72673 9.06923 8.72509 9.0697C8.72076 9.07092 8.7186 9.07153 8.71657 9.0721C7.53101 9.40783 6.60441 10.3344 6.26867 11.52C6.26809 11.522 6.26749 11.5242 6.26627 11.5285C6.2658 11.5301 6.26557 11.531 6.26546 11.5313C6.19321 11.7847 5.83413 11.7847 5.76187 11.5313C5.76177 11.531 5.76153 11.5301 5.76107 11.5285C5.75985 11.5242 5.75924 11.522 5.75867 11.52C5.42293 10.3344 4.49633 9.40783 3.31077 9.0721C3.30874 9.07153 3.30657 9.07092 3.30225 9.0697C3.3006 9.06923 3.29978 9.069 3.2994 9.06889C3.04603 8.99664 3.04603 8.63756 3.2994 8.56531C3.29978 8.5652 3.3006 8.56497 3.30225 8.56451C3.30657 8.56329 3.30874 8.56268 3.31077 8.5621C4.49633 8.22637 5.42293 7.29978 5.75867 6.11423C5.75924 6.1122 5.75985 6.11004 5.76107 6.10571Z\"\n fill=\"white\"\n />\n <path\n d=\"M14.7275 8.76473C14.7275 9.99635 13.7523 10.9948 12.5493 10.9948C11.3463 10.9948 10.3711 9.99635 10.3711 8.76473C10.3711 7.5331 11.3463 6.53467 12.5493 6.53467C13.7523 6.53467 14.7275 7.5331 14.7275 8.76473Z\"\n fill=\"white\"\n />\n <path\n d=\"M51.6133 13.0924V5.27515H53.1931V13.0924H51.6133Z\"\n fill=\"#606060\"\n />\n <path\n d=\"M44.5938 13.0924L46.5857 5.27515H49.3446L51.325 13.0924H49.7452L49.3102 11.513H46.5742L46.1621 13.0924H44.5938ZM46.8261 10.2425H49.0813L48.1998 6.55705H47.719L46.8261 10.2425Z\"\n fill=\"#606060\"\n />\n <path d=\"M42.5703 13.092V5H44.0929V13.092H42.5703Z\" fill=\"#919191\" />\n <path\n d=\"M38.6905 15.5069L39.4231 13.0919H38.1982L36.8359 7.34619H38.4272L39.446 11.7985H39.7437L40.7625 7.34619H42.2965L40.3161 15.5069H38.6905Z\"\n fill=\"#919191\"\n />\n <path\n d=\"M34.008 13.2179C33.8172 13.2179 33.5845 13.2103 33.3097 13.195C33.035 13.1797 32.7526 13.1569 32.4626 13.1263C32.1802 13.0958 31.9284 13.0691 31.707 13.0462V5H33.241V7.52946C33.3555 7.48368 33.4967 7.4379 33.6646 7.39212C33.8325 7.34633 34.008 7.30818 34.1912 7.27766C34.382 7.23951 34.5575 7.22043 34.7178 7.22043C35.252 7.22043 35.6756 7.33107 35.9885 7.55235C36.309 7.766 36.538 8.08648 36.6754 8.51378C36.8127 8.94108 36.8814 9.47902 36.8814 10.1276C36.8814 10.8906 36.7937 11.5011 36.6181 11.9589C36.4502 12.4091 36.1564 12.7334 35.7366 12.9318C35.3169 13.1225 34.7407 13.2179 34.008 13.2179ZM34.0195 11.936C34.3934 11.936 34.672 11.8711 34.8552 11.7414C35.0383 11.6041 35.1604 11.4019 35.2215 11.1348C35.2902 10.8677 35.3245 10.5396 35.3245 10.1505C35.3245 9.75371 35.294 9.43705 35.2329 9.20051C35.1719 8.95634 35.0689 8.78084 34.9238 8.67402C34.7865 8.55956 34.5919 8.50233 34.34 8.50233C34.2179 8.50233 34.0882 8.51759 33.9508 8.54812C33.8134 8.57101 33.6799 8.60153 33.5501 8.63968C33.428 8.6702 33.325 8.70072 33.241 8.73124V11.8902C33.3555 11.8978 33.4891 11.9093 33.6417 11.9245C33.7943 11.9322 33.9203 11.936 34.0195 11.936Z\"\n fill=\"#919191\"\n />\n <path\n d=\"M27.8012 13.2177C27.2059 13.2177 26.7556 13.0689 26.4504 12.7713C26.1527 12.4661 26.0039 12.0083 26.0039 11.3978C26.0039 10.9705 26.0802 10.6386 26.2329 10.4021C26.3855 10.1579 26.6106 9.9824 26.9083 9.87558C27.2136 9.76112 27.5837 9.69245 28.0187 9.66956L29.4153 9.54366V9.20029C29.4153 8.9256 29.3467 8.73484 29.2093 8.62802C29.0719 8.51356 28.8697 8.45633 28.6025 8.45633C28.3889 8.45633 28.1408 8.46396 27.8584 8.47922C27.5837 8.49448 27.309 8.51356 27.0342 8.53645C26.7671 8.55934 26.5343 8.58223 26.3359 8.60512L26.2901 7.52924C26.4885 7.48346 26.7251 7.43768 26.9999 7.3919C27.2822 7.33849 27.5761 7.29652 27.8813 7.266C28.1866 7.23548 28.469 7.22021 28.7285 7.22021C29.2169 7.22021 29.6252 7.28126 29.9534 7.40334C30.2816 7.52543 30.5296 7.72763 30.6975 8.00996C30.8654 8.28465 30.9493 8.65854 30.9493 9.13162V11.7526C30.9646 11.8595 31.0218 11.9434 31.1211 12.0044C31.2203 12.0579 31.3347 12.096 31.4645 12.1189L31.4301 13.1719C31.308 13.1719 31.1859 13.1719 31.0638 13.1719C30.9493 13.1795 30.8387 13.1795 30.7318 13.1719C30.625 13.1719 30.5296 13.1643 30.4456 13.149C30.2701 13.1261 30.1175 13.0803 29.9877 13.0117C29.8656 12.943 29.7664 12.8705 29.6901 12.7942C29.568 12.8476 29.4039 12.9086 29.1978 12.9773C28.9918 13.046 28.7666 13.1032 28.5224 13.149C28.2858 13.1948 28.0454 13.2177 27.8012 13.2177ZM28.1675 12.0846C28.3125 12.0846 28.4652 12.0693 28.6254 12.0388C28.7857 12.0083 28.9345 11.9739 29.0719 11.9358C29.2169 11.89 29.3314 11.848 29.4153 11.8099V10.4936L28.2477 10.5966C27.9958 10.6195 27.8127 10.6958 27.6982 10.8256C27.5913 10.9476 27.5379 11.1231 27.5379 11.3521C27.5379 11.581 27.5875 11.7603 27.6867 11.89C27.7936 12.0197 27.9538 12.0846 28.1675 12.0846Z\"\n fill=\"#919191\"\n />\n <path\n d=\"M19.9531 13.0924V5.27515H23.0669C23.5859 5.27515 24.0323 5.34 24.4063 5.46972C24.7803 5.59944 25.0703 5.80927 25.2763 6.09923C25.49 6.38155 25.5969 6.76307 25.5969 7.24378C25.5969 7.57188 25.5625 7.85039 25.4938 8.0793C25.4328 8.30058 25.3336 8.49134 25.1962 8.65158C25.0665 8.80419 24.8947 8.94535 24.681 9.07506C24.91 9.159 25.1084 9.27345 25.2763 9.41843C25.4519 9.55578 25.5854 9.74272 25.677 9.97926C25.7686 10.2082 25.8144 10.5134 25.8144 10.8949C25.8144 11.3146 25.7495 11.6656 25.6198 11.9479C25.49 12.2302 25.303 12.4553 25.0588 12.6232C24.8222 12.791 24.5437 12.9131 24.2231 12.9894C23.9026 13.0581 23.5515 13.0924 23.1699 13.0924H19.9531ZM21.5329 11.925H23.0555C23.3226 11.925 23.5439 11.8945 23.7194 11.8334C23.9026 11.7648 24.04 11.6465 24.1316 11.4786C24.2308 11.3108 24.2804 11.078 24.2804 10.7804C24.2804 10.5515 24.2422 10.3646 24.1659 10.2196C24.0896 10.0746 23.9904 9.96782 23.8683 9.89914C23.7461 9.82284 23.6088 9.76943 23.4561 9.7389C23.3111 9.70838 23.1661 9.69312 23.0211 9.69312H21.5329V11.925ZM21.5329 8.57146H23.0097C23.2692 8.57146 23.479 8.53331 23.6393 8.457C23.7996 8.37307 23.9179 8.25099 23.9942 8.09075C24.0705 7.92288 24.1087 7.71304 24.1087 7.46124C24.1087 7.10262 24.0133 6.84318 23.8225 6.68295C23.6393 6.52271 23.3493 6.44259 22.9524 6.44259H21.5329V8.57146Z\"\n fill=\"#919191\"\n />\n </svg>\n </a>\n</footer>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, output } from '@angular/core';\nimport { HeaderComponent } from '../header';\n\n@Component({\n selector: 'app-loading',\n templateUrl: './loading.component.html',\n standalone: true,\n imports: [CommonModule, HeaderComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoadingComponent {\n onMinimize = output<void>();\n}\n","<div\n class=\"babylai:w-full babylai:h-full babylai:bg-secondary babylai:rounded-3xl babylai:shadow-lg babylai:flex babylai:flex-col\">\n <div class=\"babylai:rounded-3xl babylai:h-full babylai:flex babylai:flex-col babylai:gap-4\">\n <app-header (onMinimize)=\"onMinimize.emit()\" />\n <div\n class=\"babylai:flex babylai:flex-col babylai:items-center babylai:justify-center babylai:w-full babylai:h-full babylai:py-28\">\n <img src=\"./../../../../assets/animatedLogo.gif\" alt=\"Animated Logo\" class=\"babylai:w-20 babylai:h-20\" />\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n effect,\n EffectRef,\n ElementRef,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewChild,\n} from '@angular/core';\nimport { LoadingComponent } from '../loading/loading.component';\n\n@Component({\n selector: 'app-base-dialog',\n standalone: true,\n imports: [CommonModule, LoadingComponent],\n templateUrl: './base-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseDialogComponent implements OnInit, AfterViewInit, OnDestroy {\n isOpen = input<boolean>(false);\n isLoading = input<boolean>(false);\n closeOnEscape = input<boolean>(true);\n closeOnOverlayClick = input<boolean>(true);\n ariaLabel = input<string>('Dialog');\n\n close = output<void>();\n\n @ViewChild('dialogContainer') dialogContainer!: ElementRef<HTMLElement>;\n\n private previousActiveElement: HTMLElement | null = null;\n private tabKeyListener?: (event: KeyboardEvent) => void;\n private escapeKeyListener?: (event: KeyboardEvent) => void;\n private focusTimeouts: ReturnType<typeof setTimeout>[] = [];\n private focusEffectRef?: EffectRef;\n\n constructor() {\n // Effect to handle focus trapping when dialog opens/closes\n this.focusEffectRef = effect(() => {\n if (this.isOpen()) {\n // Use setTimeout to ensure DOM is fully rendered\n const timeoutId = setTimeout(() => {\n if (this.dialogContainer?.nativeElement) {\n this.trapFocus();\n }\n }, 0);\n this.focusTimeouts.push(timeoutId);\n } else {\n this.releaseFocus();\n }\n });\n }\n\n ngOnInit(): void {\n // Set up Escape key listener for closing dialog\n this.escapeKeyListener = (event: KeyboardEvent) => {\n if (\n event.key === 'Escape' &&\n this.isOpen() &&\n this.closeOnEscape() &&\n !this.isLoading()\n ) {\n this.handleClose();\n }\n };\n document.addEventListener('keydown', this.escapeKeyListener);\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen()) {\n const timeoutId = setTimeout(() => {\n if (this.dialogContainer?.nativeElement) {\n this.trapFocus();\n }\n }, 0);\n this.focusTimeouts.push(timeoutId);\n }\n }\n\n ngOnDestroy(): void {\n // Clean up effect\n if (this.focusEffectRef) {\n this.focusEffectRef.destroy();\n this.focusEffectRef = undefined;\n }\n this.releaseFocus();\n // Remove Escape key listener\n if (this.escapeKeyListener) {\n document.removeEventListener('keydown', this.escapeKeyListener);\n this.escapeKeyListener = undefined;\n }\n // Clear all pending focus timeouts\n this.focusTimeouts.forEach((timeoutId) => clearTimeout(timeoutId));\n this.focusTimeouts = [];\n }\n\n onOverlayClick(): void {\n if (this.closeOnOverlayClick() && !this.isLoading()) {\n this.handleClose();\n }\n }\n\n onDialogClick(event: Event): void {\n // Prevent overlay click when clicking inside dialog\n event.stopPropagation();\n }\n\n private handleClose(): void {\n if (!this.isLoading()) {\n this.close.emit();\n }\n }\n\n private trapFocus(): void {\n // Store the previously focused element\n this.previousActiveElement = document.activeElement as HTMLElement;\n\n // Set up Tab key listener for focus trapping\n this.tabKeyListener = (event: KeyboardEvent) => {\n if (event.key !== 'Tab' || !this.isOpen()) return;\n\n const focusableElements = this.getFocusableElements();\n if (focusableElements.length === 0) {\n event.preventDefault();\n return;\n }\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n document.addEventListener('keydown', this.tabKeyListener);\n\n // Focus the first focusable element after a short delay to ensure DOM is ready\n // If no focusable elements exist, focus the container itself\n const timeoutId = setTimeout(() => {\n const focusableElements = this.getFocusableElements();\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n } else if (this.dialogContainer?.nativeElement) {\n // Fallback: focus the container itself if no focusable elements\n this.dialogContainer.nativeElement.focus();\n }\n }, 0);\n this.focusTimeouts.push(timeoutId);\n }\n\n private releaseFocus(): void {\n // Remove Tab key listener\n if (this.tabKeyListener) {\n document.removeEventListener('keydown', this.tabKeyListener);\n this.tabKeyListener = undefined;\n }\n\n // Return focus to the previously active element\n if (\n this.previousActiveElement &&\n typeof this.previousActiveElement.focus === 'function'\n ) {\n this.previousActiveElement.focus();\n this.previousActiveElement = null;\n }\n }\n\n private getFocusableElements(): HTMLElement[] {\n if (!this.dialogContainer?.nativeElement) return [];\n\n const container = this.dialogContainer.nativeElement;\n const selector =\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(container.querySelectorAll<HTMLElement>(selector)).filter(\n (el) => !el.hasAttribute('disabled') && !el.hasAttribute('aria-hidden'),\n );\n }\n}\n","@if (isOpen()) {\n<div \n class=\"babylai:absolute babylai:inset-0 babylai:flex babylai:items-end babylai:justify-center babylai:border-radius-2xl babylai:z-50 babylai:bg-card-foreground/50\" \n (click)=\"onOverlayClick()\" \n role=\"dialog\" \n aria-modal=\"true\" \n [attr.aria-label]=\"ariaLabel()\"\n>\n <div class=\"babylai:bg-card babylai:rounded-t-2xl babylai:w-full\" #dialogContainer tabindex=\"-1\" (click)=\"onDialogClick($event)\">\n <ng-content></ng-content>\n @if (isLoading()) {\n <div class=\"babylai:bg-black/30 babylai:flex babylai:items-center babylai:justify-center babylai:absolute babylai:inset-0\">\n <app-loading variant=\"primary\"></app-loading>\n </div>\n }\n </div>\n</div>\n}\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { FooterComponent } from '../../../help-center-widget/components/footer/footer.component';\nimport { BaseDialogComponent } from '../base-dialog';\nimport { ButtonComponent } from '../button';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-confirmation-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ButtonComponent,\n BaseDialogComponent,\n IconComponent,\n FooterComponent,\n ],\n templateUrl: './confirmation-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfirmationDialogComponent {\n title = input<string>('');\n body = input<string>('');\n confirmText = input<string>('Confirm');\n cancelText = input<string>('Cancel');\n isLoading = input<boolean>(false);\n onConfirm = output<void>();\n onCancel = output<void>();\n onClose = output<void>();\n\n disableActions = computed(() => this.isLoading());\n\n onCloseClick(): void {\n this.onClose.emit();\n }\n}\n","<app-base-dialog\n [isOpen]=\"true\"\n [isLoading]=\"isLoading()\"\n [ariaLabel]=\"title()\"\n (close)=\"onCloseClick()\"\n>\n <div\n class=\"babylai:flex babylai:flex-col babylai:p-6 babylai:pb-5 babylai:w-full\"\n >\n <button\n class=\"babylai:border-0 babylai:p-0 babylai:flex babylai:bg-transparent babylai:cursor-pointer babylai:mb-6 babylai:ms-auto babylai:text-card-foreground\"\n (click)=\"onCloseClick()\"\n >\n <app-icon\n name=\"solar:close-circle-line-duotone\"\n class=\"babylai:flex\"\n size=\"28px\"\n />\n </button>\n <section\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:border-b babylai:border-black-white-200 babylai:pb-6 babylai:mb-6\"\n >\n <div\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:w-20 babylai:h-20 babylai:rounded-full babylai:p-3 babylai:bg-primary/15 babylai:text-primary\"\n >\n <app-icon\n name=\"solar:chat-round-unread-bold-duotone\"\n class=\"babylai:flex\"\n size=\"56px\"\n />\n </div>\n </section>\n <h3\n class=\"babylai:text-2xl! babylai:text-center babylai:font-bold! babylai:mb-2! babylai:text-card-foreground\"\n >\n {{ title() }}\n </h3>\n <p\n class=\"babylai:text-sm babylai:text-center babylai:text-muted-foreground\"\n >\n {{ body() }}\n </p>\n </div>\n <div\n class=\"babylai:flex babylai:justify-between babylai:gap-3 babylai:mb-5 babylai:px-6\"\n >\n <app-button\n variant=\"outline\"\n [fullWidth]=\"true\"\n [disabled]=\"disableActions()\"\n (onClick)=\"onCancel.emit()\"\n class=\"babylai:w-full\"\n >\n {{ cancelText() }}\n <app-icon name=\"solar:plain-2-bold-duotone\" class=\"babylai:flex\" />\n </app-button>\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"disableActions()\"\n (onClick)=\"onConfirm.emit()\"\n class=\"babylai:w-full\"\n >\n {{ confirmText() }}\n </app-button>\n </div>\n <app-footer />\n</app-base-dialog>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FooterComponent } from '../../../help-center-widget/components/footer/footer.component';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { BaseDialogComponent } from '../base-dialog';\nimport { ButtonComponent } from '../button';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-review-dialog',\n templateUrl: './review-dialog.component.html',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonComponent,\n BaseDialogComponent,\n TranslatePipe,\n IconComponent,\n FooterComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReviewDialogComponent {\n isOpen = input<boolean>(false);\n isSubmitting = input<boolean>(false);\n showCommentField = input<boolean>(true);\n close = output<void>();\n submitReview = output<{ rating: number; comment: string }>();\n skip = output<void>();\n\n rating = signal<number>(0);\n comment = signal<string>('');\n\n // Validation errors\n ratingError = signal<string>('');\n commentError = signal<string>('');\n\n onRatingClick(starIndex: number): void {\n this.rating.set(starIndex + 1);\n this.clearRatingError();\n }\n\n onCommentChange(): void {\n this.clearCommentError();\n }\n\n onClose(): void {\n if (!this.isSubmitting()) {\n this.close.emit();\n }\n }\n\n onDialogClose(): void {\n this.onClose();\n }\n\n onSubmitReview(): void {\n if (this.validateForm() && !this.isSubmitting()) {\n this.submitReview.emit({\n rating: this.rating(),\n comment: this.comment().trim(),\n });\n }\n }\n\n onSkip(): void {\n if (!this.isSubmitting()) {\n this.skip.emit();\n this.resetForm();\n }\n }\n\n private validateForm(): boolean {\n let isValid = true;\n\n // Validate rating\n if (this.rating() < 1 || this.rating() > 5) {\n this.ratingError.set('Rating must be between 1 and 5.');\n isValid = false;\n }\n\n // Validate comment only if comment field is shown\n if (this.showCommentField()) {\n const trimmedComment = this.comment().trim();\n if (trimmedComment.length < 10) {\n this.commentError.set('Comment must be at least 10 characters long.');\n isValid = false;\n } else if (trimmedComment.length > 500) {\n this.commentError.set('Comment must not exceed 500 characters.');\n isValid = false;\n }\n }\n\n return isValid;\n }\n\n private clearRatingError(): void {\n this.ratingError.set('');\n }\n\n private clearCommentError(): void {\n this.commentError.set('');\n }\n\n private resetForm(): void {\n this.rating.set(0);\n this.comment.set('');\n this.ratingError.set('');\n this.commentError.set('');\n }\n\n getStarsArray(): number[] {\n return Array(5)\n .fill(0)\n .map((_, index) => index);\n }\n\n isStarFilled(starIndex: number): boolean {\n return starIndex < this.rating();\n }\n\n getCommentLength(): number {\n return this.comment().trim().length;\n }\n\n getCommentMaxLength(): number {\n return 500;\n }\n\n getCommentMinLength(): number {\n return 10;\n }\n}\n","<app-base-dialog\n [isOpen]=\"isOpen()\"\n [ariaLabel]=\"'ReviewDialogTitle' | translate\"\n (close)=\"onDialogClose()\"\n>\n <div\n class=\"babylai:flex babylai:flex-col babylai:p-6 babylai:pb-5 babylai:w-full\"\n >\n <button\n class=\"babylai:border-0 babylai:p-0 babylai:flex babylai:bg-transparent babylai:cursor-pointer babylai:mb-6 babylai:ms-auto babylai:text-card-foreground\"\n (click)=\"onClose()\"\n >\n <app-icon\n name=\"solar:close-circle-line-duotone\"\n class=\"babylai:flex\"\n size=\"28px\"\n />\n </button>\n <section\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:border-b babylai:border-black-white-200 babylai:pb-6 babylai:mb-6\"\n >\n <!-- Rating Section -->\n <div>\n <label class=\"babylai:sr-only\">\n {{ \"ReviewDialogRatingLabel\" | translate }}\n </label>\n <div class=\"babylai:inline-flex babylai:gap-2\">\n @for (star of getStarsArray(); track star) {\n <button\n class=\"babylai:hover:text-[#F49E00] babylai:border-0 babylai:bg-transparent babylai:p-0\"\n [class.babylai:text-black-white-200]=\"!isStarFilled(star)\"\n [class.babylai:dark:text-muted-foreground]=\"!isStarFilled(star)\"\n [class.babylai:text-[#F49E00]]=\"isStarFilled(star)\"\n [disabled]=\"isSubmitting()\"\n (click)=\"onRatingClick(star)\"\n [attr.aria-label]=\"'Rate ' + (star + 1) + ' out of 5 stars'\"\n [attr.aria-pressed]=\"isStarFilled(star)\"\n role=\"button\"\n type=\"button\"\n (keydown.enter)=\"onRatingClick(star)\"\n (keydown.space)=\"$event.preventDefault(); onRatingClick(star)\"\n >\n <app-icon\n name=\"solar:star-bold\"\n class=\"babylai:flex\"\n size=\"53px\"\n />\n </button>\n }\n </div>\n @if (ratingError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ ratingError() }}\n </div>\n }\n </div>\n </section>\n <h3\n class=\"babylai:text-2xl! babylai:text-center babylai:font-bold! babylai:mb-2! babylai:text-card-foreground\"\n >\n {{ \"ReviewDialogTitle\" | translate }}\n </h3>\n <p\n class=\"babylai:text-xs babylai:text-center babylai:text-muted-foreground babylai:mb-4 babylai:leading-snug\"\n >\n {{ \"ReviewDialogDescription\" | translate }}\n </p>\n\n @if (rating() > 0) {\n <div class=\"babylai:flex babylai:flex-col babylai:gap-6 babylai:mt-6\">\n <p\n class=\"babylai:text-sm babylai:text-card-foreground babylai:leading-snug\"\n >\n {{ \"ReviewDialogCommentLabel\" | translate }}\n </p>\n <div class=\"babylai:flex babylai:flex-col babylai:gap-2\">\n <textarea\n class=\"babylai:resize-none babylai:w-full babylai:bg-secondary babylai:border babylai:rounded-xl babylai:text-card-foreground babylai:text-sm babylai:p-3 babylai:resize-vertical babylai:min-h-20 babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed babylai:disabled:bg-secondary babylai:border-black-white-200\"\n [class.babylai:border-destructive]=\"commentError()\"\n [ngModel]=\"comment()\"\n (ngModelChange)=\"comment.set($event); onCommentChange()\"\n [placeholder]=\"'ReviewDialogCommentPlaceholder' | translate\"\n [maxlength]=\"getCommentMaxLength()\"\n [disabled]=\"isSubmitting()\"\n rows=\"4\"\n ></textarea>\n <div class=\"babylai:flex babylai:flex-col\">\n <div\n class=\"babylai:text-card-foreground babylai:text-sm babylai:whitespace-nowrap babylai:opacity-70\"\n >\n {{ getCommentLength() }}/{{ getCommentMaxLength() }} characters\n </div>\n @if (commentError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ commentError() }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions -->\n <div\n class=\"babylai:flex babylai:justify-between babylai:gap-3 babylai:mb-5 babylai:px-6\"\n >\n <app-button\n variant=\"outline\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting()\"\n (onClick)=\"onSkip()\"\n class=\"babylai:w-full\"\n >\n {{ \"ReviewDialogSkipButton\" | translate }}\n </app-button>\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting()\"\n (onClick)=\"onSubmitReview()\"\n class=\"babylai:w-full babylai:inline-flex babylai:items-center babylai:justify-center babylai:gap-2\"\n >\n @if (isSubmitting()) {\n <app-icon\n name=\"line-md:loading-twotone-loop\"\n class=\"babylai:flex babylai:shrink-0\"\n size=\"20px\"\n />\n Submitting...\n } @else {\n {{ \"ReviewDialogSubmitButton\" | translate }}\n }\n </app-button>\n </div>\n <app-footer />\n</app-base-dialog>\n","// Main header components\nexport * from './chat-header';\nexport * from './header';\n\n// Header sub-components\nexport * from './back-button';\nexport * from './close-button';\nexport * from './minimize-button';\n\n// Other shared components\nexport * from './button';\nexport * from './card';\nexport * from './confirmation-dialog';\nexport * from './icon';\nexport * from './loading';\nexport * from './markdown-renderer';\nexport * from './review-dialog';\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { catchError, of } from 'rxjs';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { FileUploadService } from '../../../services/file-upload.service';\nimport { IconComponent } from '../../../shared/components';\nimport { SelectedFileDto, UploadResult } from '../../../types';\n\n@Component({\n selector: 'app-chat-input',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe, IconComponent],\n templateUrl: './chat-input.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatInputComponent implements OnInit, OnDestroy {\n // Using input() signals - automatically trigger change detection on updates\n isChatClosed = input<boolean>(false);\n assistantStatus = input<string>('');\n currentLang = input<string>('en');\n @Input() set sessionId(value: string | null) {\n this._sessionId = value;\n // When sessionId becomes available, upload any pending files\n if (value) {\n // Use setTimeout to ensure the component has updated\n setTimeout(() => this.uploadPendingFiles(), 0);\n }\n }\n get sessionId(): string | null {\n return this._sessionId;\n }\n private _sessionId: string | null = null;\n @Output() sendMessage = new EventEmitter<{\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }>();\n /** Emitted when user adds attachments but there is no session yet (so parent can create one and start upload) */\n @Output() requestSessionForAttachments = new EventEmitter<void>();\n @ViewChild('messageInput') messageInput!: ElementRef;\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n private readonly fileUploadService = inject(FileUploadService);\n // Local state as signal\n messageContent = signal('');\n selectedFiles = signal<SelectedFileDto[]>([]);\n previewImageUrl = signal<string | null>(null);\n previewImageIndex = signal<number>(-1);\n\n isUploading = computed(() => this.selectedFiles().some((f) => f.uploading));\n hasUploadErrors = computed(() => {\n const files = this.selectedFiles();\n // Only return true if there are files AND all of them have errors\n // If no files are selected, there are no errors\n return (\n files.length > 0 &&\n files.every((f) => f.error !== null && f.uploadedId === null)\n );\n });\n\n /** True when any file is still uploading or pending (no uploadedId yet) */\n hasPendingOrUploadingFiles = computed(() =>\n this.selectedFiles().some(\n (f) => f.uploading || (!f.uploadedId && !f.error),\n ),\n );\n\n canSend = computed(() => {\n const hasText = this.messageContent().trim().length > 0;\n const hasUploadedFiles = this.selectedFiles().some((f) => !!f.uploadedId);\n const notTyping = this.assistantStatus() !== 'typing';\n const notClosed = !this.isChatClosed();\n\n // Allow sending only when (text or uploaded files) and no files still uploading/pending\n return (\n (hasText || hasUploadedFiles) &&\n !this.hasPendingOrUploadingFiles() &&\n notTyping &&\n notClosed\n );\n });\n\n ngOnInit(): void {\n // Component initialization\n }\n\n ngOnDestroy(): void {\n // Clean up blob URLs\n this.selectedFiles().forEach((file) => {\n if (file.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(file.previewUrl);\n }\n });\n if (this.previewImageUrl()?.startsWith('blob:')) {\n URL.revokeObjectURL(this.previewImageUrl()!);\n }\n }\n\n handleFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n const files = input.files;\n\n if (!files || files.length === 0) return;\n\n const imageFiles = Array.from(files).filter((file) =>\n file.type.startsWith('image/'),\n );\n\n if (imageFiles.length === 0) {\n window.alert('Please select image files only');\n return;\n }\n\n // Create preview URLs and add to selected files\n const newFiles: SelectedFileDto[] = imageFiles.map((file) => ({\n file,\n previewUrl: URL.createObjectURL(file),\n uploading: false,\n uploadedId: null,\n error: null,\n }));\n\n this.selectedFiles.update((current) => [...current, ...newFiles]);\n\n // Start uploading if session exists; otherwise ask parent to create session so we can upload\n if (this.sessionId) {\n this.uploadFiles(imageFiles);\n } else {\n this.requestSessionForAttachments.emit();\n }\n\n // Reset file input\n if (input) {\n input.value = '';\n }\n }\n\n handleAttachClick(): void {\n this.fileInput?.nativeElement?.click();\n }\n\n removeFile(index: number): void {\n const file = this.selectedFiles()[index];\n if (file.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(file.previewUrl);\n }\n this.selectedFiles.update((current) =>\n current.filter((_, i) => i !== index),\n );\n }\n\n /**\n * Upload pending files that don't have an uploadedId yet\n */\n uploadPendingFiles(): void {\n if (!this.sessionId) return;\n\n const pendingFiles = this.selectedFiles().filter(\n (f) => !f.uploadedId && !f.uploading && !f.error,\n );\n\n if (pendingFiles.length > 0) {\n const filesToUpload = pendingFiles.map((f) => f.file);\n this.uploadFiles(filesToUpload);\n }\n }\n\n uploadFiles(files: File[]): void {\n if (!this.sessionId || files.length === 0) {\n // If no sessionId, files will be uploaded later when session is created\n // Don't mark them as error - just wait\n return;\n }\n\n // Create a map of file names to track which file corresponds to which result\n const fileMap = new Map<File, number>();\n files.forEach((file, index) => {\n fileMap.set(file, index);\n });\n\n // Mark files as uploading\n this.selectedFiles.update((current) =>\n current.map((f) => {\n if (files.includes(f.file)) {\n return { ...f, uploading: true, error: null };\n }\n return f;\n }),\n );\n\n // Upload files\n this.fileUploadService\n .uploadFiles(this.sessionId, files)\n .pipe(\n catchError((error) => {\n console.error('Error uploading files:', error);\n // Mark all uploading files as failed\n this.selectedFiles.update((current) =>\n current.map((f) => {\n if (files.includes(f.file)) {\n return {\n ...f,\n uploading: false,\n error: 'Upload failed',\n };\n }\n return f;\n }),\n );\n return of([] as UploadResult[]);\n }),\n )\n .subscribe((results) => {\n // Update selected files with upload results\n // Match results to files by index\n this.selectedFiles.update((current) => {\n return current.map((f) => {\n const fileIndex = fileMap.get(f.file);\n if (fileIndex !== undefined && results[fileIndex]) {\n const result = results[fileIndex];\n return {\n ...f,\n uploading: false,\n uploadedId: result.success ? result.fileId : null,\n error: result.success ? null : result.error || 'Upload failed',\n };\n }\n return f;\n });\n });\n });\n }\n\n handleSendMessage(): void {\n if (!this.canSend()) return;\n\n // Send is only enabled when all files are uploaded, so we only emit uploaded IDs\n const uploadedIds = this.selectedFiles()\n .map((f) => f.uploadedId)\n .filter((id): id is string => id !== null);\n\n this.sendMessage.emit({\n text: this.messageContent(),\n attachmentIds: uploadedIds,\n });\n\n // Clear message and files\n this.messageContent.set('');\n this.selectedFiles().forEach((f) => {\n if (f.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(f.previewUrl);\n }\n });\n this.selectedFiles.set([]);\n this.adjustTextareaHeight();\n }\n\n handlePreviewImage(index: number): void {\n const file = this.selectedFiles()[index];\n if (file) {\n this.previewImageUrl.set(file.previewUrl);\n this.previewImageIndex.set(index);\n }\n }\n\n closePreview(): void {\n this.previewImageUrl.set(null);\n this.previewImageIndex.set(-1);\n }\n\n adjustTextareaHeight(): void {\n const textarea = this.messageInput?.nativeElement;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = textarea.scrollHeight + 'px';\n }\n }\n}\n","<div class=\"babylai:relative babylai:w-full\">\n @if (selectedFiles().length > 0) {\n <div\n class=\"babylai:scrollbar-thin babylai:flex babylai:gap-2 babylai:mb-2 babylai:overflow-x-auto babylai:bg-card babylai:rounded-2xl babylai:p-3\"\n style=\"scrollbar-width: thin\"\n >\n @for (file of selectedFiles(); track $index) {\n <div\n class=\"babylai:relative babylai:w-[50px] babylai:h-[50px] babylai:rounded-md babylai:shrink-0 babylai:border babylai:border-black-white-200\"\n [style.background-color]=\"'var(--muted)'\"\n >\n <img\n [src]=\"file.previewUrl\"\n [alt]=\"file.file.name\"\n class=\"babylai:w-full babylai:h-full babylai:object-cover babylai:transition-opacity babylai:duration-200\"\n [class.babylai:opacity-50]=\"file.uploading\"\n [class.babylai:opacity-100]=\"!file.uploading\"\n [class.babylai:hover:opacity-80]=\"!file.uploading\"\n [class.babylai:cursor-pointer]=\"!file.uploading\"\n [class.babylai:pointer-events-none]=\"file.uploading\"\n (click)=\"handlePreviewImage($index)\"\n />\n @if (file.uploading) {\n <div\n class=\"babylai:absolute babylai:inset-0 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-md babylai:bg-black/50\"\n aria-hidden=\"true\"\n >\n <app-icon\n name=\"line-md:loading-twotone-loop\"\n class=\"babylai:flex babylai:text-white babylai:text-2xl\"\n />\n </div>\n }\n @if (file.error) {\n <div\n class=\"babylai:absolute babylai:top-0.5 babylai:right-0.5 babylai:w-4 babylai:h-4 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full text-white babylai:text-xs babylai:font-semibold\"\n [style.background-color]=\"'var(--destructive)'\"\n [title]=\"file.error\"\n >\n !\n </div>\n }\n <button\n type=\"button\"\n class=\"babylai:border-0 babylai:p-0 babylai:absolute babylai:-top-2 babylai:-right-2 babylai:bg-destructive babylai:text-white babylai:rounded-full babylai:w-5 babylai:h-5 babylai:flex babylai:items-center babylai:justify-center babylai:cursor-pointer\"\n (click)=\"removeFile($index)\"\n aria-label=\"Remove image\"\n >\n <app-icon\n name=\"solar:close-circle-line-duotone\"\n class=\"babylai:flex\"\n />\n </button>\n </div>\n }\n </div>\n }\n\n <form\n (ngSubmit)=\"handleSendMessage()\"\n class=\"babylai:relative babylai:w-full\"\n >\n <div\n class=\"babylai:flex babylai:items-center babylai:gap-2 babylai:relative babylai:rounded-full babylai:bg-card babylai:py-3 babylai:px-4\"\n >\n <input\n type=\"file\"\n #fileInput\n accept=\"image/*\"\n multiple\n (change)=\"handleFileSelect($event)\"\n class=\"babylai:hidden\"\n [disabled]=\"isChatClosed()\"\n />\n\n <div class=\"babylai:border-e babylai:border-border babylai:pe-2\">\n <button\n type=\"button\"\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:border-0 babylai:rounded-full babylai:w-8 babylai:h-8 babylai:cursor-pointer babylai:bg-secondary babylai:text-muted-foreground babylai:hover:text-primary-500 babylai:transition-colors babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed\"\n (click)=\"handleAttachClick()\"\n [disabled]=\"isChatClosed()\"\n aria-label=\"Attach image\"\n >\n <app-icon name=\"solar:paperclip-bold-duotone\" class=\"babylai:flex\" />\n </button>\n </div>\n\n <input\n type=\"text\"\n [ngModel]=\"messageContent()\"\n (ngModelChange)=\"messageContent.set($event)\"\n name=\"messageContent\"\n [placeholder]=\"'ChatPlaceholder' | translate\"\n [disabled]=\"isChatClosed()\"\n [attr.aria-label]=\"'Chat input field'\"\n [attr.aria-disabled]=\"isChatClosed()\"\n role=\"textbox\"\n class=\"babylai:flex-1 babylai:py-2 babylai:px-2 babylai:bg-transparent babylai:outline-none babylai:text-sm babylai:border-none babylai:text-card-foreground babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed\"\n dir=\"auto\"\n #messageInput\n (keydown.enter)=\"handleSendMessage()\"\n (keydown.escape)=\"messageContent.set('')\"\n />\n\n <button\n type=\"submit\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"'Send message'\"\n class=\"babylai:border-0 babylai:rounded-full babylai:bg-primary-500 babylai:hover:bg-primary-600 babylai:w-8 babylai:h-8 babylai:p-0 babylai:flex babylai:items-center babylai:justify-center babylai:disabled:opacity-50 babylai:text-white babylai:cursor-pointer babylai:disabled:cursor-not-allowed\"\n >\n <app-icon name=\"solar:plain-2-bold-duotone\" class=\"babylai:flex\" />\n </button>\n </div>\n </form>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { ChatComponent } from '../../../chat/chat.component';\nimport { ChatInputComponent } from '../../../chat/components/chat-input/chat-input.component';\nimport { ChatHeaderComponent } from '../../../shared/components';\nimport { Message, Option } from '../../../types';\nimport { FooterComponent } from '../footer/footer.component';\n\n@Component({\n selector: 'app-chat-screen',\n templateUrl: './chat-screen.component.html',\n standalone: true,\n imports: [\n CommonModule,\n ChatHeaderComponent,\n ChatComponent,\n FooterComponent,\n ChatInputComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatScreenComponent {\n showChat = input<boolean>(false);\n messages = input<Message[]>([]);\n needsAgent = input<boolean>(false);\n assistantStatus = input<string>('idle');\n isAblyConnected = input<boolean>(false);\n isChatClosed = input<boolean>(false);\n currentLang = input<string>('en');\n chatIsLoading = input<boolean>(false);\n sessionId = input<string | null>(null);\n selectedOption = input<Option | null>(null);\n selectedNestedOption = input<Option | null>(null);\n isSubmittingReview = input<boolean>(false);\n\n endChat = output<void>();\n back = output<void>();\n onMinimize = output<void>();\n sendMessage = output<{\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }>();\n requestSessionForAttachments = output<void>();\n reviewSubmit = output<{ rating: number; comment: string }>();\n reviewSkip = output<void>();\n\n handleEndChat() {\n this.endChat.emit();\n }\n\n handleBack() {\n this.back.emit();\n }\n\n handleMinimize() {\n this.onMinimize.emit();\n }\n\n handleSendMessage(event: {\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }) {\n this.sendMessage.emit(event);\n }\n\n handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n this.reviewSubmit.emit(reviewData);\n }\n\n handleReviewSkip() {\n this.reviewSkip.emit();\n }\n}\n","<app-chat-header\n [showBackButton]=\"showChat()\"\n [selectedOptionTitle]=\"\n selectedNestedOption()?.title || selectedOption()?.title || null\n \"\n (onClose)=\"handleEndChat()\"\n (onBack)=\"handleBack()\"\n (onMinimize)=\"handleMinimize()\"\n [language]=\"currentLang()\"\n></app-chat-header>\n\n<app-chat\n class=\"babylai:flex babylai:flex-col babylai:flex-1 babylai:overflow-y-auto babylai:p-4\"\n [messages]=\"messages()\"\n [needsAgent]=\"needsAgent()\"\n [assistantStatus]=\"assistantStatus()\"\n [currentLang]=\"currentLang()\"\n [loading]=\"chatIsLoading()\"\n [isSubmittingReview]=\"isSubmittingReview()\"\n (reviewSubmit)=\"handleReviewSubmit($event)\"\n (reviewSkip)=\"handleReviewSkip()\"\n></app-chat>\n\n<app-chat-input\n [isChatClosed]=\"isChatClosed()\"\n [assistantStatus]=\"assistantStatus()\"\n [currentLang]=\"currentLang()\"\n [sessionId]=\"sessionId()\"\n (sendMessage)=\"handleSendMessage($event)\"\n (requestSessionForAttachments)=\"requestSessionForAttachments.emit()\"\n class=\"babylai:px-4 babylai:mb-2\"\n/>\n\n<app-footer />\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n@Component({\n selector: 'app-company-card',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './company-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CompanyCardComponent {\n title = input<string>('BabylAI');\n description = input<string>('Smart solutions for customer service');\n iconUrl = input<string | null | undefined>('');\n\n hasIconUrl = computed(() => {\n const url = this.iconUrl();\n return !!url && url.trim().length > 0;\n });\n}\n","<section class=\"babylai:border-b babylai:border-black-white-200\">\n <div\n class=\"babylai:flex babylai:items-center babylai:gap-3 babylai:p-6 babylai:mb-6 babylai:rounded-3xl babylai:border babylai:border-black-white-200 babylai:bg-card\"\n >\n <!-- Left Icon -->\n @if (hasIconUrl()) {\n <div\n class=\"babylai:shrink-0 babylai:w-12 babylai:h-12 babylai:rounded-md babylai:overflow-hidden\"\n >\n <img\n [src]=\"iconUrl()!\"\n [alt]=\"title() + ' logo'\"\n class=\"babylai:w-full babylai:h-full babylai:object-contain\"\n />\n </div>\n }\n\n <!-- Center Content -->\n <div class=\"babylai:flex-1 babylai:min-w-0 babylai:text-start\">\n <h3\n class=\"babylai:text-lg babylai:font-semibold babylai:mb-1 babylai:text-card-foreground\"\n dir=\"auto\"\n >\n {{ title() }}\n </h3>\n <p class=\"babylai:text-sm babylai:text-muted-foreground\" dir=\"auto\">\n {{ description() }}\n </p>\n </div>\n </div>\n</section>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\n\n@Component({\n selector: 'app-help-button',\n templateUrl: './help-button.component.html',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpButtonComponent {\n isPopupOpen = input<boolean>(false);\n togglePopup = output<void>();\n\n handleTogglePopup() {\n this.togglePopup.emit();\n }\n}\n","<button\n class=\"babylai:fixed babylai:z-50 babylai:bottom-4 babylai:right-4 babylai:p-4 babylai:rounded-full babylai:bg-primary-500 babylai:flex babylai:items-center babylai:justify-center babylai:border-[0.5px] babylai:border-black-white-50\"\n (click)=\"handleTogglePopup()\"\n type=\"button\"\n [attr.aria-label]=\"'Toggle help center'\"\n [attr.aria-expanded]=\"isPopupOpen()\"\n [attr.aria-haspopup]=\"true\"\n (keydown.enter)=\"handleTogglePopup()\"\n (keydown.space)=\"$event.preventDefault(); handleTogglePopup()\"\n>\n <svg\n class=\"babylai:w-8 babylai:h-8 babylai:text-primary-500\"\n viewBox=\"0 0 55 53\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.53125 19.1353C8.53125 12.2804 14.0883 6.72339 20.9432 6.72339H41.6298C48.4847 6.72339 54.0418 12.2804 54.0418 19.1353V52.2339H20.9432C14.0883 52.2339 8.53125 46.6769 8.53125 39.8219V19.1353Z\"\n fill=\"#E5E5E5\"\n />\n <path\n d=\"M0 12.412C0 5.55702 5.55702 0 12.412 0H33.0985C39.9535 0 45.5105 5.55702 45.5105 12.412V33.0985C45.5105 39.9535 39.9535 45.5105 33.0985 45.5105H0V12.412Z\"\n fill=\"white\"\n />\n <path\n d=\"M14.3684 15.2203C14.3696 15.2162 14.3701 15.2142 14.3704 15.2132C14.5505 14.5816 15.4457 14.5816 15.6258 15.2132C15.6261 15.2142 15.6267 15.2162 15.6278 15.2203C15.6309 15.2311 15.6324 15.2365 15.6338 15.2416C16.4708 18.1971 18.7808 20.5071 21.7364 21.3441C21.7414 21.3455 21.7468 21.3471 21.7576 21.3501C21.7617 21.3512 21.7637 21.3518 21.7647 21.3521C22.3963 21.5322 22.3963 22.4274 21.7647 22.6075C21.7637 22.6078 21.7617 22.6084 21.7576 22.6095C21.7468 22.6126 21.7414 22.6141 21.7364 22.6155C18.7808 23.4525 16.4708 25.7625 15.6338 28.7181C15.6324 28.7231 15.6309 28.7285 15.6278 28.7393C15.6267 28.7434 15.6261 28.7454 15.6258 28.7464C15.4457 29.378 14.5505 29.378 14.3704 28.7464C14.3701 28.7454 14.3696 28.7434 14.3684 28.7393C14.3654 28.7285 14.3638 28.7231 14.3624 28.7181C13.5254 25.7625 11.2154 23.4525 8.25988 22.6155C8.25481 22.6141 8.24942 22.6126 8.23864 22.6095C8.23454 22.6084 8.2325 22.6078 8.23155 22.6075C7.5999 22.4274 7.5999 21.5322 8.23155 21.3521C8.2325 21.3518 8.23454 21.3512 8.23864 21.3501C8.24942 21.3471 8.25481 21.3455 8.25988 21.3441C11.2154 20.5071 13.5254 18.1971 14.3624 15.2416C14.3638 15.2365 14.3654 15.2311 14.3684 15.2203Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M36.7198 21.8503C36.7198 24.9207 34.2886 27.4098 31.2896 27.4098C28.2906 27.4098 25.8594 24.9207 25.8594 21.8503C25.8594 18.7799 28.2906 16.2908 31.2896 16.2908C34.2886 16.2908 36.7198 18.7799 36.7198 21.8503Z\"\n fill=\"currentColor\"\n />\n </svg>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { HeaderComponent } from '../header';\n\n@Component({\n selector: 'app-error-state',\n templateUrl: './error-state.component.html',\n imports: [HeaderComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ErrorStateComponent {\n error = input<string | null>(null);\n onMinimize = output<void>();\n}\n","<div\n class=\"babylai:w-full babylai:h-full babylai:bg-secondary babylai:rounded-3xl babylai:shadow-lg babylai:flex babylai:flex-col\">\n <div class=\"babylai:rounded-3xl babylai:h-full babylai:flex babylai:flex-col babylai:gap-4\">\n <app-header (onMinimize)=\"onMinimize.emit()\" />\n <div\n class=\"babylai:flex babylai:flex-col babylai:items-center babylai:justify-center babylai:w-full babylai:h-full babylai:py-28 babylai:p-4\">\n <span class=\"babylai:text-secondary-foreground babylai:text-lg\">Error: {{ error() }}</span>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { HelpScreenOption } from '../../../types';\n\n@Component({\n selector: 'app-helpscreen-option',\n imports: [],\n templateUrl: './helpscreen-option.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpscreenOptionComponent {\n option = input.required<HelpScreenOption>();\n isSelected = input<boolean>(false);\n\n optionSelected = output<string>();\n\n select(): void {\n this.optionSelected.emit(this.option().id);\n }\n}\n","<div\n [id]=\"option().id\"\n class=\"babylai:flex babylai:flex-col babylai:gap-2 babylai:p-6 babylai:rounded-3xl babylai:text-start babylai:border babylai:border-black-white-200 babylai:bg-card babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:ease-out babylai:active:scale-[0.98] babylai:active:opacity-95\"\n [class.babylai:ring]=\"isSelected()\"\n [class.babylai:ring-primary-500]=\"isSelected()\"\n [class.babylai:shadow-md]=\"isSelected()\"\n (click)=\"select()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"option().title + (isSelected() ? ' (selected)' : '')\"\n [attr.aria-pressed]=\"isSelected()\"\n (keydown.enter)=\"select()\"\n (keydown.space)=\"$event.preventDefault(); select()\"\n>\n <h4\n class=\"babylai:text-base! babylai:font-semibold! babylai:text-card-foreground\"\n dir=\"auto\"\n >\n {{ option().title }}\n </h4>\n @if (option().paragraphs && option().paragraphs.length > 0) {\n <p\n class=\"babylai:text-sm babylai:text-muted-foreground babylai:leading-snug\"\n dir=\"auto\"\n >\n {{ option().paragraphs[0] }}\n </p>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { TranslatePipe } from '../pipes/translate.pipe';\nimport { ButtonComponent } from '../shared/components/button';\nimport { IconComponent } from '../shared/components/icon';\nimport { HelpScreenData, HelpScreenOption } from '../types';\nimport { HelpscreenOptionComponent } from './components/helpscreen-option/helpscreen-option.component';\n\n@Component({\n selector: 'app-helpscreen-list',\n standalone: true,\n imports: [\n CommonModule,\n ButtonComponent,\n TranslatePipe,\n IconComponent,\n HelpscreenOptionComponent,\n ],\n templateUrl: './helpscreen-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpscreenListComponent implements OnInit, OnDestroy {\n helpScreenData = input<HelpScreenData | null>(null);\n title = input<string>('');\n hasOngoingSession = input<boolean>(false);\n handleStartNewChat = output<HelpScreenOption>();\n\n selectedItemId = signal<string | null>(null);\n\n selectedOption = computed(() => {\n const data = this.helpScreenData();\n const selectedId = this.selectedItemId();\n if (!data?.options || !selectedId) return null;\n return (\n data.options.find(\n (option: HelpScreenOption) => option.id === selectedId,\n ) || null\n );\n });\n\n canStartChat = computed(() => {\n const selected = this.selectedOption();\n return selected?.chatWithUs ?? false;\n });\n\n ngOnInit() {}\n\n selectItem(itemId: string): void {\n if (this.selectedItemId() === itemId) {\n // Deselect if clicking the same item\n this.selectedItemId.set(null);\n } else {\n this.selectedItemId.set(itemId);\n }\n }\n\n ngOnDestroy(): void {}\n\n handleStartChat(): void {\n const selected = this.selectedOption();\n if (selected) {\n this.handleStartNewChat.emit(selected);\n }\n }\n}\n","<div class=\"babylai:flex babylai:flex-col babylai:flex-1 babylai:gap-4\">\n <div class=\"babylai:grid babylai:grid-cols-1 babylai:gap-4\">\n @for (item of helpScreenData()?.options; track item.id) {\n <app-helpscreen-option\n [option]=\"item\"\n [isSelected]=\"selectedItemId() === item.id\"\n (optionSelected)=\"selectItem($event)\"\n />\n }\n </div>\n\n @if (!hasOngoingSession()) {\n <!-- Fixed call to action button -->\n <div class=\"babylai:sticky babylai:bottom-0 babylai:z-10\">\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"!canStartChat()\"\n (onClick)=\"handleStartChat()\"\n [attr.aria-label]=\"'Start chat'\"\n >\n <span>\n {{ \"ChatNow\" | translate }}\n </span>\n <app-icon\n name=\"solar:plain-2-bold-duotone\"\n class=\"babylai:flex\"\n size=\"24px\"\n />\n </app-button>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { HelpscreenListComponent } from '../../../help-screen-list/helpscreen-list.component';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { HeaderComponent } from '../../../shared/components';\nimport { Option } from '../../../types';\nimport { CompanyCardComponent } from '../company-card/company-card.component';\nimport { FooterComponent } from '../footer/footer.component';\n\n@Component({\n selector: 'app-home-screen',\n templateUrl: './home-screen.component.html',\n standalone: true,\n imports: [\n CommonModule,\n TranslatePipe,\n CompanyCardComponent,\n HelpscreenListComponent,\n FooterComponent,\n HeaderComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HomeScreenComponent {\n helpScreenData = input<any>(null);\n showHelpScreenData = input<boolean>(false);\n sessionId = input<string | null>(null);\n\n startNewChat = output<Option>();\n onClose = output<void>();\n onMinimize = output<void>();\n\n handleStartNewChat(option: Option) {\n this.startNewChat.emit(option);\n }\n\n handleClosePopup() {\n this.onClose.emit();\n }\n\n handleMinimizePopup() {\n this.onMinimize.emit();\n }\n}\n","<app-header (onMinimize)=\"handleMinimizePopup()\" />\n<div\n class=\"babylai:flex babylai:flex-col babylai:flex-1 babylai:overflow-y-auto babylai:px-6 babylai:pt-6 babylai:pb-4 babylai:gap-6\"\n>\n <header\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:gap-3 babylai:pb-5 babylai:border-b babylai:border-black-white-200\"\n >\n <svg\n class=\"babylai:w-8 babylai:h-8\"\n [style.color]=\"'var(--babylai-primary-color)'\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 34 34\"\n fill=\"currentColor\"\n >\n <path\n d=\"M18.4785 1.12896C18.4758 1.11935 18.4745 1.11454 18.4739 1.11232C18.0509 -0.370772 15.9491 -0.370772 15.5261 1.11232C15.5255 1.11454 15.5242 1.11935 15.5215 1.12896C15.5143 1.15428 15.5107 1.16694 15.5074 1.17883C13.5422 8.11839 8.11839 13.5422 1.17883 15.5074C1.16694 15.5107 1.15428 15.5143 1.12895 15.5215C1.11934 15.5242 1.11454 15.5255 1.11232 15.5261C-0.370773 15.9491 -0.370773 18.0509 1.11232 18.4739C1.11454 18.4745 1.11934 18.4758 1.12896 18.4785C1.15428 18.4857 1.16694 18.4893 1.17883 18.4926C8.11839 20.4578 13.5422 25.8816 15.5074 32.8212C15.5107 32.8331 15.5143 32.8457 15.5215 32.871C15.5242 32.8807 15.5255 32.8855 15.5261 32.8877C15.9491 34.3708 18.0509 34.3708 18.4739 32.8877C18.4745 32.8855 18.4758 32.8807 18.4785 32.871C18.4857 32.8457 18.4893 32.8331 18.4926 32.8212C20.4578 25.8816 25.8816 20.4578 32.8212 18.4926C32.8331 18.4893 32.8457 18.4857 32.871 18.4785C32.8807 18.4758 32.8855 18.4745 32.8877 18.4739C34.3708 18.0509 34.3708 15.9491 32.8877 15.5261C32.8855 15.5255 32.8807 15.5242 32.871 15.5215C32.8457 15.5143 32.8331 15.5107 32.8212 15.5074C25.8816 13.5422 20.4578 8.11839 18.4926 1.17883C18.4893 1.16694 18.4857 1.15428 18.4785 1.12896Z\"\n fill=\"currentColor\"\n />\n </svg>\n <h1\n class=\"babylai:text-2xl! babylai:font-semibold! babylai:text-card-foreground\"\n >\n {{ \"HelpCenter\" | translate }}\n </h1>\n </header>\n <app-company-card\n [title]=\"helpScreenData()?.tenant?.name\"\n [description]=\"\n helpScreenData()?.tenant?.settings?.description ||\n helpScreenData()?.description\n \"\n [iconUrl]=\"helpScreenData()?.tenant?.logoUrl\"\n />\n @if (showHelpScreenData()) {\n <app-helpscreen-list\n [helpScreenData]=\"helpScreenData()\"\n [hasOngoingSession]=\"!!sessionId()\"\n (handleStartNewChat)=\"handleStartNewChat($event)\"\n ></app-helpscreen-list>\n }\n</div>\n<app-footer />\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n input,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { ConfirmationDialogComponent } from '../../../shared/components/confirmation-dialog/confirmation-dialog.component';\nimport { ErrorStateComponent } from '../../../shared/components/error-state/error-state.component';\nimport { LoadingComponent } from '../../../shared/components/loading/loading.component';\nimport { ReviewDialogComponent } from '../../../shared/components/review-dialog/review-dialog.component';\nimport { Message, Option } from '../../../types';\nimport { ChatActionButtonsComponent } from '../chat-action-buttons/chat-action-buttons.component';\nimport { ChatScreenComponent } from '../chat-screen/chat-screen.component';\nimport { HomeScreenComponent } from '../home-screen/home-screen.component';\n\n@Component({\n selector: 'app-help-popup',\n templateUrl: './help-popup.component.html',\n standalone: true,\n imports: [\n CommonModule,\n TranslatePipe,\n LoadingComponent,\n ErrorStateComponent,\n ConfirmationDialogComponent,\n ReviewDialogComponent,\n HomeScreenComponent,\n ChatScreenComponent,\n ChatActionButtonsComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpPopupComponent implements OnDestroy {\n private static readonly POPUP_ANIMATION_DURATION_MS = 250;\n\n isPopupOpen = input<boolean>(false);\n isEntering = signal(true);\n isClosing = signal(false);\n private previousPopupOpen = false;\n private closeTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private closingAction: 'close' | 'minimize' | null = null;\n\n constructor() {\n effect(() => {\n const open = this.isPopupOpen();\n if (open && !this.previousPopupOpen) {\n this.previousPopupOpen = true;\n this.isEntering.set(true);\n const id = window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => this.isEntering.set(false));\n });\n return () => window.cancelAnimationFrame(id);\n }\n if (!open) {\n this.previousPopupOpen = false;\n }\n return undefined;\n });\n }\n\n ngOnDestroy() {\n if (this.closeTimeoutId !== null) {\n clearTimeout(this.closeTimeoutId);\n }\n }\n showHelpScreenData = input<boolean>(false);\n showChat = input<boolean>(false);\n status = input<string>('idle');\n error = input<string | null>(null);\n helpScreenData = input<any>(null);\n messages = input<Message[]>([]);\n needsAgent = input<boolean>(false);\n assistantStatus = input<string>('idle');\n isAblyConnected = input<boolean>(false);\n isChatClosed = input<boolean>(false);\n currentLang = input<string>('en');\n chatIsLoading = input<boolean>(false);\n sessionId = input<string | null>(null);\n selectedOption = input<Option | null>(null);\n selectedNestedOption = input<Option | null>(null);\n showEndChatConfirmation = input<boolean>(false);\n showStartNewChatConfirmation = input<boolean>(false);\n showReviewDialog = input<boolean>(false);\n isSubmittingReview = input<boolean>(false);\n isStartingNewChat = input<boolean>(false);\n\n closePopup = output<void>();\n minimizePopup = output<void>();\n back = output<void>();\n showChatEvent = output<void>();\n endChat = output<void>();\n confirmEndChat = output<void>();\n cancelEndChat = output<void>();\n closeEndChat = output<void>();\n confirmStartNewChat = output<void>();\n cancelStartNewChat = output<void>();\n closeStartNewChat = output<void>();\n reviewSubmit = output<{ rating: number; comment: string }>();\n reviewSkip = output<void>();\n reviewClose = output<void>();\n reviewSubmitFromChat = output<{ rating: number; comment: string }>();\n reviewSkipFromChat = output<void>();\n startNewChat = output<Option>();\n navigateToUrl = output<string>();\n sendMessageEvent = output<{\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }>();\n requestSessionForAttachments = output<void>();\n\n handleClosePopup() {\n if (this.isClosing()) return;\n this.isClosing.set(true);\n this.closingAction = 'close';\n this.scheduleCloseEmit();\n }\n\n handleMinimizePopup() {\n if (this.isClosing()) return;\n this.isClosing.set(true);\n this.closingAction = 'minimize';\n this.scheduleCloseEmit();\n }\n\n private scheduleCloseEmit() {\n this.closeTimeoutId = setTimeout(() => {\n if (this.closingAction === 'close') {\n this.closePopup.emit();\n } else if (this.closingAction === 'minimize') {\n this.minimizePopup.emit();\n }\n this.isClosing.set(false);\n this.closingAction = null;\n this.closeTimeoutId = null;\n }, HelpPopupComponent.POPUP_ANIMATION_DURATION_MS);\n }\n\n handleBack() {\n this.back.emit();\n }\n\n handleShowChat() {\n this.showChatEvent.emit();\n }\n\n handleEndChat() {\n this.endChat.emit();\n }\n\n handleConfirmEndChat() {\n this.confirmEndChat.emit();\n }\n\n handleCancelEndChat() {\n this.cancelEndChat.emit();\n }\n\n handleCloseEndChat() {\n this.closeEndChat.emit();\n }\n\n handleConfirmStartNewChat() {\n this.confirmStartNewChat.emit();\n }\n\n handleCancelStartNewChat() {\n this.cancelStartNewChat.emit();\n }\n\n handleCloseStartNewChat() {\n this.closeStartNewChat.emit();\n }\n\n handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n this.reviewSubmit.emit(reviewData);\n }\n\n handleReviewSkip() {\n this.reviewSkip.emit();\n }\n\n handleReviewClose() {\n this.reviewClose.emit();\n }\n\n handleSendMessage(event: {\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }) {\n this.sendMessageEvent.emit(event);\n }\n\n handleRequestSessionForAttachments() {\n this.requestSessionForAttachments.emit();\n }\n\n handleStartNewChat(option: Option) {\n this.startNewChat.emit(option);\n }\n\n handleNavigateToUrl(url: string) {\n this.navigateToUrl.emit(url);\n }\n\n handleReviewSubmitFromChat(reviewData: { rating: number; comment: string }) {\n this.reviewSubmitFromChat.emit(reviewData);\n }\n\n handleReviewSkipFromChat() {\n this.reviewSkipFromChat.emit();\n }\n}\n","@if (isPopupOpen()) {\n <div\n class=\"babylai:h-[calc(100vh-12rem)] babylai:bg-secondary babylai:rounded-3xl babylai:overflow-hidden babylai:max-h-[800px] babylai:shadow-md babylai:flex babylai:flex-col babylai:fixed babylai:bottom-24 babylai:right-5 babylai:z-1000 babylai:transition-all babylai:duration-250 babylai:ease-out\"\n [class.babylai:w-96]=\"isPopupOpen()\"\n [class.babylai:w-15]=\"!isPopupOpen()\"\n [class.babylai:bg-linear-to-b]=\"\n isPopupOpen() && !showHelpScreenData() && !showChat()\n \"\n [class.babylai:opacity-0]=\"isEntering() || isClosing()\"\n [class.babylai:scale-[0.96]]=\"isEntering() || isClosing()\"\n [class.babylai:translate-y-2]=\"isEntering() || isClosing()\"\n [class.babylai:opacity-100]=\"!isEntering() && !isClosing()\"\n [class.babylai:scale-100]=\"!isEntering() && !isClosing()\"\n [class.babylai:translate-y-0]=\"!isEntering() && !isClosing()\"\n >\n @if (showEndChatConfirmation()) {\n <app-confirmation-dialog\n [title]=\"'LeavingDialogTitle' | translate\"\n [body]=\"'LeavingDialogBody' | translate\"\n [confirmText]=\"'CloseChat' | translate\"\n [cancelText]=\"'Continue' | translate\"\n (onConfirm)=\"handleConfirmEndChat()\"\n (onCancel)=\"handleCancelEndChat()\"\n (onClose)=\"handleCloseEndChat()\"\n ></app-confirmation-dialog>\n }\n @if (showStartNewChatConfirmation()) {\n <app-confirmation-dialog\n [title]=\"'StartNewChatDialogTitle' | translate\"\n [body]=\"'StartNewChatDialogBody' | translate\"\n [confirmText]=\"'CloseChat' | translate\"\n [cancelText]=\"'Continue' | translate\"\n [isLoading]=\"isStartingNewChat()\"\n (onConfirm)=\"handleConfirmStartNewChat()\"\n (onCancel)=\"handleCancelStartNewChat()\"\n (onClose)=\"handleCloseStartNewChat()\"\n ></app-confirmation-dialog>\n }\n\n <!-- Loading State -->\n @if (status() === \"loading\") {\n <app-loading\n (onMinimize)=\"handleMinimizePopup()\"\n class=\"babylai:h-full\"\n ></app-loading>\n }\n\n <!-- Error State -->\n @if (status() === \"failed\") {\n <app-error-state\n [error]=\"error()\"\n (onMinimize)=\"handleMinimizePopup()\"\n class=\"babylai:h-full\"\n ></app-error-state>\n }\n\n @if (status() === \"succeeded\") {\n @if (!showChat()) {\n @if (sessionId()) {\n <app-chat-action-buttons\n [selectedOption]=\"selectedOption()\"\n (closeChat)=\"handleEndChat()\"\n (continueChat)=\"handleShowChat()\"\n ></app-chat-action-buttons>\n }\n }\n\n <!-- Chat Screen -->\n @if (showChat()) {\n <app-chat-screen\n [showChat]=\"showChat()\"\n [messages]=\"messages()\"\n [needsAgent]=\"needsAgent()\"\n [assistantStatus]=\"assistantStatus()\"\n [isAblyConnected]=\"isAblyConnected()\"\n [isChatClosed]=\"isChatClosed()\"\n [currentLang]=\"currentLang()\"\n [chatIsLoading]=\"chatIsLoading()\"\n [sessionId]=\"sessionId()\"\n [selectedOption]=\"selectedOption()\"\n [selectedNestedOption]=\"selectedNestedOption()\"\n [isSubmittingReview]=\"isSubmittingReview()\"\n (endChat)=\"handleEndChat()\"\n (back)=\"handleBack()\"\n (onMinimize)=\"handleMinimizePopup()\"\n (sendMessage)=\"handleSendMessage($event)\"\n (requestSessionForAttachments)=\"handleRequestSessionForAttachments()\"\n (reviewSubmit)=\"handleReviewSubmitFromChat($event)\"\n (reviewSkip)=\"handleReviewSkipFromChat()\"\n class=\"babylai:flex babylai:flex-col babylai:h-full\"\n ></app-chat-screen>\n }\n\n <!-- Home Screen -->\n @if (!showChat()) {\n <app-home-screen\n [helpScreenData]=\"helpScreenData()\"\n [showHelpScreenData]=\"showHelpScreenData()\"\n [sessionId]=\"sessionId()\"\n (startNewChat)=\"handleStartNewChat($event)\"\n (onClose)=\"handleClosePopup()\"\n (onMinimize)=\"handleMinimizePopup()\"\n class=\"babylai:flex babylai:flex-col babylai:max-h-full\"\n ></app-home-screen>\n }\n\n <!-- Review Dialog (shown when closing from home screen - stars only) -->\n <app-review-dialog\n [isOpen]=\"showReviewDialog()\"\n [isSubmitting]=\"isSubmittingReview()\"\n [showCommentField]=\"false\"\n (close)=\"handleReviewClose()\"\n (submitReview)=\"handleReviewSubmit($event)\"\n (skip)=\"handleReviewSkip()\"\n ></app-review-dialog>\n }\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n EffectRef,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { ActionHandlerService } from '../services/action-handler.service';\nimport { ApiService } from '../services/api.service';\nimport { ChatSessionService } from '../services/chat-session.service';\nimport { FileUploadService } from '../services/file-upload.service';\nimport { ThemeService } from '../services/theme.service';\nimport { TranslationService } from '../services/translation.service';\nimport { HelpScreenData, Message, Option } from '../types';\nimport {\n ArrowAnimationComponent,\n HelpButtonComponent,\n HelpPopupComponent,\n} from './components';\n\n@Component({\n selector: 'app-help-center-widget',\n templateUrl: './help-center-widget.component.html',\n styleUrls: ['../../styles.css'],\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ArrowAnimationComponent,\n HelpButtonComponent,\n HelpPopupComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpCenterWidgetComponent implements OnInit, OnDestroy {\n getToken = input.required<() => Promise<string>>();\n helpScreenId = input.required<string>();\n showArrow = input<boolean>(true);\n messageLabel = input<string | null>(null);\n currentLang = input<string>('en');\n primaryColor = input<string>('#ad49e1');\n logoUrl = input<string>('');\n @ViewChild('chatMessagesContainer') chatMessagesContainer!: ElementRef;\n\n isRTL = computed(() => this.currentLang() === 'ar');\n\n // State variables - using signals for automatic change detection\n isPopupOpen = signal(false);\n helpScreenData = signal<HelpScreenData | null>(null);\n status = signal<'idle' | 'loading' | 'succeeded' | 'failed'>('idle');\n error = signal<string | null>(null);\n showArrowAnimation = signal(false);\n showTooltip = signal(false);\n sessionId = signal<string | null>(null);\n isAblyConnected = signal(false);\n isChatClosed = signal(false);\n showChat = signal(false);\n messageText = signal('');\n isTyping = signal(false);\n messages = signal<Message[]>([]);\n showHelpScreenData = signal(false);\n chatIsLoading = signal(false);\n ablyToken = signal<string | null>(null);\n needsAgent = signal(false);\n assistantStatus = signal<'idle' | 'typing'>('idle');\n selectedOption = signal<Option | null>(null);\n selectedNestedOption = signal<Option | null>(null);\n showEndChatConfirmation = signal(false);\n showStartNewChatConfirmation = signal(false);\n showReviewDialog = signal(false);\n isSubmittingReview = signal(false);\n isStartingNewChat = signal(false);\n pendingNewChatOption = signal<Option | null>(null);\n hasUserSentMessages = signal(false);\n closedSessionIdForReview = signal<string | null>(null);\n waitingForSessionEndConfirmation = signal(false);\n\n private isClosingChatSession = false;\n\n private apiService = inject(ApiService);\n private translationService = inject(TranslationService);\n private themeService = inject(ThemeService);\n private chatSessionService = inject(ChatSessionService);\n private actionHandlerService = inject(ActionHandlerService);\n private fileUploadService = inject(FileUploadService);\n private destroyRef = inject(DestroyRef);\n private themeEffectRef?: EffectRef;\n private languageEffectRef?: EffectRef;\n\n constructor() {\n // Combined effect to initialize and update theme when primaryColor or logoUrl change\n // This is more efficient than having separate effects\n this.themeEffectRef = effect(() => {\n const primaryColor = this.primaryColor();\n const logoUrl = this.logoUrl();\n\n // Initialize theme when either primaryColor or logoUrl changes\n if (primaryColor || logoUrl) {\n this.themeService.initializeTheme(primaryColor, logoUrl);\n }\n });\n\n // Effect to sync translation service language with input\n this.languageEffectRef = effect(() => {\n const lang = this.currentLang();\n if (lang) {\n this.translationService.setLanguage(lang as 'en' | 'ar');\n }\n });\n\n // Subscribe to language changes from translation service\n this.translationService.currentLang\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((lang) => {\n // Update if translation service language differs from input\n if (lang !== this.currentLang()) {\n // The translation service will update, but we don't need to update the input\n // as it's controlled by the parent component\n }\n });\n\n // Register action handlers for extensible action handling\n this.registerActionHandlers();\n }\n\n /**\n * Registers action handlers for AI response actions.\n * This uses the ActionHandlerService for extensible, maintainable action handling.\n */\n private registerActionHandlers(): void {\n // Register handler for 'needs_agent' action\n this.actionHandlerService.registerHandler('needs_agent', () => {\n // Trigger \"handoff / needs agent\" UI flow\n this.needsAgent.set(true);\n });\n\n // Register handler for 'end_session' action\n this.actionHandlerService.registerHandler('end_session', () => {\n // Trigger end session flow\n this.handleEndSessionReceived();\n });\n }\n\n ngOnInit() {\n this.showArrowAnimation.set(this.showArrow());\n }\n\n ngOnDestroy() {\n // Clean up effects\n if (this.themeEffectRef) {\n this.themeEffectRef.destroy();\n this.themeEffectRef = undefined;\n }\n if (this.languageEffectRef) {\n this.languageEffectRef.destroy();\n this.languageEffectRef = undefined;\n }\n // Cleanup handled by takeUntilDestroyed\n // Clean up Ably connection\n this.chatSessionService.stopConnection();\n // Clear any pending timeouts\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n this.scrollTimeout = undefined;\n }\n }\n\n async handleTogglePopup() {\n this.isPopupOpen.update((isOpen) => !isOpen);\n this.showArrowAnimation.set(this.isPopupOpen());\n\n if (this.isPopupOpen()) {\n // Reset the state when opening the popup\n await this.fetchHelpScreenData();\n }\n }\n\n private async fetchHelpScreenData() {\n this.status.set('loading');\n this.error.set(null);\n\n try {\n const response = await this.apiService.apiRequest(\n `client/clientHelpScreen/${this.helpScreenId()}`,\n 'GET',\n null,\n {\n 'Accept-Language': this.currentLang(),\n },\n );\n this.helpScreenData.set(await response.json());\n this.status.set('succeeded');\n // Automatically show the option screen when data is loaded (since intro section is removed)\n this.showHelpScreenData.set(true);\n } catch (error: unknown) {\n console.error('Error fetching help screen data:', error);\n this.error.set(\n this.translationService.translate('ErrorFetchingHelpScreen'),\n );\n this.status.set('failed');\n }\n }\n\n async createChatSession(option?: Option) {\n try {\n const selectedOpt = option || this.selectedOption();\n if (!selectedOpt) {\n throw new Error('No option selected for chat session');\n }\n\n // Create session using service\n const data = await this.chatSessionService.createSession(\n selectedOpt,\n this.helpScreenId(),\n this.currentLang(),\n );\n\n const { chatSession, ablyToken } = data;\n this.sessionId.set(chatSession?.id ?? null);\n this.ablyToken.set(ablyToken);\n\n // Establish Ably connection after creating session\n if (this.sessionId() && selectedOpt && !this.isAblyConnected()) {\n // Use the ablyToken from response or fallback to getValidToken\n const tokenToUse =\n this.ablyToken() || (await this.apiService.getValidToken());\n\n // Get tenantId from the selected option's assistant\n const tenantId =\n selectedOpt.assistant?.tenantId ||\n selectedOpt.assistant?.tenant?.id ||\n '';\n\n // Read sessionId fresh after async operation to ensure we have the current value\n const currentSessionId = this.sessionId();\n if (currentSessionId) {\n // Use action handler service for extensible action handling\n const actionHandler = async (\n actionType: string,\n messageData: any,\n ) => {\n await this.actionHandlerService.handleAction(\n actionType,\n messageData,\n );\n };\n\n await this.chatSessionService.establishAblyConnection(\n currentSessionId,\n tokenToUse,\n this.handleReceiveMessage.bind(this),\n tenantId,\n selectedOpt,\n this.helpScreenId(),\n this.currentLang(),\n actionHandler,\n );\n\n this.isAblyConnected.set(true);\n }\n }\n\n return data;\n } catch (error) {\n console.error('Error creating chat session:', error);\n throw error;\n }\n }\n\n async sendMessage(\n event?:\n | { text: string; attachmentIds: string[]; pendingFiles?: File[] }\n | string,\n ) {\n let textToSend = '';\n let attachmentIds: string[] = [];\n let pendingFiles: File[] = [];\n\n if (typeof event === 'string') {\n textToSend = event || this.messageText();\n } else if (event) {\n textToSend = event.text || this.messageText();\n attachmentIds = event.attachmentIds || [];\n pendingFiles = event.pendingFiles || [];\n } else {\n textToSend = this.messageText();\n }\n\n const hasContent = !!textToSend && textToSend.trim().length > 0;\n const hasAttachments = attachmentIds.length > 0 || pendingFiles.length > 0;\n\n if (!hasContent && !hasAttachments) {\n this.error.set(this.translationService.translate('ErrorMessageEmpty'));\n return;\n }\n\n if (textToSend.length > 5000) {\n this.error.set(this.translationService.translate('ErrorMessageTooLong'));\n return;\n }\n\n if (this.isChatClosed()) return;\n\n try {\n // Add user message first so it appears in UI immediately\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'user',\n senderType: 1,\n messageContent: hasContent ? textToSend : '',\n sentAt: new Date(),\n isSeen: false,\n ...(attachmentIds.length > 0 ? { attachmentIds } : {}),\n },\n ]);\n\n // Track that user has sent a message\n this.hasUserSentMessages.set(true);\n this.assistantStatus.set('typing');\n\n // Create session only when user sends first message (if not already exists)\n if (!this.sessionId()) {\n const selectedOption = this.selectedOption();\n if (!selectedOption) {\n this.error.set(\n this.translationService.translate('ErrorCreatingSession'),\n );\n this.assistantStatus.set('idle');\n this.chatIsLoading.set(false);\n // Remove the message that was just added\n this.messages.update((msgs) => msgs.slice(0, -1));\n return;\n }\n await this.createChatSession(selectedOption);\n }\n\n // If there are pending files (e.g. from another code path), upload them now that we have a session\n const currentSessionId = this.sessionId();\n if (pendingFiles.length > 0 && currentSessionId) {\n try {\n const uploadResults = await firstValueFrom(\n this.fileUploadService.uploadFiles(currentSessionId, pendingFiles),\n );\n\n const newAttachmentIds = uploadResults\n .filter((result) => result.success)\n .map((result) => result.fileId);\n\n attachmentIds = [...attachmentIds, ...newAttachmentIds];\n } catch (uploadError) {\n console.error('Error uploading pending files:', uploadError);\n }\n }\n\n // Send message via API\n const freshSessionId = this.sessionId();\n if (freshSessionId) {\n const contentToSend = hasContent ? textToSend : ' ';\n await this.chatSessionService.sendMessage(\n freshSessionId,\n contentToSend,\n this.currentLang(),\n attachmentIds,\n );\n }\n\n this.messageText.set('');\n\n // Update message as seen\n this.messages.update((msgs) =>\n msgs.map((msg) =>\n msg.senderType === 1 && !msg.isSeen ? { ...msg, isSeen: true } : msg,\n ),\n );\n } catch (error) {\n console.error('Error sending message:', error);\n this.assistantStatus.set('idle');\n this.chatIsLoading.set(false);\n const errorMessage = this.translationService.translate(\n 'ErrorSendingMessage',\n );\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent: errorMessage,\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n }\n }\n\n /**\n * Called when user attaches files but there is no session yet.\n * Creates a session so that chat-input can upload the files; send stays disabled until upload completes.\n */\n async handleRequestSessionForAttachments(): Promise<void> {\n if (this.sessionId()) return;\n const selectedOption = this.selectedOption();\n if (!selectedOption) return;\n try {\n await this.createChatSession(selectedOption);\n } catch (error) {\n console.error('Error creating session for attachments:', error);\n }\n }\n\n handleReceiveMessage(\n message: string | { content: string; attachments?: string[] },\n senderType: number,\n needsAgent: boolean,\n ) {\n if (needsAgent) {\n this.needsAgent.set(true);\n }\n\n const sender = this.getSenderType(senderType);\n const messageContent =\n typeof message === 'string' ? message : message.content || '';\n const attachmentIds =\n typeof message === 'string' ? undefined : message.attachments;\n\n // If we're waiting for session end confirmation, this message is the closing one.\n // Add it first, then add the review message so order is: closing → separator → review.\n const wasWaitingForConfirmation = this.waitingForSessionEndConfirmation();\n if (wasWaitingForConfirmation) {\n this.waitingForSessionEndConfirmation.set(false);\n }\n\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: sender,\n senderType: senderType,\n messageContent,\n sentAt: new Date(),\n isSeen: true,\n ...(attachmentIds && attachmentIds.length > 0 ? { attachmentIds } : {}),\n },\n ]);\n\n if (wasWaitingForConfirmation) {\n this.handleEndSessionConfirmed();\n }\n\n this.assistantStatus.set('idle');\n this.chatIsLoading.set(false);\n this.scrollToBottom();\n }\n\n private getSenderType(senderType: number): 'user' | 'assistant' | 'agent' {\n switch (senderType) {\n case 1:\n return 'user';\n case 2:\n return 'agent';\n default:\n return 'assistant';\n }\n }\n\n private hasActiveChatSession(): boolean {\n // Check if there are any user messages or agent/assistant responses (not just welcome messages)\n return this.messages().some(\n (message) =>\n message.senderType === 1 || // User message\n ((message.senderType === 2 || message.senderType === 3) &&\n !this.isWelcomeMessage(message.messageContent)), // Assistant/agent message that's not a welcome\n );\n }\n\n private isWelcomeMessage(content: string): boolean {\n const welcomeMessages = [\n 'Hello! How can I assist you today?',\n 'مرحباً! كيف يمكنني مساعدتك اليوم؟',\n ];\n // Check if it's a standard welcome message or if it contains common greeting patterns\n return (\n welcomeMessages.some((welcome) => content.includes(welcome)) ||\n content.includes('Hello!') ||\n content.includes('مرحباً!') ||\n content.includes('How can I assist') ||\n content.includes('كيف يمكنني مساعدتك')\n );\n }\n\n async handleStartNewChat(option: Option) {\n // Check if there's already an active chat session (has sessionId and meaningful messages)\n if (this.sessionId() && this.hasActiveChatSession()) {\n this.pendingNewChatOption.set(option);\n this.showStartNewChatConfirmation.set(true);\n return;\n }\n\n // If there's a sessionId but only welcome messages, clear the session and start fresh\n if (this.sessionId() && !this.hasActiveChatSession()) {\n await this.clearCurrentChat();\n }\n\n // If there are only welcome messages but no session, clear them and start fresh\n if (this.messages().length > 0 && !this.sessionId()) {\n this.messages.set([]);\n this.hasUserSentMessages.set(false);\n }\n\n this.selectedOption.set(option);\n\n try {\n // Update UI state - session will be created when the user sends the first message\n this.showChat.set(true);\n this.isChatClosed.set(false);\n this.showHelpScreenData.set(false);\n\n // Add greeting message\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent:\n option.assistant?.greeting ||\n (this.currentLang() === 'en'\n ? 'Hello! How can I assist you today?'\n : 'مرحباً! كيف يمكنني مساعدتك اليوم؟'),\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n } catch (error) {\n console.error('Error starting chat:', error);\n\n const errorMessage =\n this.translationService.translate('ErrorStartingChat');\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent: errorMessage,\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n }\n }\n\n private async startNewChatSession(option: Option) {\n try {\n this.status.set('loading');\n this.error.set('');\n this.messages.set([]);\n\n // Use the centralized createChatSession method\n await this.createChatSession(option);\n\n // Update UI state only after successful session creation\n this.isChatClosed.set(false);\n this.status.set('succeeded');\n } catch (error: unknown) {\n console.error('Chat start error:', error);\n this.error.set(this.translationService.translate('ErrorCreatingSession'));\n this.status.set('failed');\n }\n }\n\n async handleStartChat(option: Option) {\n await this.startNewChatSession(option);\n // Update UI state only after successful session creation\n if (this.status() === 'succeeded') {\n this.showChat.set(true);\n }\n }\n\n async handleEndChat() {\n // If called from home screen and user has sent messages, close session and show review dialog\n if (!this.showChat() && this.sessionId() && this.hasUserSentMessages()) {\n // Store session ID before closing\n const currentSessionId = this.sessionId();\n\n // Close the chat session first\n await this.endChatSession();\n\n // Store the closed session ID for review submission\n this.closedSessionIdForReview.set(currentSessionId);\n\n // Show review dialog\n this.showReviewDialog.set(true);\n return;\n }\n\n // Otherwise, show confirmation dialog (when called from chat screen)\n this.showEndChatConfirmation.set(true);\n }\n\n async confirmEndChat() {\n if (this.isClosingChatSession) {\n return;\n }\n this.isClosingChatSession = true;\n this.showEndChatConfirmation.set(false);\n\n try {\n // Only show review if user has sent messages\n if (this.hasUserSentMessages()) {\n // Store session ID before closing (closeSessionOnly clears it immediately)\n const currentSessionId = this.sessionId();\n\n // Close the chat session on backend only (don't change UI state)\n await this.closeSessionOnly();\n\n // Store the closed session ID for review submission\n this.closedSessionIdForReview.set(currentSessionId);\n\n // Add review message to chat\n this.addReviewMessageToChat();\n } else {\n // No messages sent, just end the chat directly\n await this.endChatSession();\n }\n } finally {\n this.isClosingChatSession = false;\n }\n }\n\n async handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n try {\n this.isSubmittingReview.set(true);\n\n // Use the stored closed session ID for review submission\n const sessionIdForReview = this.closedSessionIdForReview();\n\n // Submit review to API endpoint using the closed session ID\n if (sessionIdForReview) {\n await this.chatSessionService.submitReview(\n sessionIdForReview,\n reviewData.rating,\n reviewData.comment || '',\n this.currentLang(),\n );\n }\n\n // Close review dialog\n this.showReviewDialog.set(false);\n this.isSubmittingReview.set(false);\n\n // Clear the stored session ID\n this.closedSessionIdForReview.set(null);\n\n // Don't close popup after review submission - keep it open showing help screen\n this.hasUserSentMessages.set(false);\n } catch (error) {\n console.error('Error submitting review:', error);\n this.isSubmittingReview.set(false);\n // Still close the dialog even if review submission fails\n this.showReviewDialog.set(false);\n // Clear the stored session ID even on error\n this.closedSessionIdForReview.set(null);\n this.hasUserSentMessages.set(false);\n }\n }\n\n handleReviewClose() {\n // Only close the review dialog without triggering any actions\n this.showReviewDialog.set(false);\n // Clear the stored session ID\n this.closedSessionIdForReview.set(null);\n }\n\n async handleReviewSkip() {\n // Close review dialog\n this.showReviewDialog.set(false);\n // Clear the stored session ID without submitting review\n this.closedSessionIdForReview.set(null);\n // Don't close popup after skipping review - keep it open showing help screen\n this.hasUserSentMessages.set(false);\n }\n\n private async endChatSession() {\n // Reset waiting flag if connection closes before confirmation\n this.waitingForSessionEndConfirmation.set(false);\n\n // Capture and clear sessionId immediately so a second concurrent call won't call the close API again\n const currentSessionId = this.sessionId();\n if (!currentSessionId) {\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n return;\n }\n this.sessionId.set(null);\n\n await this.chatSessionService.closeSession(\n currentSessionId,\n this.currentLang(),\n );\n\n // Stop Ably connection\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n\n private async closeSessionOnly() {\n // Reset waiting flag when closing session\n this.waitingForSessionEndConfirmation.set(false);\n\n // Capture and clear sessionId immediately so a second concurrent call (e.g. double-click) won't call the close API again\n const currentSessionId = this.sessionId();\n if (!currentSessionId) {\n return;\n }\n this.sessionId.set(null);\n\n await this.chatSessionService.closeSession(\n currentSessionId,\n this.currentLang(),\n );\n\n // Stop Ably connection\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n }\n\n cancelEndChat() {\n this.showEndChatConfirmation.set(false);\n }\n\n closeEndChat() {\n // Only close the dialog without triggering any actions\n this.showEndChatConfirmation.set(false);\n }\n\n async confirmStartNewChat() {\n const pendingOption = this.pendingNewChatOption();\n if (!pendingOption) {\n return;\n }\n\n this.isStartingNewChat.set(true);\n\n try {\n // Clear current chat session\n await this.clearCurrentChat();\n // Start new chat with the pending option\n await this.startNewChatWithOption(pendingOption);\n this.pendingNewChatOption.set(null);\n // Only close dialog after successful completion\n this.showStartNewChatConfirmation.set(false);\n } catch (error) {\n console.error('Error starting new chat:', error);\n // On error, keep dialog open and show error message\n // The error will be handled by the startNewChatWithOption method\n } finally {\n this.isStartingNewChat.set(false);\n }\n }\n\n cancelStartNewChat() {\n // Don't allow cancellation while loading\n if (this.isStartingNewChat()) {\n return;\n }\n this.showStartNewChatConfirmation.set(false);\n this.pendingNewChatOption.set(null);\n // Show the already opened chat\n this.showChat.set(true);\n this.showHelpScreenData.set(false);\n }\n\n closeStartNewChat() {\n // Only close the dialog without triggering any actions\n // Don't allow closing while loading\n if (this.isStartingNewChat()) {\n return;\n }\n this.showStartNewChatConfirmation.set(false);\n this.pendingNewChatOption.set(null);\n }\n\n private async clearCurrentChat() {\n // Reset waiting flag when clearing chat\n this.waitingForSessionEndConfirmation.set(false);\n\n // Read sessionId fresh to ensure we have the current value before async operations\n const currentSessionId = this.sessionId();\n if (currentSessionId) {\n await this.chatSessionService.closeSession(\n currentSessionId,\n this.currentLang(),\n );\n // Read again after async operation to ensure we're clearing the correct session\n if (this.sessionId() === currentSessionId) {\n this.sessionId.set(null);\n }\n }\n\n // Stop Ably connection\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n\n // Clear messages and reset state\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n\n private async startNewChatWithOption(option: Option) {\n this.selectedOption.set(option);\n this.hasUserSentMessages.set(false);\n\n try {\n // Create chat session (includes Ably connection setup)\n await this.createChatSession(option);\n\n // Update UI state only after successful session creation\n // This ensures UI consistency - chat interface only shows when session is functional\n this.showChat.set(true);\n this.isChatClosed.set(false);\n this.showHelpScreenData.set(false);\n\n // Add greeting message\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent:\n option.assistant?.greeting ||\n (this.currentLang() === 'en'\n ? 'Hello! How can I assist you today?'\n : 'مرحباً! كيف يمكنني مساعدتك اليوم؟'),\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n } catch (error) {\n console.error('Error starting new chat:', error);\n\n // Show error message to user\n const errorMessage =\n this.translationService.translate('ErrorStartingChat');\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent: errorMessage,\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n }\n }\n\n async handleClosePopup() {\n // If there's an active session with messages, show stars-only review dialog\n if (this.sessionId() && this.hasUserSentMessages()) {\n this.showReviewDialog.set(true);\n // Don't close yet - wait for review submission/skip\n return;\n }\n\n // No messages or no session, close normally\n this.showHelpScreenData.set(false);\n this.showChat.set(false);\n this.isPopupOpen.set(false);\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n // Clear messages when closing popup to ensure fresh start next time\n this.messages.set([]);\n this.hasUserSentMessages.set(false);\n }\n\n handleMinimizePopup() {\n // Only close the popup, preserve all state (messages, sessionId, selectedOption, etc.)\n this.isPopupOpen.set(false);\n }\n\n handleCloseArrowAnimation() {\n this.showArrowAnimation.set(false);\n }\n\n handleBack() {\n if (this.showChat()) {\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n // Don't clear sessionId or messages when going back - user might want to return to chat\n } else if (this.selectedNestedOption()) {\n this.selectedNestedOption.set(null);\n } else if (this.selectedOption()) {\n this.selectedOption.set(null);\n } else if (this.showHelpScreenData()) {\n this.showHelpScreenData.set(false);\n }\n }\n\n handleShowChat() {\n this.showChat.set(true);\n this.showHelpScreenData.set(false);\n }\n\n selectOption(option: Option) {\n this.selectedOption.set(option);\n this.selectedNestedOption.set(null);\n }\n\n selectNestedOption(nestedOption: Option) {\n this.selectedNestedOption.set(nestedOption);\n }\n\n handleShowHelpScreenData() {\n this.showHelpScreenData.set(true);\n }\n\n private scrollTimeout?: ReturnType<typeof setTimeout>;\n\n private scrollToBottom(): void {\n // Clear any existing timeout\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n }\n this.scrollTimeout = setTimeout(() => {\n if (this.chatMessagesContainer) {\n const element = this.chatMessagesContainer.nativeElement;\n element.scrollTop = element.scrollHeight;\n }\n this.scrollTimeout = undefined;\n }, 0);\n }\n\n getDirection() {\n return this.currentLang() === 'ar' ? 'rtl' : 'ltr';\n }\n\n get helpScreenDataList() {\n const helpData = this.helpScreenData();\n if (!helpData?.options) return [];\n // Transform options to the format expected by HelpscreenListComponent\n return helpData.options.map((option: Option) => ({\n icon: option.icon || '/icons/default.svg',\n title: option.title,\n description: option.paragraphs?.[0] || '',\n actionLabel: option.chatWithUs ? 'Chat Now' : '',\n action: option.chatWithUs ? () => this.handleStartChat(option) : null,\n }));\n }\n\n navigateToUrl(url: string): void {\n window.open(url, '_blank');\n }\n\n private addReviewMessageToChat() {\n // Avoid adding review twice (e.g. from both confirmEndChat and handleEndSessionConfirmed)\n if (this.messages().some((m) => m.isReviewMessage)) {\n return;\n }\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'agent',\n senderType: 2,\n messageContent: '',\n sentAt: new Date(),\n isSeen: true,\n isReviewMessage: true,\n },\n ]);\n }\n\n handleEndSessionReceived() {\n // Set flag to wait for confirmation message\n // The next message received will be treated as confirmation\n this.waitingForSessionEndConfirmation.set(true);\n }\n\n private async handleEndSessionConfirmed() {\n // Only proceed if user has sent messages (to show review)\n if (!this.hasUserSentMessages()) {\n // No messages sent, just end the chat directly\n await this.endChatSession();\n return;\n }\n\n // Store session ID before closing\n const currentSessionId = this.sessionId();\n\n // Close the chat session on backend only (don't change UI state)\n await this.closeSessionOnly();\n\n // Store the closed session ID for review submission\n this.closedSessionIdForReview.set(currentSessionId);\n\n // Add review message to chat\n this.addReviewMessageToChat();\n }\n\n async handleReviewSubmitFromChat(reviewData: {\n rating: number;\n comment: string;\n }) {\n try {\n this.isSubmittingReview.set(true);\n\n // Use the stored closed session ID for review submission\n const sessionIdForReview = this.closedSessionIdForReview();\n\n // Submit review to API endpoint using the closed session ID\n if (sessionIdForReview) {\n await this.chatSessionService.submitReview(\n sessionIdForReview,\n reviewData.rating,\n reviewData.comment || '',\n this.currentLang(),\n );\n }\n\n // Clear the stored session ID\n this.closedSessionIdForReview.set(null);\n this.isSubmittingReview.set(false);\n\n // Clean up UI state after review submission\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n } catch (error) {\n console.error('Error submitting review:', error);\n this.isSubmittingReview.set(false);\n // Clear the stored session ID even on error\n this.closedSessionIdForReview.set(null);\n\n // Clean up UI state even on error\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n }\n\n async handleReviewSkipFromChat() {\n // Clear the stored session ID and clean up UI state\n this.closedSessionIdForReview.set(null);\n\n // Clean up UI state when skipping review\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n}\n","<div\n class=\"babylai-theme-root babylai:flex babylai:flex-col babylai:items-end babylai:h-auto babylai:w-auto babylai:fixed babylai:bottom-6 babylai:right-6 babylai:z-9998\"\n [dir]=\"getDirection()\"\n>\n <!-- TEST: Version mismatch fixed - Arrow Animation - SUCCESS! -->\n <app-arrow-animation\n [showArrowAnimation]=\"showArrowAnimation()\"\n [isPopupOpen]=\"isPopupOpen()\"\n [messageLabel]=\"messageLabel()\"\n (closeArrowAnimation)=\"handleCloseArrowAnimation()\"\n ></app-arrow-animation>\n\n <!-- Help Button -->\n <app-help-button\n [isPopupOpen]=\"isPopupOpen()\"\n (togglePopup)=\"handleTogglePopup()\"\n ></app-help-button>\n\n <!-- Help Popup -->\n <app-help-popup\n [isPopupOpen]=\"isPopupOpen()\"\n [showHelpScreenData]=\"showHelpScreenData()\"\n [showChat]=\"showChat()\"\n [status]=\"status()\"\n [error]=\"error()\"\n [helpScreenData]=\"helpScreenData()\"\n [messages]=\"messages()\"\n [needsAgent]=\"needsAgent()\"\n [assistantStatus]=\"assistantStatus()\"\n [isAblyConnected]=\"isAblyConnected()\"\n [isChatClosed]=\"isChatClosed()\"\n [currentLang]=\"currentLang()\"\n [chatIsLoading]=\"chatIsLoading()\"\n [sessionId]=\"sessionId()\"\n [selectedOption]=\"selectedOption()\"\n [selectedNestedOption]=\"selectedNestedOption()\"\n [showEndChatConfirmation]=\"showEndChatConfirmation()\"\n [showStartNewChatConfirmation]=\"showStartNewChatConfirmation()\"\n [showReviewDialog]=\"showReviewDialog()\"\n [isSubmittingReview]=\"isSubmittingReview()\"\n [isStartingNewChat]=\"isStartingNewChat()\"\n (closePopup)=\"handleClosePopup()\"\n (minimizePopup)=\"handleMinimizePopup()\"\n (back)=\"handleBack()\"\n (showChatEvent)=\"handleShowChat()\"\n (endChat)=\"handleEndChat()\"\n (confirmEndChat)=\"confirmEndChat()\"\n (cancelEndChat)=\"cancelEndChat()\"\n (closeEndChat)=\"closeEndChat()\"\n (confirmStartNewChat)=\"confirmStartNewChat()\"\n (cancelStartNewChat)=\"cancelStartNewChat()\"\n (closeStartNewChat)=\"closeStartNewChat()\"\n (reviewSubmit)=\"handleReviewSubmit($event)\"\n (reviewSkip)=\"handleReviewSkip()\"\n (reviewClose)=\"handleReviewClose()\"\n (reviewSubmitFromChat)=\"handleReviewSubmitFromChat($event)\"\n (reviewSkipFromChat)=\"handleReviewSkipFromChat()\"\n (sendMessageEvent)=\"sendMessage($event)\"\n (requestSessionForAttachments)=\"handleRequestSessionForAttachments()\"\n (startNewChat)=\"handleStartNewChat($event)\"\n (showHelpScreenDataEvent)=\"handleShowHelpScreenData()\"\n (navigateToUrl)=\"navigateToUrl($event)\"\n />\n</div>\n","import { Injectable } from '@angular/core';\n\nexport type GetTokenFn = () => Promise<string>;\n\n/**\n * Service for managing help center configuration.\n *\n * Stores configuration such as API base URL and token retrieval function.\n * This service is used internally by other services to access configuration.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class HelpCenterConfigService {\n private _apiBaseUrl: string = 'https://babylai.net/api';\n private _getTokenFn?: GetTokenFn;\n\n setApiBaseUrl(url: string) {\n this._apiBaseUrl = url;\n }\n\n getApiBaseUrl(): string {\n return this._apiBaseUrl;\n }\n\n setGetTokenFn(fn: GetTokenFn) {\n this._getTokenFn = fn;\n }\n\n getTokenFn(): GetTokenFn | undefined {\n return this._getTokenFn;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { TokenResponse } from '../types';\nimport { HelpCenterConfigService } from './help-center-config.service';\n\n/**\n * Service for retrieving authentication tokens from the configured token function.\n *\n * This service acts as a wrapper around the configured token retrieval function,\n * providing a consistent interface for token management.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class TokenService {\n private config = inject(HelpCenterConfigService);\n\n /**\n * Retrieves an authentication token using the configured token function.\n *\n * @returns Promise resolving to a TokenResponse containing the token and expiry time\n * @throws Error if no token function is configured\n */\n async getToken(): Promise<TokenResponse> {\n // If a custom token function is provided, use it\n const customGetToken = this.config.getTokenFn();\n if (customGetToken) {\n const token = await customGetToken();\n return {\n token,\n expiresIn: 3600, // Default to 1 hour\n };\n }\n\n // Otherwise, return error that getTokenFn is not provided\n throw new Error('getTokenFn is not provided');\n }\n}\n","// Types\nexport * from './src/app/types';\n\n/**\n * Configuration interface for API service initialization\n * \n * @publicApi\n */\nexport interface ApiConfig {\n /**\n * Function that returns a promise resolving to an authentication token\n * This function is called when tokens need to be refreshed\n */\n getToken: () => Promise<string>;\n \n /**\n * Optional base URL for API requests\n * Defaults to 'https://babylai.net/api' if not provided\n * Should use HTTPS in production environments\n */\n baseUrl?: string;\n}\n\n// Components and Modules\nexport * from './src/app/help-center-widget/help-center-widget.component';\n\n// Services\nexport * from './src/app/services/help-center-config.service';\nexport * from './src/app/services/api.service';\nexport * from './src/app/services/token.service';\nexport * from './src/app/services/translation.service';\nexport * from './src/app/services/chat-session.service';\nexport * from './src/app/language.service';\n\n// Pipes\nexport * from './src/app/pipes/translate.pipe';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["catchError"],"mappings":";;;;;;;;;;;;;;AAOA;;;;;;;;AAQG;MAIU,oBAAoB,CAAA;AACvB,IAAA,cAAc,GAAG,IAAI,GAAG,EAAyB;AACjD,IAAA,cAAc;AAEtB,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,KAAI;AACrC,YAAA,MAAM,UAAU,GAAG,WAAW,EAAE,UAAU,IAAI,EAAE;AAChD,YAAA,IAAI,UAAU,IAAI,UAAU,KAAK,EAAE,EAAE;AACnC,gBAAA,OAAO,CAAC,IAAI,CACV,CAAA,sDAAA,EAAyD,UAAU,CAAA,GAAA,CAAK;oBACtE,CAAA,aAAA,CAAe,EACjB,WAAW,CACZ;YACH;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;AAKG;IACH,eAAe,CAAC,UAAkB,EAAE,OAAsB,EAAA;QACxD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACvC,YAAA,OAAO,CAAC,IAAI,CACV,CAAA,gDAAA,EAAmD,UAAU,CAAA,kBAAA,CAAoB;AAC/E,gBAAA,CAAA,6BAAA,CAA+B,CAClC;QACH;QACA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC;IAC9C;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,UAAkB,EAAA;AAClC,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;IACxC;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,OAAsB,EAAA;AACtC,QAAA,IAAI,CAAC,cAAc,GAAG,OAAO;IAC/B;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,YAAY,CAChB,UAAqC,EACrC,WAAgB,EAAA;;AAGhB,QAAA,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,EAAE,EAAE;YACpC;QACF;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC;QAEnD,IAAI,OAAO,EAAE;AACX,YAAA,IAAI;AACF,gBAAA,MAAM,OAAO,CAAC,WAAW,CAAC;YAC5B;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CACX,CAAA,gEAAA,EAAmE,UAAU,CAAA,EAAA,CAAI,EACjF,KAAK,CACN;YACH;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,cAAc,EAAE;;AAE9B,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YACxC;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CACX,CAAA,wEAAA,EAA2E,UAAU,CAAA,EAAA,CAAI,EACzF,KAAK,CACN;YACH;QACF;IACF;AAEA;;;;AAIG;IACH,oBAAoB,GAAA;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/C;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;IAC7B;uGA1GW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA;;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACfD;;;;;;;;;;AAUG;MAIU,UAAU,CAAA;IACb,gBAAgB,GAAmC,IAAI;IACvD,OAAO,GAAW,yBAAyB;AAEnD;;;;;;;;;;;;;;;;;;;;AAoBG;AACH,IAAA,UAAU,CAAC,MAAiB,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;QACzE;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,QAAQ;AACvC,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;;;YAGlB,IACE,OAAO,MAAM,KAAK,WAAW;AAC7B,gBAAA,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EACrC;gBACA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;AAC5C,gBAAA,MAAM,WAAW,GACf,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;;AAGhE,gBAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE;oBAC1D,MAAM,IAAI,KAAK,CACb,iFAAiF;AAC/E,wBAAA,+DAA+D,CAClE;gBACH;YACF;AACA,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;QAC/B;IACF;AAEA;;;AAGG;AACK,IAAA,aAAa,CAAC,KAAa,EAAA;QACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE;AACjC,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,YAAA,OAAO,KAAK;QACd;;QAGA,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;AACrC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IACE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;AACrB,YAAA,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;YACrB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EACrB;AACA,YAAA,OAAO,KAAK;QACd;;;AAIA,QAAA,IAAI,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE;AAC5B,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;;;;;;;;;AAcG;AACH,IAAA,MAAM,aAAa,CAAC,YAAY,GAAG,KAAK,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,YAAA,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE;QACH;;;AAIA,QAAA,MAAM,uBAAuB,GAC3B,OAAO,MAAM,KAAK,WAAW;AAC7B,YAAA,OAAO,MAAM,CAAC,cAAc,KAAK,WAAW;AAC9C,QAAA,MAAM,qBAAqB,GACzB,OAAO,MAAM,KAAK,WAAW;AAC7B,YAAA,OAAO,MAAM,CAAC,YAAY,KAAK,WAAW;QAC5C,MAAM,YAAY,GAAmB;cACjC,MAAM,CAAC;AACT,cAAE;kBACE,MAAM,CAAC;kBACP,IAAI;QACV,MAAM,UAAU,GAAmB;cAC/B,MAAM,CAAC;cACP,IAAI;AAER,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACjD,IAAI,WAAW,GAAkB,IAAI;QACrC,IAAI,YAAY,GAAkB,IAAI;;QAGtC,IAAI,UAAU,EAAE;YACd,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC;YACtD,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAE9D,IAAI,UAAU,IAAI,WAAW,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE;;AAElE,gBAAA,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE;oBAClC,WAAW,GAAG,UAAU;oBACxB,YAAY,GAAG,WAAW;;AAG1B,oBAAA,IAAI,YAAY,IAAI,CAAC,YAAY,EAAE;AACjC,wBAAA,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC;AACjD,wBAAA,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,WAAW,CAAC;oBAC3D;gBACF;qBAAO;;AAEL,oBAAA,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;AACtC,oBAAA,UAAU,CAAC,UAAU,CAAC,sBAAsB,CAAC;gBAC/C;YACF;QACF;;AAGA,QAAA,IAAI,CAAC,WAAW,IAAI,YAAY,EAAE;YAChC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC;YAC1D,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC;AAElE,YAAA,IACE,YAAY;gBACZ,aAAa;AACb,gBAAA,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,EACnC;;AAEA,gBAAA,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;oBACpC,WAAW,GAAG,YAAY;oBAC1B,YAAY,GAAG,aAAa;gBAC9B;qBAAO;;AAEL,oBAAA,YAAY,CAAC,UAAU,CAAC,eAAe,CAAC;AACxC,oBAAA,YAAY,CAAC,UAAU,CAAC,sBAAsB,CAAC;gBACjD;YACF;QACF;;AAGA,QAAA,IACE,CAAC,WAAW;AACZ,YAAA,CAAC,YAAY;AACb,YAAA,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC;AACnC,YAAA,YAAY,EACZ;AACA,YAAA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE;YAEnD,IAAI,CAAC,aAAa,EAAE;AAClB,gBAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;YAClE;;YAGA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE;AACtC,gBAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;YACzE;YAEA,WAAW,GAAG,aAAa;YAC3B,YAAY,GAAG,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;;AAGzC,YAAA,MAAM,aAAa,GAAG,YAAY,IAAI,UAAU;YAChD,IAAI,aAAa,EAAE;AACjB,gBAAA,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC;AACnD,gBAAA,aAAa,CAAC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC;;AAG3D,gBAAA,IAAI,UAAU,IAAI,aAAa,KAAK,YAAY,EAAE;AAChD,oBAAA,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;AACtC,oBAAA,UAAU,CAAC,UAAU,CAAC,sBAAsB,CAAC;gBAC/C;YACF;QACF;AAEA,QAAA,OAAO,WAAY;IACrB;IAEQ,MAAM,aAAa,CACzB,GAAW,EACX,OAAoB,EACpB,KAAK,GAAG,IAAI,EAAA;AAEZ,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACpB,YAAA,OAAO,CAAC,OAAO,GAAG,EAAE;QACtB;AAEA,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAiC;QACzD,OAAO,CAAC,eAAe,CAAC,GAAG,CAAA,OAAA,EAAU,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA,CAAE;QAEjE,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;AAExC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,KAAK,KAAK,EAAE;AACjE,YAAA,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC;YAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AAC/C,YAAA,OAAO,CAAC,eAAe,CAAC,GAAG,CAAA,OAAA,EAAU,QAAQ,EAAE;YAE/C,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;QACtC;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEA;;;;;;;;;AASG;AACK,IAAA,gBAAgB,CAAC,QAAgB,EAAA;;AAEvC,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7C,YAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC;QAC/D;;AAGA,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE;AAClC,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE;;AAG3C,QAAA,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;QACzE;;;AAIA,QAAA,MAAM,kBAAkB,GAAG;YACzB,SAAS;YACT,UAAU;YACV,QAAQ;YACR,SAAS;YACT,OAAO;YACP,aAAa;YACb,SAAS;YACT,MAAM;YACN,OAAO;YACP,QAAQ;YACR,WAAW;YACX,SAAS;YACT,UAAU;SACX;AAED,QAAA,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE;AACzC,YAAA,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACnC,gBAAA,MAAM,IAAI,KAAK,CACb,kDAAkD,QAAQ,CAAA,aAAA,CAAe,CAC1E;YACH;QACF;;AAGA,QAAA,IAAI,eAAuB;AAC3B,QAAA,IAAI;;AAEF,YAAA,eAAe,GAAG,kBAAkB,CAAC,UAAU,CAAC;;AAEhD,YAAA,eAAe,GAAG,kBAAkB,CAAC,eAAe,CAAC;QACvD;AAAE,QAAA,MAAM;;AAEN,YAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;QACtE;;AAGA,QAAA,MAAM,iBAAiB,GAAG,eAAe,CAAC,WAAW,EAAE;;AAGvD,QAAA,MAAM,qBAAqB,GAAG;YAC5B,IAAI;YACJ,QAAQ;YACR,SAAS;YACT,KAAK;YACL,MAAM;YACN,KAAK;YACL,KAAK;SACN;AAED,QAAA,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE;AAC3C,YAAA,IACE,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACnC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC1C;AACA,gBAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;YAC9D;QACF;;AAGA,QAAA,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE;AACzC,YAAA,IAAI,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AAC1C,gBAAA,MAAM,IAAI,KAAK,CACb,CAAA,mEAAA,CAAqE,CACtE;YACH;QACF;;;AAIA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,KAAK,QAAQ,KAAK,IAAI,EAAE;AAC/D,gBAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC;YACrE;QACF;IACF;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;AACH,IAAA,MAAM,UAAU,CACd,QAAgB,EAChB,MAAM,GAAG,KAAK,EACd,IAAA,GAAiB,IAAI,EACrB,gBAAwC,EAAE,EAAA;;AAG1C,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAE/B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;AAEzC,QAAA,MAAM,OAAO,GAAgB;YAC3B,MAAM;AACN,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,GAAG,aAAa;AACjB,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI;SACzC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC;AAEvD,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAA,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,oBAAoB,CAAC;QAC5D;AAEA,QAAA,OAAO,QAAQ;IACjB;uGAzZW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAV,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA;;2FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AChBD;AACA;AACA;MAca,iBAAiB,CAAA;AACpB,IAAA,OAAO,MAAM,GAAyB,IAAI;AAC1C,IAAA,OAAO,OAAO,GAAgC,IAAI;AAClD,IAAA,OAAO,WAAW,GAAY,KAAK;AACnC,IAAA,OAAO,SAAS,GAAkB,IAAI;AACtC,IAAA,OAAO,kBAAkB,GAAwB,IAAI;IACrD,OAAO,iBAAiB;AAEhC;;;;AAIG;IACK,OAAO,sBAAsB,CAAC,GAAY,EAAA;QAChD,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;;AAE1B,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,IAAI,GAAG,KAAK,EAAE;AAAE,gBAAA,OAAO,EAAE;;AAEzB,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,gBAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;YAC5C;AAAE,YAAA,MAAM;;gBAEN,OAAO,CAAC,GAAG,CAAC;YACd;QACF;AACA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,EAAE;YAC/B,MAAM,OAAO,GAAa,EAAE;AAC5B,YAAA,KAAK,MAAM,UAAU,IAAI,GAAG,EAAE;AAC5B,gBAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AAClC,oBAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC1B;AAAO,qBAAA,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;oBACvD,MAAM,CAAC,GAAG,UAIT;oBACD,IAAI,CAAC,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,EAAE;AACtD,wBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;oBAC7B;yBAAO,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;AAC7C,wBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;oBACrB;yBAAO,IAAI,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE;AAC3C,wBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpB;gBACF;YACF;AACA,YAAA,OAAO,OAAO;QAChB;QACA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;YAC3C,MAAM,CAAC,GAAG,GAA8B;AACxC,YAAA,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAY;AACvE,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QACzC;AACA,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,aAAa,eAAe,CAC1B,SAAiB,EACjB,SAAiB,EACjB,iBAA0C,EAC1C,QAAgB,EAChB,YAEwC,EACxC,gBAAwC,EAAA;;QAGxC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YACpD;QACF;;QAGA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;AACpD,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;QAC7B;AAEA,QAAA,IAAI;;AAEF,YAAA,MAAM,aAAa,GAAuB;AACxC,gBAAA,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,SAAS;aACjB;YAED,IAAI,YAAY,EAAE;;;;AAIhB,gBAAA,aAAa,CAAC,YAAY,GAAG,YAAY;YAC3C;YAEA,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;;YAG9C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;AAC1C,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,oBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;oBACrD;gBACF;gBAEA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAK;;AAE5C,oBAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,wBAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,wBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;oBACpC;AACA,oBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,oBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,oBAAA,OAAO,EAAE;AACX,gBAAA,CAAC,CAAC;AAEF,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,KAAI;;AAEpD,oBAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,wBAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,wBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;oBACpC;AACA,oBAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,WAAW,CAAC;AACrD,oBAAA,MAAM,CACJ,IAAI,KAAK,CACP,2BACE,WAAW,CAAC,MAAM,EAAE,OAAO,IAAI,eACjC,CAAA,CAAE,CACH,CACF;AACH,gBAAA,CAAC,CAAC;AAEF,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,KAAI;;AAE1D,oBAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,wBAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,wBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;oBACpC;AACA,oBAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,WAAW,CAAC;AAC3D,oBAAA,MAAM,CACJ,IAAI,KAAK,CACP,iCACE,WAAW,CAAC,MAAM,EAAE,OAAO,IAAI,eACjC,CAAA,CAAE,CACH,CACF;AACH,gBAAA,CAAC,CAAC;;AAGF,gBAAA,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,MAAK;AACvC,oBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;AAErB,wBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM;AACnC,wBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;;wBAGlC,IAAI,eAAe,EAAE;AACnB,4BAAA,IAAI;gCACF,eAAe,CAAC,KAAK,EAAE;4BACzB;4BAAE,OAAO,YAAY,EAAE;AACrB,gCAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,YAAY,CAAC;4BACjE;AACA,4BAAA,IAAI,CAAC,MAAM,GAAG,IAAI;wBACpB;;AAGA,wBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,wBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,wBAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,wBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAE9B,wBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC9C;gBACF,CAAC,EAAE,KAAK,CAAC;AACX,YAAA,CAAC,CAAC;;AAGF,YAAA,MAAM,IAAI,CAAC,WAAW,CACpB,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,gBAAgB,CACjB;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;;AAG3D,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI;AACF,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBACrB;gBAAE,OAAO,YAAY,EAAE;AACrB,oBAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,YAAY,CAAC;gBAC/D;AACA,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI;YACpB;;AAGA,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;YACpC;;AAGA,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAE9B,YAAA,MAAM,KAAK;QACb;IACF;IAEQ,aAAa,WAAW,CAC9B,SAAiB,EACjB,iBAA0C,EAC1C,QAAgB,EAChB,gBAAwC,EAAA;AAExC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;QAChD;AAEA,QAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA,EAAI,SAAS,EAAE;;AAGnD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;;YAGjD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,OAAO,KAAI;AACnD,gBAAA,IAAI;AACF,oBAAA,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,IAAI,KAAK;AACtB,0BAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI;AACzB,0BAAE,OAAO,CAAC,IAAI,IAAI,EAAE;AACxB,oBAAA,MAAM,cAAc,GAClB,OAAO,WAAW,KAAK;AACrB,0BAAE;0BACA,WAAW,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,EAAE;oBACxD,MAAM,UAAU,GAAG,WAAW,EAAE,UAAU,IAAI,CAAC,CAAC;;;AAGhD,oBAAA,MAAM,cAAc,GAAG,WAAW,EAAE,WAAW;AAC/C,oBAAA,MAAM,gBAAgB,GAAG,WAAW,EAAE,aAAa;;;AAGnD,oBAAA,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG;AACvD,0BAAE;AACF,0BAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG;AAC7D,8BAAE;AACF,+BAAG,cAAc,IAAI,gBAAgB,CAAC;oBAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC;AACjE,oBAAA,MAAM,UAAU,GAAG,WAAW,EAAE,UAAU;;;AAI1C,oBAAA,IACE,gBAAgB;AAChB,wBAAA,UAAU,KAAK,SAAS;wBACxB,UAAU,KAAK,IAAI,EACnB;;AAEA,wBAAA,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAC9D,CAAC,KAAK,KAAI;4BACR,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,UAAU,EAAE,KAAK,CAAC;AACjE,wBAAA,CAAC,CACF;oBACH;;;AAIA,oBAAA,MAAM,UAAU,GACd,WAAW,EAAE,UAAU;wBACvB,WAAW,EAAE,UAAU,IAAI,aAAa;AACxC,wBAAA,KAAK;;AAGP,oBAAA,MAAM,aAAa,GACjB,aAAa,CAAC,MAAM,GAAG;0BACnB,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa;0BACrD,cAAc;AAEpB,oBAAA,iBAAiB,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;gBAC1D;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;gBAC1D;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QAC7B;IACF;IAEA,aAAa,cAAc,GAAA;AACzB,QAAA,IAAI;;AAEF,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;YACpC;;AAGA,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,IAAI,CAAC,kBAAkB,EAAE;AACzB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;YAChC;;AAGA,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;AAC1B,gBAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AAC3B,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACrB;;AAGA,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI;YACpB;AAEA,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC;;AAEvD,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;QACpC;IACF;AAEA,IAAA,OAAO,kBAAkB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,KAAK,WAAW;IAC1E;AAEA,IAAA,OAAO,kBAAkB,GAAA;QACvB,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,cAAc;IACxD;;IAGA,aAAa,WAAW,CAAC,cAAsB,EAAE,aAAqB,CAAC,EAAA;QACrE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC;QAC1C;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,WAAW,GAAG;AAClB,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,QAAQ,EAAE;oBACR,UAAU;AACV,oBAAA,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACjC,iBAAA;aACF;YAED,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;QACpD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAC9C,YAAA,MAAM,KAAK;QACb;IACF;;;AC/WF;;;;;;;;;AASG;MAIU,kBAAkB,CAAA;AACrB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAE3D;;;;;;;;AAQG;AACH,IAAA,MAAM,aAAa,CACjB,MAAc,EACd,YAAoB,EACpB,WAAmB,EAAA;AAEnB,QAAA,MAAM,oBAAoB,GAAG;YAC3B,QAAQ,EAAE,MAAM,CAAC,EAAE;AACnB,YAAA,YAAY,EAAE,YAAY;SAC3B;AAED,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAC/C,yCAAyC,EACzC,MAAM,EACN,oBAAoB,EACpB;AACE,YAAA,iBAAiB,EAAE,WAAW;AAC/B,SAAA,CACF;AAED,QAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;IAC9B;AAEA;;;;;;;;;;;AAWG;AACH,IAAA,MAAM,uBAAuB,CAC3B,SAAiB,EACjB,SAAiB,EACjB,iBAIS,EACT,QAAgB,EAChB,MAAe,EACf,YAAqB,EACrB,WAAoB,EACpB,gBAGyB,EAAA;;AAGzB,QAAA,IAAI,YAES;AAEb,QAAA,IAAI,MAAM,IAAI,YAAY,IAAI,WAAW,EAAE;YACzC,YAAY,GAAG,YAAW;AACxB,gBAAA,IAAI;;;;;;AAMF,oBAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAC1C,MAAM,EACN,YAAY,EACZ,WAAW,CACZ;oBACD,OAAO,WAAW,CAAC,SAAS;gBAC9B;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,oBAAA,MAAM,KAAK;gBACb;AACF,YAAA,CAAC;QACH;;QAGA,MAAM,aAAa,GACjB,gBAAgB;AAChB,aAAC,CAAC,UAAkB,EAAE,WAAgB,KAAI;gBACxC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC;AACjE,YAAA,CAAC,CAAC;AAEJ,QAAA,MAAM,iBAAiB,CAAC,eAAe,CACrC,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,aAAa,CACd;IACH;AAEA;;;;;;;AAOG;IACH,MAAM,WAAW,CACf,SAAiB,EACjB,cAAsB,EACtB,WAAmB,EACnB,aAAwB,EAAA;AAExB,QAAA,MAAM,UAAU,GAAyD;YACvE,cAAc;SACf;QACD,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,UAAU,CAAC,aAAa,GAAG,aAAa;QAC1C;AAEA,QAAA,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAC9B,CAAA,yBAAA,EAA4B,SAAS,CAAA,aAAA,CAAe,EACpD,MAAM,EACN,UAAU,EACV;AACE,YAAA,iBAAiB,EAAE,WAAW;AAC/B,SAAA,CACF;IACH;AAEA;;;;;;;AAOG;AACH,IAAA,MAAM,YAAY,CAAC,SAAiB,EAAE,WAAmB,EAAA;AACvD,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAC/C,CAAA,yBAAA,EAA4B,SAAS,CAAA,MAAA,CAAQ,EAC7C,MAAM,EACN,IAAI,EACJ;AACE,YAAA,iBAAiB,EAAE,WAAW;AAC/B,SAAA,CACF;AAED,QAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;IAC9B;AAEA;;;;;;;;AAQG;IACH,MAAM,YAAY,CAChB,SAAiB,EACjB,MAAc,EACd,OAAe,EACf,WAAmB,EAAA;AAEnB,QAAA,MAAM,aAAa,GAAG;YACpB,MAAM;YACN,OAAO;SACR;AAED,QAAA,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAC9B,CAAA,yBAAA,EAA4B,SAAS,CAAA,OAAA,CAAS,EAC9C,MAAM,EACN,aAAa,EACb;AACE,YAAA,iBAAiB,EAAE,WAAW;AAC/B,SAAA,CACF;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,MAAM,iBAAiB,CAAC,cAAc,EAAE;IAC1C;AAEA;;;;AAIG;IACH,kBAAkB,GAAA;AAChB,QAAA,OAAO,iBAAiB,CAAC,kBAAkB,EAAE;IAC/C;uGA3MW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACnBD;AA8CA;;;;;;;AAOG;MAIU,kBAAkB,CAAA;AACrB,IAAA,YAAY,GAAG;AACrB,QAAA,EAAE,EAAE;AACF,YAAA,gBAAgB,EAAE,sBAAsB;AACxC,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,kBAAkB,EAAE,gDAAgD;AACpE,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,UAAU,EAAE,yBAAyB;AACrC,YAAA,SAAS,EAAE,4BAA4B;AACvC,YAAA,UAAU,EAAE,aAAa;AACzB,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,eAAe,EAAE,sBAAsB;AACvC,YAAA,gBAAgB,EAAE,YAAY;AAC9B,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,kBAAkB,EAAE,qBAAqB;AACzC,YAAA,iBAAiB,EACf,+FAA+F;AACjG,YAAA,uBAAuB,EAAE,wBAAwB;AACjD,YAAA,sBAAsB,EACpB,4EAA4E;AAC9E,YAAA,iBAAiB,EAAE,0BAA0B;AAC7C,YAAA,uBAAuB,EACrB,oIAAoI;AACtI,YAAA,uBAAuB,EAAE,SAAS;AAClC,YAAA,wBAAwB,EACtB,uHAAuH;AACzH,YAAA,8BAA8B,EAAE,4BAA4B;AAC5D,YAAA,wBAAwB,EAAE,eAAe;AACzC,YAAA,sBAAsB,EAAE,MAAM;AAC9B,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,KAAK,EAAE,aAAa;AACpB,YAAA,uBAAuB,EAAE,+CAA+C;AACxE,YAAA,mBAAmB,EAAE,+CAA+C;AACpE,YAAA,iBAAiB,EAAE,yCAAyC;AAC5D,YAAA,eAAe,EAAE,uCAAuC;AACxD,YAAA,qBAAqB,EAAE,4CAA4C;AACnE,YAAA,gBAAgB,EAAE,+BAA+B;AACjD,YAAA,oBAAoB,EAAE,kDAAkD;AACxE,YAAA,mBAAmB,EACjB,4DAA4D;AAC9D,YAAA,YAAY,EAAE,iDAAiD;AAC/D,YAAA,mBAAmB,EACjB,uDAAuD;AACzD,YAAA,iBAAiB,EAAE,0BAA0B;AAC7C,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,QAAQ,EAAE,UAAU;AACrB,SAAA;AACD,QAAA,EAAE,EAAE;AACF,YAAA,gBAAgB,EAAE,oBAAoB;AACtC,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,kBAAkB,EAAE,qCAAqC;AACzD,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,UAAU,EAAE,sBAAsB;AAClC,YAAA,SAAS,EAAE,4BAA4B;AACvC,YAAA,UAAU,EAAE,eAAe;AAC3B,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,eAAe,EAAE,gBAAgB;AACjC,YAAA,gBAAgB,EAAE,UAAU;AAC5B,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,kBAAkB,EAAE,qBAAqB;AACzC,YAAA,iBAAiB,EACf,yFAAyF;AAC3F,YAAA,uBAAuB,EAAE,wBAAwB;AACjD,YAAA,sBAAsB,EACpB,oEAAoE;AACtE,YAAA,iBAAiB,EAAE,uBAAuB;AAC1C,YAAA,uBAAuB,EACrB,gLAAgL;AAClL,YAAA,uBAAuB,EAAE,UAAU;AACnC,YAAA,wBAAwB,EACtB,iKAAiK;AACnK,YAAA,8BAA8B,EAAE,oBAAoB;AACpD,YAAA,wBAAwB,EAAE,eAAe;AACzC,YAAA,sBAAsB,EAAE,MAAM;AAC9B,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,KAAK,EAAE,eAAe;AACtB,YAAA,uBAAuB,EACrB,qDAAqD;AACvD,YAAA,mBAAmB,EAAE,+CAA+C;AACpE,YAAA,iBAAiB,EAAE,8CAA8C;AACjE,YAAA,eAAe,EAAE,gDAAgD;AACjE,YAAA,qBAAqB,EAAE,+CAA+C;AACtE,YAAA,gBAAgB,EAAE,4BAA4B;AAC9C,YAAA,oBAAoB,EAClB,oDAAoD;AACtD,YAAA,mBAAmB,EACjB,2DAA2D;AAC7D,YAAA,YAAY,EAAE,4CAA4C;AAC1D,YAAA,mBAAmB,EAAE,2CAA2C;AAChE,YAAA,iBAAiB,EAAE,gCAAgC;AACnD,YAAA,SAAS,EAAE,eAAe;AAC1B,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA;KACF;AAEO,IAAA,YAAY,GAAG,IAAI,eAAe,CAAW,IAAI,CAAC;AAC1C,IAAA,WAAW,GACzB,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;AAElC;;;;;;;;;;;AAWG;AACH,IAAA,SAAS,CAAC,GAAmB,EAAA;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAiB;QAChD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;IAC5C;AAEA;;;;;;;;;AASG;AACH,IAAA,WAAW,CAAC,IAAc,EAAA;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA;;;;AAIG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK;IAChC;uGA/IW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACxDD;AAKA;;;;;;;AAOG;MAIU,eAAe,CAAA;AAClB,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAEvD;;;;;;;;;AASG;AACH,IAAA,cAAc,CAAC,QAAkB,EAAA;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC;IAC/C;AAEA;;;;AAIG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;IACjD;uGAxBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA;;2FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCMY,iBAAiB,CAAA;AACX,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AAE1D;;AAEG;IACH,aAAa,CACX,aAAqB,EACrB,IAAU,EAAA;AAEV,QAAA,MAAM,OAAO,GAA4B;YACvC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,SAAS,EAAE,IAAI,CAAC,IAAI;AACpB,YAAA,QAAQ,EAAE;AACR,gBAAA,IAAI,EAAE,CAAC;gBACP,aAAa;AACd,aAAA;SACF;AAED,QAAA,OAAO,IAAI,CACT,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,wBAAwB,EAAE,MAAM,EAAE,OAAO,EAAE;AACpE,YAAA,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACzD,SAAA,CAAC,CACH,CAAC,IAAI,CACJ,SAAS,CAAC,OAAO,QAAQ,KAAK,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EACpD,GAAG,CAAC,CAAC,IAA2B,KAAK,IAAI,CAAC,EAC1C,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;AAC3D,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACH;AAEA;;;AAGG;IACH,UAAU,CAAC,SAAiB,EAAE,IAAU,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,cAAc,EAAE,IAAI,CAAC,IAAI;AAC1B,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC;AACT,aAAA,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE;YACpB,OAAO;AACP,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,OAAO,EAAE,QAAQ;SAClB;AACA,aAAA,IAAI,CACH,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,gBAAA,OAAO,CAAC,KAAK,CACX,iDAAiD,EACjD,KAAK,CACN;YACH;AACA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACL;AAEA;;AAEG;AACH,IAAA,eAAe,CAAC,MAAc,EAAA;AAC5B,QAAA,OAAO,IAAI,CACT,IAAI,CAAC,UAAU,CAAC,UAAU,CACxB,CAAA,QAAA,EAAW,MAAM,CAAA,iBAAA,CAAmB,EACpC,KAAK,EACL,IAAI,EACJ;AACE,YAAA,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACzD,SAAA,CACF,CACF,CAAC,IAAI,CACJ,SAAS,CAAC,OAAO,QAAQ,KAAK,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EACpD,GAAG,CAAC,CAAC,IAA6B,KAAK,IAAI,CAAC,EAC5C,UAAU,CAAC,CAAC,KAAK,KAAI;YACnB,OAAO,CAAC,KAAK,CAAC,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAE,EAAE,KAAK,CAAC;AAChE,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACH;AAEA;;;AAGG;IACH,WAAW,CACT,aAAqB,EACrB,KAAa,EAAA;AAEb,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,IAAI,UAAU,CAAC,CAAC,QAAQ,KAAI;AACjC,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjB,QAAQ,CAAC,QAAQ,EAAE;AACrB,YAAA,CAAC,CAAC;QACJ;;QAGA,MAAM,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KACvC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAC3C;;AAGD,QAAA,OAAO,QAAQ,CAAC,iBAAiB,CAAC;IACpC;AAEA;;AAEG;IACK,gBAAgB,CACtB,aAAqB,EACrB,IAAU,EAAA;AAEV,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,IAAI,CACjD,SAAS,CAAC,CAAC,eAAe,KACxB,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI;;QAEnD,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,CAAC,EACxD,GAAG,CAAC,CAAC,KAAK,KAAI;AACZ,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;gBAChD,OAAO;oBACL,MAAM,EAAE,eAAe,CAAC,EAAE;AAC1B,oBAAA,OAAO,EAAE,IAAI;iBACE;YACnB;YACA,OAAO;gBACL,MAAM,EAAE,eAAe,CAAC,EAAE;AAC1B,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,CAAA,0BAAA,EAA6B,KAAK,CAAC,MAAM,CAAA,CAAE;aACnC;AACnB,QAAA,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,IAAI,UAAU,CAAe,CAAC,QAAQ,KAAI;gBAC/C,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,eAAe,CAAC,EAAE;AAC1B,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;AACxC,iBAAA,CAAC;gBACF,QAAQ,CAAC,QAAQ,EAAE;AACrB,YAAA,CAAC,CAAC;QACJ,CAAC,CAAC,CACH,CACF,EACD,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,IAAI,UAAU,CAAe,CAAC,QAAQ,KAAI;gBAC/C,QAAQ,CAAC,IAAI,CAAC;AACZ,oBAAA,MAAM,EAAE,EAAE;AACV,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,6BAA6B;AACtD,iBAAA,CAAC;gBACF,QAAQ,CAAC,QAAQ,EAAE;AACrB,YAAA,CAAC,CAAC;QACJ,CAAC,CAAC,CACH;IACH;uGA/JW,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,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCfY,YAAY,CAAA;IACf,YAAY,GAAW,SAAS;IAChC,OAAO,GAAW,EAAE;AACpB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,UAAU;AACV,IAAA,kBAAkB;AAE1B,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,2BAA2B,EAAE;IACpC;AAEA;;AAEG;IACK,2BAA2B,GAAA;;QAEjC,IAAI,CAAC,mBAAmB,EAAE;;QAG1B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE;YACtD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC;;AAGnE,YAAA,IAAI,CAAC,kBAAkB,GAAG,MAAK;gBAC7B,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,CAAC;;YAGD,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC;QACrE;IACF;AAEA;;;AAGG;IACH,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC9C,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC;AACtE,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;QACrC;IACF;AAEA;;AAEG;IACK,mBAAmB,GAAA;QACzB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE;YACtD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO;AACxE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;QAC7B;IACF;AAEA;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;IACrC;AAEA;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;IAC1B;AAEA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;AAEA,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG;IACpB;IAEA,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;IAEA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;IACrB;IAEQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;;QAGrC,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC;;QAGvE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,yBAAyB,EAAE,IAAI,CAAC,YAAY,CAAC;AACpE,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;IAC7E;AAEQ,IAAA,uBAAuB,CAAC,SAAiB,EAAA;;QAI/C,MAAM,UAAU,GAA8B,EAAE;AAEhD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;AACpD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;AACpD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;AACpD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;AACpD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AAC5B,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AAEnD,QAAA,OAAO,UAAU;IACnB;AAEA;;AAEG;IACK,YAAY,CAAC,KAAa,EAAE,MAAc,EAAA;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAClC,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3C,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3C,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;;AAG3C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC;AAE/C,QAAA,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;IAC3H;AAEA;;AAEG;IACK,WAAW,CAAC,KAAa,EAAE,MAAc,EAAA;QAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAClC,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3C,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3C,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;;AAG3C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;AAEzC,QAAA,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;IAC3H;IAEA,eAAe,CAAC,YAAoB,EAAE,OAAe,EAAA;AACnD,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IAC1B;uGAlKW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA;;2FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCWY,uBAAuB,CAAA;AAClC,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;AAC1C,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,uDAAC;AACnC,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,wDAAC;IACzC,mBAAmB,GAAG,MAAM,EAAQ;IAEpC,yBAAyB,GAAA;AACvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;IACjC;uGARW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfpC,+7CAwBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDZY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGX,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EAEnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EACN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+7CAAA,EAAA;;;AEbjD;AAOA;;;;;;;;;AASG;MAKU,aAAa,CAAA;AAChB,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAuB;AAE7E;;;;;AAKG;AACH,IAAA,SAAS,CAAC,GAAmB,EAAA;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC;IAC/C;uGAXW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCDY,eAAe,CAAA;IAC1B,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiB;AAChC,IAAA,IAAI,GAAG,KAAK,CAAa,QAAQ,gDAAC;AAClC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,qDAAC;AACjC,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;AAC7B,IAAA,IAAI,GAAG,KAAK,CAAiC,SAAS,gDAAC;IACvD,OAAO,GAAG,MAAM,EAAc;AAE9B,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,OAAO,GAAG;YACd,wYAAwY;SACzY;;AAGD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE;AAChC,YAAA,OAAO,CAAC,IAAI,CACV,4HAA4H,CAC7H;QACH;AAAO,aAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE;AACvC,YAAA,OAAO,CAAC,IAAI,CACV,kIAAkI,CACnI;QACH;AAAO,aAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE;YACvC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;AACjD,gBAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAClC;iBAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;;YAE1D;AACA,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;gBAC3B,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC;YAC3D;iBAAO;AACL,gBAAA,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YAC7B;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,WAAW,EAAE;AACzC,YAAA,OAAO,CAAC,IAAI,CACV,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,wBAAwB,CACzB;QACH;;AAGA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC;QAChD;;AAGA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,4DAAC;uGAxDS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnB5B,gMAUA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDKY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIX,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAEN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,gMAAA,EAAA;;;MEApC,aAAa,CAAA;;AAExB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAU;;AAG/B,IAAA,IAAI,GAAG,KAAK,CAAkB,OAAO,gDAAC;;AAGtC,IAAA,KAAK,GAAG,KAAK,CAAS,cAAc,iDAAC;;AAGrC,IAAA,SAAS,GAAG,KAAK,CAAS,cAAc,qDAAC;;AAGzC,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;;AAG9B,IAAA,IAAI,GAAG,KAAK,CAAiD,SAAS,gDAAC;;AAGvE,IAAA,MAAM,GAAG,KAAK,CAA8B,SAAS,kDAAC;uGApB3C,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,g6BCjB1B,ggBAWA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDMa,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;+BACE,UAAU,EAAA,OAAA,EACX,EAAE,EAAA,eAAA,EAEM,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,ggBAAA,EAAA;;;ME6BtB,0BAA0B,CAAA;AACrC,IAAA,cAAc,GAAG,KAAK,CAAgB,IAAI,0DAAC;IAE3C,SAAS,GAAG,MAAM,EAAU;IAC5B,YAAY,GAAG,MAAM,EAAQ;IAE7B,eAAe,GAAA;AACb,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;QACpC,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7B;IACF;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;uGAfW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5CvC,uwBAmBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDsBY,YAAY,+BAAiB,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA7C,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAG1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,UAAA,EAEvB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,CAAC,EAAA,eAAA,EACrD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uwBAAA,EAAA;;;ME/BpC,mBAAmB,CAAA;AAC9B,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,sDAAC;AAC7B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,sDAAC;AAClC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;uGAHrB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXhC,wnFA4CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrCY,YAAY,+BAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI1B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,eAAA,EAErB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wnFAAA,EAAA;;;MEWpC,wBAAwB,CAAA;IAC1B,MAAM,GAAW,EAAE;IACnB,aAAa,GAAY,IAAI;IAC7B,SAAS,GAAW,EAAE;AACrB,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AAE9B,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE9D,IAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,oDAAC;AACtC,IAAA,SAAS,GAAG,MAAM,CAAU,IAAI,qDAAC;AACjC,IAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,oDAAC;IAEjC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;YACzE,IAAI,WAAW,EAAE;gBACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;iBAAO;gBACL,IAAI,CAAC,SAAS,EAAE;YAClB;QACF;IACF;IAEA,WAAW,GAAA;;AAET,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAClC,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;QAC1B;IACF;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,eAAe,CAAC,IAAI,CAAC,MAAM;AAC3B,aAAA,IAAI,CACHA,YAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;AAC5C,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,IAAI,QAAQ,EAAE,WAAW,EAAE;gBACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;AACvC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;iBAAO;AACL,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACxB;IACF;uGA9DW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBrC,u/BAwBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDPY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAGX,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,u/BAAA,EAAA;;sBAItB;;sBACA;;sBACA;;sBACA;;;MEFU,2BAA2B,CAAA;AACtC,IAAA,SAAS,GAAG,KAAK,CAAW,EAAE,qDAAC;AAC/B,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,wDAAC;AAC/B,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;IAC9B,KAAK,GAAG,MAAM,EAAQ;AAEtB,IAAA,YAAY,GAAG,MAAM,CAAS,CAAC,wDAAC;AAChC,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;QACjC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI;AACxC,IAAA,CAAC,2DAAC;AACF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE;AAClE,IAAA,CAAC,wDAAC;AACF,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,6DAAC;AAC/D,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,yDAAC;IACvD,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,qDAAC;IAE7E,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C;QACA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C;IACF;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AAEpB,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,QAAQ;gBACX,IAAI,CAAC,WAAW,EAAE;gBAClB;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,cAAc,EAAE;gBACrB;AACF,YAAA,KAAK,YAAY;gBACf,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,UAAU,EAAE;gBACjB;;IAEN;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;AAEA,IAAA,mBAAmB,CAAC,KAAiB,EAAA;;QAEnC,IACG,KAAK,CAAC,MAAsB,CAAC,SAAS,CAAC,QAAQ,CAC9C,gCAAgC,CACjC,EACD;YACA,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC;QAChD;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC;QAChD;IACF;uGA1EW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBxC,qmJAmGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpFY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAOX,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBATvC,SAAS;+BACE,0BAA0B,EAAA,OAAA,EAC3B,CAAC,YAAY,CAAC,mBAEN,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,oBAAoB,EAAE,uBAAuB;AAC9C,qBAAA,EAAA,QAAA,EAAA,qmJAAA,EAAA;;;AEDH;AACA,MAAM,CAAC,UAAU,CAAC;AAChB,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,KAAK;;AAEd,CAAA,CAAC;MAoBW,yBAAyB,CAAA;AAGpC,IAAA,OAAO,GAAG,KAAK,CAAS,EAAE,mDAAC;AAC3B,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;AAC9B,IAAA,QAAQ,GAAG,KAAK,CACd,+GAA+G,oDAChH;AACD,IAAA,GAAG,GAAG,KAAK,CAAS,KAAK,+CAAC;AACM,IAAA,iBAAiB;AAEzC,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AACxC,IAAA,gBAAgB,GAAG,MAAM,CAAW,EAAE,4DAAC;AAC/B,IAAA,gBAAgB;AAExB,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAK;AAClC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE;;AAEnC,YAAA,KAAK,IAAI,CAAC,MAAM,EAAE;YAClB,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,aAAa,EAAE;YACtB;iBAAO;AACL,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B;AACF,QAAA,CAAC,4DAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;IACtB;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,aAAa,EAAE;;QAEpB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA;;AAEG;AACK,IAAA,MAAM,iBAAiB,GAAA;;QAE7B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE;YACjD;QACF;;AAGA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAClD;QACF;AAEA,QAAA,IAAI;;YAEF,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,OAAO,SAAS,CAAC;gBACjB,OAAO,qCAAqC,CAAC;gBAC7C,OAAO,qCAAqC,CAAC;gBAC7C,OAAO,8BAA8B,CAAC;gBACtC,OAAO,+BAA+B,CAAC;AACxC,aAAA,CAAC;;YAGF,IAAI,CAAC,aAAa,EAAE;QACtB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC;QACjD;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B;QACF;AAEA,QAAA,IAAI;;;AAGF,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;AACtB,kBAAG,MAAM,CAAC,WAAW,CAAC,YAAY;AAClC,kBAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAY;;AAG1C,YAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,gBAAA,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC;AACxD,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B;YACF;;;AAIA,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;YAErE,IAAI,CAAC,SAAS,EAAE;;AAEd,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B;YACF;;;AAIA,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAClD;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC;;AAE9C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CACvC,eAAe,CAAC,IAAI,EACpB,YAAY,CACb;YACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,SAAS,CAAC,GAAG,EAAE,CACnE;QACH;IACF;IAEQ,aAAa,GAAA;QACnB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE;AACjD,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE;gBACzC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;YACtE;QACF;IACF;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;AAC/B,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;QACnC;IACF;uGAtIW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7CtC,6HAOA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDkCY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,uBAAuB,EAAA,UAAA,EACrB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAEN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6HAAA,EAAA;;sBAW9C,SAAS;uBAAC,mBAAmB;;;MExBnB,oBAAoB,CAAA;AAC/B,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAW;AACnC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,sDAAC;AAClC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,uDAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAEf,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE9D,IAAA,gBAAgB,GAAG,MAAM,CAAW,EAAE,4DAAC;AACvC,IAAA,iBAAiB,GAAG,MAAM,CAAS,CAAC,CAAC,6DAAC;AACtC,IAAA,aAAa,GAAG,MAAM,CAAU,KAAK,yDAAC;AAEtC,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE;AACrC,QAAA,OAAO,CAAC,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM;AAC/C,IAAA,CAAC,0DAAC;AAEF,IAAA,mBAAmB,CAAC,OAAe,EAAA;QACjC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7C;AAEA,IAAA,gBAAgB,CAAC,YAAoB,EAAA;AACnC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE;QACrC,IACE,CAAC,cAAc,CAAC,aAAa;AAC7B,YAAA,cAAc,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EACzC;YACA;QACF;;QAGA,MAAM,mBAAmB,GAAG,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,KAAI;AACvE,YAAA,MAAM,KAAK,GACT,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;YACjE,IAAI,KAAK,EAAE;gBACT,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;YACrC;AACA,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CACzDA,YAAU,CAAC,CAAC,KAAK,KAAI;gBACnB,OAAO,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;AACvD,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;YACjB,CAAC,CAAC,CACH;AACH,QAAA,CAAC,CAAC;QAEF,QAAQ,CAAC,mBAAmB,CAAC,CAAC,SAAS,CACrC,CAAC,SAAgD,KAAI;YACnD,MAAM,IAAI,GAAG;iBACV,MAAM,CAAC,CAAC,CAAC,KAAmC,CAAC,KAAK,IAAI;iBACtD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;AAC5B,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC;AACxC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,CAAC,CACF;IACH;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC;uGA7DW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BjC,yhDAsDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjCI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,eAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKlB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAbhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,yBAAyB;wBACzB,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;qBAC5B,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yhDAAA,EAAA;;;MEnBpC,sBAAsB,CAAA;uGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECTnC,qnDAgBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDVY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAGX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,qnDAAA,EAAA;;;MEIZ,4BAA4B,CAAA;uGAA5B,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,QAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVzC,2pCAkCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3BY,YAAY,+BAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGhC,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,cACzB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,2pCAAA,EAAA;;;MEmBjC,sBAAsB,CAAA;AACjC,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,wDAAC;AACpC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,uDAAC;AAEjC,IAAA,MAAM,GAAG,MAAM,CAAS,CAAC,kDAAC;AAC1B,IAAA,OAAO,GAAG,MAAM,CAAS,EAAE,mDAAC;;AAG5B,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,uDAAC;AAChC,IAAA,YAAY,GAAG,MAAM,CAAS,EAAE,wDAAC;IAEjC,YAAY,GAAG,MAAM,EAAU;IAC/B,aAAa,GAAG,MAAM,EAAU;IAChC,YAAY,GAAG,MAAM,EAAuC;IAC5D,IAAI,GAAG,MAAM,EAAQ;AAErB,IAAA,aAAa,CAAC,SAAiB,EAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACvC;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,iBAAiB,EAAE;QACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACzC;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AAC/C,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AAC/B,aAAA,CAAC;QACJ;IACF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAChB,IAAI,CAAC,SAAS,EAAE;QAClB;IACF;IAEQ,YAAY,GAAA;QAClB,IAAI,OAAO,GAAG,IAAI;;AAGlB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,iCAAiC,CAAC;YACvD,OAAO,GAAG,KAAK;QACjB;;QAGA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AAC5C,QAAA,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,GAAG,EAAE;AAC5D,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,yCAAyC,CAAC;YAChE,OAAO,GAAG,KAAK;QACjB;aAAO;;AAEL,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B;AAEA,QAAA,OAAO,OAAO;IAChB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;IAEA,aAAa,GAAA;QACX,OAAO,KAAK,CAAC,CAAC;aACX,IAAI,CAAC,CAAC;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;IAC7B;AAEA,IAAA,YAAY,CAAC,SAAiB,EAAA;AAC5B,QAAA,OAAO,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE;IAClC;IAEA,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM;IACrC;IAEA,mBAAmB,GAAA;AACjB,QAAA,OAAO,GAAG;IACZ;IAEA,mBAAmB,GAAA;AACjB,QAAA,OAAO,EAAE;IACX;uGApGW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BnC,4gHAyFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvEI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,IAAA,EACX,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EADb,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKJ,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAblC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAElB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,aAAa;wBACb,aAAa;qBACd,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4gHAAA,EAAA;;;MEYpC,aAAa,CAAA;;AAExB,IAAA,QAAQ,GAAG,KAAK,CAAY,EAAE,oDAAC;AAC/B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,sDAAC;AAClC,IAAA,eAAe,GAAG,KAAK,CAAS,EAAE,2DAAC;AACnC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,uDAAC;AACjC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,mDAAC;AAC/B,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;AACN,IAAA,qBAAqB;IAEzD,YAAY,GAAG,MAAM,EAAuC;IAC5D,UAAU,GAAG,MAAM,EAAQ;;AAG3B,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,UAAU,KAAK,CAAC,CAAC;AACzE,IAAA,CAAC,kEAAC;IAEM,sBAAsB,GAAG,CAAC;IAC1B,cAAc,GAAoC,EAAE;AACpD,IAAA,iBAAiB;AAEzB,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,MAAK;AACnC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM;;AAGrC,YAAA,IAAI,aAAa,KAAK,IAAI,CAAC,sBAAsB,EAAE;AACjD,gBAAA,IAAI,CAAC,sBAAsB,GAAG,aAAa;;AAE3C,gBAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC;AACF,QAAA,CAAC,6DAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM;IACtD;IAEA,eAAe,GAAA;;AAEb,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;IACrC;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE;AAChC,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;QACpC;;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;IAC1B;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,SAAS;AAChD,gBAAA,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,YAAY;QACzD;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC;QAClD;IACF;AAEA,IAAA,kBAAkB,CAAC,UAA+C,EAAA;AAChE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;IACpC;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;uGA1EW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpC1B,qwDAmDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzBI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,4BAA4B,EAAA,QAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,sBAAsB,4KACtB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKV,aAAa,EAAA,UAAA,EAAA,CAAA;kBAdzB,SAAS;+BACE,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,oBAAoB;wBACpB,sBAAsB;wBACtB,4BAA4B;wBAC5B,sBAAsB;wBACtB,mBAAmB;qBACpB,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qwDAAA,EAAA;;sBAU9C,SAAS;uBAAC,uBAAuB;;;MExBvB,mBAAmB,CAAA;IAC9B,MAAM,GAAG,MAAM,EAAQ;AAEf,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAC/C,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;AAClE,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA,CAAC;AAEQ,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,oDAAC;uGARrD,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,0GCpBhC,4fAYA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,aAAa,4HAA5B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI1B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,EAAA,eAAA,EAEpC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4fAAA,EAAA;;;MEPpC,oBAAoB,CAAA;IAC/B,OAAO,GAAG,MAAM,EAAQ;uGADb,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,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXjC,obAQA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDDY,YAAY,+BAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI1B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,eAAA,EAErB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,obAAA,EAAA;;;MEEpC,uBAAuB,CAAA;IAClC,UAAU,GAAG,MAAM,EAAQ;uGADhB,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,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXpC,gaAQA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDDY,YAAY,+BAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI1B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,eAAA,EAErB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,gaAAA,EAAA;;;MEepC,mBAAmB,CAAA;AAC9B,IAAA,cAAc,GAAG,KAAK,CAAU,KAAK,0DAAC;AACtC,IAAA,QAAQ,GAAG,KAAK,CAAS,IAAI,oDAAC;AAC9B,IAAA,mBAAmB,GAAG,KAAK,CAAgB,IAAI,+DAAC;IAChD,MAAM,GAAG,MAAM,EAAQ;IACvB,OAAO,GAAG,MAAM,EAAQ;IACxB,UAAU,GAAG,MAAM,EAAQ;AAE3B,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,iDAAC;uGARrC,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBhC,ikBAaS,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDGL,YAAY,+BACZ,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKd,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAZ/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,oBAAoB;wBACpB,uBAAuB;qBACxB,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ikBAAA,EAAA;;;MEXpC,eAAe,CAAA;IAC1B,UAAU,GAAG,MAAM,EAAQ;uGADhB,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,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX5B,yOAGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,YAAY,+BAAE,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIpC,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,uBAAuB,CAAC,EAAA,eAAA,EAE/B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yOAAA,EAAA;;;MEWpC,aAAa,CAAA;AACxB,IAAA,OAAO,GAAG,KAAK,CAAwB,SAAS,mDAAC;AACjD,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEzB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC1B,MAAM,OAAO,GAAG,CAAC,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;;AAGvE,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE;AAChC,YAAA,OAAO,CAAC,IAAI,CACV,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,gCAAgC,EAChC,iBAAiB,EACjB,8BAA8B,CAC/B;QACH;AAAO,aAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE;AACvC,YAAA,OAAO,CAAC,IAAI,CACV,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,eAAe,EACf,iBAAiB,CAClB;QACH;AAEA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;QAC/B,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1B;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,uDAAC;uGAhCS,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpB1B,+BAEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAQX,aAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,aAAA,EAER,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA;;;MEEU,mBAAmB,CAAA;AAC9B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEzB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,OAAO,GAAG;YACd,cAAc;YACd,kBAAkB;YAClB,iBAAiB;YACjB,aAAa;YACb,gBAAgB;YAChB,8BAA8B;SAC/B;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;QAC/B,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1B;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,uDAAC;uGAjBS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBhC,+BAEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAQX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAX/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,aAAA,EAER,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA;;;MEEU,kBAAkB,CAAA;AAC7B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEzB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,OAAO,GAAG;YACd,uBAAuB;YACvB,sBAAsB;YACtB,wBAAwB;YACxB,gBAAgB;YAChB,8BAA8B;SAC/B;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;QAC/B,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1B;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,uDAAC;uGAhBS,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpB/B,+BAEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAQX,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAX9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,aAAA,EAER,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA;;;MEEU,wBAAwB,CAAA;AACnC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEzB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,OAAO,GAAG;YACd,iBAAiB;YACjB,gBAAgB;YAChB,+BAA+B;SAChC;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;QAC/B,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1B;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,uDAAC;uGAdS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBrC,+BAEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAQX,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAXpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,aAAA,EAER,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA;;;MEEU,oBAAoB,CAAA;AAC/B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEzB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,OAAO,GAAG;YACd,aAAa;YACb,cAAc;YACd,gBAAgB;YAChB,oBAAoB;YACpB,oBAAoB;SACrB;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;QAC/B,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1B;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,uDAAC;uGAhBS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBjC,+BAEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAQX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAXhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,aAAA,EAER,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA;;;MEEU,mBAAmB,CAAA;AAC9B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEzB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,OAAO,GAAG;YACd,cAAc;YACd,sBAAsB;YACtB,aAAa;YACb,cAAc;YACd,gBAAgB;YAChB,8BAA8B;SAC/B;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;QAC/B,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1B;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,uDAAC;uGAjBS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBhC,+BAEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAQX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAX/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,aAAA,EAER,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA;;;MEPU,eAAe,CAAA;uGAAf,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,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX5B,olOAmDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3CY,YAAY,0BAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAG1B,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,YAAY,EAAA,UAAA,EAEV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,eAAA,EACrB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,olOAAA,EAAA;;;MEEpC,gBAAgB,CAAA;IAC3B,UAAU,GAAG,MAAM,EAAQ;uGADhB,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,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX7B,6kBAUA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDFY,YAAY,+BAAE,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAG5B,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;+BACE,aAAa,EAAA,UAAA,EAEX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,eAAA,EACvB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6kBAAA,EAAA;;;MEcpC,mBAAmB,CAAA;AAC9B,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;AAC9B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,qDAAC;AACjC,IAAA,aAAa,GAAG,KAAK,CAAU,IAAI,yDAAC;AACpC,IAAA,mBAAmB,GAAG,KAAK,CAAU,IAAI,+DAAC;AAC1C,IAAA,SAAS,GAAG,KAAK,CAAS,QAAQ,qDAAC;IAEnC,KAAK,GAAG,MAAM,EAAQ;AAEQ,IAAA,eAAe;IAErC,qBAAqB,GAAuB,IAAI;AAChD,IAAA,cAAc;AACd,IAAA,iBAAiB;IACjB,aAAa,GAAoC,EAAE;AACnD,IAAA,cAAc;AAEtB,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAK;AAChC,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;;AAEjB,gBAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAK;AAChC,oBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE;wBACvC,IAAI,CAAC,SAAS,EAAE;oBAClB;gBACF,CAAC,EAAE,CAAC,CAAC;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;YACpC;iBAAO;gBACL,IAAI,CAAC,YAAY,EAAE;YACrB;AACF,QAAA,CAAC,0DAAC;IACJ;IAEA,QAAQ,GAAA;;AAEN,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,KAAoB,KAAI;AAChD,YAAA,IACE,KAAK,CAAC,GAAG,KAAK,QAAQ;gBACtB,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,CAAC,IAAI,CAAC,SAAS,EAAE,EACjB;gBACA,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC;QACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC9D;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAK;AAChC,gBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE;oBACvC,IAAI,CAAC,SAAS,EAAE;gBAClB;YACF,CAAC,EAAE,CAAC,CAAC;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC;IACF;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;QACjC;QACA,IAAI,CAAC,YAAY,EAAE;;AAEnB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC;AAC/D,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;QACpC;;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IACzB;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACnD,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;AAEA,IAAA,aAAa,CAAC,KAAY,EAAA;;QAExB,KAAK,CAAC,eAAe,EAAE;IACzB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACrB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACnB;IACF;IAEQ,SAAS,GAAA;;AAEf,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,aAA4B;;AAGlE,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC,KAAoB,KAAI;YAC7C,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE;AAE3C,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACrD,YAAA,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE;gBAClC,KAAK,CAAC,cAAc,EAAE;gBACtB;YACF;AAEA,YAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;AAEnE,YAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;;AAElB,gBAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,YAAY,EAAE;oBAC3C,KAAK,CAAC,cAAc,EAAE;oBACtB,WAAW,CAAC,KAAK,EAAE;gBACrB;YACF;iBAAO;;AAEL,gBAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE;oBAC1C,KAAK,CAAC,cAAc,EAAE;oBACtB,YAAY,CAAC,KAAK,EAAE;gBACtB;YACF;AACF,QAAA,CAAC;QAED,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;;;AAIzD,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACrD,YAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;AAChC,gBAAA,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;YAC9B;AAAO,iBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE;;AAE9C,gBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE;YAC5C;QACF,CAAC,EAAE,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IACpC;IAEQ,YAAY,GAAA;;AAElB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;AAC5D,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;QACjC;;QAGA,IACE,IAAI,CAAC,qBAAqB;YAC1B,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,KAAK,UAAU,EACtD;AACA,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;AAClC,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;QACnC;IACF;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa;AAAE,YAAA,OAAO,EAAE;AAEnD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa;QACpD,MAAM,QAAQ,GACZ,0EAA0E;AAC5E,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,QAAQ,CAAC,CAAC,CAAC,MAAM,CACzE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CACxE;IACH;uGAxKW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBhC,uuBAmBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDAY,YAAY,+BAAE,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI7B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAExB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uuBAAA,EAAA;;sBAW9C,SAAS;uBAAC,iBAAiB;;;MENjB,2BAA2B,CAAA;AACtC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,gDAAC;AACxB,IAAA,WAAW,GAAG,KAAK,CAAS,SAAS,uDAAC;AACtC,IAAA,UAAU,GAAG,KAAK,CAAS,QAAQ,sDAAC;AACpC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,qDAAC;IACjC,SAAS,GAAG,MAAM,EAAQ;IAC1B,QAAQ,GAAG,MAAM,EAAQ;IACzB,OAAO,GAAG,MAAM,EAAQ;IAExB,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAEjD,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;uGAdW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BxC,4lEAoEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnDI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKN,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAbvC,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,eAAe;wBACf,mBAAmB;wBACnB,aAAa;wBACb,eAAe;qBAChB,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4lEAAA,EAAA;;;MEMpC,qBAAqB,CAAA;AAChC,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;AAC9B,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,wDAAC;AACpC,IAAA,gBAAgB,GAAG,KAAK,CAAU,IAAI,4DAAC;IACvC,KAAK,GAAG,MAAM,EAAQ;IACtB,YAAY,GAAG,MAAM,EAAuC;IAC5D,IAAI,GAAG,MAAM,EAAQ;AAErB,IAAA,MAAM,GAAG,MAAM,CAAS,CAAC,kDAAC;AAC1B,IAAA,OAAO,GAAG,MAAM,CAAS,EAAE,mDAAC;;AAG5B,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,uDAAC;AAChC,IAAA,YAAY,GAAG,MAAM,CAAS,EAAE,wDAAC;AAEjC,IAAA,aAAa,CAAC,SAAiB,EAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACnB;IACF;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,OAAO,EAAE;IAChB;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AAC/C,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AAC/B,aAAA,CAAC;QACJ;IACF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAChB,IAAI,CAAC,SAAS,EAAE;QAClB;IACF;IAEQ,YAAY,GAAA;QAClB,IAAI,OAAO,GAAG,IAAI;;AAGlB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,iCAAiC,CAAC;YACvD,OAAO,GAAG,KAAK;QACjB;;AAGA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AAC5C,YAAA,IAAI,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE;AAC9B,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,8CAA8C,CAAC;gBACrE,OAAO,GAAG,KAAK;YACjB;AAAO,iBAAA,IAAI,cAAc,CAAC,MAAM,GAAG,GAAG,EAAE;AACtC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,yCAAyC,CAAC;gBAChE,OAAO,GAAG,KAAK;YACjB;QACF;AAEA,QAAA,OAAO,OAAO;IAChB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;IAEA,aAAa,GAAA;QACX,OAAO,KAAK,CAAC,CAAC;aACX,IAAI,CAAC,CAAC;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;IAC7B;AAEA,IAAA,YAAY,CAAC,SAAiB,EAAA;AAC5B,QAAA,OAAO,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE;IAClC;IAEA,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM;IACrC;IAEA,mBAAmB,GAAA;AACjB,QAAA,OAAO,GAAG;IACZ;IAEA,mBAAmB,GAAA;AACjB,QAAA,OAAO,EAAE;IACX;uGA7GW,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,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BlC,40KA6IA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzHI,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,IAAA,EACX,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEnB,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,eAAe,kDAFf,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAMJ,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAfjC,SAAS;+BACE,mBAAmB,EAAA,UAAA,EAEjB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,mBAAmB;wBACnB,aAAa;wBACb,aAAa;wBACb,eAAe;qBAChB,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,40KAAA,EAAA;;;AE5BjD;;MC8Ba,kBAAkB,CAAA;;AAE7B,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,wDAAC;AACpC,IAAA,eAAe,GAAG,KAAK,CAAS,EAAE,2DAAC;AACnC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,uDAAC;IACjC,IAAa,SAAS,CAAC,KAAoB,EAAA;AACzC,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;QAEvB,IAAI,KAAK,EAAE;;YAET,UAAU,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAChD;IACF;AACA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU;IACxB;IACQ,UAAU,GAAkB,IAAI;AAC9B,IAAA,WAAW,GAAG,IAAI,YAAY,EAIpC;;AAEM,IAAA,4BAA4B,GAAG,IAAI,YAAY,EAAQ;AACtC,IAAA,YAAY;AACf,IAAA,SAAS;AAEhB,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAE9D,IAAA,cAAc,GAAG,MAAM,CAAC,EAAE,0DAAC;AAC3B,IAAA,aAAa,GAAG,MAAM,CAAoB,EAAE,yDAAC;AAC7C,IAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;AAC7C,IAAA,iBAAiB,GAAG,MAAM,CAAS,CAAC,CAAC,6DAAC;IAEtC,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC3E,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;;;AAGlC,QAAA,QACE,KAAK,CAAC,MAAM,GAAG,CAAC;YAChB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC;AAEjE,IAAA,CAAC,2DAAC;;AAGF,IAAA,0BAA0B,GAAG,QAAQ,CAAC,MACpC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CACvB,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAClD,sEACF;AAED,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,QAAQ;AACrD,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;;AAGtC,QAAA,QACE,CAAC,OAAO,IAAI,gBAAgB;YAC5B,CAAC,IAAI,CAAC,0BAA0B,EAAE;YAClC,SAAS;AACT,YAAA,SAAS;AAEb,IAAA,CAAC,mDAAC;IAEF,QAAQ,GAAA;;IAER;IAEA,WAAW,GAAA;;QAET,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YACpC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACvC,gBAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;YACtC;AACF,QAAA,CAAC,CAAC;QACF,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE;YAC/C,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAG,CAAC;QAC9C;IACF;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;AAEzB,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QAElC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC/B;AAED,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,YAAA,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC;YAC9C;QACF;;QAGA,MAAM,QAAQ,GAAsB,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;YAC5D,IAAI;AACJ,YAAA,UAAU,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;;AAGjE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE;QAC1C;;QAGA,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,CAAC,KAAK,GAAG,EAAE;QAClB;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE;IACxC;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACvC,YAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;QACA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAChC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CACtC;IACH;AAEA;;AAEG;IACH,kBAAkB,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAC9C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,CACjD;AAED,QAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,YAAA,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACrD,YAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;QACjC;IACF;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;;;YAGzC;QACF;;AAGA,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC5B,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AAC1B,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;YAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;AAC1B,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YAC/C;AACA,YAAA,OAAO,CAAC;QACV,CAAC,CAAC,CACH;;AAGD,QAAA,IAAI,CAAC;AACF,aAAA,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK;AACjC,aAAA,IAAI,CACHA,YAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;;AAE9C,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;gBAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;oBAC1B,OAAO;AACL,wBAAA,GAAG,CAAC;AACJ,wBAAA,SAAS,EAAE,KAAK;AAChB,wBAAA,KAAK,EAAE,eAAe;qBACvB;gBACH;AACA,gBAAA,OAAO,CAAC;YACV,CAAC,CAAC,CACH;AACD,YAAA,OAAO,EAAE,CAAC,EAAoB,CAAC;AACjC,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC,CAAC,OAAO,KAAI;;;YAGrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACpC,gBAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;oBACvB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;oBACrC,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE;AACjD,wBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;wBACjC,OAAO;AACL,4BAAA,GAAG,CAAC;AACJ,4BAAA,SAAS,EAAE,KAAK;AAChB,4BAAA,UAAU,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI;AACjD,4BAAA,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,eAAe;yBAC/D;oBACH;AACA,oBAAA,OAAO,CAAC;AACV,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACN;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;;AAGrB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa;aACnC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU;aACvB,MAAM,CAAC,CAAC,EAAE,KAAmB,EAAE,KAAK,IAAI,CAAC;AAE5C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE;AAC3B,YAAA,aAAa,EAAE,WAAW;AAC3B,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;YACjC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACpC,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,oBAAoB,EAAE;IAC7B;AAEA,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;AACzC,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACnC;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC;IAEA,oBAAoB,GAAA;AAClB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa;QACjD,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;YAC9B,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,GAAG,IAAI;QACtD;IACF;uGArQW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,4BAAA,EAAA,8BAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9B/B,uoKAmHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzFY,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA5B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIvC,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,EAAA,eAAA,EAEjD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uoKAAA,EAAA;;sBAO9C;;sBAYA;;sBAMA;;sBACA,SAAS;uBAAC,cAAc;;sBACxB,SAAS;uBAAC,WAAW;;;ME7BX,mBAAmB,CAAA;AAC9B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAY,EAAE,oDAAC;AAC/B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,sDAAC;AAClC,IAAA,eAAe,GAAG,KAAK,CAAS,MAAM,2DAAC;AACvC,IAAA,eAAe,GAAG,KAAK,CAAU,KAAK,2DAAC;AACvC,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,wDAAC;AACpC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,uDAAC;AACjC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,yDAAC;AACrC,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,qDAAC;AACtC,IAAA,cAAc,GAAG,KAAK,CAAgB,IAAI,0DAAC;AAC3C,IAAA,oBAAoB,GAAG,KAAK,CAAgB,IAAI,gEAAC;AACjD,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;IAE1C,OAAO,GAAG,MAAM,EAAQ;IACxB,IAAI,GAAG,MAAM,EAAQ;IACrB,UAAU,GAAG,MAAM,EAAQ;IAC3B,WAAW,GAAG,MAAM,EAIhB;IACJ,4BAA4B,GAAG,MAAM,EAAQ;IAC7C,YAAY,GAAG,MAAM,EAAuC;IAC5D,UAAU,GAAG,MAAM,EAAQ;IAE3B,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;AAEA,IAAA,iBAAiB,CAAC,KAIjB,EAAA;AACC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;AAEA,IAAA,kBAAkB,CAAC,UAA+C,EAAA;AAChE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;IACpC;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;uGApDW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,4BAAA,EAAA,8BAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BhC,ikCAkCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhBI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,8BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIT,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAb/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EAEf,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,aAAa;wBACb,eAAe;wBACf,kBAAkB;qBACnB,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ikCAAA,EAAA;;;METpC,oBAAoB,CAAA;AAC/B,IAAA,KAAK,GAAG,KAAK,CAAS,SAAS,iDAAC;AAChC,IAAA,WAAW,GAAG,KAAK,CAAS,sCAAsC,uDAAC;AACnE,IAAA,OAAO,GAAG,KAAK,CAA4B,EAAE,mDAAC;AAE9C,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1B,QAAA,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AACvC,IAAA,CAAC,sDAAC;uGARS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfjC,giCA+BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpBY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAEN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,giCAAA,EAAA;;;MEEpC,mBAAmB,CAAA;AAC9B,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,uDAAC;IACnC,WAAW,GAAG,MAAM,EAAQ;IAE5B,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;IACzB;uGANW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfhC,+nFAkCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtBY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EAEf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EACN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+nFAAA,EAAA;;;MECpC,mBAAmB,CAAA;AAC9B,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,iDAAC;IAClC,UAAU,GAAG,MAAM,EAAQ;uGAFhB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdhC,ukBAUA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDCY,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGd,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,WAElB,CAAC,eAAe,CAAC,EAAA,eAAA,EACT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ukBAAA,EAAA;;;MEEpC,yBAAyB,CAAA;AACpC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAAoB;AAC3C,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,sDAAC;IAElC,cAAc,GAAG,MAAM,EAAU;IAEjC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC5C;uGARW,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,QAAA,EAAA,IAAA,EAAA,yBAAyB,6YCdtC,ynCA6BA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDfa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB,EAAE,EAAA,eAAA,EAEM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ynCAAA,EAAA;;;MEkBpC,uBAAuB,CAAA;AAClC,IAAA,cAAc,GAAG,KAAK,CAAwB,IAAI,0DAAC;AACnD,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,iBAAiB,GAAG,KAAK,CAAU,KAAK,6DAAC;IACzC,kBAAkB,GAAG,MAAM,EAAoB;AAE/C,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,0DAAC;AAE5C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE;AACxC,QAAA,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI;QAC9C,QACE,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,CAAC,MAAwB,KAAK,MAAM,CAAC,EAAE,KAAK,UAAU,CACvD,IAAI,IAAI;AAEb,IAAA,CAAC,0DAAC;AAEF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,QAAA,OAAO,QAAQ,EAAE,UAAU,IAAI,KAAK;AACtC,IAAA,CAAC,wDAAC;AAEF,IAAA,QAAQ,KAAI;AAEZ,IAAA,UAAU,CAAC,MAAc,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,MAAM,EAAE;;AAEpC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QACjC;IACF;AAEA,IAAA,WAAW,KAAU;IAErB,eAAe,GAAA;AACb,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;QACtC,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC;IACF;uGA1CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BpC,8+BAiCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDZI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAFzB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAOJ,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,eAAe;wBACf,aAAa;wBACb,aAAa;wBACb,yBAAyB;qBAC1B,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8+BAAA,EAAA;;;MEApC,mBAAmB,CAAA;AAC9B,IAAA,cAAc,GAAG,KAAK,CAAM,IAAI,0DAAC;AACjC,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;AAC1C,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,qDAAC;IAEtC,YAAY,GAAG,MAAM,EAAU;IAC/B,OAAO,GAAG,MAAM,EAAQ;IACxB,UAAU,GAAG,MAAM,EAAQ;AAE3B,IAAA,kBAAkB,CAAC,MAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;IAChC;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;uGAnBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BhC,w9EA0CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvBI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEZ,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,OAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,eAAe,2EAJf,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAQJ,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAd/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EAEf,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,aAAa;wBACb,oBAAoB;wBACpB,uBAAuB;wBACvB,eAAe;wBACf,eAAe;qBAChB,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w9EAAA,EAAA;;;MEWpC,kBAAkB,CAAA;AACrB,IAAA,OAAgB,2BAA2B,GAAG,GAAG;AAEzD,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,uDAAC;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,IAAI,sDAAC;AACzB,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;IACjB,iBAAiB,GAAG,KAAK;IACzB,cAAc,GAAyC,IAAI;IAC3D,aAAa,GAAgC,IAAI;AAEzD,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACnC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,gBAAA,MAAM,EAAE,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAK;AAC3C,oBAAA,MAAM,CAAC,qBAAqB,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChE,gBAAA,CAAC,CAAC;gBACF,OAAO,MAAM,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC9C;YACA,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;YAChC;AACA,YAAA,OAAO,SAAS;AAClB,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;QACnC;IACF;AACA,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;AAC1C,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,MAAM,GAAG,KAAK,CAAS,MAAM,kDAAC;AAC9B,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,iDAAC;AAClC,IAAA,cAAc,GAAG,KAAK,CAAM,IAAI,0DAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAY,EAAE,oDAAC;AAC/B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,sDAAC;AAClC,IAAA,eAAe,GAAG,KAAK,CAAS,MAAM,2DAAC;AACvC,IAAA,eAAe,GAAG,KAAK,CAAU,KAAK,2DAAC;AACvC,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,wDAAC;AACpC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,uDAAC;AACjC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,yDAAC;AACrC,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,qDAAC;AACtC,IAAA,cAAc,GAAG,KAAK,CAAgB,IAAI,0DAAC;AAC3C,IAAA,oBAAoB,GAAG,KAAK,CAAgB,IAAI,gEAAC;AACjD,IAAA,uBAAuB,GAAG,KAAK,CAAU,KAAK,mEAAC;AAC/C,IAAA,4BAA4B,GAAG,KAAK,CAAU,KAAK,wEAAC;AACpD,IAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,4DAAC;AACxC,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;AAC1C,IAAA,iBAAiB,GAAG,KAAK,CAAU,KAAK,6DAAC;IAEzC,UAAU,GAAG,MAAM,EAAQ;IAC3B,aAAa,GAAG,MAAM,EAAQ;IAC9B,IAAI,GAAG,MAAM,EAAQ;IACrB,aAAa,GAAG,MAAM,EAAQ;IAC9B,OAAO,GAAG,MAAM,EAAQ;IACxB,cAAc,GAAG,MAAM,EAAQ;IAC/B,aAAa,GAAG,MAAM,EAAQ;IAC9B,YAAY,GAAG,MAAM,EAAQ;IAC7B,mBAAmB,GAAG,MAAM,EAAQ;IACpC,kBAAkB,GAAG,MAAM,EAAQ;IACnC,iBAAiB,GAAG,MAAM,EAAQ;IAClC,YAAY,GAAG,MAAM,EAAuC;IAC5D,UAAU,GAAG,MAAM,EAAQ;IAC3B,WAAW,GAAG,MAAM,EAAQ;IAC5B,oBAAoB,GAAG,MAAM,EAAuC;IACpE,kBAAkB,GAAG,MAAM,EAAQ;IACnC,YAAY,GAAG,MAAM,EAAU;IAC/B,aAAa,GAAG,MAAM,EAAU;IAChC,gBAAgB,GAAG,MAAM,EAIrB;IACJ,4BAA4B,GAAG,MAAM,EAAQ;IAE7C,gBAAgB,GAAA;QACd,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO;QAC5B,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEA,mBAAmB,GAAA;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,UAAU;QAC/B,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;AACpC,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE;AAClC,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACxB;AAAO,iBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;AAC5C,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;YAC3B;AACA,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC5B,QAAA,CAAC,EAAE,kBAAkB,CAAC,2BAA2B,CAAC;IACpD;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IAC3B;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC5B;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IAC3B;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;IAEA,yBAAyB,GAAA;AACvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;IACjC;IAEA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;IAChC;IAEA,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;IAC/B;AAEA,IAAA,kBAAkB,CAAC,UAA+C,EAAA;AAChE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;IACpC;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;IACzB;AAEA,IAAA,iBAAiB,CAAC,KAIjB,EAAA;AACC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;IAEA,kCAAkC,GAAA;AAChC,QAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE;IAC1C;AAEA,IAAA,kBAAkB,CAAC,MAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;IAChC;AAEA,IAAA,mBAAmB,CAAC,GAAW,EAAA;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B;AAEA,IAAA,0BAA0B,CAAC,UAA+C,EAAA;AACxE,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;IAC5C;IAEA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;IAChC;uGApLW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,ixHCrC/B,6nJAsHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7FI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEZ,gBAAgB,iFAChB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,2BAA2B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,qBAAqB,kKACrB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,aAAA,EAAA,8BAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,0BAA0B,mIAP1B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAWJ,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjB9B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EAEd,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,aAAa;wBACb,gBAAgB;wBAChB,mBAAmB;wBACnB,2BAA2B;wBAC3B,qBAAqB;wBACrB,mBAAmB;wBACnB,mBAAmB;wBACnB,0BAA0B;qBAC3B,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6nJAAA,EAAA;;;MEWpC,yBAAyB,CAAA;AACpC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,mDAAyB;AAClD,IAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,uDAAU;AACvC,IAAA,SAAS,GAAG,KAAK,CAAU,IAAI,qDAAC;AAChC,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,wDAAC;AACzC,IAAA,WAAW,GAAG,KAAK,CAAS,IAAI,uDAAC;AACjC,IAAA,YAAY,GAAG,KAAK,CAAS,SAAS,wDAAC;AACvC,IAAA,OAAO,GAAG,KAAK,CAAS,EAAE,mDAAC;AACS,IAAA,qBAAqB;AAEzD,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,iDAAC;;AAGnD,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;AAC3B,IAAA,cAAc,GAAG,MAAM,CAAwB,IAAI,0DAAC;AACpD,IAAA,MAAM,GAAG,MAAM,CAA8C,MAAM,kDAAC;AACpE,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AACnC,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAClC,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;AAC3B,IAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,qDAAC;AACvC,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;AAC/B,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC5B,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,uDAAC;AACxB,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC;AACxB,IAAA,QAAQ,GAAG,MAAM,CAAY,EAAE,oDAAC;AAChC,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAClC,IAAA,aAAa,GAAG,MAAM,CAAC,KAAK,yDAAC;AAC7B,IAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,qDAAC;AACvC,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,eAAe,GAAG,MAAM,CAAoB,MAAM,2DAAC;AACnD,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,0DAAC;AAC5C,IAAA,oBAAoB,GAAG,MAAM,CAAgB,IAAI,gEAAC;AAClD,IAAA,uBAAuB,GAAG,MAAM,CAAC,KAAK,mEAAC;AACvC,IAAA,4BAA4B,GAAG,MAAM,CAAC,KAAK,wEAAC;AAC5C,IAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,4DAAC;AAChC,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAClC,IAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,6DAAC;AACjC,IAAA,oBAAoB,GAAG,MAAM,CAAgB,IAAI,gEAAC;AAClD,IAAA,mBAAmB,GAAG,MAAM,CAAC,KAAK,+DAAC;AACnC,IAAA,wBAAwB,GAAG,MAAM,CAAgB,IAAI,oEAAC;AACtD,IAAA,gCAAgC,GAAG,MAAM,CAAC,KAAK,4EAAC;IAExC,oBAAoB,GAAG,KAAK;AAE5B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,IAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACnD,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,cAAc;AACd,IAAA,iBAAiB;AAEzB,IAAA,WAAA,GAAA;;;AAGE,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAK;AAChC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;;AAG9B,YAAA,IAAI,YAAY,IAAI,OAAO,EAAE;gBAC3B,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC;YAC1D;AACF,QAAA,CAAC,0DAAC;;AAGF,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,MAAK;AACnC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;YAC/B,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAmB,CAAC;YAC1D;AACF,QAAA,CAAC,6DAAC;;QAGF,IAAI,CAAC,kBAAkB,CAAC;AACrB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,IAAI,KAAI;;AAElB,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;;;YAGjC;AACF,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA;;;AAGG;IACK,sBAAsB,GAAA;;QAE5B,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,aAAa,EAAE,MAAK;;AAE5D,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,aAAa,EAAE,MAAK;;YAE5D,IAAI,CAAC,wBAAwB,EAAE;AACjC,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/C;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;QACjC;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE;AAChC,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;QACpC;;;AAGA,QAAA,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;;AAExC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAChC;IACF;AAEA,IAAA,MAAM,iBAAiB,GAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAE/C,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;;AAEtB,YAAA,MAAM,IAAI,CAAC,mBAAmB,EAAE;QAClC;IACF;AAEQ,IAAA,MAAM,mBAAmB,GAAA;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAC/C,2BAA2B,IAAI,CAAC,YAAY,EAAE,CAAA,CAAE,EAChD,KAAK,EACL,IAAI,EACJ;AACE,gBAAA,iBAAiB,EAAE,IAAI,CAAC,WAAW,EAAE;AACtC,aAAA,CACF;YACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC9C,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;;AAE5B,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;QACnC;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAC7D;AACD,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B;IACF;IAEA,MAAM,iBAAiB,CAAC,MAAe,EAAA;AACrC,QAAA,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;YACnD,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;YACxD;;YAGA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,CACtD,WAAW,EACX,IAAI,CAAC,YAAY,EAAE,EACnB,IAAI,CAAC,WAAW,EAAE,CACnB;AAED,YAAA,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAI;YACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;;AAG7B,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;;AAE9D,gBAAA,MAAM,UAAU,GACd,IAAI,CAAC,SAAS,EAAE,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;;AAG7D,gBAAA,MAAM,QAAQ,GACZ,WAAW,CAAC,SAAS,EAAE,QAAQ;AAC/B,oBAAA,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;AACjC,oBAAA,EAAE;;AAGJ,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;gBACzC,IAAI,gBAAgB,EAAE;;oBAEpB,MAAM,aAAa,GAAG,OACpB,UAAkB,EAClB,WAAgB,KACd;wBACF,MAAM,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAC1C,UAAU,EACV,WAAW,CACZ;AACH,oBAAA,CAAC;AAED,oBAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CACnD,gBAAgB,EAChB,UAAU,EACV,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EACpC,QAAQ,EACR,WAAW,EACX,IAAI,CAAC,YAAY,EAAE,EACnB,IAAI,CAAC,WAAW,EAAE,EAClB,aAAa,CACd;AAED,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBAChC;YACF;AAEA,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,YAAA,MAAM,KAAK;QACb;IACF;IAEA,MAAM,WAAW,CACf,KAEU,EAAA;QAEV,IAAI,UAAU,GAAG,EAAE;QACnB,IAAI,aAAa,GAAa,EAAE;QAChC,IAAI,YAAY,GAAW,EAAE;AAE7B,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,UAAU,GAAG,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE;QAC1C;aAAO,IAAI,KAAK,EAAE;YAChB,UAAU,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;AAC7C,YAAA,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE;AACzC,YAAA,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE;QACzC;aAAO;AACL,YAAA,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE;QACjC;AAEA,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AAC/D,QAAA,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;AAE1E,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,EAAE;AAClC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YACtE;QACF;AAEA,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,EAAE;AAC5B,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YACxE;QACF;QAEA,IAAI,IAAI,CAAC,YAAY,EAAE;YAAE;AAEzB,QAAA,IAAI;;YAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,gBAAA,GAAG,IAAI;AACP,gBAAA;AACE,oBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,UAAU,EAAE,CAAC;oBACb,cAAc,EAAE,UAAU,GAAG,UAAU,GAAG,EAAE;oBAC5C,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;AACvD,iBAAA;AACF,aAAA,CAAC;;AAGF,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAGlC,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACrB,gBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;gBAC5C,IAAI,CAAC,cAAc,EAAE;AACnB,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAC1D;AACD,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;;oBAE7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACjD;gBACF;AACA,gBAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC;YAC9C;;AAGA,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;YACzC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,EAAE;AAC/C,gBAAA,IAAI;AACF,oBAAA,MAAM,aAAa,GAAG,MAAM,cAAc,CACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,gBAAgB,EAAE,YAAY,CAAC,CACnE;oBAED,MAAM,gBAAgB,GAAG;yBACtB,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO;yBACjC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC;oBAEjC,aAAa,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,gBAAgB,CAAC;gBACzD;gBAAE,OAAO,WAAW,EAAE;AACpB,oBAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,WAAW,CAAC;gBAC9D;YACF;;AAGA,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE;YACvC,IAAI,cAAc,EAAE;gBAClB,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,GAAG;AACnD,gBAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CACvC,cAAc,EACd,aAAa,EACb,IAAI,CAAC,WAAW,EAAE,EAClB,aAAa,CACd;YACH;AAEA,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;;YAGxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KACX,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CACrE,CACF;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CACpD,qBAAqB,CACtB;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,gBAAA,GAAG,IAAI;AACP,gBAAA;AACE,oBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,cAAc,EAAE,YAAY;oBAC5B,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,EAAE,IAAI;AACb,iBAAA;AACF,aAAA,CAAC;QACJ;IACF;AAEA;;;AAGG;AACH,IAAA,MAAM,kCAAkC,GAAA;QACtC,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE;AACtB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;AAC5C,QAAA,IAAI,CAAC,cAAc;YAAE;AACrB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC;QAC9C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC;QACjE;IACF;AAEA,IAAA,oBAAoB,CAClB,OAA6D,EAC7D,UAAkB,EAClB,UAAmB,EAAA;QAEnB,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3B;QAEA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AAC7C,QAAA,MAAM,cAAc,GAClB,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE;AAC/D,QAAA,MAAM,aAAa,GACjB,OAAO,OAAO,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW;;;AAI/D,QAAA,MAAM,yBAAyB,GAAG,IAAI,CAAC,gCAAgC,EAAE;QACzE,IAAI,yBAAyB,EAAE;AAC7B,YAAA,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,CAAC;QAClD;QAEA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,YAAA,GAAG,IAAI;AACP,YAAA;AACE,gBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,UAAU,EAAE,UAAU;gBACtB,cAAc;gBACd,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;AACxE,aAAA;AACF,SAAA,CAAC;QAEF,IAAI,yBAAyB,EAAE;YAC7B,IAAI,CAAC,yBAAyB,EAAE;QAClC;AAEA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,cAAc,EAAE;IACvB;AAEQ,IAAA,aAAa,CAAC,UAAkB,EAAA;QACtC,QAAQ,UAAU;AAChB,YAAA,KAAK,CAAC;AACJ,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,CAAC;AACJ,gBAAA,OAAO,OAAO;AAChB,YAAA;AACE,gBAAA,OAAO,WAAW;;IAExB;IAEQ,oBAAoB,GAAA;;AAE1B,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CACzB,CAAC,OAAO,KACN,OAAO,CAAC,UAAU,KAAK,CAAC;AACxB,aAAC,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC;gBACpD,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CACpD;IACH;AAEQ,IAAA,gBAAgB,CAAC,OAAe,EAAA;AACtC,QAAA,MAAM,eAAe,GAAG;YACtB,oCAAoC;YACpC,mCAAmC;SACpC;;AAED,QAAA,QACE,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC5D,YAAA,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC1B,YAAA,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC3B,YAAA,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AACpC,YAAA,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAE1C;IAEA,MAAM,kBAAkB,CAAC,MAAc,EAAA;;QAErC,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AACnD,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC;AACrC,YAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3C;QACF;;QAGA,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;AACpD,YAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC/B;;AAGA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACnD,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QACrC;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAE/B,QAAA,IAAI;;AAEF,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;YAGlC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,gBAAA,GAAG,IAAI;AACP,gBAAA;AACE,oBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,cAAc,EACZ,MAAM,CAAC,SAAS,EAAE,QAAQ;AAC1B,yBAAC,IAAI,CAAC,WAAW,EAAE,KAAK;AACtB,8BAAE;8BACA,mCAAmC,CAAC;oBAC1C,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,EAAE,IAAI;AACb,iBAAA;AACF,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;YAE5C,MAAM,YAAY,GAChB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,gBAAA,GAAG,IAAI;AACP,gBAAA;AACE,oBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,cAAc,EAAE,YAAY;oBAC5B,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,EAAE,IAAI;AACb,iBAAA;AACF,aAAA,CAAC;QACJ;IACF;IAEQ,MAAM,mBAAmB,CAAC,MAAc,EAAA;AAC9C,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGrB,YAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;;AAGpC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QAC9B;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC;AACzC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;AACzE,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B;IACF;IAEA,MAAM,eAAe,CAAC,MAAc,EAAA;AAClC,QAAA,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;;AAEtC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB;IACF;AAEA,IAAA,MAAM,aAAa,GAAA;;AAEjB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;;AAEtE,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;;AAGzC,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;;AAG3B,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,gBAAgB,CAAC;;AAGnD,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;YAC/B;QACF;;AAGA,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;IACxC;AAEA,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B;QACF;AACA,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;AAEvC,QAAA,IAAI;;AAEF,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;;AAE9B,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;;AAGzC,gBAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;;AAG7B,gBAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,gBAAgB,CAAC;;gBAGnD,IAAI,CAAC,sBAAsB,EAAE;YAC/B;iBAAO;;AAEL,gBAAA,MAAM,IAAI,CAAC,cAAc,EAAE;YAC7B;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;QACnC;IACF;IAEA,MAAM,kBAAkB,CAAC,UAA+C,EAAA;AACtE,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGjC,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,EAAE;;YAG1D,IAAI,kBAAkB,EAAE;gBACtB,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CACxC,kBAAkB,EAClB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,OAAO,IAAI,EAAE,EACxB,IAAI,CAAC,WAAW,EAAE,CACnB;YACH;;AAGA,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGlC,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGvC,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QACrC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;AAChD,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAElC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEhC,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;AACvC,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QACrC;IACF;IAEA,iBAAiB,GAAA;;AAEf,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEhC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;IACzC;AAEA,IAAA,MAAM,gBAAgB,GAAA;;AAEpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEhC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAEvC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;AAEQ,IAAA,MAAM,cAAc,GAAA;;AAE1B,QAAA,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGhD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;QACzC,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CACxC,gBAAgB,EAChB,IAAI,CAAC,WAAW,EAAE,CACnB;;AAGD,QAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAE/B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;AAEQ,IAAA,MAAM,gBAAgB,GAAA;;AAE5B,QAAA,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGhD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;QACzC,IAAI,CAAC,gBAAgB,EAAE;YACrB;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CACxC,gBAAgB,EAChB,IAAI,CAAC,WAAW,EAAE,CACnB;;AAGD,QAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;IACzC;IAEA,YAAY,GAAA;;AAEV,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;IACzC;AAEA,IAAA,MAAM,mBAAmB,GAAA;AACvB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE;QACjD,IAAI,CAAC,aAAa,EAAE;YAClB;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAEhC,QAAA,IAAI;;AAEF,YAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;;AAE7B,YAAA,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC;AAChD,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAEnC,YAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;;;QAGlD;gBAAU;AACR,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACnC;IACF;IAEA,kBAAkB,GAAA;;AAEhB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC5B;QACF;AACA,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAEnC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;IACpC;IAEA,iBAAiB,GAAA;;;AAGf,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC5B;QACF;AACA,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;AAEQ,IAAA,MAAM,gBAAgB,GAAA;;AAE5B,QAAA,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGhD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;QACzC,IAAI,gBAAgB,EAAE;AACpB,YAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CACxC,gBAAgB,EAChB,IAAI,CAAC,WAAW,EAAE,CACnB;;AAED,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,gBAAgB,EAAE;AACzC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;QACF;;AAGA,QAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG/B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;IAEQ,MAAM,sBAAsB,CAAC,MAAc,EAAA;AACjD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AAEnC,QAAA,IAAI;;AAEF,YAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;;;AAIpC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;YAGlC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,gBAAA,GAAG,IAAI;AACP,gBAAA;AACE,oBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,cAAc,EACZ,MAAM,CAAC,SAAS,EAAE,QAAQ;AAC1B,yBAAC,IAAI,CAAC,WAAW,EAAE,KAAK;AACtB,8BAAE;8BACA,mCAAmC,CAAC;oBAC1C,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,EAAE,IAAI;AACb,iBAAA;AACF,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;;YAGhD,MAAM,YAAY,GAChB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,gBAAA,GAAG,IAAI;AACP,gBAAA;AACE,oBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,cAAc,EAAE,YAAY;oBAC5B,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,EAAE,IAAI;AACb,iBAAA;AACF,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,MAAM,gBAAgB,GAAA;;QAEpB,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;AAClD,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;;YAE/B;QACF;;AAGA,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAEnC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;IAEA,mBAAmB,GAAA;;AAEjB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;IAEA,yBAAyB,GAAA;AACvB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;IACpC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;QAEnC;AAAO,aAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AACtC,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QACrC;AAAO,aAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AAChC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B;AAAO,aAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AACpC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;IACpC;AAEA,IAAA,YAAY,CAAC,MAAc,EAAA;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;AAEA,IAAA,kBAAkB,CAAC,YAAoB,EAAA;AACrC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7C;IAEA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;IACnC;AAEQ,IAAA,aAAa;IAEb,cAAc,GAAA;;AAEpB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QAClC;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;AACnC,YAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa;AACxD,gBAAA,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;YAC1C;AACA,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAChC,CAAC,EAAE,CAAC,CAAC;IACP;IAEA,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK;IACpD;AAEA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;QACtC,IAAI,CAAC,QAAQ,EAAE,OAAO;AAAE,YAAA,OAAO,EAAE;;QAEjC,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAc,MAAM;AAC/C,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,oBAAoB;YACzC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE;YACzC,WAAW,EAAE,MAAM,CAAC,UAAU,GAAG,UAAU,GAAG,EAAE;AAChD,YAAA,MAAM,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;AACtE,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;IAC5B;IAEQ,sBAAsB,GAAA;;AAE5B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE;YAClD;QACF;QACA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC7B,YAAA,GAAG,IAAI;AACP,YAAA;AACE,gBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACd,gBAAA,MAAM,EAAE,OAAO;AACf,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,cAAc,EAAE,EAAE;gBAClB,MAAM,EAAE,IAAI,IAAI,EAAE;AAClB,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,eAAe,EAAE,IAAI;AACtB,aAAA;AACF,SAAA,CAAC;IACJ;IAEA,wBAAwB,GAAA;;;AAGtB,QAAA,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,IAAI,CAAC;IACjD;AAEQ,IAAA,MAAM,yBAAyB,GAAA;;AAErC,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;;AAE/B,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;YAC3B;QACF;;AAGA,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE;;AAGzC,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;;AAG7B,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,gBAAgB,CAAC;;QAGnD,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEA,MAAM,0BAA0B,CAAC,UAGhC,EAAA;AACC,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGjC,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,EAAE;;YAG1D,IAAI,kBAAkB,EAAE;gBACtB,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CACxC,kBAAkB,EAClB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,OAAO,IAAI,EAAE,EACxB,IAAI,CAAC,WAAW,EAAE,CACnB;YACH;;AAGA,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;AACvC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGlC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QACrC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;AAChD,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAElC,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGvC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QACrC;IACF;AAEA,IAAA,MAAM,wBAAwB,GAAA;;AAE5B,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGvC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;uGA/hCW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9CtC,4kFAgEA,EAAA,MAAA,EAAA,CAAA,0g9BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,8BAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,eAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,8BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIT,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EAGtB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,uBAAuB;wBACvB,mBAAmB;wBACnB,kBAAkB;qBACnB,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4kFAAA,EAAA,MAAA,EAAA,CAAA,0g9BAAA,CAAA,EAAA;;sBAU9C,SAAS;uBAAC,uBAAuB;;;AElDpC;;;;;;;AAOG;MAIU,uBAAuB,CAAA;IAC1B,WAAW,GAAW,yBAAyB;AAC/C,IAAA,WAAW;AAEnB,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG;IACxB;IAEA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,WAAW;IACzB;AAEA,IAAA,aAAa,CAAC,EAAc,EAAA;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;IACvB;IAEA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,WAAW;IACzB;uGAlBW,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,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACVD;;;;;;;AAOG;MAIU,YAAY,CAAA;AACf,IAAA,MAAM,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAEhD;;;;;AAKG;AACH,IAAA,MAAM,QAAQ,GAAA;;QAEZ,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;QAC/C,IAAI,cAAc,EAAE;AAClB,YAAA,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE;YACpC,OAAO;gBACL,KAAK;gBACL,SAAS,EAAE,IAAI;aAChB;QACH;;AAGA,QAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAC/C;uGAtBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA;;2FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACdD;;ACAA;;AAEG;;;;"}
1
+ {"version":3,"file":"aslaluroba-help-center.mjs","sources":["../../../src/app/services/action-handler.service.ts","../../../src/app/services/api.service.ts","../../../src/app/services/ably.service.ts","../../../src/app/services/chat-session.service.ts","../../../src/app/services/translation.service.ts","../../../src/app/language.service.ts","../../../src/app/services/file-upload.service.ts","../../../src/app/services/theme.service.ts","../../../src/app/help-center-widget/components/arrow-animation/arrow-animation.component.ts","../../../src/app/help-center-widget/components/arrow-animation/arrow-animation.component.html","../../../src/app/pipes/translate.pipe.ts","../../../src/app/shared/components/button/button.component.ts","../../../src/app/shared/components/button/button.component.html","../../../src/app/shared/components/icon/icon.component.ts","../../../src/app/shared/components/icon/icon.component.html","../../../src/app/help-center-widget/components/chat-action-buttons/chat-action-buttons.component.ts","../../../src/app/help-center-widget/components/chat-action-buttons/chat-action-buttons.component.html","../../../src/app/chat/components/chat-avatar/chat-avatar.component.ts","../../../src/app/chat/components/chat-avatar/chat-avatar.component.html","../../../src/app/chat/components/image-attachment/image-attachment.component.ts","../../../src/app/chat/components/image-attachment/image-attachment.component.html","../../../src/app/chat/components/image-preview-dialog/image-preview-dialog.component.ts","../../../src/app/chat/components/image-preview-dialog/image-preview-dialog.component.html","../../../src/app/shared/components/markdown-renderer/markdown-renderer.component.ts","../../../src/app/shared/components/markdown-renderer/markdown-renderer.component.html","../../../src/app/chat/components/chat-message/chat-message.component.ts","../../../src/app/chat/components/chat-message/chat-message.component.html","../../../src/app/chat/components/chat-separator/chat-separator.component.ts","../../../src/app/chat/components/chat-separator/chat-separator.component.html","../../../src/app/chat/components/chat-typing-indicator/chat-typing-indicator.component.ts","../../../src/app/chat/components/chat-typing-indicator/chat-typing-indicator.component.html","../../../src/app/chat/components/review-message/review-message.component.ts","../../../src/app/chat/components/review-message/review-message.component.html","../../../src/app/chat/chat.component.ts","../../../src/app/chat/chat.component.html","../../../src/app/shared/components/back-button/back-button.component.ts","../../../src/app/shared/components/back-button/back-button.component.html","../../../src/app/shared/components/close-button/close-button.component.ts","../../../src/app/shared/components/close-button/close-button.component.html","../../../src/app/shared/components/minimize-button/minimize-button.component.ts","../../../src/app/shared/components/minimize-button/minimize-button.component.html","../../../src/app/shared/components/chat-header/chat-header.component.ts","../../../src/app/shared/components/chat-header/chat-header.component.html","../../../src/app/shared/components/header/header.component.ts","../../../src/app/shared/components/header/header.component.html","../../../src/app/shared/components/card/card/card.component.ts","../../../src/app/shared/components/card/card/card.component.html","../../../src/app/shared/components/card/card-header/card-header.component.ts","../../../src/app/shared/components/card/card-header/card-header.component.html","../../../src/app/shared/components/card/card-title/card-title.component.ts","../../../src/app/shared/components/card/card-title/card-title.component.html","../../../src/app/shared/components/card/card-description/card-description.component.ts","../../../src/app/shared/components/card/card-description/card-description.component.html","../../../src/app/shared/components/card/card-content/card-content.component.ts","../../../src/app/shared/components/card/card-content/card-content.component.html","../../../src/app/shared/components/card/card-footer/card-footer.component.ts","../../../src/app/shared/components/card/card-footer/card-footer.component.html","../../../src/app/help-center-widget/components/footer/footer.component.ts","../../../src/app/help-center-widget/components/footer/footer.component.html","../../../src/app/help-center-widget/tokens.ts","../../../src/app/shared/components/loading/loading.component.ts","../../../src/app/shared/components/loading/loading.component.html","../../../src/app/shared/components/base-dialog/base-dialog.component.ts","../../../src/app/shared/components/base-dialog/base-dialog.component.html","../../../src/app/shared/components/confirmation-dialog/confirmation-dialog.component.ts","../../../src/app/shared/components/confirmation-dialog/confirmation-dialog.component.html","../../../src/app/shared/components/review-dialog/review-dialog.component.ts","../../../src/app/shared/components/review-dialog/review-dialog.component.html","../../../src/app/shared/components/index.ts","../../../src/app/chat/components/chat-input/chat-input.component.ts","../../../src/app/chat/components/chat-input/chat-input.component.html","../../../src/app/help-center-widget/components/chat-screen/chat-screen.component.ts","../../../src/app/help-center-widget/components/chat-screen/chat-screen.component.html","../../../src/app/help-center-widget/components/company-card/company-card.component.ts","../../../src/app/help-center-widget/components/company-card/company-card.component.html","../../../src/app/help-center-widget/components/help-button/help-button.component.ts","../../../src/app/help-center-widget/components/help-button/help-button.component.html","../../../src/app/shared/components/error-state/error-state.component.ts","../../../src/app/shared/components/error-state/error-state.component.html","../../../src/app/help-screen-list/components/helpscreen-option/helpscreen-option.component.ts","../../../src/app/help-screen-list/components/helpscreen-option/helpscreen-option.component.html","../../../src/app/help-screen-list/helpscreen-list.component.ts","../../../src/app/help-screen-list/helpscreen-list.component.html","../../../src/app/help-center-widget/components/home-screen/home-screen.component.ts","../../../src/app/help-center-widget/components/home-screen/home-screen.component.html","../../../src/app/help-center-widget/components/help-popup/help-popup.component.ts","../../../src/app/help-center-widget/components/help-popup/help-popup.component.html","../../../src/app/help-center-widget/help-center-widget.component.ts","../../../src/app/help-center-widget/help-center-widget.component.html","../../../src/app/services/help-center-config.service.ts","../../../src/app/services/token.service.ts","../../../public_api.ts","../../../aslaluroba-help-center.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n/**\n * Type definition for action handlers\n */\nexport type ActionHandler = (messageData: any) => void | Promise<void>;\n\n/**\n * Service for managing AI response action handlers in an extensible way.\n *\n * This service provides a registry pattern for handling different action types\n * from realtime AI responses, making it easy to add new actions without\n * modifying existing code.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ActionHandlerService {\n private actionHandlers = new Map<string, ActionHandler>();\n private defaultHandler?: ActionHandler;\n\n constructor() {\n // Register default handler for unknown actions\n this.setDefaultHandler((messageData) => {\n const actionType = messageData?.actionType || '';\n if (actionType && actionType !== '') {\n console.warn(\n `[ActionHandlerService] Unknown action type received: \"${actionType}\". ` +\n `Message data:`,\n messageData,\n );\n }\n });\n }\n\n /**\n * Registers a handler for a specific action type\n *\n * @param actionType The action type string (e.g., 'needs_agent', 'end_session')\n * @param handler The handler function to execute when this action is received\n */\n registerHandler(actionType: string, handler: ActionHandler): void {\n if (this.actionHandlers.has(actionType)) {\n console.warn(\n `[ActionHandlerService] Handler for action type \"${actionType}\" already exists. ` +\n `Overwriting with new handler.`,\n );\n }\n this.actionHandlers.set(actionType, handler);\n }\n\n /**\n * Unregisters a handler for a specific action type\n *\n * @param actionType The action type to unregister\n */\n unregisterHandler(actionType: string): void {\n this.actionHandlers.delete(actionType);\n }\n\n /**\n * Sets the default handler for unknown action types\n *\n * @param handler The default handler function\n */\n setDefaultHandler(handler: ActionHandler): void {\n this.defaultHandler = handler;\n }\n\n /**\n * Handles an action type by executing the registered handler or default handler\n *\n * @param actionType The action type to handle\n * @param messageData The message data containing the action\n * @returns Promise that resolves when handling is complete\n */\n async handleAction(\n actionType: string | undefined | null,\n messageData: any,\n ): Promise<void> {\n // Handle empty string or null/undefined - do nothing as per requirements\n if (!actionType || actionType === '') {\n return;\n }\n\n const handler = this.actionHandlers.get(actionType);\n\n if (handler) {\n try {\n await handler(messageData);\n } catch (error) {\n console.error(\n `[ActionHandlerService] Error executing handler for action type \"${actionType}\":`,\n error,\n );\n }\n } else if (this.defaultHandler) {\n // Use default handler for unknown actions\n try {\n await this.defaultHandler(messageData);\n } catch (error) {\n console.error(\n `[ActionHandlerService] Error executing default handler for action type \"${actionType}\":`,\n error,\n );\n }\n }\n }\n\n /**\n * Gets all registered action types\n *\n * @returns Array of registered action type strings\n */\n getRegisteredActions(): string[] {\n return Array.from(this.actionHandlers.keys());\n }\n\n /**\n * Clears all registered handlers (useful for testing or cleanup)\n */\n clearHandlers(): void {\n this.actionHandlers.clear();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiConfig } from '../../../public_api';\n\n/**\n * Service for handling API requests with automatic authentication token management.\n *\n * Features:\n * - Automatic token refresh on expiry\n * - Token validation and format checking\n * - Secure token storage using sessionStorage\n * - Endpoint validation to prevent SSRF attacks\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ApiService {\n private getTokenFunction: (() => Promise<string>) | null = null;\n private baseUrl: string = 'https://babylai.net/api';\n\n /**\n * Initialize the API service with authentication configuration.\n *\n * This must be called before making any API requests. The service will use\n * the provided token function to fetch and refresh tokens automatically.\n *\n * @param config Configuration object containing token function and optional base URL\n * @throws Error if getToken function is not provided\n *\n * @example\n * ```typescript\n * apiService.initialize({\n * getToken: async () => {\n * const response = await fetch('/auth/token');\n * const data = await response.json();\n * return data.token;\n * },\n * baseUrl: 'https://api.example.com'\n * });\n * ```\n */\n initialize(config: ApiConfig) {\n if (!config.getToken) {\n throw new Error('getToken function is required for API initialization');\n }\n\n this.getTokenFunction = config.getToken;\n if (config.baseUrl) {\n // Enforce HTTPS for API calls when app is served over HTTPS\n // Allow localhost for development\n if (\n typeof window !== 'undefined' &&\n window.location.protocol === 'https:'\n ) {\n const baseUrl = config.baseUrl.toLowerCase();\n const isLocalhost =\n baseUrl.includes('localhost') || baseUrl.includes('127.0.0.1');\n\n // If the app is running on HTTPS, enforce HTTPS for API calls (except localhost)\n if (!config.baseUrl.startsWith('https://') && !isLocalhost) {\n throw new Error(\n 'Security violation: API base URL must use HTTPS when app is served over HTTPS. ' +\n 'Non-HTTPS URLs are only allowed for localhost in development.',\n );\n }\n }\n this.baseUrl = config.baseUrl;\n }\n }\n\n /**\n * Validate token format\n * JWT tokens must have exactly 3 parts separated by dots (header.payload.signature)\n */\n private validateToken(token: string): boolean {\n if (!token || typeof token !== 'string') {\n return false;\n }\n\n // Basic validation - ensure token is not empty\n const trimmedToken = token.trim();\n if (trimmedToken.length === 0) {\n return false;\n }\n\n // JWT tokens must have exactly 3 parts separated by dots (header.payload.signature)\n const parts = trimmedToken.split('.');\n if (parts.length !== 3) {\n return false;\n }\n\n // Each part should be non-empty\n if (\n parts[0].length === 0 ||\n parts[1].length === 0 ||\n parts[2].length === 0\n ) {\n return false;\n }\n\n // Basic length check - JWT tokens are typically much longer than 10 characters\n // Header and payload are base64url encoded, signature is typically longer\n if (trimmedToken.length < 20) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Retrieves a valid authentication token, fetching a new one if expired.\n *\n * Tokens are cached for 15 minutes. The service provides backward compatibility:\n * - Checks localStorage first for existing tokens (backward compatibility)\n * - Falls back to sessionStorage if no token found in localStorage\n * - New tokens are stored in sessionStorage (preferred) or localStorage (fallback)\n * - Automatically migrates tokens from localStorage to sessionStorage when found\n *\n * After expiry, a new token is automatically fetched using the configured getToken function.\n *\n * @param forceRefresh If true, forces a new token fetch even if current token is valid\n * @returns Promise resolving to a valid authentication token\n * @throws Error if API service is not initialized or token format is invalid\n */\n async getValidToken(forceRefresh = false): Promise<string> {\n if (!this.getTokenFunction) {\n throw new Error(\n 'API service not initialized. Call initialize({ getToken }) first.',\n );\n }\n\n // Determine storage mechanism - prefer sessionStorage for new tokens (more secure)\n // but check localStorage first for backward compatibility\n const sessionStorageAvailable =\n typeof window !== 'undefined' &&\n typeof window.sessionStorage !== 'undefined';\n const localStorageAvailable =\n typeof window !== 'undefined' &&\n typeof window.localStorage !== 'undefined';\n const sessionStore: Storage | null = sessionStorageAvailable\n ? window.sessionStorage\n : localStorageAvailable\n ? window.localStorage\n : null;\n const localStore: Storage | null = localStorageAvailable\n ? window.localStorage\n : null;\n\n const currentTime = Math.floor(Date.now() / 1000);\n let storedToken: string | null = null;\n let storedExpiry: string | null = null;\n\n // Backward compatibility: Check localStorage first for existing tokens\n if (localStore) {\n const localToken = localStore.getItem('chatbot-token');\n const localExpiry = localStore.getItem('chatbot-token-expiry');\n\n if (localToken && localExpiry && currentTime < Number(localExpiry)) {\n // Validate stored token format\n if (this.validateToken(localToken)) {\n storedToken = localToken;\n storedExpiry = localExpiry;\n\n // Migrate to sessionStorage for future use (if available)\n if (sessionStore && !forceRefresh) {\n sessionStore.setItem('chatbot-token', localToken);\n sessionStore.setItem('chatbot-token-expiry', localExpiry);\n }\n } else {\n // Invalid token in localStorage, clear it\n localStore.removeItem('chatbot-token');\n localStore.removeItem('chatbot-token-expiry');\n }\n }\n }\n\n // If no valid token found in localStorage, check sessionStorage\n if (!storedToken && sessionStore) {\n const sessionToken = sessionStore.getItem('chatbot-token');\n const sessionExpiry = sessionStore.getItem('chatbot-token-expiry');\n\n if (\n sessionToken &&\n sessionExpiry &&\n currentTime < Number(sessionExpiry)\n ) {\n // Validate stored token format\n if (this.validateToken(sessionToken)) {\n storedToken = sessionToken;\n storedExpiry = sessionExpiry;\n } else {\n // Invalid token in sessionStorage, clear it\n sessionStore.removeItem('chatbot-token');\n sessionStore.removeItem('chatbot-token-expiry');\n }\n }\n }\n\n // Fetch new token if needed\n if (\n !storedToken ||\n !storedExpiry ||\n currentTime >= Number(storedExpiry) ||\n forceRefresh\n ) {\n const tokenResponse = await this.getTokenFunction();\n\n if (!tokenResponse) {\n throw new Error('Invalid token response from getToken function');\n }\n\n // Validate token format before storing\n if (!this.validateToken(tokenResponse)) {\n throw new Error('Invalid token format received from getToken function');\n }\n\n storedToken = tokenResponse;\n storedExpiry = String(currentTime + 900); // 15 minutes expiry\n\n // Store new tokens in sessionStorage (preferred) or localStorage (fallback)\n const targetStorage = sessionStore || localStore;\n if (targetStorage) {\n targetStorage.setItem('chatbot-token', storedToken);\n targetStorage.setItem('chatbot-token-expiry', storedExpiry);\n\n // Clean up old localStorage token if it exists (migration)\n if (localStore && targetStorage === sessionStore) {\n localStore.removeItem('chatbot-token');\n localStore.removeItem('chatbot-token-expiry');\n }\n }\n }\n\n return storedToken!;\n }\n\n private async fetchWithAuth(\n url: string,\n options: RequestInit,\n retry = true,\n ): Promise<Response> {\n if (!options.headers) {\n options.headers = {};\n }\n\n const headers = options.headers as Record<string, string>;\n headers['Authorization'] = `Bearer ${await this.getValidToken()}`;\n\n let response = await fetch(url, options);\n\n if ((response.status === 401 || response.status === 403) && retry) {\n console.warn('Token expired. Fetching new token...');\n\n const newToken = await this.getValidToken(true);\n headers['Authorization'] = `Bearer ${newToken}`;\n\n response = await fetch(url, options);\n }\n\n return response;\n }\n\n /**\n * Validate endpoint to prevent SSRF vulnerabilities\n *\n * Protects against:\n * - Absolute URLs with any protocol (case-insensitive)\n * - Protocol-relative URLs\n * - Dangerous protocols (ftp, file, data, javascript, etc.)\n * - URL-encoded path traversal\n * - Double-encoded attacks\n */\n private validateEndpoint(endpoint: string): void {\n // Ensure endpoint is not empty\n if (!endpoint || endpoint.trim().length === 0) {\n throw new Error('Invalid endpoint: endpoint cannot be empty');\n }\n\n // Normalize endpoint for case-insensitive checks\n const normalized = endpoint.trim();\n const lowercased = normalized.toLowerCase();\n\n // Prevent protocol-relative URLs (//example.com)\n if (normalized.startsWith('//')) {\n throw new Error('Invalid endpoint: protocol-relative URLs not allowed');\n }\n\n // Check for dangerous protocols (case-insensitive)\n // List of dangerous protocols that could be used for SSRF\n const dangerousProtocols = [\n 'http://',\n 'https://',\n 'ftp://',\n 'file://',\n 'data:',\n 'javascript:',\n 'mailto:',\n 'tel:',\n 'ws://',\n 'wss://',\n 'gopher://',\n 'ldap://',\n 'ldaps://',\n ];\n\n for (const protocol of dangerousProtocols) {\n if (lowercased.startsWith(protocol)) {\n throw new Error(\n `Invalid endpoint: absolute URLs with protocol '${protocol}' not allowed`,\n );\n }\n }\n\n // Decode URL-encoded strings to catch encoded attacks\n let decodedEndpoint: string;\n try {\n // Decode once to catch single-encoded attacks\n decodedEndpoint = decodeURIComponent(normalized);\n // Decode twice to catch double-encoded attacks\n decodedEndpoint = decodeURIComponent(decodedEndpoint);\n } catch {\n // If decoding fails, it might be malicious - reject it\n throw new Error('Invalid endpoint: malformed URL encoding detected');\n }\n\n // Check decoded endpoint for path traversal patterns\n const decodedLowercased = decodedEndpoint.toLowerCase();\n\n // Check for path traversal in various forms\n const pathTraversalPatterns = [\n '..',\n '%2e%2e',\n '%2e%2e/',\n '../',\n '..\\\\',\n '%2f',\n '%5c',\n ];\n\n for (const pattern of pathTraversalPatterns) {\n if (\n decodedLowercased.includes(pattern) ||\n normalized.toLowerCase().includes(pattern)\n ) {\n throw new Error('Invalid endpoint: path traversal detected');\n }\n }\n\n // Check for dangerous protocols in decoded string\n for (const protocol of dangerousProtocols) {\n if (decodedLowercased.startsWith(protocol)) {\n throw new Error(\n `Invalid endpoint: dangerous protocol detected in URL-encoded string`,\n );\n }\n }\n\n // Prevent control characters and other dangerous characters\n // Check for control characters (0x00-0x1F) and DEL (0x7F) using character codes\n for (let i = 0; i < normalized.length; i++) {\n const charCode = normalized.charCodeAt(i);\n if ((charCode >= 0x00 && charCode <= 0x1f) || charCode === 0x7f) {\n throw new Error('Invalid endpoint: control characters not allowed');\n }\n }\n }\n\n /**\n * Makes an authenticated API request with automatic token management.\n *\n * This method automatically:\n * - Validates the endpoint to prevent SSRF attacks\n * - Adds authentication headers with a valid token\n * - Retries with a fresh token if authentication fails\n * - Handles errors and returns appropriate error messages\n *\n * @param endpoint API endpoint path (relative to baseUrl)\n * @param method HTTP method (default: 'GET')\n * @param body Request body object (will be JSON stringified)\n * @param customHeaders Additional headers to include in the request\n * @returns Promise resolving to the Response object\n * @throws Error if endpoint validation fails, request fails, or authentication fails\n *\n * @example\n * ```typescript\n * // GET request\n * const response = await apiService.apiRequest('client/help-screens/123');\n * const data = await response.json();\n *\n * // POST request\n * const response = await apiService.apiRequest(\n * 'client/chat-sessions',\n * 'POST',\n * { helpScreenId: '123' }\n * );\n * ```\n */\n async apiRequest<T = unknown>(\n endpoint: string,\n method = 'GET',\n body: T | null = null,\n customHeaders: Record<string, string> = {},\n ): Promise<Response> {\n // Validate endpoint before making request\n this.validateEndpoint(endpoint);\n\n const url = `${this.baseUrl}/${endpoint}`;\n\n const options: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders,\n },\n body: body ? JSON.stringify(body) : null,\n };\n\n const response = await this.fetchWithAuth(url, options);\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.message || 'API request failed');\n }\n\n return response;\n }\n}\n","// Note: Using namespace import for tree-shaking support\n// Modern bundlers (webpack, esbuild) should tree-shake unused exports\n// Only Realtime class and related types are used, so tree-shaking should work\nimport * as Ably from 'ably';\n\ntype MessageReceivedCallback = (\n message: string | { content: string; attachments?: string[] },\n senderType: number,\n needsAgent: boolean,\n) => void;\n\ntype ActionHandlerCallback = (\n actionType: string,\n messageData: any,\n) => void | Promise<void>;\n\nexport class ClientAblyService {\n private static client: Ably.Realtime | null = null;\n private static channel: Ably.RealtimeChannel | null = null;\n private static isConnected: boolean = false;\n private static sessionId: string | null = null;\n private static messageUnsubscribe: (() => void) | null = null;\n private static connectionTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * Normalize backend attachments to string[] of image sources (URLs or file IDs).\n * Handles: array of strings/objects (downloadUrl, url, id), JSON strings, or empty strings.\n * URLs are used directly; IDs are presigned by ImageAttachmentComponent.\n */\n private static normalizeAttachmentIds(raw: unknown): string[] {\n if (raw == null) return [];\n // Handle empty strings (backend sends \"\" when no attachments)\n if (typeof raw === 'string') {\n if (raw === '') return [];\n // Try parsing as JSON in case backend sends JSON string\n try {\n const parsed = JSON.parse(raw);\n return this.normalizeAttachmentIds(parsed);\n } catch {\n // Not valid JSON; treat as single source (URL or ID)\n return [raw];\n }\n }\n if (Array.isArray(raw)) {\n if (raw.length === 0) return [];\n const sources: string[] = [];\n for (const attachment of raw) {\n if (typeof attachment === 'string') {\n sources.push(attachment);\n } else if (attachment && typeof attachment === 'object') {\n const o = attachment as {\n downloadUrl?: string;\n url?: string;\n id?: string;\n };\n if (o.downloadUrl && typeof o.downloadUrl === 'string') {\n sources.push(o.downloadUrl);\n } else if (o.url && typeof o.url === 'string') {\n sources.push(o.url);\n } else if (o.id && typeof o.id === 'string') {\n sources.push(o.id);\n }\n }\n }\n return sources;\n }\n if (typeof raw === 'object' && raw !== null) {\n const o = raw as Record<string, unknown>;\n const arr = (o['ids'] ?? o['fileIds'] ?? o['attachmentIds']) as unknown;\n return this.normalizeAttachmentIds(arr);\n }\n return [];\n }\n\n static async startConnection(\n sessionId: string,\n ablyToken: string,\n onMessageReceived: MessageReceivedCallback,\n tenantId: string,\n getAblyToken?: (\n tokenParams: Ably.TokenParams,\n ) => Promise<Ably.TokenDetails | string>,\n onActionReceived?: ActionHandlerCallback,\n ) {\n // Prevent multiple connections\n if (this.isConnected && this.sessionId === sessionId) {\n return;\n }\n\n // Close existing connection if connecting to a different session\n if (this.isConnected && this.sessionId !== sessionId) {\n await this.stopConnection();\n }\n\n try {\n // Initialize Ably client with token refresh support\n const clientOptions: Ably.ClientOptions = {\n autoConnect: true,\n token: ablyToken, // Use initial token for immediate connection\n };\n\n if (getAblyToken) {\n // Use authCallback for token renewal when callback is provided\n // When both token and authCallback are provided, token is used for initial connection\n // and authCallback is used for token refresh\n clientOptions.authCallback = getAblyToken;\n }\n\n this.client = new Ably.Realtime(clientOptions);\n\n // Wait for connection to be established\n await new Promise<void>((resolve, reject) => {\n if (!this.client) {\n reject(new Error('Failed to initialize Ably client'));\n return;\n }\n\n this.client.connection.once('connected', () => {\n // Clear connection timeout if connection succeeds\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n this.isConnected = true;\n this.sessionId = sessionId;\n resolve();\n });\n\n this.client.connection.once('failed', (stateChange) => {\n // Clear connection timeout on failure\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n console.error('Ably connection failed:', stateChange);\n reject(\n new Error(\n `Ably connection failed: ${\n stateChange.reason?.message || 'Unknown error'\n }`,\n ),\n );\n });\n\n this.client.connection.once('disconnected', (stateChange) => {\n // Clear connection timeout on disconnect\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n console.error('Ably connection disconnected:', stateChange);\n reject(\n new Error(\n `Ably connection disconnected: ${\n stateChange.reason?.message || 'Unknown error'\n }`,\n ),\n );\n });\n\n // Set a timeout for connection\n this.connectionTimeout = setTimeout(() => {\n if (!this.isConnected) {\n // Clean up resources on timeout\n const clientToCleanup = this.client;\n this.connectionTimeout = undefined;\n\n // Close and clear the client connection\n if (clientToCleanup) {\n try {\n clientToCleanup.close();\n } catch (cleanupError) {\n console.error('Error closing client on timeout:', cleanupError);\n }\n this.client = null;\n }\n\n // Reset connection state\n this.isConnected = false;\n this.sessionId = null;\n this.channel = null;\n this.messageUnsubscribe = null;\n\n reject(new Error('Ably connection timeout'));\n }\n }, 10000);\n });\n\n // Subscribe to the session room\n await this.joinChannel(\n sessionId,\n onMessageReceived,\n tenantId,\n onActionReceived,\n );\n } catch (error) {\n console.error('Error during Ably connection setup:', error);\n\n // Clean up resources on error (including timeout)\n if (this.client) {\n try {\n this.client.close();\n } catch (cleanupError) {\n console.error('Error closing client on error:', cleanupError);\n }\n this.client = null;\n }\n\n // Clear connection timeout if still pending\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n\n // Reset all connection state\n this.isConnected = false;\n this.sessionId = null;\n this.channel = null;\n this.messageUnsubscribe = null;\n\n throw error;\n }\n }\n\n private static async joinChannel(\n sessionId: string,\n onMessageReceived: MessageReceivedCallback,\n tenantId: string,\n onActionReceived?: ActionHandlerCallback,\n ) {\n if (!this.client) {\n throw new Error('Chat client not initialized');\n }\n\n const roomName = `session:${tenantId}:${sessionId}`;\n\n // Set up raw channel subscription for server messages\n if (this.client) {\n this.channel = this.client.channels.get(roomName);\n\n // Subscribe to assistant/system responses\n this.channel.subscribe('ReceiveMessage', (message) => {\n try {\n const messageData =\n typeof message.data === 'string'\n ? { content: message.data }\n : message.data || {};\n const messageContent =\n typeof messageData === 'string'\n ? messageData\n : messageData?.content || messageData?.message || '';\n const senderType = messageData?.senderType || 3; // Assistant\n // Extract attachments from backend (can be array of strings/objects or empty string)\n // Backend sends attachments as array when present, empty string when none\n const attachmentsRaw = messageData?.attachments;\n const attachmentIdsRaw = messageData?.attachmentIds;\n // Prioritize attachments array if it exists and has items, otherwise check attachmentIds field\n // If attachments is an array with items, use it; else if attachmentIds is an array, use it; else use attachmentsRaw (might be empty string)\n const rawAttachments =\n Array.isArray(attachmentsRaw) && attachmentsRaw.length > 0\n ? attachmentsRaw\n : Array.isArray(attachmentIdsRaw) && attachmentIdsRaw.length > 0\n ? attachmentIdsRaw\n : (attachmentsRaw ?? attachmentIdsRaw);\n const attachmentIds = this.normalizeAttachmentIds(rawAttachments);\n const actionType = messageData?.actionType;\n\n // Handle action type using extensible action handler\n // This supports all action types (known and unknown) in a safe, extensible way\n if (\n onActionReceived &&\n actionType !== undefined &&\n actionType !== null\n ) {\n // Execute action handler (may be async, but we don't await to avoid blocking message processing)\n Promise.resolve(onActionReceived(actionType, messageData)).catch(\n (error) => {\n console.error('Error handling action type:', actionType, error);\n },\n );\n }\n\n // Extract needsAgent flag (for backward compatibility)\n // This is separate from action handling to maintain existing behavior\n const needsAgent =\n messageData?.needsAgent ||\n messageData?.actionType == 'needs_agent' ||\n false;\n\n // Pass message as object if it has attachments, otherwise as string for backward compatibility\n const messageToPass =\n attachmentIds.length > 0\n ? { content: messageContent, attachments: attachmentIds }\n : messageContent;\n\n onMessageReceived(messageToPass, senderType, needsAgent);\n } catch (error) {\n console.error('Error processing ReceiveMessage:', error);\n }\n });\n\n await this.channel.attach();\n }\n }\n\n static async stopConnection() {\n try {\n // Clear connection timeout if still pending\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = undefined;\n }\n\n // Unsubscribe from room messages\n if (this.messageUnsubscribe) {\n this.messageUnsubscribe();\n this.messageUnsubscribe = null;\n }\n\n // Unsubscribe and detach from raw channel\n if (this.channel) {\n this.channel.unsubscribe();\n await this.channel.detach();\n this.channel = null;\n }\n\n // Close Ably connection\n if (this.client) {\n this.client.close();\n this.client = null;\n }\n\n this.isConnected = false;\n this.sessionId = null;\n } catch (error) {\n console.error('Error stopping Ably connection:', error);\n // Reset state even if there's an error\n this.isConnected = false;\n this.sessionId = null;\n this.client = null;\n this.channel = null;\n this.messageUnsubscribe = null;\n this.connectionTimeout = undefined;\n }\n }\n\n static isConnectionActive(): boolean {\n return this.isConnected && this.client?.connection.state === 'connected';\n }\n\n static getConnectionState(): string {\n return this.client?.connection.state || 'disconnected';\n }\n\n // Method to manually send a message (if needed for debugging or direct messaging)\n static async sendMessage(messageContent: string, senderType: number = 1) {\n if (!this.channel || !this.isConnected) {\n throw new Error('Connection not active');\n }\n\n try {\n const messageData = {\n text: messageContent,\n metadata: {\n senderType,\n sentAt: new Date().toISOString(),\n },\n };\n\n await this.channel.publish('message', messageData);\n } catch (error) {\n console.error('Error sending message:', error);\n throw error;\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport * as Ably from 'ably';\nimport { Option } from '../types';\nimport { ClientAblyService } from './ably.service';\nimport { ActionHandlerService } from './action-handler.service';\nimport { ApiService } from './api.service';\n\n/**\n * Service for managing chat session lifecycle and operations.\n *\n * Handles:\n * - Chat session creation and management\n * - Ably connection management\n * - Message sending operations\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ChatSessionService {\n private apiService = inject(ApiService);\n private actionHandlerService = inject(ActionHandlerService);\n\n /**\n * Creates a new chat session with the specified option.\n *\n * @param option The help screen option to create a chat session for\n * @param helpScreenId The help screen ID\n * @param currentLang Current language code for API headers\n * @returns Promise resolving to session data including sessionId and ablyToken\n * @throws Error if session creation fails\n */\n async createSession(\n option: Option,\n helpScreenId: string,\n currentLang: string,\n ): Promise<{ chatSession: { id: string }; ablyToken: string }> {\n const chatSessionCreateDto = {\n optionId: option.id,\n helpScreenId: helpScreenId,\n };\n\n const response = await this.apiService.apiRequest(\n 'Client/ClientChatSession/create-session',\n 'POST',\n chatSessionCreateDto,\n {\n 'Accept-Language': currentLang,\n },\n );\n\n return await response.json();\n }\n\n /**\n * Establishes Ably real-time connection for a chat session.\n *\n * @param sessionId The chat session ID\n * @param ablyToken The Ably authentication token\n * @param onMessageReceived Callback function for received messages\n * @param tenantId The tenant ID for the connection\n * @param option Optional option for token refresh (needed for token renewal)\n * @param helpScreenId Optional help screen ID for token refresh\n * @param currentLang Optional current language for token refresh\n * @param onActionReceived Optional callback function for handling action types\n */\n async establishAblyConnection(\n sessionId: string,\n ablyToken: string,\n onMessageReceived: (\n message: string | { content: string; attachments?: string[] },\n senderType: number,\n needsAgent: boolean,\n ) => void,\n tenantId: string,\n option?: Option,\n helpScreenId?: string,\n currentLang?: string,\n onActionReceived?: (\n actionType: string,\n messageData: any,\n ) => void | Promise<void>,\n ): Promise<void> {\n // Create token refresh callback if context is provided\n let getAblyToken:\n | ((tokenParams: Ably.TokenParams) => Promise<Ably.TokenDetails | string>)\n | undefined;\n\n if (option && helpScreenId && currentLang) {\n getAblyToken = async () => {\n try {\n // This callback is only called when the token needs to be refreshed\n // The initial token is provided via the 'token' option in Ably client options\n // Create a new session to get a fresh token\n // Note: This will create a new session, but we keep using the original sessionId\n // In the future, if there's a dedicated refresh endpoint, use that instead\n const sessionData = await this.createSession(\n option,\n helpScreenId,\n currentLang,\n );\n return sessionData.ablyToken;\n } catch (error) {\n console.error('Error refreshing Ably token:', error);\n throw error;\n }\n };\n }\n\n // Create action handler callback that uses the ActionHandlerService\n const actionHandler =\n onActionReceived ||\n ((actionType: string, messageData: any) => {\n this.actionHandlerService.handleAction(actionType, messageData);\n });\n\n await ClientAblyService.startConnection(\n sessionId,\n ablyToken,\n onMessageReceived,\n tenantId,\n getAblyToken,\n actionHandler,\n );\n }\n\n /**\n * Sends a message in an active chat session.\n *\n * @param sessionId The chat session ID\n * @param messageContent The message content to send\n * @param currentLang Current language code for API headers\n * @throws Error if message sending fails\n */\n async sendMessage(\n sessionId: string,\n messageContent: string,\n currentLang: string,\n attachmentIds?: string[],\n ): Promise<void> {\n const messageDto: { messageContent: string; attachmentIds?: string[] } = {\n messageContent,\n };\n if (attachmentIds && attachmentIds.length > 0) {\n messageDto.attachmentIds = attachmentIds;\n }\n\n await this.apiService.apiRequest(\n `Client/ClientChatSession/${sessionId}/send-message`,\n 'POST',\n messageDto,\n {\n 'Accept-Language': currentLang,\n },\n );\n }\n\n /**\n * Closes a chat session.\n *\n * @param sessionId The chat session ID to close\n * @param currentLang Current language code for API headers\n * @returns Promise resolving to the close response\n * @throws Error if session closing fails\n */\n async closeSession(sessionId: string, currentLang: string): Promise<unknown> {\n const response = await this.apiService.apiRequest(\n `Client/ClientChatSession/${sessionId}/close`,\n 'POST',\n null,\n {\n 'Accept-Language': currentLang,\n },\n );\n\n return await response.json();\n }\n\n /**\n * Submits a review for a chat session.\n *\n * @param sessionId The chat session ID\n * @param rating Rating value (1-5)\n * @param comment Review comment (10-500 characters)\n * @param currentLang Current language code for API headers\n * @throws Error if review submission fails\n */\n async submitReview(\n sessionId: string,\n rating: number,\n comment: string,\n currentLang: string,\n ): Promise<void> {\n const reviewPayload = {\n rating,\n comment,\n };\n\n await this.apiService.apiRequest(\n `Client/ClientChatSession/${sessionId}/review`,\n 'POST',\n reviewPayload,\n {\n 'Accept-Language': currentLang,\n },\n );\n }\n\n /**\n * Stops the Ably connection.\n */\n async stopConnection(): Promise<void> {\n await ClientAblyService.stopConnection();\n }\n\n /**\n * Checks if Ably connection is active.\n *\n * @returns True if connection is active, false otherwise\n */\n isConnectionActive(): boolean {\n return ClientAblyService.isConnectionActive();\n }\n}\n","// src/app/services/translation.service.ts\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Language } from '../types';\n\nexport type TranslationKey =\n | 'ChatIntroMessage'\n | 'BabylaiTitle'\n | 'BabylaiDescription'\n | 'ChatNow'\n | 'TryBableAI'\n | 'ContactUs'\n | 'HelpCenter'\n | 'BabylAI'\n | 'ChatPlaceholder'\n | 'PoweredByBabylAI'\n | 'EndChat'\n | 'LeavingDialogTitle'\n | 'LeavingDialogBody'\n | 'StartNewChatDialogTitle'\n | 'StartNewChatDialogBody'\n | 'ReviewDialogTitle'\n | 'ReviewDialogDescription'\n | 'ReviewDialogRatingLabel'\n | 'ReviewDialogCommentLabel'\n | 'ReviewDialogCommentPlaceholder'\n | 'ReviewDialogSubmitButton'\n | 'ReviewDialogSkipButton'\n | 'Confirm'\n | 'Cancel'\n | 'Close'\n | 'Back'\n | 'title'\n | 'ErrorFetchingHelpScreen'\n | 'ErrorSendingMessage'\n | 'ErrorStartingChat'\n | 'ErrorEndingChat'\n | 'ErrorSubmittingReview'\n | 'ErrorClosingChat'\n | 'ErrorCreatingSession'\n | 'ErrorNetworkFailure'\n | 'ErrorUnknown'\n | 'ErrorMessageTooLong'\n | 'ErrorMessageEmpty'\n | 'CloseChat'\n | 'Continue';\n/**\n * Service for managing translations and language switching.\n *\n * Supports multiple languages (currently English and Arabic) with RTL support.\n * Provides reactive language changes through Observable pattern.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationService {\n private translations = {\n en: {\n ChatIntroMessage: 'Chat with BabylAI 🚀',\n BabylaiTitle: 'BabylAI',\n BabylaiDescription: \"Hey there! 👋 I'm BabylAI, here to assist you.\",\n ChatNow: 'Chat Now',\n TryBableAI: 'Try BabylAI for Free 🎉',\n ContactUs: \"Contact us, Let's Talk! 💬\",\n HelpCenter: 'Help Center',\n BabylAI: 'BabylAI',\n ChatPlaceholder: 'Type your message...',\n PoweredByBabylAI: 'Powered by',\n EndChat: 'End Chat',\n LeavingDialogTitle: 'Leaving so soon? 👋',\n LeavingDialogBody:\n \"Don't worry, you can come back anytime. We're always here if you need help or have questions.\",\n StartNewChatDialogTitle: 'End and Start New Chat',\n StartNewChatDialogBody:\n 'Are you sure you want to end the current conversation and start a new one?',\n ReviewDialogTitle: \"We'd Love Your Feedback!\",\n ReviewDialogDescription:\n 'Your opinion helps us improve and deliver better support. Please rate your experience with our service and let us know how we did.',\n ReviewDialogRatingLabel: 'Rating:',\n ReviewDialogCommentLabel:\n 'Awesome! We’re glad you enjoyed chatting with us. Could you rate your overall experience to help us keep it that way?',\n ReviewDialogCommentPlaceholder: 'Write your comment here...',\n ReviewDialogSubmitButton: 'Submit Review',\n ReviewDialogSkipButton: 'Skip',\n Confirm: 'Confirm',\n Cancel: 'Cancel',\n Close: 'Close',\n Back: 'Back',\n title: 'Help Center',\n ErrorFetchingHelpScreen: 'Failed to load help screen. Please try again.',\n ErrorSendingMessage: 'Failed to send the message. Please try again.',\n ErrorStartingChat: 'Failed to start chat. Please try again.',\n ErrorEndingChat: 'Failed to end chat. Please try again.',\n ErrorSubmittingReview: 'Failed to submit review. Please try again.',\n ErrorClosingChat: 'Failed to close chat session.',\n ErrorCreatingSession: 'Failed to create chat session. Please try again.',\n ErrorNetworkFailure:\n 'Network error. Please check your connection and try again.',\n ErrorUnknown: 'An unexpected error occurred. Please try again.',\n ErrorMessageTooLong:\n 'Message is too long. Maximum 5000 characters allowed.',\n ErrorMessageEmpty: 'Message cannot be empty.',\n CloseChat: 'Close Chat',\n Continue: 'Continue',\n },\n ar: {\n ChatIntroMessage: 'دردش مع BabylAI 🚀',\n BabylaiTitle: 'BabylAI',\n BabylaiDescription: 'مرحبا! 👋 أنا BabylAI، هنا لتساعدك.',\n ChatNow: 'دعنا نتحدث',\n TryBableAI: 'جرب BabylAI مجانا 🎉',\n ContactUs: 'تواصل معنا, دعنا نتحدث! 💬',\n HelpCenter: 'مركز المساعدة',\n BabylAI: 'BabylAI',\n ChatPlaceholder: 'اكتب رسالتك...',\n PoweredByBabylAI: 'مدعوم من',\n EndChat: 'إنهاء الدردشة',\n LeavingDialogTitle: 'هل تغادر بالفعل؟ 👋',\n LeavingDialogBody:\n 'لا تقلق، يمكنك العودة في أي وقت. نحن دائماً هنا إذا كنت بحاجة إلى مساعدة أو لديك أسئلة.',\n StartNewChatDialogTitle: 'إنهاء وبدء دردشة جديدة',\n StartNewChatDialogBody:\n 'هل أنت متأكد من أنك تريد إنهاء المحادثة الحالية وبدء محادثة جديدة؟',\n ReviewDialogTitle: 'كيف كانت تجربتك معنا؟',\n ReviewDialogDescription:\n 'نقدر ملاحظاتك! يرجى قضاء لحظة لتقييم تجربتك ومشاركة أفكارك في قسم التعليقات أدناه. تقييمك يساعدنا في تحسين خدماتنا ويساعد المستخدمين الآخرين في اتخاذ قرارات مدروسة. شكراً لك!',\n ReviewDialogRatingLabel: 'التقييم:',\n ReviewDialogCommentLabel:\n 'شكراً لك! يرجى قضاء لحظة لتقييم تجربتك ومشاركة أفكارك في قسم التعليقات أدناه. تقييمك يساعدنا في تحسين خدماتنا ويساعد المستخدمين الآخرين في اتخاذ قرارات مدروسة.',\n ReviewDialogCommentPlaceholder: 'اكتب تعليقك هنا...',\n ReviewDialogSubmitButton: 'إرسال التقييم',\n ReviewDialogSkipButton: 'تخطي',\n Confirm: 'تأكيد',\n Cancel: 'إلغاء',\n Close: 'إغلاق',\n Back: 'رجوع',\n title: 'مركز المساعدة',\n ErrorFetchingHelpScreen:\n 'فشل في تحميل شاشة المساعدة. يرجى المحاولة مرة أخرى.',\n ErrorSendingMessage: 'لم يتم إرسال الرسالة. يرجى المحاولة مرة أخرى.',\n ErrorStartingChat: 'فشل في بدء المحادثة. يرجى المحاولة مرة أخرى.',\n ErrorEndingChat: 'فشل في إنهاء المحادثة. يرجى المحاولة مرة أخرى.',\n ErrorSubmittingReview: 'فشل في إرسال التقييم. يرجى المحاولة مرة أخرى.',\n ErrorClosingChat: 'فشل في إغلاق جلسة الدردشة.',\n ErrorCreatingSession:\n 'فشل في إنشاء جلسة الدردشة. يرجى المحاولة مرة أخرى.',\n ErrorNetworkFailure:\n 'خطأ في الشبكة. يرجى التحقق من الاتصال والمحاولة مرة أخرى.',\n ErrorUnknown: 'حدث خطأ غير متوقع. يرجى المحاولة مرة أخرى.',\n ErrorMessageTooLong: 'الرسالة طويلة جداً. الحد الأقصى 5000 حرف.',\n ErrorMessageEmpty: 'لا يمكن أن تكون الرسالة فارغة.',\n CloseChat: 'إغلاق الدردشة',\n Continue: 'متابعة',\n },\n };\n\n private _currentLang = new BehaviorSubject<Language>('en');\n public readonly currentLang: Observable<Language> =\n this._currentLang.asObservable();\n\n /**\n * Translates a translation key to the current language.\n *\n * @param key Translation key to look up\n * @returns Translated string in the current language, or the key itself if translation not found\n *\n * @example\n * ```typescript\n * const message = translationService.translate('ChatNow');\n * // Returns 'Let\\'s Chat' in English or 'دعنا نتحدث' in Arabic\n * ```\n */\n translate(key: TranslationKey): string {\n const lang = this._currentLang.value as Language;\n return this.translations[lang][key] || key;\n }\n\n /**\n * Sets the current language for translations.\n *\n * @param lang Language code ('en' or 'ar')\n *\n * @example\n * ```typescript\n * translationService.setLanguage('ar'); // Switch to Arabic\n * ```\n */\n setLanguage(lang: Language) {\n this._currentLang.next(lang);\n }\n\n /**\n * Gets the current language code.\n *\n * @returns Current language code ('en' or 'ar')\n */\n getCurrentLang(): Language {\n return this._currentLang.value;\n }\n}\n","// src/app/language.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { TranslationService } from './services/translation.service';\nimport { Language } from './types';\n\n/**\n * Service for managing language switching.\n *\n * Provides a simplified interface for switching between supported languages.\n * This service wraps TranslationService for easier language management.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LanguageService {\n private translationService = inject(TranslationService);\n\n /**\n * Switches the application language.\n *\n * @param language Language code to switch to ('en' or 'ar')\n *\n * @example\n * ```typescript\n * languageService.switchLanguage('ar'); // Switch to Arabic\n * ```\n */\n switchLanguage(language: Language) {\n this.translationService.setLanguage(language);\n }\n\n /**\n * Gets the current application language.\n *\n * @returns Current language code ('en' or 'ar')\n */\n getCurrentLang(): Language {\n return this.translationService.getCurrentLang();\n }\n}\n","import {\n HttpClient,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n} from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, forkJoin, from, throwError } from 'rxjs';\nimport { catchError, filter, map, switchMap } from 'rxjs/operators';\nimport { LanguageService } from '../language.service';\nimport {\n PresignDownloadResponse,\n PresignUploadRequestDto,\n PresignUploadResponse,\n UploadResult,\n} from '../types';\nimport { ApiService } from './api.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FileUploadService {\n private readonly http = inject(HttpClient);\n private readonly apiService = inject(ApiService);\n private readonly languageService = inject(LanguageService);\n\n /**\n * Get presigned upload URL from the API\n */\n presignUpload(\n chatSessionId: string,\n file: File,\n ): Observable<PresignUploadResponse> {\n const request: PresignUploadRequestDto = {\n name: file.name,\n contentType: file.type,\n sizeBytes: file.size,\n pathData: {\n type: 1,\n chatSessionId,\n },\n };\n\n return from(\n this.apiService.apiRequest('NewFile/presign-upload', 'POST', request, {\n 'Accept-Language': this.languageService.getCurrentLang(),\n }),\n ).pipe(\n switchMap(async (response) => await response.json()),\n map((data: PresignUploadResponse) => data),\n catchError((error) => {\n console.error('Error getting presigned upload URL:', error);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Upload file to S3 using presigned URL\n * Returns Observable with progress events\n */\n uploadToS3(uploadUrl: string, file: File): Observable<HttpEvent<any>> {\n const headers = new HttpHeaders({\n 'Content-Type': file.type,\n });\n\n return this.http\n .put(uploadUrl, file, {\n headers,\n reportProgress: true,\n observe: 'events',\n })\n .pipe(\n catchError((error) => {\n if (error.status === 0) {\n console.error(\n 'CORS error - S3 bucket needs CORS configuration',\n error,\n );\n }\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Get presigned download URL for a file\n */\n presignDownload(fileId: string): Observable<PresignDownloadResponse> {\n return from(\n this.apiService.apiRequest(\n `NewFile/${fileId}/presign-download`,\n 'GET',\n null,\n {\n 'Accept-Language': this.languageService.getCurrentLang(),\n },\n ),\n ).pipe(\n switchMap(async (response) => await response.json()),\n map((data: PresignDownloadResponse) => data),\n catchError((error) => {\n console.error(`Failed to get download URL for ${fileId}`, error);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Upload multiple files in parallel\n * Returns array of upload results\n */\n uploadFiles(\n chatSessionId: string,\n files: File[],\n ): Observable<UploadResult[]> {\n if (files.length === 0) {\n return new Observable((observer) => {\n observer.next([]);\n observer.complete();\n });\n }\n\n // Upload files in parallel\n const uploadObservables = files.map((file) =>\n this.uploadSingleFile(chatSessionId, file),\n );\n\n // Use forkJoin to wait for all uploads to complete\n return forkJoin(uploadObservables);\n }\n\n /**\n * Upload a single file\n */\n private uploadSingleFile(\n chatSessionId: string,\n file: File,\n ): Observable<UploadResult> {\n return this.presignUpload(chatSessionId, file).pipe(\n switchMap((presignResponse) =>\n this.uploadToS3(presignResponse.uploadUrl, file).pipe(\n // Filter to get only the final response event\n filter((event) => event.type === HttpEventType.Response),\n map((event) => {\n if (event.status === 200 || event.status === 204) {\n return {\n fileId: presignResponse.id,\n success: true,\n } as UploadResult;\n }\n return {\n fileId: presignResponse.id,\n success: false,\n error: `Upload failed with status ${event.status}`,\n } as UploadResult;\n }),\n catchError((error) => {\n return new Observable<UploadResult>((observer) => {\n observer.next({\n fileId: presignResponse.id,\n success: false,\n error: error.message || 'Upload failed',\n });\n observer.complete();\n });\n }),\n ),\n ),\n catchError((error) => {\n return new Observable<UploadResult>((observer) => {\n observer.next({\n fileId: '',\n success: false,\n error: error.message || 'Failed to get presigned URL',\n });\n observer.complete();\n });\n }),\n );\n }\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeService {\n private primaryColor: string = '#ad49e1';\n private logoUrl: string = '';\n private isDarkMode = signal(false);\n private mediaQuery?: MediaQueryList;\n private mediaQueryListener?: (event: MediaQueryListEvent) => void;\n\n constructor() {\n this.initializeDarkModeDetection();\n }\n\n /**\n * Initialize dark mode detection based on browser preferences\n */\n private initializeDarkModeDetection(): void {\n // Check initial preference\n this.updateDarkModeState();\n\n // Listen for changes in color scheme preference\n if (typeof window !== 'undefined' && window.matchMedia) {\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n // Store listener reference for cleanup\n this.mediaQueryListener = () => {\n this.updateDarkModeState();\n };\n\n // Add listener for changes\n this.mediaQuery.addEventListener('change', this.mediaQueryListener);\n }\n }\n\n /**\n * Cleanup method to remove event listeners\n * Should be called when service is no longer needed (e.g., in tests or if service scope changes)\n */\n cleanup(): void {\n if (this.mediaQuery && this.mediaQueryListener) {\n this.mediaQuery.removeEventListener('change', this.mediaQueryListener);\n this.mediaQuery = undefined;\n this.mediaQueryListener = undefined;\n }\n }\n\n /**\n * Update dark mode state based on current browser preference\n */\n private updateDarkModeState(): void {\n if (typeof window !== 'undefined' && window.matchMedia) {\n const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n this.isDarkMode.set(isDark);\n }\n }\n\n /**\n * Get current dark mode state\n */\n getDarkModeState() {\n return this.isDarkMode.asReadonly();\n }\n\n /**\n * Check if dark mode is currently active\n */\n isDarkModeActive(): boolean {\n return this.isDarkMode();\n }\n\n setPrimaryColor(color: string): void {\n this.primaryColor = color;\n this.updateCSSVariables();\n }\n\n setLogoUrl(url: string): void {\n this.logoUrl = url;\n }\n\n getPrimaryColor(): string {\n return this.primaryColor;\n }\n\n getLogoUrl(): string {\n return this.logoUrl;\n }\n\n private updateCSSVariables(): void {\n const root = document.documentElement;\n\n // Generate color variations based on the primary color\n const colorVariations = this.generateColorVariations(this.primaryColor);\n\n // Set CSS custom properties\n root.style.setProperty('--babylai-primary-color', this.primaryColor);\n root.style.setProperty('--babylai-primary-color-100', colorVariations[100]);\n root.style.setProperty('--babylai-primary-color-200', colorVariations[200]);\n root.style.setProperty('--babylai-primary-color-300', colorVariations[300]);\n root.style.setProperty('--babylai-primary-color-400', colorVariations[400]);\n root.style.setProperty('--babylai-primary-color-500', colorVariations[500]);\n root.style.setProperty('--babylai-primary-color-600', colorVariations[600]);\n root.style.setProperty('--babylai-primary-color-700', colorVariations[700]);\n root.style.setProperty('--babylai-primary-color-800', colorVariations[800]);\n root.style.setProperty('--babylai-primary-color-900', colorVariations[900]);\n root.style.setProperty('--babylai-primary-color-950', colorVariations[950]);\n }\n\n private generateColorVariations(baseColor: string): {\n [key: number]: string;\n } {\n // Generate variations by adjusting lightness\n const variations: { [key: number]: string } = {};\n\n variations[100] = this.lightenColor(baseColor, 0.85);\n variations[200] = this.lightenColor(baseColor, 0.65);\n variations[300] = this.lightenColor(baseColor, 0.45);\n variations[400] = this.lightenColor(baseColor, 0.25);\n variations[500] = baseColor; // Base color\n variations[600] = this.darkenColor(baseColor, 0.35);\n variations[700] = this.darkenColor(baseColor, 0.55);\n variations[800] = this.darkenColor(baseColor, 0.75);\n variations[900] = this.darkenColor(baseColor, 0.85);\n variations[950] = this.darkenColor(baseColor, 0.92);\n\n return variations;\n }\n\n /**\n * Lighten a color by a percentage\n */\n private lightenColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n // Use HSL-like approach for more natural lightening\n const newR = Math.round(r + (255 - r) * amount);\n const newG = Math.round(g + (255 - g) * amount);\n const newB = Math.round(b + (255 - b) * amount);\n\n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\n }\n\n /**\n * Darken a color by a percentage\n */\n private darkenColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n // Use HSL-like approach for more natural darkening\n const newR = Math.round(r * (1 - amount));\n const newG = Math.round(g * (1 - amount));\n const newB = Math.round(b * (1 - amount));\n\n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\n }\n\n initializeTheme(primaryColor: string, logoUrl: string): void {\n this.setPrimaryColor(primaryColor);\n this.setLogoUrl(logoUrl);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\n\n@Component({\n selector: 'app-arrow-animation',\n templateUrl: './arrow-animation.component.html',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ArrowAnimationComponent {\n showArrowAnimation = input<boolean>(false);\n isPopupOpen = input<boolean>(false);\n messageLabel = input<string | null>(null);\n closeArrowAnimation = output<void>();\n\n handleCloseArrowAnimation() {\n this.closeArrowAnimation.emit();\n }\n}\n","@if (showArrowAnimation() && !isPopupOpen()) {\n<div class=\"babylai:fixed babylai:bottom-20 babylai:right-6 babylai:z-9997 animate-float\">\n <div class=\"babylai:relative babylai:bg-primary babylai:rounded-full babylai:mb-4 babylai:shadow-lg babylai:px-4 babylai:py-3 babylai:max-w-xs\">\n <p class=\"babylai:text-xs babylai:mb-0 babylai:text-white babylai:max-w-40\">\n {{ messageLabel() || \"Need assistance Or You want to try the Product? Click here\" }}\n </p>\n <button \n class=\"babylai:absolute babylai:-top-2 babylai:right-0 babylai:w-5 babylai:h-5 babylai:cursor-pointer babylai:p-1.5 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:hover:bg-secondary babylai:text-card-foreground babylai:transition-colors babylai:bg-card babylai:shadow-lg babylai:border babylai:border-black-white-200\" \n (click)=\"handleCloseArrowAnimation()\"\n type=\"button\"\n [attr.aria-label]=\"'Close'\"\n >\n <svg class=\"babylai:w-3 babylai:h-3\" viewBox=\"0 0 12 12\">\n <path\n d=\"M1 1L11 11M1 11L11 1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n </svg>\n </button>\n <div class=\"babylai:absolute babylai:bottom-[-8px] babylai:right-6 babylai:w-0 babylai:h-0 babylai:border-l-8 babylai:border-r-8 babylai:border-t-8 babylai:border-l-transparent babylai:border-r-transparent babylai:border-t-primary\"></div>\n </div>\n</div>\n}\n","// src/app/pipes/translate.pipe.ts\nimport { Pipe, PipeTransform, inject } from '@angular/core';\nimport {\n TranslationKey,\n TranslationService,\n} from '../services/translation.service';\n\n/**\n * Angular pipe for translating keys in templates.\n *\n * Usage in templates:\n * ```html\n * {{ 'ChatNow' | translate }}\n * ```\n *\n * @publicApi\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n})\nexport class TranslatePipe implements PipeTransform {\n private translationService = inject(TranslationService) as TranslationService;\n\n /**\n * Transforms a translation key into the translated string for the current language.\n *\n * @param key Translation key to look up\n * @returns Translated string in the current language\n */\n transform(key: TranslationKey): string {\n return this.translationService.translate(key);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\n\ntype ButtonVariant = 'default' | 'icon-bg' | 'icon-only' | 'outline';\ntype ButtonType = 'button' | 'submit' | 'reset';\n\n@Component({\n selector: 'app-button',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonComponent {\n variant = input<ButtonVariant>();\n type = input<ButtonType>('button');\n disabled = input<boolean>(false);\n fullWidth = input<boolean>(false);\n className = input<string>('');\n size = input<'default' | 'small' | 'medium'>('default');\n onClick = output<MouseEvent>();\n\n getButtonClasses = computed(() => {\n const classes = [\n 'babylai:border babylai:disabled:bg-black-white-300 babylai:cursor-pointer babylai:text-xl! babylai:transition-all babylai:w-full babylai:disabled:border-black-white-300 babylai:disabled:cursor-not-allowed babylai:disabled:text-white babylai:duration-200 babylai:ease-out babylai:flex babylai:gap-1 babylai:items-center babylai:justify-center babylai:p-3 babylai:relative babylai:rounded-2xl',\n ];\n\n // Add variant-specific classes\n if (this.variant() === 'default') {\n classes.push(\n 'babylai:bg-primary babylai:border-primary babylai:text-white babylai:hover:bg-primary-600 babylai:hover:border-primary-600',\n );\n } else if (this.variant() === 'outline') {\n classes.push(\n 'babylai:bg-transparent babylai:border-primary babylai:text-primary babylai:hover:bg-primary-100 babylai:hover:border-primary-200',\n );\n } else if (this.variant() === 'icon-bg') {\n if (this.className().includes('babylai:white-bg')) {\n classes.push('babylai:bg-white');\n } else if (this.className().includes('babylai:light-bg')) {\n // Will be handled by CSS variables\n }\n if (this.size() === 'small') {\n classes.push('babylai:p-2', 'babylai:w-7', 'babylai:h-7');\n } else {\n classes.push('babylai:p-3');\n }\n } else if (this.variant() === 'icon-only') {\n classes.push(\n 'babylai:bg-transparent',\n 'babylai:border-none',\n 'babylai:p-1',\n 'babylai:flex',\n 'babylai:items-center',\n 'babylai:justify-center',\n );\n }\n\n // Add full width class if needed\n if (this.fullWidth()) {\n classes.push('babylai:w-full', 'babylai:flex');\n }\n\n // Add custom classes\n if (this.className()) {\n classes.push(this.className());\n }\n\n return classes.join(' ');\n });\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"disabled()\"\n [class]=\"getButtonClasses()\"\n (click)=\"onClick.emit($event)\"\n dir=\"auto\"\n>\n <ng-content></ng-content>\n</button>\n\n","import {\n ChangeDetectionStrategy,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n input,\n} from '@angular/core';\n\n// Import iconify-icon to register the custom element\nimport 'iconify-icon';\n\n@Component({\n selector: 'app-icon',\n imports: [],\n templateUrl: './icon.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class IconComponent {\n // Icon name from Solar icon set (e.g., 'solar:home-bold', 'solar:chat-round-bold')\n name = input.required<string>();\n\n // Size of the icon (can be a number or string like '24px', '1em', etc.)\n size = input<string | number>('1.2em');\n\n // Color of the icon (CSS color value)\n color = input<string>('currentColor');\n\n // Additional CSS classes\n className = input<string>('babylai:flex');\n\n // Whether the icon should be inline\n inline = input<boolean>(false);\n\n // Flip the icon horizontally\n flip = input<'horizontal' | 'vertical' | 'both' | undefined>(undefined);\n\n // Rotate the icon (degrees or '90deg', '180deg', etc.)\n rotate = input<string | number | undefined>(undefined);\n}\n","<iconify-icon\n [icon]=\"name()\"\n [style.width]=\"typeof size() === 'number' ? size() + 'px' : size()\"\n [style.height]=\"typeof size() === 'number' ? size() + 'px' : size()\"\n [style.font-size]=\"typeof size() === 'number' ? size() + 'px' : size()\"\n [style.color]=\"color()\"\n [class]=\"className()\"\n [attr.inline]=\"inline() ? '' : null\"\n [attr.flip]=\"flip() || null\"\n [attr.rotate]=\"rotate() ? (typeof rotate() === 'number' ? rotate() + 'deg' : rotate()) : null\"\n></iconify-icon>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { ButtonComponent } from '../../../shared/components/button';\nimport { IconComponent } from '../../../shared/components/icon';\n\ninterface Option {\n id: string;\n helpScreenId: string;\n parentOptionId: string | null;\n nestedOptions: Option[];\n title: string;\n paragraphs: string[];\n chatWithUs: boolean;\n assistantId?: string;\n assistant?: {\n id: string;\n tenantId: string;\n tenant: {\n id: string;\n name: string;\n key: string;\n };\n name: string;\n openAIAssistantId: string;\n greeting: string;\n closing: string;\n };\n hasNestedOptions: boolean;\n order: number;\n}\n\n@Component({\n selector: 'app-chat-action-buttons',\n templateUrl: './chat-action-buttons.component.html',\n standalone: true,\n imports: [CommonModule, TranslatePipe, ButtonComponent, IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatActionButtonsComponent {\n selectedOption = input<Option | null>(null);\n\n closeChat = output<Option>();\n continueChat = output<void>();\n\n handleCloseChat() {\n const option = this.selectedOption();\n if (option) {\n this.closeChat.emit(option);\n }\n }\n\n handleContinueChat() {\n this.continueChat.emit();\n }\n}\n","<section class=\"babylai:flex babylai:justify-between babylai:gap-3 babylai:px-4 babylai:py-6 babylai:absolute babylai:left-0 babylai:right-0 babylai:bottom-11 babylai:z-20 babylai:bg-linear-to-t babylai:from-card babylai:to-transparent babylai:from-[28.32%] babylai:to-[112.59%]\">\n <app-button\n variant=\"outline\"\n [fullWidth]=\"true\"\n (onClick)=\"handleCloseChat()\"\n class=\"babylai:w-full\"\n >\n {{ \"CloseChat\" | translate }}\n </app-button>\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n (onClick)=\"handleContinueChat()\"\n class=\"babylai:w-full\"\n >\n {{ \"Continue\" | translate }}\n <app-icon name=\"solar:plain-2-bold-duotone\" class=\"babylai:flex\" size=\"24px\" />\n </app-button>\n</section>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { IconComponent } from '../../../shared/components/icon';\n\n@Component({\n selector: 'app-chat-avatar',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './chat-avatar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatAvatarComponent {\n senderType = input<number>(1);\n needsAgent = input<boolean>(false);\n isHidden = input<boolean>(false);\n}\n","<div\n [class.babylai:invisible]=\"isHidden()\"\n role=\"img\"\n [attr.aria-label]=\"\n senderType() === 3\n ? 'Assistant avatar'\n : needsAgent() || senderType() === 2\n ? 'Agent avatar'\n : 'User avatar'\n \"\n>\n @if (senderType() === 3) {\n <span\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:w-8 babylai:h-8 babylai:rounded-full babylai:p-2 babylai:bg-primary babylai:text-primary\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 13 13\"\n fill=\"currentColor\"\n >\n <path\n d=\"M0 3.32671C0 1.48942 1.48942 0 3.32672 0H8.87124C10.7085 0 12.198 1.48942 12.198 3.32672V8.87124C12.198 10.7085 10.7085 12.198 8.87124 12.198H0V3.32671Z\"\n fill=\"white\"\n />\n <path\n d=\"M3.84993 4.07931C3.85024 4.07821 3.85039 4.07767 3.85047 4.07741C3.89874 3.90812 4.13867 3.90812 4.18695 4.07741C4.18702 4.07767 4.18718 4.07821 4.18749 4.07931C4.1883 4.0822 4.18871 4.08365 4.1891 4.085C4.41343 4.87717 5.03256 5.49631 5.82473 5.72064C5.82608 5.72102 5.82753 5.72143 5.83042 5.72224C5.83152 5.72255 5.83207 5.72271 5.83232 5.72278C6.00162 5.77106 6.00162 6.01099 5.83232 6.05927C5.83207 6.05934 5.83152 6.05949 5.83042 6.0598C5.82753 6.06062 5.82608 6.06103 5.82473 6.06141C5.03256 6.28574 4.41343 6.90488 4.1891 7.69704C4.18871 7.6984 4.1883 7.69984 4.18749 7.70273C4.18718 7.70383 4.18702 7.70438 4.18695 7.70463C4.13867 7.87393 3.89874 7.87393 3.85047 7.70463C3.85039 7.70438 3.85024 7.70383 3.84993 7.70273C3.84911 7.69984 3.84871 7.6984 3.84832 7.69704C3.62399 6.90488 3.00486 6.28574 2.21269 6.06141C2.21133 6.06103 2.20989 6.06062 2.207 6.0598C2.2059 6.05949 2.20535 6.05934 2.2051 6.05927C2.0358 6.01099 2.0358 5.77106 2.2051 5.72278C2.20535 5.72271 2.2059 5.72255 2.207 5.72224C2.20989 5.72143 2.21133 5.72102 2.21269 5.72064C3.00486 5.49631 3.62399 4.87717 3.84832 4.085C3.84871 4.08365 3.84911 4.0822 3.84993 4.07931Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M9.84056 5.85655C9.84056 6.6795 9.18894 7.34664 8.38513 7.34664C7.58131 7.34664 6.92969 6.6795 6.92969 5.85655C6.92969 5.03359 7.58131 4.36646 8.38513 4.36646C9.18894 4.36646 9.84056 5.03359 9.84056 5.85655Z\"\n fill=\"currentColor\"\n />\n </svg>\n </span>\n } @else if (needsAgent() || senderType() === 2) {\n <span\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:w-8 babylai:h-8 babylai:rounded-full babylai:p-2 babylai:bg-black-white-50 babylai:text-primary\"\n >\n <app-icon name=\"solar:user-bold\" class=\"babylai:flex\" />\n </span>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n inject,\n signal,\n} from '@angular/core';\nimport { catchError, of } from 'rxjs';\nimport { FileUploadService } from '../../../services/file-upload.service';\n\n@Component({\n selector: 'app-image-attachment',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './image-attachment.component.html',\n})\nexport class ImageAttachmentComponent implements OnInit, OnDestroy {\n @Input() fileId: string = '';\n @Input() enablePreview: boolean = true;\n @Input() className: string = '';\n @Output() imageClick = new EventEmitter<void>();\n\n private readonly fileUploadService = inject(FileUploadService);\n\n imageUrl = signal<string | null>(null);\n isLoading = signal<boolean>(true);\n hasError = signal<boolean>(false);\n\n ngOnInit(): void {\n if (this.fileId) {\n const isDirectUrl =\n this.fileId.startsWith('http://') || this.fileId.startsWith('https://');\n if (isDirectUrl) {\n this.imageUrl.set(this.fileId);\n this.isLoading.set(false);\n } else {\n this.loadImage();\n }\n }\n }\n\n ngOnDestroy(): void {\n // Clean up object URL if created\n const url = this.imageUrl();\n if (url && url.startsWith('blob:')) {\n URL.revokeObjectURL(url);\n }\n }\n\n private loadImage(): void {\n this.isLoading.set(true);\n this.hasError.set(false);\n\n this.fileUploadService\n .presignDownload(this.fileId)\n .pipe(\n catchError((error) => {\n console.error('Error loading image:', error);\n this.hasError.set(true);\n this.isLoading.set(false);\n return of(null);\n }),\n )\n .subscribe((response) => {\n if (response?.downloadUrl) {\n this.imageUrl.set(response.downloadUrl);\n this.isLoading.set(false);\n } else {\n this.hasError.set(true);\n this.isLoading.set(false);\n }\n });\n }\n\n handleClick(): void {\n if (this.enablePreview && this.imageUrl()) {\n this.imageClick.emit();\n }\n }\n}\n","<div\n class=\"babylai:inline-flex babylai:items-center babylai:justify-center babylai:w-[50px] babylai:h-[50px] babylai:rounded-md babylai:overflow-hidden babylai:shrink-0\"\n [style.background-color]=\"'var(--muted)'\"\n [class]=\"className\"\n (click)=\"handleClick()\"\n [class.babylai:cursor-pointer]=\"enablePreview && imageUrl()\"\n [class.babylai:transition-opacity]=\"enablePreview && imageUrl()\"\n [class.babylai:duration-200]=\"enablePreview && imageUrl()\"\n>\n @if (isLoading()) {\n <div class=\"babylai:text-sm\" [style.color]=\"'var(--muted-foreground)'\">...</div>\n } @else if (hasError()) {\n <div class=\"babylai:text-sm babylai:font-semibold\" [style.color]=\"'var(--destructive)'\">!</div>\n } @else if (imageUrl()) {\n <img\n [src]=\"imageUrl()!\"\n [alt]=\"'Image attachment'\"\n class=\"babylai:w-full babylai:h-full babylai:object-cover babylai:block\"\n [class.babylai:opacity-80]=\"enablePreview\"\n loading=\"lazy\"\n />\n }\n</div>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n OnChanges,\n OnInit,\n SimpleChanges,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\n\n@Component({\n selector: 'app-image-preview-dialog',\n imports: [CommonModule],\n templateUrl: './image-preview-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:keydown)': 'handleKeydown($event)',\n },\n})\nexport class ImagePreviewDialogComponent implements OnInit, OnChanges {\n imageUrls = input<string[]>([]);\n initialIndex = input<number>(0);\n isOpen = input<boolean>(false);\n close = output<void>();\n\n currentIndex = signal<number>(0);\n currentImageUrl = computed(() => {\n const index = this.currentIndex();\n return this.imageUrls()[index] || null;\n });\n imageCounter = computed(() => {\n return `${this.currentIndex() + 1} / ${this.imageUrls().length}`;\n });\n hasMultipleImages = computed(() => this.imageUrls().length > 1);\n canGoPrevious = computed(() => this.currentIndex() > 0);\n canGoNext = computed(() => this.currentIndex() < this.imageUrls().length - 1);\n\n ngOnInit(): void {\n this.currentIndex.set(this.initialIndex());\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['initialIndex'] && this.isOpen()) {\n this.currentIndex.set(this.initialIndex());\n }\n if (changes['isOpen'] && this.isOpen()) {\n this.currentIndex.set(this.initialIndex());\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n if (!this.isOpen()) return;\n\n switch (event.key) {\n case 'Escape':\n this.handleClose();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.handlePrevious();\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.handleNext();\n break;\n }\n }\n\n handleClose(): void {\n this.close.emit();\n }\n\n handleBackdropClick(event: MouseEvent): void {\n // Close if clicking on the backdrop (not the image)\n if (\n (event.target as HTMLElement).classList.contains(\n 'image-preview-dialog__backdrop',\n )\n ) {\n this.handleClose();\n }\n }\n\n handlePrevious(): void {\n if (this.canGoPrevious()) {\n this.currentIndex.update((index) => index - 1);\n }\n }\n\n handleNext(): void {\n if (this.canGoNext()) {\n this.currentIndex.update((index) => index + 1);\n }\n }\n}\n","@if (isOpen()) {\n <div\n class=\"image-preview-dialog__backdrop babylai:fixed babylai:inset-0 babylai:bg-black/90 babylai:flex babylai:items-center babylai:justify-center babylai:z-9999 babylai:p-4\"\n (click)=\"handleBackdropClick($event)\"\n >\n <div class=\"image-preview-dialog__container babylai:relative babylai:w-full babylai:h-full babylai:flex babylai:items-center babylai:justify-center babylai:max-w-[90vw] babylai:max-h-[90vh] babylai:z-1\">\n <button\n class=\"image-preview-dialog__close babylai:absolute babylai:top-4 babylai:right-4 babylai:z-10001 babylai:w-10 babylai:h-10 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:bg-white/10 babylai:border babylai:border-white/20 babylai:text-white babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:pointer-events-auto babylai:hover:bg-white/20 babylai:hover:scale-110\"\n (click)=\"handleClose()\"\n type=\"button\"\n aria-label=\"Close preview\"\n >\n <svg\n class=\"babylai:w-6 babylai:h-6 babylai:pointer-events-none\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n @if (hasMultipleImages()) {\n <button\n class=\"babylai:absolute babylai:top-1/2 babylai:-translate-y-1/2 babylai:z-10001 babylai:w-12 babylai:h-12 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:bg-white/10 babylai:border babylai:border-white/20 babylai:text-white babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:pointer-events-auto babylai:left-4\"\n [class.babylai:opacity-30]=\"!canGoPrevious()\"\n [class.babylai:cursor-not-allowed]=\"!canGoPrevious()\"\n (click)=\"handlePrevious()\"\n type=\"button\"\n aria-label=\"Previous image\"\n [disabled]=\"!canGoPrevious()\"\n >\n <svg\n class=\"babylai:w-6 babylai:h-6 babylai:pointer-events-none\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <button\n class=\"babylai:absolute babylai:top-1/2 babylai:-translate-y-1/2 babylai:z-10001 babylai:w-12 babylai:h-12 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full babylai:bg-white/10 babylai:border babylai:border-white/20 babylai:text-white babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:pointer-events-auto babylai:right-4\"\n [class.babylai:opacity-30]=\"!canGoNext()\"\n [class.babylai:cursor-not-allowed]=\"!canGoNext()\"\n (click)=\"handleNext()\"\n type=\"button\"\n aria-label=\"Next image\"\n [disabled]=\"!canGoNext()\"\n >\n <svg\n class=\"babylai:w-6 babylai:h-6 babylai:pointer-events-none\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n\n <div class=\"babylai:relative babylai:w-full babylai:h-full babylai:flex babylai:items-center babylai:justify-center babylai:overflow-hidden babylai:z-1\">\n @if (currentImageUrl()) {\n <img\n [src]=\"currentImageUrl()!\"\n [alt]=\"'Image preview'\"\n class=\"babylai:max-w-full babylai:max-h-full babylai:object-contain babylai:rounded-md babylai:pointer-events-none\"\n />\n }\n </div>\n\n @if (hasMultipleImages()) {\n <div class=\"babylai:absolute babylai:bottom-4 babylai:left-1/2 babylai:-translate-x-1/2 babylai:py-2 babylai:px-4 babylai:bg-black/60 babylai:text-white babylai:rounded-full babylai:text-sm babylai:font-medium babylai:z-10001 babylai:pointer-events-none\">\n {{ imageCounter() }}\n </div>\n }\n </div>\n </div>\n}\n\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n effect,\n EffectRef,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n SecurityContext,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { marked } from 'marked';\n\n// Configure marked with safe options\nmarked.setOptions({\n breaks: true,\n gfm: true,\n silent: false, // Log warnings for debugging\n // Note: We don't use marked's sanitize option as we handle sanitization with Angular's DomSanitizer\n});\n\n// Type declaration for Prism.js on window object\ndeclare global {\n interface Window {\n Prism?: {\n highlightAllUnder: (element: HTMLElement) => void;\n highlight: (code: string, grammar: unknown, language: string) => string;\n languages: Record<string, unknown>;\n };\n }\n}\n\n@Component({\n selector: 'app-markdown-renderer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './markdown-renderer.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MarkdownRendererComponent\n implements OnInit, AfterViewInit, OnDestroy\n{\n content = input<string>('');\n inline = input<boolean>(false);\n cssClass = input<string>(\n 'babylai:m-0 babylai:leading-snug babylai:text-sm babylai:font-sans babylai:wrap-break-word babylai:text-start',\n );\n dir = input<string>('ltr');\n @ViewChild('markdownContainer') markdownContainer!: ElementRef;\n\n private sanitizer = inject(DomSanitizer);\n sanitizedContent = signal<SafeHtml>('');\n private contentEffectRef?: EffectRef;\n\n constructor() {\n // Effect to re-render content when input changes\n this.contentEffectRef = effect(() => {\n const contentValue = this.content();\n // Track inline() to re-render when it changes\n void this.inline();\n if (contentValue) {\n this.renderContent();\n } else {\n this.sanitizedContent.set('');\n }\n });\n }\n\n ngOnInit(): void {\n this.renderContent();\n }\n\n ngAfterViewInit(): void {\n this.highlightCode();\n // Lazy load Prism.js if code blocks are detected\n this.loadPrismIfNeeded();\n }\n\n /**\n * Lazy loads Prism.js syntax highlighter only if code blocks are detected\n */\n private async loadPrismIfNeeded(): Promise<void> {\n // Check if Prism is already loaded\n if (typeof window !== 'undefined' && window.Prism) {\n return;\n }\n\n // Check if content contains code blocks (```)\n const contentValue = this.content();\n if (!contentValue || !contentValue.includes('```')) {\n return;\n }\n\n try {\n // Dynamically import Prism.js and its commonly used components\n await Promise.all([\n import('prismjs'),\n import('prismjs/components/prism-typescript'),\n import('prismjs/components/prism-javascript'),\n import('prismjs/components/prism-css'),\n import('prismjs/components/prism-json'),\n ]);\n\n // Re-highlight after loading\n this.highlightCode();\n } catch (error) {\n console.warn('Failed to load Prism.js:', error);\n }\n }\n\n private renderContent(): void {\n const contentValue = this.content();\n if (!contentValue) {\n this.sanitizedContent.set('');\n return;\n }\n\n try {\n // Parse markdown to HTML\n // Use parseInline() for inline content (titles, labels, etc.) and parse() for block-level content\n const html = this.inline()\n ? (marked.parseInline(contentValue) as string)\n : (marked.parse(contentValue) as string);\n\n // Additional validation: ensure we have a string\n if (typeof html !== 'string') {\n console.warn('Marked parsing returned non-string value');\n this.sanitizedContent.set('');\n return;\n }\n\n // Sanitize the HTML content to prevent XSS attacks\n // Angular's DomSanitizer removes dangerous HTML/JavaScript while preserving safe formatting\n const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, html);\n\n if (!sanitized) {\n // If sanitization removed everything (likely due to dangerous content), return empty\n this.sanitizedContent.set('');\n return;\n }\n\n // Use bypassSecurityTrustHtml only for the sanitized content\n // This is safe because we've already sanitized it with Angular's DomSanitizer\n this.sanitizedContent.set(\n this.sanitizer.bypassSecurityTrustHtml(sanitized),\n );\n } catch (error) {\n console.warn('Error parsing markdown:', error);\n // On error, sanitize the raw content as fallback\n const sanitized = this.sanitizer.sanitize(\n SecurityContext.HTML,\n contentValue,\n );\n this.sanitizedContent.set(\n sanitized ? this.sanitizer.bypassSecurityTrustHtml(sanitized) : '',\n );\n }\n }\n\n private highlightCode(): void {\n if (typeof window !== 'undefined' && window.Prism) {\n if (this.markdownContainer?.nativeElement) {\n window.Prism.highlightAllUnder(this.markdownContainer.nativeElement);\n }\n }\n }\n\n ngOnDestroy(): void {\n // Clean up effect\n if (this.contentEffectRef) {\n this.contentEffectRef.destroy();\n this.contentEffectRef = undefined;\n }\n }\n}\n","<div \n #markdownContainer\n [class]=\"cssClass()\"\n [dir]=\"dir()\"\n [innerHTML]=\"sanitizedContent()\"\n></div>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { catchError, forkJoin, of } from 'rxjs';\nimport { FileUploadService } from '../../../services/file-upload.service';\nimport { ChatAvatarComponent } from '../chat-avatar/chat-avatar.component';\nimport { ImageAttachmentComponent } from '../image-attachment/image-attachment.component';\nimport { ImagePreviewDialogComponent } from '../image-preview-dialog/image-preview-dialog.component';\nimport { MarkdownRendererComponent } from './../../../shared/components/markdown-renderer/markdown-renderer.component';\nimport { Message } from './../../../types';\n\n@Component({\n selector: 'app-chat-message',\n standalone: true,\n imports: [\n CommonModule,\n MarkdownRendererComponent,\n ChatAvatarComponent,\n ImageAttachmentComponent,\n ImagePreviewDialogComponent,\n ],\n templateUrl: './chat-message.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatMessageComponent {\n message = input.required<Message>();\n needsAgent = input<boolean>(false);\n currentLang = input<string>('en');\n isHidden = input<boolean>(false);\n\n private readonly fileUploadService = inject(FileUploadService);\n\n previewImageUrls = signal<string[]>([]);\n previewImageIndex = signal<number>(-1);\n isPreviewOpen = signal<boolean>(false);\n\n hasAttachments = computed(() => {\n const currentMessage = this.message();\n return !!currentMessage.attachmentIds?.length;\n });\n\n cleanMessageContent(content: string): string {\n return content.replace(/```/g, '\\\\`\\\\`\\\\`');\n }\n\n handleImageClick(clickedIndex: number): void {\n const currentMessage = this.message();\n if (\n !currentMessage.attachmentIds ||\n currentMessage.attachmentIds.length === 0\n ) {\n return;\n }\n\n // Each item can be a direct URL or a file ID (needs presign)\n const downloadObservables = currentMessage.attachmentIds.map((idOrUrl) => {\n const isUrl =\n idOrUrl.startsWith('http://') || idOrUrl.startsWith('https://');\n if (isUrl) {\n return of({ downloadUrl: idOrUrl });\n }\n return this.fileUploadService.presignDownload(idOrUrl).pipe(\n catchError((error) => {\n console.error(`Error loading image ${idOrUrl}:`, error);\n return of(null);\n }),\n );\n });\n\n forkJoin(downloadObservables).subscribe(\n (responses: Array<{ downloadUrl: string } | null>) => {\n const urls = responses\n .filter((r): r is { downloadUrl: string } => r !== null)\n .map((r) => r.downloadUrl);\n this.previewImageUrls.set(urls);\n this.previewImageIndex.set(clickedIndex);\n this.isPreviewOpen.set(true);\n },\n );\n }\n\n closePreview(): void {\n this.isPreviewOpen.set(false);\n this.previewImageUrls.set([]);\n this.previewImageIndex.set(-1);\n }\n}\n","<div\n class=\"babylai:flex babylai:items-start babylai:gap-3\"\n [class.babylai:flex-row-reverse]=\"message().senderType === 1\"\n>\n @if (message().senderType !== 1) {\n <app-chat-avatar\n [senderType]=\"message().senderType\"\n [needsAgent]=\"needsAgent()\"\n [isHidden]=\"isHidden()\"\n />\n }\n\n <div\n class=\"babylai:rounded-2xl babylai:p-4 babylai:flex babylai:flex-col babylai:gap-2\"\n [dir]=\"\n (currentLang() === 'ar') !== (message().senderType === 1) ? 'rtl' : 'ltr'\n \"\n [class]=\"\n message().senderType === 1\n ? 'babylai:bg-primary-500 babylai:text-black-white-50 babylai:max-w-[220px]'\n : 'babylai:bg-card'\n \"\n >\n @if (hasAttachments()) {\n <div class=\"babylai:flex babylai:flex-wrap babylai:gap-2\">\n @for (\n fileId of message().attachmentIds!;\n track fileId;\n let i = $index\n ) {\n <app-image-attachment\n [fileId]=\"fileId\"\n [enablePreview]=\"true\"\n (imageClick)=\"handleImageClick(i)\"\n class=\"babylai:flex babylai:flex-col\"\n />\n }\n </div>\n }\n <app-markdown-renderer\n [content]=\"cleanMessageContent(message().messageContent)\"\n [inline]=\"false\"\n [dir]=\"'auto'\"\n >\n </app-markdown-renderer>\n </div>\n</div>\n\n<app-image-preview-dialog\n [imageUrls]=\"previewImageUrls()\"\n [initialIndex]=\"previewImageIndex()\"\n [isOpen]=\"isPreviewOpen()\"\n (close)=\"closePreview()\"\n/>\n","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'app-chat-separator',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './chat-separator.component.html',\n})\nexport class ChatSeparatorComponent {}\n","<div class=\"chat__separator babylai:w-full babylai:text-black-white-300\">\n <svg\n class=\"babylai:w-full\"\n height=\"14\"\n viewBox=\"0 0 327 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <line x1=\"132.5\" y1=\"7.5\" y2=\"7.5\" stroke=\"currentColor\" />\n <path\n d=\"M162.891 0.464864C162.892 0.460907 162.893 0.458928 162.893 0.458012C163.067 -0.152671 163.933 -0.152671 164.107 0.458012C164.107 0.458928 164.108 0.460907 164.109 0.464864C164.112 0.475291 164.113 0.480505 164.115 0.4854C164.924 3.34287 167.157 5.57619 170.015 6.38539C170.019 6.38678 170.025 6.38825 170.035 6.39119C170.039 6.3923 170.041 6.39286 170.042 6.39312C170.653 6.56727 170.653 7.43274 170.042 7.60688C170.041 7.60714 170.039 7.6077 170.035 7.60881C170.025 7.61175 170.019 7.61322 170.015 7.61461C167.157 8.42381 164.924 10.6571 164.115 13.5146C164.113 13.5195 164.112 13.5247 164.109 13.5351C164.108 13.5391 164.107 13.5411 164.107 13.542C163.933 14.1527 163.067 14.1527 162.893 13.542C162.893 13.5411 162.892 13.5391 162.891 13.5351C162.888 13.5247 162.887 13.5195 162.885 13.5146C162.076 10.6571 159.843 8.42381 156.985 7.61461C156.981 7.61322 156.975 7.61175 156.965 7.60881C156.961 7.6077 156.959 7.60714 156.958 7.60688C156.347 7.43274 156.347 6.56727 156.958 6.39312C156.959 6.39286 156.961 6.3923 156.965 6.39119C156.975 6.38825 156.981 6.38678 156.985 6.38539C159.843 5.57619 162.076 3.34287 162.885 0.4854C162.887 0.480505 162.888 0.475291 162.891 0.464864Z\"\n fill=\"currentColor\"\n />\n <line x1=\"327\" y1=\"7.5\" x2=\"194.5\" y2=\"7.5\" stroke=\"currentColor\" />\n </svg>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { ChatAvatarComponent } from '../chat-avatar/chat-avatar.component';\n\n@Component({\n selector: 'app-chat-typing-indicator',\n standalone: true,\n imports: [CommonModule, ChatAvatarComponent],\n templateUrl: './chat-typing-indicator.component.html',\n})\nexport class ChatTypingIndicatorComponent {}\n","<div class=\"babylai:mb-4 babylai:flex\">\n <div class=\"babylai:shrink-0 babylai:me-3\">\n <div\n class=\"babylai:w-8 babylai:h-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:bg-primary\"\n >\n <app-chat-avatar\n [senderType]=\"3\"\n [needsAgent]=\"false\"\n [isHidden]=\"false\"\n />\n </div>\n </div>\n <div\n class=\"babylai:max-w-[80%] babylai:rounded-2xl babylai:p-4 babylai:bg-card\"\n >\n <p\n class=\"babylai:text-sm babylai:text-muted-foreground babylai:m-0 babylai:flex babylai:gap-0.5 babylai:items-center\"\n aria-hidden=\"true\"\n >\n <span\n class=\"babylai-typing-dot babylai:inline-block babylai:w-1.5 babylai:h-1.5 babylai:rounded-full babylai:bg-current\"\n >\n </span>\n <span\n class=\"babylai-typing-dot babylai:inline-block babylai:w-1.5 babylai:h-1.5 babylai:rounded-full babylai:bg-current\"\n >\n </span>\n <span\n class=\"babylai-typing-dot babylai:inline-block babylai:w-1.5 babylai:h-1.5 babylai:rounded-full babylai:bg-current\"\n >\n </span>\n </p>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { ButtonComponent } from '../../../shared/components/button';\nimport { IconComponent } from '../../../shared/components/icon';\n\n@Component({\n selector: 'app-review-message',\n templateUrl: './review-message.component.html',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonComponent,\n TranslatePipe,\n IconComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReviewMessageComponent {\n isSubmitting = input<boolean>(false);\n currentLang = input<string>('en');\n\n rating = signal<number>(0);\n comment = signal<string>('');\n\n // Validation errors\n ratingError = signal<string>('');\n commentError = signal<string>('');\n\n ratingChange = output<number>();\n commentChange = output<string>();\n submitReview = output<{ rating: number; comment: string }>();\n skip = output<void>();\n\n onRatingClick(starIndex: number): void {\n this.rating.set(starIndex + 1);\n this.clearRatingError();\n this.ratingChange.emit(this.rating());\n }\n\n onCommentChange(): void {\n this.clearCommentError();\n this.commentChange.emit(this.comment());\n }\n\n onSubmitReview(): void {\n if (this.validateForm() && !this.isSubmitting()) {\n this.submitReview.emit({\n rating: this.rating(),\n comment: this.comment().trim(),\n });\n }\n }\n\n onSkip(): void {\n if (!this.isSubmitting()) {\n this.skip.emit();\n this.resetForm();\n }\n }\n\n private validateForm(): boolean {\n let isValid = true;\n\n // Validate rating\n if (this.rating() < 1 || this.rating() > 5) {\n this.ratingError.set('Rating must be between 1 and 5.');\n isValid = false;\n }\n\n // Validate comment (optional - only check max length if provided)\n const trimmedComment = this.comment().trim();\n if (trimmedComment.length > 0 && trimmedComment.length > 500) {\n this.commentError.set('Comment must not exceed 500 characters.');\n isValid = false;\n } else {\n // Clear any existing error if comment is valid or empty\n this.commentError.set('');\n }\n\n return isValid;\n }\n\n private clearRatingError(): void {\n this.ratingError.set('');\n }\n\n private clearCommentError(): void {\n this.commentError.set('');\n }\n\n private resetForm(): void {\n this.rating.set(0);\n this.comment.set('');\n this.ratingError.set('');\n this.commentError.set('');\n }\n\n getStarsArray(): number[] {\n return Array(5)\n .fill(0)\n .map((_, index) => index);\n }\n\n isStarFilled(starIndex: number): boolean {\n return starIndex < this.rating();\n }\n\n getCommentLength(): number {\n return this.comment().trim().length;\n }\n\n getCommentMaxLength(): number {\n return 500;\n }\n\n getCommentMinLength(): number {\n return 10;\n }\n}\n","<div class=\"babylai:flex babylai:flex-col babylai:gap-2.5\">\n <h2 class=\"babylai:font-normal babylai:text-card-foreground\">\n {{ \"ReviewDialogTitle\" | translate }}\n </h2>\n <p class=\"babylai:text-sm babylai:text-muted-foreground\">\n {{ \"ReviewDialogDescription\" | translate }}\n </p>\n\n <div class=\"\">\n <label class=\"babylai:sr-only\" aria-label=\"review message stars label\">\n {{ \"ReviewDialogRatingLabel\" | translate }}\n </label>\n <div\n class=\"babylai:inline-flex babylai:bg-muted babylai:rounded-3xl babylai:p-3 babylai:gap-2\"\n aria-labelledby=\"review message stars\"\n >\n @for (star of getStarsArray(); track star) {\n <button\n class=\"babylai:hover:text-[#F49E00] babylai:border-0 babylai:bg-transparent babylai:p-0\"\n [class.babylai:text-black-white-200]=\"!isStarFilled(star)\"\n [class.babylai:dark:text-muted-foreground]=\"!isStarFilled(star)\"\n [class.babylai:text-[#F49E00]]=\"isStarFilled(star)\"\n [disabled]=\"isSubmitting()\"\n (click)=\"onRatingClick(star)\"\n [attr.aria-label]=\"'Rate ' + (star + 1) + ' out of 5 stars'\"\n [attr.aria-pressed]=\"isStarFilled(star)\"\n role=\"button\"\n type=\"button\"\n (keydown.enter)=\"onRatingClick(star)\"\n (keydown.space)=\"$event.preventDefault(); onRatingClick(star)\"\n >\n <app-icon name=\"solar:star-bold\" class=\"babylai:flex\" size=\"28px\" />\n </button>\n }\n </div>\n @if (ratingError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ ratingError() }}\n </div>\n }\n </div>\n\n @if (rating() > 0) {\n <div class=\"babylai:flex babylai:flex-col babylai:gap-2.5\">\n <label class=\"babylai:text-card-foreground\">\n {{ \"ReviewDialogCommentLabel\" | translate }}\n </label>\n <textarea\n class=\"babylai:resize-none babylai:w-full babylai:bg-secondary babylai:border babylai:rounded-xl babylai:text-card-foreground babylai:text-sm babylai:p-3 babylai:resize-vertical babylai:min-h-20 babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed babylai:disabled:bg-secondary babylai:border-black-white-200\"\n [class.babylai:border-destructive]=\"commentError()\"\n [ngModel]=\"comment()\"\n (ngModelChange)=\"comment.set($event); onCommentChange()\"\n [placeholder]=\"'ReviewDialogCommentPlaceholder' | translate\"\n [maxlength]=\"getCommentMaxLength()\"\n [disabled]=\"isSubmitting()\"\n rows=\"4\"\n ></textarea>\n <div class=\"babylai:flex babylai:flex-col\">\n <div\n class=\"babylai:text-card-foreground babylai:text-sm babylai:whitespace-nowrap babylai:opacity-70\"\n >\n {{ getCommentLength() }}/{{ getCommentMaxLength() }} characters\n </div>\n @if (commentError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ commentError() }}\n </div>\n }\n </div>\n </div>\n\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting()\"\n (onClick)=\"onSubmitReview()\"\n >\n @if (isSubmitting()) {\n Submitting...\n } @else {\n {{ \"ReviewDialogSubmitButton\" | translate }}\n }\n </app-button>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n EffectRef,\n ElementRef,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewChild,\n} from '@angular/core';\nimport { Message } from '../types';\nimport { ChatAvatarComponent } from './components/chat-avatar/chat-avatar.component';\nimport { ChatMessageComponent } from './components/chat-message/chat-message.component';\nimport { ChatSeparatorComponent } from './components/chat-separator/chat-separator.component';\nimport { ChatTypingIndicatorComponent } from './components/chat-typing-indicator/chat-typing-indicator.component';\nimport { ReviewMessageComponent } from './components/review-message/review-message.component';\n\n@Component({\n selector: 'app-chat',\n standalone: true,\n imports: [\n CommonModule,\n ChatMessageComponent,\n ChatSeparatorComponent,\n ChatTypingIndicatorComponent,\n ReviewMessageComponent,\n ChatAvatarComponent,\n ],\n templateUrl: './chat.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatComponent implements OnInit, AfterViewInit, OnDestroy {\n // Using input() signals - automatically trigger change detection on updates\n messages = input<Message[]>([]);\n needsAgent = input<boolean>(false);\n assistantStatus = input<string>('');\n currentLang = input<string>('en');\n loading = input<boolean>(false);\n isSubmittingReview = input<boolean>(false);\n @ViewChild('chatMessagesContainer') chatMessagesContainer!: ElementRef;\n\n reviewSubmit = output<{ rating: number; comment: string }>();\n reviewSkip = output<void>();\n\n // Computed signal for first agent message index\n firstAgentMessageIndex = computed(() => {\n return this.messages().findIndex((message) => message.senderType === 2);\n });\n\n private previousMessagesLength = 0;\n private scrollTimeouts: ReturnType<typeof setTimeout>[] = [];\n private messagesEffectRef?: EffectRef;\n\n constructor() {\n // Effect to handle scrolling when messages change\n this.messagesEffectRef = effect(() => {\n const messages = this.messages();\n const currentLength = messages.length;\n\n // Only scroll if messages array length changed (new message added)\n if (currentLength !== this.previousMessagesLength) {\n this.previousMessagesLength = currentLength;\n // Use setTimeout to ensure DOM is updated\n const timeoutId = setTimeout(() => this.scrollToBottom(), 0);\n this.scrollTimeouts.push(timeoutId);\n }\n });\n }\n\n ngOnInit(): void {\n this.previousMessagesLength = this.messages().length;\n }\n\n ngAfterViewInit(): void {\n // Initial scroll to bottom after view init\n const timeoutId = setTimeout(() => this.scrollToBottom(), 0);\n this.scrollTimeouts.push(timeoutId);\n }\n\n ngOnDestroy(): void {\n // Clean up effect\n if (this.messagesEffectRef) {\n this.messagesEffectRef.destroy();\n this.messagesEffectRef = undefined;\n }\n // Clear all pending scroll timeouts\n this.scrollTimeouts.forEach((timeoutId) => clearTimeout(timeoutId));\n this.scrollTimeouts = [];\n }\n\n scrollToBottom(): void {\n try {\n this.chatMessagesContainer.nativeElement.scrollTop =\n this.chatMessagesContainer.nativeElement.scrollHeight;\n } catch (err) {\n console.error('Error scrolling to bottom:', err);\n }\n }\n\n handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n this.reviewSubmit.emit(reviewData);\n }\n\n handleReviewSkip() {\n this.reviewSkip.emit();\n }\n}\n","<div\n class=\"babylai:flex-1 babylai:flex babylai:flex-col babylai:gap-4\"\n #chatMessagesContainer\n>\n @for (message of messages(); track message.id; let i = $index) {\n <div class=\"babylai:flex babylai:flex-col babylai:gap-2\">\n @if (i === firstAgentMessageIndex() && message.senderType === 2 && !message.isReviewMessage) {\n <app-chat-separator class=\"babylai:py-4\" />\n }\n @if (message.isReviewMessage) {\n <app-chat-separator class=\"babylai:py-4\" />\n <div class=\"babylai:flex babylai:items-start babylai:gap-3\">\n <app-chat-avatar\n [senderType]=\"message.senderType\"\n [needsAgent]=\"needsAgent()\"\n [isHidden]=\"false\"\n />\n <div\n class=\"babylai:relative babylai:rounded-2xl babylai:p-5! babylai:text-sm babylai:bg-card babylai:max-w-[80%]\"\n >\n <app-review-message\n [isSubmitting]=\"isSubmittingReview()\"\n [currentLang]=\"currentLang()\"\n (submitReview)=\"handleReviewSubmit($event)\"\n (skip)=\"handleReviewSkip()\"\n />\n </div>\n </div>\n } @else {\n <app-chat-message\n [message]=\"message\"\n [needsAgent]=\"needsAgent()\"\n [currentLang]=\"currentLang()\"\n [isHidden]=\"\n i > 0 && messages()[i - 1].senderType === message.senderType\n \"\n />\n }\n </div>\n }\n @if (assistantStatus() === \"typing\" && firstAgentMessageIndex() === -1) {\n <app-chat-typing-indicator />\n }\n @if (loading()) {\n <div\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:h-full\"\n >\n loading status here\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n output,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { TranslationService } from '../../../services/translation.service';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-back-button',\n standalone: true,\n imports: [CommonModule, TranslatePipe, IconComponent],\n templateUrl: './back-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BackButtonComponent {\n onBack = output<void>();\n\n private translationService = inject(TranslationService);\n private currentLang = toSignal(this.translationService.currentLang, {\n initialValue: 'en',\n });\n\n protected isArabic = computed(() => this.currentLang() === 'ar');\n}\n","<button\n class=\"babylai:bg-card babylai:text-card-foreground babylai:h-6 babylai:w-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:font-bold babylai:text-base babylai:cursor-pointer babylai:border-0\"\n (click)=\"onBack.emit()\"\n [attr.aria-label]=\"'Back' | translate\"\n type=\"button\"\n>\n <app-icon\n name=\"solar:alt-arrow-left-linear\"\n class=\"babylai:flex\"\n [style.transform]=\"isArabic() ? 'rotate(180deg)' : 'none'\"\n />\n</button>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, output } from '@angular/core';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-close-button',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './close-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CloseButtonComponent {\n onClose = output<void>();\n}\n","<button\n (click)=\"onClose.emit()\"\n class=\"babylai:bg-card babylai:text-card-foreground babylai:h-6 babylai:w-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:font-bold babylai:text-base babylai:cursor-pointer babylai:border-0\"\n [attr.aria-label]=\"'Close'\"\n type=\"button\"\n>\n <app-icon name=\"material-symbols:close-small-outline-rounded\" class=\"babylai:flex\" />\n</button>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, output } from '@angular/core';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-minimize-button',\n standalone: true,\n imports: [CommonModule, IconComponent],\n templateUrl: './minimize-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MinimizeButtonComponent {\n onMinimize = output<void>();\n}\n","<button\n (click)=\"onMinimize.emit()\"\n class=\"babylai:bg-card babylai:text-card-foreground babylai:h-6 babylai:w-8 babylai:rounded-full babylai:flex babylai:items-center babylai:justify-center babylai:font-bold babylai:text-base babylai:cursor-pointer babylai:border-0\"\n [attr.aria-label]=\"'Minimize'\"\n type=\"button\"\n>\n <app-icon name=\"fa7-solid:subtract\" class=\"babylai:flex\" />\n</button>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { BackButtonComponent } from '../back-button';\nimport { CloseButtonComponent } from '../close-button';\nimport { MinimizeButtonComponent } from '../minimize-button';\n\n@Component({\n selector: 'app-chat-header',\n standalone: true,\n imports: [\n CommonModule,\n BackButtonComponent,\n CloseButtonComponent,\n MinimizeButtonComponent,\n ],\n templateUrl: './chat-header.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatHeaderComponent {\n showBackButton = input<boolean>(false);\n language = input<string>('en');\n selectedOptionTitle = input<string | null>(null);\n onBack = output<void>();\n onClose = output<void>();\n onMinimize = output<void>();\n\n isRtl = computed(() => this.language() === 'ar');\n}\n","<header\n class=\"bg-header babylai:flex babylai:items-center babylai:justify-between babylai:p-6 babylai:gap-4 babylai:border-b babylai:border-black-white-200\">\n <div class=\"babylai:flex babylai:items-center babylai:gap-2\">\n <app-back-button (onBack)=\"onBack.emit()\" />\n\n <app-close-button (onClose)=\"onClose.emit()\" />\n </div>\n\n <h1 class=\"babylai:text-lg! babylai:font-semibold! babylai:text-card-foreground\">\n {{ selectedOptionTitle() }}\n </h1>\n\n <app-minimize-button (onMinimize)=\"onMinimize.emit()\"></app-minimize-button>\n</header>","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, output } from '@angular/core';\nimport { MinimizeButtonComponent } from '../minimize-button';\n\n@Component({\n selector: 'app-header',\n standalone: true,\n imports: [CommonModule, MinimizeButtonComponent],\n templateUrl: './header.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderComponent {\n onMinimize = output<void>();\n}\n","<div class=\"bg-header babylai:flex babylai:items-center babylai:justify-end babylai:p-6 babylai:border-b babylai:border-black-white-200\">\n <app-minimize-button (onMinimize)=\"onMinimize.emit()\"></app-minimize-button>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardComponent {\n variant = input<'default' | 'rounded'>('default');\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = ['babylai:z-1', 'babylai:w-full', 'babylai:box-border'];\n\n // Add variant-specific classes\n if (this.variant() === 'default') {\n classes.push(\n 'babylai:rounded-lg',\n 'babylai:border',\n 'babylai:block',\n 'babylai:border-black-white-200',\n 'babylai:bg-card',\n 'babylai:text-card-foreground',\n );\n } else if (this.variant() === 'rounded') {\n classes.push(\n 'babylai:rounded-3xl',\n 'babylai:p-1',\n 'babylai:px-2',\n 'babylai:block',\n 'babylai:bg-card',\n );\n }\n\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-header',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-header.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardHeaderComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:flex',\n 'babylai:flex-col',\n 'babylai:gap-1.5',\n 'babylai:p-6',\n 'babylai:w-full',\n 'babylai:text-card-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-title',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-title.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardTitleComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:font-semibold',\n 'babylai:leading-none',\n 'babylai:tracking-tight',\n 'babylai:w-full',\n 'babylai:text-card-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-description',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-description.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardDescriptionComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:text-sm',\n 'babylai:w-full',\n 'babylai:text-muted-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-content',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-content.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardContentComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:p-0',\n 'babylai:pt-0',\n 'babylai:w-full',\n 'babylai:box-border',\n 'babylai:text-start',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n selector: 'app-card-footer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card-footer.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class CardFooterComponent {\n class = input<string>('');\n\n hostClasses = computed(() => {\n const classes = [\n 'babylai:flex',\n 'babylai:items-center',\n 'babylai:p-6',\n 'babylai:pt-0',\n 'babylai:w-full',\n 'babylai:text-card-foreground',\n ];\n const classValue = this.class();\n if (classValue) {\n classes.push(classValue);\n }\n return classes.join(' ');\n });\n}\n","<ng-content></ng-content>\n\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { TranslatePipe } from './../../../pipes/translate.pipe';\n\n@Component({\n selector: 'app-footer',\n templateUrl: './footer.component.html',\n standalone: true,\n imports: [CommonModule, TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FooterComponent {}\n","<footer class=\"babylai:flex babylai:items-center babylai:justify-center babylai:p-3 babylai:border-t babylai:border-border\">\n <a\n href=\"https://babylai.net\"\n target=\"_blank\"\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:gap-2 babylai:text-sm babylai:text-card-foreground babylai:no-underline babylai:transition-opacity babylai:duration-200 babylai:hover:opacity-80\"\n >\n <span>\n {{ \"PoweredByBabylAI\" | translate }}\n </span>\n <span>|</span>\n <svg viewBox=\"0 0 54 19\" fill=\"none\" class=\"babylai:w-15\">\n <path\n d=\"M0 4.97873C0 2.22905 2.22908 0 4.97879 0H13.2768C16.0265 0 18.2556 2.22905 18.2556 4.97873V13.2766C18.2556 16.0263 16.0265 18.2554 13.2768 18.2554H0V4.97873Z\"\n fill=\"#606060\"\n />\n <path\n d=\"M5.76107 6.10571C5.76153 6.10407 5.76177 6.10325 5.76187 6.10287C5.83413 5.8495 6.19321 5.8495 6.26546 6.10287C6.26557 6.10325 6.2658 6.10407 6.26627 6.10571C6.26749 6.11004 6.26809 6.1122 6.26867 6.11423C6.60441 7.29978 7.53101 8.22637 8.71657 8.5621C8.7186 8.56268 8.72076 8.56329 8.72509 8.56451C8.72673 8.56497 8.72755 8.5652 8.72793 8.56531C8.98131 8.63756 8.98131 8.99664 8.72793 9.06889C8.72755 9.069 8.72673 9.06923 8.72509 9.0697C8.72076 9.07092 8.7186 9.07153 8.71657 9.0721C7.53101 9.40783 6.60441 10.3344 6.26867 11.52C6.26809 11.522 6.26749 11.5242 6.26627 11.5285C6.2658 11.5301 6.26557 11.531 6.26546 11.5313C6.19321 11.7847 5.83413 11.7847 5.76187 11.5313C5.76177 11.531 5.76153 11.5301 5.76107 11.5285C5.75985 11.5242 5.75924 11.522 5.75867 11.52C5.42293 10.3344 4.49633 9.40783 3.31077 9.0721C3.30874 9.07153 3.30657 9.07092 3.30225 9.0697C3.3006 9.06923 3.29978 9.069 3.2994 9.06889C3.04603 8.99664 3.04603 8.63756 3.2994 8.56531C3.29978 8.5652 3.3006 8.56497 3.30225 8.56451C3.30657 8.56329 3.30874 8.56268 3.31077 8.5621C4.49633 8.22637 5.42293 7.29978 5.75867 6.11423C5.75924 6.1122 5.75985 6.11004 5.76107 6.10571Z\"\n fill=\"white\"\n />\n <path\n d=\"M14.7275 8.76473C14.7275 9.99635 13.7523 10.9948 12.5493 10.9948C11.3463 10.9948 10.3711 9.99635 10.3711 8.76473C10.3711 7.5331 11.3463 6.53467 12.5493 6.53467C13.7523 6.53467 14.7275 7.5331 14.7275 8.76473Z\"\n fill=\"white\"\n />\n <path\n d=\"M51.6133 13.0924V5.27515H53.1931V13.0924H51.6133Z\"\n fill=\"#606060\"\n />\n <path\n d=\"M44.5938 13.0924L46.5857 5.27515H49.3446L51.325 13.0924H49.7452L49.3102 11.513H46.5742L46.1621 13.0924H44.5938ZM46.8261 10.2425H49.0813L48.1998 6.55705H47.719L46.8261 10.2425Z\"\n fill=\"#606060\"\n />\n <path d=\"M42.5703 13.092V5H44.0929V13.092H42.5703Z\" fill=\"#919191\" />\n <path\n d=\"M38.6905 15.5069L39.4231 13.0919H38.1982L36.8359 7.34619H38.4272L39.446 11.7985H39.7437L40.7625 7.34619H42.2965L40.3161 15.5069H38.6905Z\"\n fill=\"#919191\"\n />\n <path\n d=\"M34.008 13.2179C33.8172 13.2179 33.5845 13.2103 33.3097 13.195C33.035 13.1797 32.7526 13.1569 32.4626 13.1263C32.1802 13.0958 31.9284 13.0691 31.707 13.0462V5H33.241V7.52946C33.3555 7.48368 33.4967 7.4379 33.6646 7.39212C33.8325 7.34633 34.008 7.30818 34.1912 7.27766C34.382 7.23951 34.5575 7.22043 34.7178 7.22043C35.252 7.22043 35.6756 7.33107 35.9885 7.55235C36.309 7.766 36.538 8.08648 36.6754 8.51378C36.8127 8.94108 36.8814 9.47902 36.8814 10.1276C36.8814 10.8906 36.7937 11.5011 36.6181 11.9589C36.4502 12.4091 36.1564 12.7334 35.7366 12.9318C35.3169 13.1225 34.7407 13.2179 34.008 13.2179ZM34.0195 11.936C34.3934 11.936 34.672 11.8711 34.8552 11.7414C35.0383 11.6041 35.1604 11.4019 35.2215 11.1348C35.2902 10.8677 35.3245 10.5396 35.3245 10.1505C35.3245 9.75371 35.294 9.43705 35.2329 9.20051C35.1719 8.95634 35.0689 8.78084 34.9238 8.67402C34.7865 8.55956 34.5919 8.50233 34.34 8.50233C34.2179 8.50233 34.0882 8.51759 33.9508 8.54812C33.8134 8.57101 33.6799 8.60153 33.5501 8.63968C33.428 8.6702 33.325 8.70072 33.241 8.73124V11.8902C33.3555 11.8978 33.4891 11.9093 33.6417 11.9245C33.7943 11.9322 33.9203 11.936 34.0195 11.936Z\"\n fill=\"#919191\"\n />\n <path\n d=\"M27.8012 13.2177C27.2059 13.2177 26.7556 13.0689 26.4504 12.7713C26.1527 12.4661 26.0039 12.0083 26.0039 11.3978C26.0039 10.9705 26.0802 10.6386 26.2329 10.4021C26.3855 10.1579 26.6106 9.9824 26.9083 9.87558C27.2136 9.76112 27.5837 9.69245 28.0187 9.66956L29.4153 9.54366V9.20029C29.4153 8.9256 29.3467 8.73484 29.2093 8.62802C29.0719 8.51356 28.8697 8.45633 28.6025 8.45633C28.3889 8.45633 28.1408 8.46396 27.8584 8.47922C27.5837 8.49448 27.309 8.51356 27.0342 8.53645C26.7671 8.55934 26.5343 8.58223 26.3359 8.60512L26.2901 7.52924C26.4885 7.48346 26.7251 7.43768 26.9999 7.3919C27.2822 7.33849 27.5761 7.29652 27.8813 7.266C28.1866 7.23548 28.469 7.22021 28.7285 7.22021C29.2169 7.22021 29.6252 7.28126 29.9534 7.40334C30.2816 7.52543 30.5296 7.72763 30.6975 8.00996C30.8654 8.28465 30.9493 8.65854 30.9493 9.13162V11.7526C30.9646 11.8595 31.0218 11.9434 31.1211 12.0044C31.2203 12.0579 31.3347 12.096 31.4645 12.1189L31.4301 13.1719C31.308 13.1719 31.1859 13.1719 31.0638 13.1719C30.9493 13.1795 30.8387 13.1795 30.7318 13.1719C30.625 13.1719 30.5296 13.1643 30.4456 13.149C30.2701 13.1261 30.1175 13.0803 29.9877 13.0117C29.8656 12.943 29.7664 12.8705 29.6901 12.7942C29.568 12.8476 29.4039 12.9086 29.1978 12.9773C28.9918 13.046 28.7666 13.1032 28.5224 13.149C28.2858 13.1948 28.0454 13.2177 27.8012 13.2177ZM28.1675 12.0846C28.3125 12.0846 28.4652 12.0693 28.6254 12.0388C28.7857 12.0083 28.9345 11.9739 29.0719 11.9358C29.2169 11.89 29.3314 11.848 29.4153 11.8099V10.4936L28.2477 10.5966C27.9958 10.6195 27.8127 10.6958 27.6982 10.8256C27.5913 10.9476 27.5379 11.1231 27.5379 11.3521C27.5379 11.581 27.5875 11.7603 27.6867 11.89C27.7936 12.0197 27.9538 12.0846 28.1675 12.0846Z\"\n fill=\"#919191\"\n />\n <path\n d=\"M19.9531 13.0924V5.27515H23.0669C23.5859 5.27515 24.0323 5.34 24.4063 5.46972C24.7803 5.59944 25.0703 5.80927 25.2763 6.09923C25.49 6.38155 25.5969 6.76307 25.5969 7.24378C25.5969 7.57188 25.5625 7.85039 25.4938 8.0793C25.4328 8.30058 25.3336 8.49134 25.1962 8.65158C25.0665 8.80419 24.8947 8.94535 24.681 9.07506C24.91 9.159 25.1084 9.27345 25.2763 9.41843C25.4519 9.55578 25.5854 9.74272 25.677 9.97926C25.7686 10.2082 25.8144 10.5134 25.8144 10.8949C25.8144 11.3146 25.7495 11.6656 25.6198 11.9479C25.49 12.2302 25.303 12.4553 25.0588 12.6232C24.8222 12.791 24.5437 12.9131 24.2231 12.9894C23.9026 13.0581 23.5515 13.0924 23.1699 13.0924H19.9531ZM21.5329 11.925H23.0555C23.3226 11.925 23.5439 11.8945 23.7194 11.8334C23.9026 11.7648 24.04 11.6465 24.1316 11.4786C24.2308 11.3108 24.2804 11.078 24.2804 10.7804C24.2804 10.5515 24.2422 10.3646 24.1659 10.2196C24.0896 10.0746 23.9904 9.96782 23.8683 9.89914C23.7461 9.82284 23.6088 9.76943 23.4561 9.7389C23.3111 9.70838 23.1661 9.69312 23.0211 9.69312H21.5329V11.925ZM21.5329 8.57146H23.0097C23.2692 8.57146 23.479 8.53331 23.6393 8.457C23.7996 8.37307 23.9179 8.25099 23.9942 8.09075C24.0705 7.92288 24.1087 7.71304 24.1087 7.46124C24.1087 7.10262 24.0133 6.84318 23.8225 6.68295C23.6393 6.52271 23.3493 6.44259 22.9524 6.44259H21.5329V8.57146Z\"\n fill=\"#919191\"\n />\n </svg>\n </a>\n</footer>\n","import { InjectionToken } from '@angular/core';\n\n/**\n * URL for the loading screen animated logo (e.g. animatedLogo.gif).\n * When using the library as an npm package, copy the library's assets to your app\n * (see README \"Assets setup\") or provide your own URL here.\n */\nexport const HELP_CENTER_LOADING_LOGO_URL = new InjectionToken<string>(\n 'HELP_CENTER_LOADING_LOGO_URL',\n {\n providedIn: 'root',\n factory: () => '/assets/animatedLogo.gif',\n }\n);\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, output } from '@angular/core';\nimport { HELP_CENTER_LOADING_LOGO_URL } from '../../../help-center-widget/tokens';\nimport { HeaderComponent } from '../header';\n\n@Component({\n selector: 'app-loading',\n templateUrl: './loading.component.html',\n standalone: true,\n imports: [CommonModule, HeaderComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoadingComponent {\n private readonly loadingLogoUrlToken = inject(HELP_CENTER_LOADING_LOGO_URL);\n loadingLogoUrl = () => this.loadingLogoUrlToken;\n onMinimize = output<void>();\n}\n","<div\n class=\"babylai:w-full babylai:h-full babylai:bg-secondary babylai:rounded-3xl babylai:shadow-lg babylai:flex babylai:flex-col\">\n <div class=\"babylai:rounded-3xl babylai:h-full babylai:flex babylai:flex-col babylai:gap-4\">\n <app-header (onMinimize)=\"onMinimize.emit()\" />\n <div\n class=\"babylai:flex babylai:flex-col babylai:items-center babylai:justify-center babylai:w-full babylai:h-full babylai:py-28\">\n <img [src]=\"loadingLogoUrl()\" alt=\"Animated Logo\" class=\"babylai:w-20 babylai:h-20\" />\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n effect,\n EffectRef,\n ElementRef,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewChild,\n} from '@angular/core';\nimport { LoadingComponent } from '../loading/loading.component';\n\n@Component({\n selector: 'app-base-dialog',\n standalone: true,\n imports: [CommonModule, LoadingComponent],\n templateUrl: './base-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseDialogComponent implements OnInit, AfterViewInit, OnDestroy {\n isOpen = input<boolean>(false);\n isLoading = input<boolean>(false);\n closeOnEscape = input<boolean>(true);\n closeOnOverlayClick = input<boolean>(true);\n ariaLabel = input<string>('Dialog');\n\n close = output<void>();\n\n @ViewChild('dialogContainer') dialogContainer!: ElementRef<HTMLElement>;\n\n private previousActiveElement: HTMLElement | null = null;\n private tabKeyListener?: (event: KeyboardEvent) => void;\n private escapeKeyListener?: (event: KeyboardEvent) => void;\n private focusTimeouts: ReturnType<typeof setTimeout>[] = [];\n private focusEffectRef?: EffectRef;\n\n constructor() {\n // Effect to handle focus trapping when dialog opens/closes\n this.focusEffectRef = effect(() => {\n if (this.isOpen()) {\n // Use setTimeout to ensure DOM is fully rendered\n const timeoutId = setTimeout(() => {\n if (this.dialogContainer?.nativeElement) {\n this.trapFocus();\n }\n }, 0);\n this.focusTimeouts.push(timeoutId);\n } else {\n this.releaseFocus();\n }\n });\n }\n\n ngOnInit(): void {\n // Set up Escape key listener for closing dialog\n this.escapeKeyListener = (event: KeyboardEvent) => {\n if (\n event.key === 'Escape' &&\n this.isOpen() &&\n this.closeOnEscape() &&\n !this.isLoading()\n ) {\n this.handleClose();\n }\n };\n document.addEventListener('keydown', this.escapeKeyListener);\n }\n\n ngAfterViewInit(): void {\n if (this.isOpen()) {\n const timeoutId = setTimeout(() => {\n if (this.dialogContainer?.nativeElement) {\n this.trapFocus();\n }\n }, 0);\n this.focusTimeouts.push(timeoutId);\n }\n }\n\n ngOnDestroy(): void {\n // Clean up effect\n if (this.focusEffectRef) {\n this.focusEffectRef.destroy();\n this.focusEffectRef = undefined;\n }\n this.releaseFocus();\n // Remove Escape key listener\n if (this.escapeKeyListener) {\n document.removeEventListener('keydown', this.escapeKeyListener);\n this.escapeKeyListener = undefined;\n }\n // Clear all pending focus timeouts\n this.focusTimeouts.forEach((timeoutId) => clearTimeout(timeoutId));\n this.focusTimeouts = [];\n }\n\n onOverlayClick(): void {\n if (this.closeOnOverlayClick() && !this.isLoading()) {\n this.handleClose();\n }\n }\n\n onDialogClick(event: Event): void {\n // Prevent overlay click when clicking inside dialog\n event.stopPropagation();\n }\n\n private handleClose(): void {\n if (!this.isLoading()) {\n this.close.emit();\n }\n }\n\n private trapFocus(): void {\n // Store the previously focused element\n this.previousActiveElement = document.activeElement as HTMLElement;\n\n // Set up Tab key listener for focus trapping\n this.tabKeyListener = (event: KeyboardEvent) => {\n if (event.key !== 'Tab' || !this.isOpen()) return;\n\n const focusableElements = this.getFocusableElements();\n if (focusableElements.length === 0) {\n event.preventDefault();\n return;\n }\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n document.addEventListener('keydown', this.tabKeyListener);\n\n // Focus the first focusable element after a short delay to ensure DOM is ready\n // If no focusable elements exist, focus the container itself\n const timeoutId = setTimeout(() => {\n const focusableElements = this.getFocusableElements();\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n } else if (this.dialogContainer?.nativeElement) {\n // Fallback: focus the container itself if no focusable elements\n this.dialogContainer.nativeElement.focus();\n }\n }, 0);\n this.focusTimeouts.push(timeoutId);\n }\n\n private releaseFocus(): void {\n // Remove Tab key listener\n if (this.tabKeyListener) {\n document.removeEventListener('keydown', this.tabKeyListener);\n this.tabKeyListener = undefined;\n }\n\n // Return focus to the previously active element\n if (\n this.previousActiveElement &&\n typeof this.previousActiveElement.focus === 'function'\n ) {\n this.previousActiveElement.focus();\n this.previousActiveElement = null;\n }\n }\n\n private getFocusableElements(): HTMLElement[] {\n if (!this.dialogContainer?.nativeElement) return [];\n\n const container = this.dialogContainer.nativeElement;\n const selector =\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(container.querySelectorAll<HTMLElement>(selector)).filter(\n (el) => !el.hasAttribute('disabled') && !el.hasAttribute('aria-hidden'),\n );\n }\n}\n","@if (isOpen()) {\n<div \n class=\"babylai:absolute babylai:inset-0 babylai:flex babylai:items-end babylai:justify-center babylai:border-radius-2xl babylai:z-50 babylai:bg-card-foreground/50\" \n (click)=\"onOverlayClick()\" \n role=\"dialog\" \n aria-modal=\"true\" \n [attr.aria-label]=\"ariaLabel()\"\n>\n <div class=\"babylai:bg-card babylai:rounded-t-2xl babylai:w-full\" #dialogContainer tabindex=\"-1\" (click)=\"onDialogClick($event)\">\n <ng-content></ng-content>\n @if (isLoading()) {\n <div class=\"babylai:bg-black/30 babylai:flex babylai:items-center babylai:justify-center babylai:absolute babylai:inset-0\">\n <app-loading variant=\"primary\"></app-loading>\n </div>\n }\n </div>\n</div>\n}\n\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { FooterComponent } from '../../../help-center-widget/components/footer/footer.component';\nimport { BaseDialogComponent } from '../base-dialog';\nimport { ButtonComponent } from '../button';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-confirmation-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ButtonComponent,\n BaseDialogComponent,\n IconComponent,\n FooterComponent,\n ],\n templateUrl: './confirmation-dialog.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfirmationDialogComponent {\n title = input<string>('');\n body = input<string>('');\n confirmText = input<string>('Confirm');\n cancelText = input<string>('Cancel');\n isLoading = input<boolean>(false);\n onConfirm = output<void>();\n onCancel = output<void>();\n onClose = output<void>();\n\n disableActions = computed(() => this.isLoading());\n\n onCloseClick(): void {\n this.onClose.emit();\n }\n}\n","<app-base-dialog\n [isOpen]=\"true\"\n [isLoading]=\"isLoading()\"\n [ariaLabel]=\"title()\"\n (close)=\"onCloseClick()\"\n>\n <div\n class=\"babylai:flex babylai:flex-col babylai:p-6 babylai:pb-5 babylai:w-full\"\n >\n <button\n class=\"babylai:border-0 babylai:p-0 babylai:flex babylai:bg-transparent babylai:cursor-pointer babylai:mb-6 babylai:ms-auto babylai:text-card-foreground\"\n (click)=\"onCloseClick()\"\n >\n <app-icon\n name=\"solar:close-circle-line-duotone\"\n class=\"babylai:flex\"\n size=\"28px\"\n />\n </button>\n <section\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:border-b babylai:border-black-white-200 babylai:pb-6 babylai:mb-6\"\n >\n <div\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:w-20 babylai:h-20 babylai:rounded-full babylai:p-3 babylai:bg-primary/15 babylai:text-primary\"\n >\n <app-icon\n name=\"solar:chat-round-unread-bold-duotone\"\n class=\"babylai:flex\"\n size=\"56px\"\n />\n </div>\n </section>\n <h3\n class=\"babylai:text-2xl! babylai:text-center babylai:font-bold! babylai:mb-2! babylai:text-card-foreground\"\n >\n {{ title() }}\n </h3>\n <p\n class=\"babylai:text-sm babylai:text-center babylai:text-muted-foreground\"\n >\n {{ body() }}\n </p>\n </div>\n <div\n class=\"babylai:flex babylai:justify-between babylai:gap-3 babylai:mb-5 babylai:px-6\"\n >\n <app-button\n variant=\"outline\"\n [fullWidth]=\"true\"\n [disabled]=\"disableActions()\"\n (onClick)=\"onCancel.emit()\"\n class=\"babylai:w-full\"\n >\n {{ cancelText() }}\n <app-icon name=\"solar:plain-2-bold-duotone\" class=\"babylai:flex\" />\n </app-button>\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"disableActions()\"\n (onClick)=\"onConfirm.emit()\"\n class=\"babylai:w-full\"\n >\n {{ confirmText() }}\n </app-button>\n </div>\n <app-footer />\n</app-base-dialog>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FooterComponent } from '../../../help-center-widget/components/footer/footer.component';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { BaseDialogComponent } from '../base-dialog';\nimport { ButtonComponent } from '../button';\nimport { IconComponent } from '../icon';\n\n@Component({\n selector: 'app-review-dialog',\n templateUrl: './review-dialog.component.html',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonComponent,\n BaseDialogComponent,\n TranslatePipe,\n IconComponent,\n FooterComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReviewDialogComponent {\n isOpen = input<boolean>(false);\n isSubmitting = input<boolean>(false);\n showCommentField = input<boolean>(true);\n close = output<void>();\n submitReview = output<{ rating: number; comment: string }>();\n skip = output<void>();\n\n rating = signal<number>(0);\n comment = signal<string>('');\n\n // Validation errors\n ratingError = signal<string>('');\n commentError = signal<string>('');\n\n onRatingClick(starIndex: number): void {\n this.rating.set(starIndex + 1);\n this.clearRatingError();\n }\n\n onCommentChange(): void {\n this.clearCommentError();\n }\n\n onClose(): void {\n if (!this.isSubmitting()) {\n this.close.emit();\n }\n }\n\n onDialogClose(): void {\n this.onClose();\n }\n\n onSubmitReview(): void {\n if (this.validateForm() && !this.isSubmitting()) {\n this.submitReview.emit({\n rating: this.rating(),\n comment: this.comment().trim(),\n });\n }\n }\n\n onSkip(): void {\n if (!this.isSubmitting()) {\n this.skip.emit();\n this.resetForm();\n }\n }\n\n private validateForm(): boolean {\n let isValid = true;\n\n // Validate rating\n if (this.rating() < 1 || this.rating() > 5) {\n this.ratingError.set('Rating must be between 1 and 5.');\n isValid = false;\n }\n\n // Validate comment only if comment field is shown\n if (this.showCommentField()) {\n const trimmedComment = this.comment().trim();\n if (trimmedComment.length < 10) {\n this.commentError.set('Comment must be at least 10 characters long.');\n isValid = false;\n } else if (trimmedComment.length > 500) {\n this.commentError.set('Comment must not exceed 500 characters.');\n isValid = false;\n }\n }\n\n return isValid;\n }\n\n private clearRatingError(): void {\n this.ratingError.set('');\n }\n\n private clearCommentError(): void {\n this.commentError.set('');\n }\n\n private resetForm(): void {\n this.rating.set(0);\n this.comment.set('');\n this.ratingError.set('');\n this.commentError.set('');\n }\n\n getStarsArray(): number[] {\n return Array(5)\n .fill(0)\n .map((_, index) => index);\n }\n\n isStarFilled(starIndex: number): boolean {\n return starIndex < this.rating();\n }\n\n getCommentLength(): number {\n return this.comment().trim().length;\n }\n\n getCommentMaxLength(): number {\n return 500;\n }\n\n getCommentMinLength(): number {\n return 10;\n }\n}\n","<app-base-dialog\n [isOpen]=\"isOpen()\"\n [ariaLabel]=\"'ReviewDialogTitle' | translate\"\n (close)=\"onDialogClose()\"\n>\n <div\n class=\"babylai:flex babylai:flex-col babylai:p-6 babylai:pb-5 babylai:w-full\"\n >\n <button\n class=\"babylai:border-0 babylai:p-0 babylai:flex babylai:bg-transparent babylai:cursor-pointer babylai:mb-6 babylai:ms-auto babylai:text-card-foreground\"\n (click)=\"onClose()\"\n >\n <app-icon\n name=\"solar:close-circle-line-duotone\"\n class=\"babylai:flex\"\n size=\"28px\"\n />\n </button>\n <section\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:border-b babylai:border-black-white-200 babylai:pb-6 babylai:mb-6\"\n >\n <!-- Rating Section -->\n <div>\n <label class=\"babylai:sr-only\">\n {{ \"ReviewDialogRatingLabel\" | translate }}\n </label>\n <div class=\"babylai:inline-flex babylai:gap-2\">\n @for (star of getStarsArray(); track star) {\n <button\n class=\"babylai:hover:text-[#F49E00] babylai:border-0 babylai:bg-transparent babylai:p-0\"\n [class.babylai:text-black-white-200]=\"!isStarFilled(star)\"\n [class.babylai:dark:text-muted-foreground]=\"!isStarFilled(star)\"\n [class.babylai:text-[#F49E00]]=\"isStarFilled(star)\"\n [disabled]=\"isSubmitting()\"\n (click)=\"onRatingClick(star)\"\n [attr.aria-label]=\"'Rate ' + (star + 1) + ' out of 5 stars'\"\n [attr.aria-pressed]=\"isStarFilled(star)\"\n role=\"button\"\n type=\"button\"\n (keydown.enter)=\"onRatingClick(star)\"\n (keydown.space)=\"$event.preventDefault(); onRatingClick(star)\"\n >\n <app-icon\n name=\"solar:star-bold\"\n class=\"babylai:flex\"\n size=\"53px\"\n />\n </button>\n }\n </div>\n @if (ratingError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ ratingError() }}\n </div>\n }\n </div>\n </section>\n <h3\n class=\"babylai:text-2xl! babylai:text-center babylai:font-bold! babylai:mb-2! babylai:text-card-foreground\"\n >\n {{ \"ReviewDialogTitle\" | translate }}\n </h3>\n <p\n class=\"babylai:text-xs babylai:text-center babylai:text-muted-foreground babylai:mb-4 babylai:leading-snug\"\n >\n {{ \"ReviewDialogDescription\" | translate }}\n </p>\n\n @if (rating() > 0) {\n <div class=\"babylai:flex babylai:flex-col babylai:gap-6 babylai:mt-6\">\n <p\n class=\"babylai:text-sm babylai:text-card-foreground babylai:leading-snug\"\n >\n {{ \"ReviewDialogCommentLabel\" | translate }}\n </p>\n <div class=\"babylai:flex babylai:flex-col babylai:gap-2\">\n <textarea\n class=\"babylai:resize-none babylai:w-full babylai:bg-secondary babylai:border babylai:rounded-xl babylai:text-card-foreground babylai:text-sm babylai:p-3 babylai:resize-vertical babylai:min-h-20 babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed babylai:disabled:bg-secondary babylai:border-black-white-200\"\n [class.babylai:border-destructive]=\"commentError()\"\n [ngModel]=\"comment()\"\n (ngModelChange)=\"comment.set($event); onCommentChange()\"\n [placeholder]=\"'ReviewDialogCommentPlaceholder' | translate\"\n [maxlength]=\"getCommentMaxLength()\"\n [disabled]=\"isSubmitting()\"\n rows=\"4\"\n ></textarea>\n <div class=\"babylai:flex babylai:flex-col\">\n <div\n class=\"babylai:text-card-foreground babylai:text-sm babylai:whitespace-nowrap babylai:opacity-70\"\n >\n {{ getCommentLength() }}/{{ getCommentMaxLength() }} characters\n </div>\n @if (commentError()) {\n <div\n class=\"babylai:text-destructive babylai:text-sm babylai:mt-1 babylai:flex babylai:items-center babylai:gap-1\"\n >\n {{ commentError() }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions -->\n <div\n class=\"babylai:flex babylai:justify-between babylai:gap-3 babylai:mb-5 babylai:px-6\"\n >\n <app-button\n variant=\"outline\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting()\"\n (onClick)=\"onSkip()\"\n class=\"babylai:w-full\"\n >\n {{ \"ReviewDialogSkipButton\" | translate }}\n </app-button>\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting()\"\n (onClick)=\"onSubmitReview()\"\n class=\"babylai:w-full babylai:inline-flex babylai:items-center babylai:justify-center babylai:gap-2\"\n >\n @if (isSubmitting()) {\n <app-icon\n name=\"line-md:loading-twotone-loop\"\n class=\"babylai:flex babylai:shrink-0\"\n size=\"20px\"\n />\n Submitting...\n } @else {\n {{ \"ReviewDialogSubmitButton\" | translate }}\n }\n </app-button>\n </div>\n <app-footer />\n</app-base-dialog>\n","// Main header components\nexport * from './chat-header';\nexport * from './header';\n\n// Header sub-components\nexport * from './back-button';\nexport * from './close-button';\nexport * from './minimize-button';\n\n// Other shared components\nexport * from './button';\nexport * from './card';\nexport * from './confirmation-dialog';\nexport * from './icon';\nexport * from './loading';\nexport * from './markdown-renderer';\nexport * from './review-dialog';\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { catchError, of } from 'rxjs';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { FileUploadService } from '../../../services/file-upload.service';\nimport { IconComponent } from '../../../shared/components';\nimport { SelectedFileDto, UploadResult } from '../../../types';\n\n@Component({\n selector: 'app-chat-input',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe, IconComponent],\n templateUrl: './chat-input.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatInputComponent implements OnInit, OnDestroy {\n // Using input() signals - automatically trigger change detection on updates\n isChatClosed = input<boolean>(false);\n assistantStatus = input<string>('');\n currentLang = input<string>('en');\n @Input() set sessionId(value: string | null) {\n this._sessionId = value;\n // When sessionId becomes available, upload any pending files\n if (value) {\n // Use setTimeout to ensure the component has updated\n setTimeout(() => this.uploadPendingFiles(), 0);\n }\n }\n get sessionId(): string | null {\n return this._sessionId;\n }\n private _sessionId: string | null = null;\n @Output() sendMessage = new EventEmitter<{\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }>();\n /** Emitted when user adds attachments but there is no session yet (so parent can create one and start upload) */\n @Output() requestSessionForAttachments = new EventEmitter<void>();\n @ViewChild('messageInput') messageInput!: ElementRef;\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n private readonly fileUploadService = inject(FileUploadService);\n // Local state as signal\n messageContent = signal('');\n selectedFiles = signal<SelectedFileDto[]>([]);\n previewImageUrl = signal<string | null>(null);\n previewImageIndex = signal<number>(-1);\n\n isUploading = computed(() => this.selectedFiles().some((f) => f.uploading));\n hasUploadErrors = computed(() => {\n const files = this.selectedFiles();\n // Only return true if there are files AND all of them have errors\n // If no files are selected, there are no errors\n return (\n files.length > 0 &&\n files.every((f) => f.error !== null && f.uploadedId === null)\n );\n });\n\n /** True when any file is still uploading or pending (no uploadedId yet) */\n hasPendingOrUploadingFiles = computed(() =>\n this.selectedFiles().some(\n (f) => f.uploading || (!f.uploadedId && !f.error),\n ),\n );\n\n canSend = computed(() => {\n const hasText = this.messageContent().trim().length > 0;\n const hasUploadedFiles = this.selectedFiles().some((f) => !!f.uploadedId);\n const notTyping = this.assistantStatus() !== 'typing';\n const notClosed = !this.isChatClosed();\n\n // Allow sending only when (text or uploaded files) and no files still uploading/pending\n return (\n (hasText || hasUploadedFiles) &&\n !this.hasPendingOrUploadingFiles() &&\n notTyping &&\n notClosed\n );\n });\n\n ngOnInit(): void {\n // Component initialization\n }\n\n ngOnDestroy(): void {\n // Clean up blob URLs\n this.selectedFiles().forEach((file) => {\n if (file.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(file.previewUrl);\n }\n });\n if (this.previewImageUrl()?.startsWith('blob:')) {\n URL.revokeObjectURL(this.previewImageUrl()!);\n }\n }\n\n handleFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n const files = input.files;\n\n if (!files || files.length === 0) return;\n\n const imageFiles = Array.from(files).filter((file) =>\n file.type.startsWith('image/'),\n );\n\n if (imageFiles.length === 0) {\n window.alert('Please select image files only');\n return;\n }\n\n // Create preview URLs and add to selected files\n const newFiles: SelectedFileDto[] = imageFiles.map((file) => ({\n file,\n previewUrl: URL.createObjectURL(file),\n uploading: false,\n uploadedId: null,\n error: null,\n }));\n\n this.selectedFiles.update((current) => [...current, ...newFiles]);\n\n // Start uploading if session exists; otherwise ask parent to create session so we can upload\n if (this.sessionId) {\n this.uploadFiles(imageFiles);\n } else {\n this.requestSessionForAttachments.emit();\n }\n\n // Reset file input\n if (input) {\n input.value = '';\n }\n }\n\n handleAttachClick(): void {\n this.fileInput?.nativeElement?.click();\n }\n\n removeFile(index: number): void {\n const file = this.selectedFiles()[index];\n if (file.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(file.previewUrl);\n }\n this.selectedFiles.update((current) =>\n current.filter((_, i) => i !== index),\n );\n }\n\n /**\n * Upload pending files that don't have an uploadedId yet\n */\n uploadPendingFiles(): void {\n if (!this.sessionId) return;\n\n const pendingFiles = this.selectedFiles().filter(\n (f) => !f.uploadedId && !f.uploading && !f.error,\n );\n\n if (pendingFiles.length > 0) {\n const filesToUpload = pendingFiles.map((f) => f.file);\n this.uploadFiles(filesToUpload);\n }\n }\n\n uploadFiles(files: File[]): void {\n if (!this.sessionId || files.length === 0) {\n // If no sessionId, files will be uploaded later when session is created\n // Don't mark them as error - just wait\n return;\n }\n\n // Create a map of file names to track which file corresponds to which result\n const fileMap = new Map<File, number>();\n files.forEach((file, index) => {\n fileMap.set(file, index);\n });\n\n // Mark files as uploading\n this.selectedFiles.update((current) =>\n current.map((f) => {\n if (files.includes(f.file)) {\n return { ...f, uploading: true, error: null };\n }\n return f;\n }),\n );\n\n // Upload files\n this.fileUploadService\n .uploadFiles(this.sessionId, files)\n .pipe(\n catchError((error) => {\n console.error('Error uploading files:', error);\n // Mark all uploading files as failed\n this.selectedFiles.update((current) =>\n current.map((f) => {\n if (files.includes(f.file)) {\n return {\n ...f,\n uploading: false,\n error: 'Upload failed',\n };\n }\n return f;\n }),\n );\n return of([] as UploadResult[]);\n }),\n )\n .subscribe((results) => {\n // Update selected files with upload results\n // Match results to files by index\n this.selectedFiles.update((current) => {\n return current.map((f) => {\n const fileIndex = fileMap.get(f.file);\n if (fileIndex !== undefined && results[fileIndex]) {\n const result = results[fileIndex];\n return {\n ...f,\n uploading: false,\n uploadedId: result.success ? result.fileId : null,\n error: result.success ? null : result.error || 'Upload failed',\n };\n }\n return f;\n });\n });\n });\n }\n\n handleSendMessage(): void {\n if (!this.canSend()) return;\n\n // Send is only enabled when all files are uploaded, so we only emit uploaded IDs\n const uploadedIds = this.selectedFiles()\n .map((f) => f.uploadedId)\n .filter((id): id is string => id !== null);\n\n this.sendMessage.emit({\n text: this.messageContent(),\n attachmentIds: uploadedIds,\n });\n\n // Clear message and files\n this.messageContent.set('');\n this.selectedFiles().forEach((f) => {\n if (f.previewUrl.startsWith('blob:')) {\n URL.revokeObjectURL(f.previewUrl);\n }\n });\n this.selectedFiles.set([]);\n this.adjustTextareaHeight();\n }\n\n handlePreviewImage(index: number): void {\n const file = this.selectedFiles()[index];\n if (file) {\n this.previewImageUrl.set(file.previewUrl);\n this.previewImageIndex.set(index);\n }\n }\n\n closePreview(): void {\n this.previewImageUrl.set(null);\n this.previewImageIndex.set(-1);\n }\n\n adjustTextareaHeight(): void {\n const textarea = this.messageInput?.nativeElement;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = textarea.scrollHeight + 'px';\n }\n }\n}\n","<div class=\"babylai:relative babylai:w-full\">\n @if (selectedFiles().length > 0) {\n <div\n class=\"babylai:scrollbar-thin babylai:flex babylai:gap-2 babylai:mb-2 babylai:overflow-x-auto babylai:bg-card babylai:rounded-2xl babylai:p-3\"\n style=\"scrollbar-width: thin\"\n >\n @for (file of selectedFiles(); track $index) {\n <div\n class=\"babylai:relative babylai:w-[50px] babylai:h-[50px] babylai:rounded-md babylai:shrink-0 babylai:border babylai:border-black-white-200\"\n [style.background-color]=\"'var(--muted)'\"\n >\n <img\n [src]=\"file.previewUrl\"\n [alt]=\"file.file.name\"\n class=\"babylai:w-full babylai:h-full babylai:object-cover babylai:transition-opacity babylai:duration-200\"\n [class.babylai:opacity-50]=\"file.uploading\"\n [class.babylai:opacity-100]=\"!file.uploading\"\n [class.babylai:hover:opacity-80]=\"!file.uploading\"\n [class.babylai:cursor-pointer]=\"!file.uploading\"\n [class.babylai:pointer-events-none]=\"file.uploading\"\n (click)=\"handlePreviewImage($index)\"\n />\n @if (file.uploading) {\n <div\n class=\"babylai:absolute babylai:inset-0 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-md babylai:bg-black/50\"\n aria-hidden=\"true\"\n >\n <app-icon\n name=\"line-md:loading-twotone-loop\"\n class=\"babylai:flex babylai:text-white babylai:text-2xl\"\n />\n </div>\n }\n @if (file.error) {\n <div\n class=\"babylai:absolute babylai:top-0.5 babylai:right-0.5 babylai:w-4 babylai:h-4 babylai:flex babylai:items-center babylai:justify-center babylai:rounded-full text-white babylai:text-xs babylai:font-semibold\"\n [style.background-color]=\"'var(--destructive)'\"\n [title]=\"file.error\"\n >\n !\n </div>\n }\n <button\n type=\"button\"\n class=\"babylai:border-0 babylai:p-0 babylai:absolute babylai:-top-2 babylai:-right-2 babylai:bg-destructive babylai:text-white babylai:rounded-full babylai:w-5 babylai:h-5 babylai:flex babylai:items-center babylai:justify-center babylai:cursor-pointer\"\n (click)=\"removeFile($index)\"\n aria-label=\"Remove image\"\n >\n <app-icon\n name=\"solar:close-circle-line-duotone\"\n class=\"babylai:flex\"\n />\n </button>\n </div>\n }\n </div>\n }\n\n <form\n (ngSubmit)=\"handleSendMessage()\"\n class=\"babylai:relative babylai:w-full\"\n >\n <div\n class=\"babylai:flex babylai:items-center babylai:gap-2 babylai:relative babylai:rounded-full babylai:bg-card babylai:py-3 babylai:px-4\"\n >\n <input\n type=\"file\"\n #fileInput\n accept=\"image/*\"\n multiple\n (change)=\"handleFileSelect($event)\"\n class=\"babylai:hidden\"\n [disabled]=\"isChatClosed()\"\n />\n\n <div class=\"babylai:border-e babylai:border-border babylai:pe-2\">\n <button\n type=\"button\"\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:border-0 babylai:rounded-full babylai:w-8 babylai:h-8 babylai:cursor-pointer babylai:bg-secondary babylai:text-muted-foreground babylai:hover:text-primary-500 babylai:transition-colors babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed\"\n (click)=\"handleAttachClick()\"\n [disabled]=\"isChatClosed()\"\n aria-label=\"Attach image\"\n >\n <app-icon name=\"solar:paperclip-bold-duotone\" class=\"babylai:flex\" />\n </button>\n </div>\n\n <input\n type=\"text\"\n [ngModel]=\"messageContent()\"\n (ngModelChange)=\"messageContent.set($event)\"\n name=\"messageContent\"\n [placeholder]=\"'ChatPlaceholder' | translate\"\n [disabled]=\"isChatClosed()\"\n [attr.aria-label]=\"'Chat input field'\"\n [attr.aria-disabled]=\"isChatClosed()\"\n role=\"textbox\"\n class=\"babylai:flex-1 babylai:py-2 babylai:px-2 babylai:bg-transparent babylai:outline-none babylai:text-sm babylai:border-none babylai:text-card-foreground babylai:disabled:opacity-50 babylai:disabled:cursor-not-allowed\"\n dir=\"auto\"\n #messageInput\n (keydown.enter)=\"handleSendMessage()\"\n (keydown.escape)=\"messageContent.set('')\"\n />\n\n <button\n type=\"submit\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"'Send message'\"\n class=\"babylai:border-0 babylai:rounded-full babylai:bg-primary-500 babylai:hover:bg-primary-600 babylai:w-8 babylai:h-8 babylai:p-0 babylai:flex babylai:items-center babylai:justify-center babylai:disabled:opacity-50 babylai:text-white babylai:cursor-pointer babylai:disabled:cursor-not-allowed\"\n >\n <app-icon name=\"solar:plain-2-bold-duotone\" class=\"babylai:flex\" />\n </button>\n </div>\n </form>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { ChatComponent } from '../../../chat/chat.component';\nimport { ChatInputComponent } from '../../../chat/components/chat-input/chat-input.component';\nimport { ChatHeaderComponent } from '../../../shared/components';\nimport { Message, Option } from '../../../types';\nimport { FooterComponent } from '../footer/footer.component';\n\n@Component({\n selector: 'app-chat-screen',\n templateUrl: './chat-screen.component.html',\n standalone: true,\n imports: [\n CommonModule,\n ChatHeaderComponent,\n ChatComponent,\n FooterComponent,\n ChatInputComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatScreenComponent {\n showChat = input<boolean>(false);\n messages = input<Message[]>([]);\n needsAgent = input<boolean>(false);\n assistantStatus = input<string>('idle');\n isAblyConnected = input<boolean>(false);\n isChatClosed = input<boolean>(false);\n currentLang = input<string>('en');\n chatIsLoading = input<boolean>(false);\n sessionId = input<string | null>(null);\n selectedOption = input<Option | null>(null);\n selectedNestedOption = input<Option | null>(null);\n isSubmittingReview = input<boolean>(false);\n\n endChat = output<void>();\n back = output<void>();\n onMinimize = output<void>();\n sendMessage = output<{\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }>();\n requestSessionForAttachments = output<void>();\n reviewSubmit = output<{ rating: number; comment: string }>();\n reviewSkip = output<void>();\n\n handleEndChat() {\n this.endChat.emit();\n }\n\n handleBack() {\n this.back.emit();\n }\n\n handleMinimize() {\n this.onMinimize.emit();\n }\n\n handleSendMessage(event: {\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }) {\n this.sendMessage.emit(event);\n }\n\n handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n this.reviewSubmit.emit(reviewData);\n }\n\n handleReviewSkip() {\n this.reviewSkip.emit();\n }\n}\n","<app-chat-header\n [showBackButton]=\"showChat()\"\n [selectedOptionTitle]=\"\n selectedNestedOption()?.title || selectedOption()?.title || null\n \"\n (onClose)=\"handleEndChat()\"\n (onBack)=\"handleBack()\"\n (onMinimize)=\"handleMinimize()\"\n [language]=\"currentLang()\"\n></app-chat-header>\n\n<app-chat\n class=\"babylai:flex babylai:flex-col babylai:flex-1 babylai:overflow-y-auto babylai:p-4\"\n [messages]=\"messages()\"\n [needsAgent]=\"needsAgent()\"\n [assistantStatus]=\"assistantStatus()\"\n [currentLang]=\"currentLang()\"\n [loading]=\"chatIsLoading()\"\n [isSubmittingReview]=\"isSubmittingReview()\"\n (reviewSubmit)=\"handleReviewSubmit($event)\"\n (reviewSkip)=\"handleReviewSkip()\"\n></app-chat>\n\n<app-chat-input\n [isChatClosed]=\"isChatClosed()\"\n [assistantStatus]=\"assistantStatus()\"\n [currentLang]=\"currentLang()\"\n [sessionId]=\"sessionId()\"\n (sendMessage)=\"handleSendMessage($event)\"\n (requestSessionForAttachments)=\"requestSessionForAttachments.emit()\"\n class=\"babylai:px-4 babylai:mb-2\"\n/>\n\n<app-footer />\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n@Component({\n selector: 'app-company-card',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './company-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CompanyCardComponent {\n title = input<string>('BabylAI');\n description = input<string>('Smart solutions for customer service');\n iconUrl = input<string | null | undefined>('');\n\n hasIconUrl = computed(() => {\n const url = this.iconUrl();\n return !!url && url.trim().length > 0;\n });\n}\n","<section class=\"babylai:border-b babylai:border-black-white-200\">\n <div\n class=\"babylai:flex babylai:items-center babylai:gap-3 babylai:p-6 babylai:mb-6 babylai:rounded-3xl babylai:border babylai:border-black-white-200 babylai:bg-card\"\n >\n <!-- Left Icon -->\n @if (hasIconUrl()) {\n <div\n class=\"babylai:shrink-0 babylai:w-12 babylai:h-12 babylai:rounded-md babylai:overflow-hidden\"\n >\n <img\n [src]=\"iconUrl()!\"\n [alt]=\"title() + ' logo'\"\n class=\"babylai:w-full babylai:h-full babylai:object-contain\"\n />\n </div>\n }\n\n <!-- Center Content -->\n <div class=\"babylai:flex-1 babylai:min-w-0 babylai:text-start\">\n <h3\n class=\"babylai:text-lg babylai:font-semibold babylai:mb-1 babylai:text-card-foreground\"\n dir=\"auto\"\n >\n {{ title() }}\n </h3>\n <p class=\"babylai:text-sm babylai:text-muted-foreground\" dir=\"auto\">\n {{ description() }}\n </p>\n </div>\n </div>\n</section>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\n\n@Component({\n selector: 'app-help-button',\n templateUrl: './help-button.component.html',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpButtonComponent {\n isPopupOpen = input<boolean>(false);\n togglePopup = output<void>();\n\n handleTogglePopup() {\n this.togglePopup.emit();\n }\n}\n","<button\n class=\"babylai:fixed babylai:z-50 babylai:bottom-4 babylai:right-4 babylai:p-4 babylai:rounded-full babylai:bg-primary-500 babylai:flex babylai:items-center babylai:justify-center babylai:border-[0.5px] babylai:border-black-white-50\"\n (click)=\"handleTogglePopup()\"\n type=\"button\"\n [attr.aria-label]=\"'Toggle help center'\"\n [attr.aria-expanded]=\"isPopupOpen()\"\n [attr.aria-haspopup]=\"true\"\n (keydown.enter)=\"handleTogglePopup()\"\n (keydown.space)=\"$event.preventDefault(); handleTogglePopup()\"\n>\n <svg\n class=\"babylai:w-8 babylai:h-8 babylai:text-primary-500\"\n viewBox=\"0 0 55 53\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.53125 19.1353C8.53125 12.2804 14.0883 6.72339 20.9432 6.72339H41.6298C48.4847 6.72339 54.0418 12.2804 54.0418 19.1353V52.2339H20.9432C14.0883 52.2339 8.53125 46.6769 8.53125 39.8219V19.1353Z\"\n fill=\"#E5E5E5\"\n />\n <path\n d=\"M0 12.412C0 5.55702 5.55702 0 12.412 0H33.0985C39.9535 0 45.5105 5.55702 45.5105 12.412V33.0985C45.5105 39.9535 39.9535 45.5105 33.0985 45.5105H0V12.412Z\"\n fill=\"white\"\n />\n <path\n d=\"M14.3684 15.2203C14.3696 15.2162 14.3701 15.2142 14.3704 15.2132C14.5505 14.5816 15.4457 14.5816 15.6258 15.2132C15.6261 15.2142 15.6267 15.2162 15.6278 15.2203C15.6309 15.2311 15.6324 15.2365 15.6338 15.2416C16.4708 18.1971 18.7808 20.5071 21.7364 21.3441C21.7414 21.3455 21.7468 21.3471 21.7576 21.3501C21.7617 21.3512 21.7637 21.3518 21.7647 21.3521C22.3963 21.5322 22.3963 22.4274 21.7647 22.6075C21.7637 22.6078 21.7617 22.6084 21.7576 22.6095C21.7468 22.6126 21.7414 22.6141 21.7364 22.6155C18.7808 23.4525 16.4708 25.7625 15.6338 28.7181C15.6324 28.7231 15.6309 28.7285 15.6278 28.7393C15.6267 28.7434 15.6261 28.7454 15.6258 28.7464C15.4457 29.378 14.5505 29.378 14.3704 28.7464C14.3701 28.7454 14.3696 28.7434 14.3684 28.7393C14.3654 28.7285 14.3638 28.7231 14.3624 28.7181C13.5254 25.7625 11.2154 23.4525 8.25988 22.6155C8.25481 22.6141 8.24942 22.6126 8.23864 22.6095C8.23454 22.6084 8.2325 22.6078 8.23155 22.6075C7.5999 22.4274 7.5999 21.5322 8.23155 21.3521C8.2325 21.3518 8.23454 21.3512 8.23864 21.3501C8.24942 21.3471 8.25481 21.3455 8.25988 21.3441C11.2154 20.5071 13.5254 18.1971 14.3624 15.2416C14.3638 15.2365 14.3654 15.2311 14.3684 15.2203Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M36.7198 21.8503C36.7198 24.9207 34.2886 27.4098 31.2896 27.4098C28.2906 27.4098 25.8594 24.9207 25.8594 21.8503C25.8594 18.7799 28.2906 16.2908 31.2896 16.2908C34.2886 16.2908 36.7198 18.7799 36.7198 21.8503Z\"\n fill=\"currentColor\"\n />\n </svg>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { HeaderComponent } from '../header';\n\n@Component({\n selector: 'app-error-state',\n templateUrl: './error-state.component.html',\n imports: [HeaderComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ErrorStateComponent {\n error = input<string | null>(null);\n onMinimize = output<void>();\n}\n","<div\n class=\"babylai:w-full babylai:h-full babylai:bg-secondary babylai:rounded-3xl babylai:shadow-lg babylai:flex babylai:flex-col\">\n <div class=\"babylai:rounded-3xl babylai:h-full babylai:flex babylai:flex-col babylai:gap-4\">\n <app-header (onMinimize)=\"onMinimize.emit()\" />\n <div\n class=\"babylai:flex babylai:flex-col babylai:items-center babylai:justify-center babylai:w-full babylai:h-full babylai:py-28 babylai:p-4\">\n <span class=\"babylai:text-secondary-foreground babylai:text-lg\">Error: {{ error() }}</span>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { HelpScreenOption } from '../../../types';\n\n@Component({\n selector: 'app-helpscreen-option',\n imports: [],\n templateUrl: './helpscreen-option.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpscreenOptionComponent {\n option = input.required<HelpScreenOption>();\n isSelected = input<boolean>(false);\n\n optionSelected = output<string>();\n\n select(): void {\n this.optionSelected.emit(this.option().id);\n }\n}\n","<div\n [id]=\"option().id\"\n class=\"babylai:flex babylai:flex-col babylai:gap-2 babylai:p-6 babylai:rounded-3xl babylai:text-start babylai:border babylai:border-black-white-200 babylai:bg-card babylai:cursor-pointer babylai:transition-all babylai:duration-200 babylai:ease-out babylai:active:scale-[0.98] babylai:active:opacity-95\"\n [class.babylai:ring]=\"isSelected()\"\n [class.babylai:ring-primary-500]=\"isSelected()\"\n [class.babylai:shadow-md]=\"isSelected()\"\n (click)=\"select()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"option().title + (isSelected() ? ' (selected)' : '')\"\n [attr.aria-pressed]=\"isSelected()\"\n (keydown.enter)=\"select()\"\n (keydown.space)=\"$event.preventDefault(); select()\"\n>\n <h4\n class=\"babylai:text-base! babylai:font-semibold! babylai:text-card-foreground\"\n dir=\"auto\"\n >\n {{ option().title }}\n </h4>\n @if (option().paragraphs && option().paragraphs.length > 0) {\n <p\n class=\"babylai:text-sm babylai:text-muted-foreground babylai:leading-snug\"\n dir=\"auto\"\n >\n {{ option().paragraphs[0] }}\n </p>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { TranslatePipe } from '../pipes/translate.pipe';\nimport { ButtonComponent } from '../shared/components/button';\nimport { IconComponent } from '../shared/components/icon';\nimport { HelpScreenData, HelpScreenOption } from '../types';\nimport { HelpscreenOptionComponent } from './components/helpscreen-option/helpscreen-option.component';\n\n@Component({\n selector: 'app-helpscreen-list',\n standalone: true,\n imports: [\n CommonModule,\n ButtonComponent,\n TranslatePipe,\n IconComponent,\n HelpscreenOptionComponent,\n ],\n templateUrl: './helpscreen-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpscreenListComponent implements OnInit, OnDestroy {\n helpScreenData = input<HelpScreenData | null>(null);\n title = input<string>('');\n hasOngoingSession = input<boolean>(false);\n handleStartNewChat = output<HelpScreenOption>();\n\n selectedItemId = signal<string | null>(null);\n\n selectedOption = computed(() => {\n const data = this.helpScreenData();\n const selectedId = this.selectedItemId();\n if (!data?.options || !selectedId) return null;\n return (\n data.options.find(\n (option: HelpScreenOption) => option.id === selectedId,\n ) || null\n );\n });\n\n canStartChat = computed(() => {\n const selected = this.selectedOption();\n return selected?.chatWithUs ?? false;\n });\n\n ngOnInit() {}\n\n selectItem(itemId: string): void {\n if (this.selectedItemId() === itemId) {\n // Deselect if clicking the same item\n this.selectedItemId.set(null);\n } else {\n this.selectedItemId.set(itemId);\n }\n }\n\n ngOnDestroy(): void {}\n\n handleStartChat(): void {\n const selected = this.selectedOption();\n if (selected) {\n this.handleStartNewChat.emit(selected);\n }\n }\n}\n","<div class=\"babylai:flex babylai:flex-col babylai:flex-1 babylai:gap-4\">\n <div class=\"babylai:grid babylai:grid-cols-1 babylai:gap-4\">\n @for (item of helpScreenData()?.options; track item.id) {\n <app-helpscreen-option\n [option]=\"item\"\n [isSelected]=\"selectedItemId() === item.id\"\n (optionSelected)=\"selectItem($event)\"\n />\n }\n </div>\n\n @if (!hasOngoingSession()) {\n <!-- Fixed call to action button -->\n <div class=\"babylai:sticky babylai:bottom-0 babylai:z-10\">\n <app-button\n variant=\"default\"\n [fullWidth]=\"true\"\n [disabled]=\"!canStartChat()\"\n (onClick)=\"handleStartChat()\"\n [attr.aria-label]=\"'Start chat'\"\n >\n <span>\n {{ \"ChatNow\" | translate }}\n </span>\n <app-icon\n name=\"solar:plain-2-bold-duotone\"\n class=\"babylai:flex\"\n size=\"24px\"\n />\n </app-button>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { HelpscreenListComponent } from '../../../help-screen-list/helpscreen-list.component';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { HeaderComponent } from '../../../shared/components';\nimport { Option } from '../../../types';\nimport { CompanyCardComponent } from '../company-card/company-card.component';\nimport { FooterComponent } from '../footer/footer.component';\n\n@Component({\n selector: 'app-home-screen',\n templateUrl: './home-screen.component.html',\n standalone: true,\n imports: [\n CommonModule,\n TranslatePipe,\n CompanyCardComponent,\n HelpscreenListComponent,\n FooterComponent,\n HeaderComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HomeScreenComponent {\n helpScreenData = input<any>(null);\n showHelpScreenData = input<boolean>(false);\n sessionId = input<string | null>(null);\n\n startNewChat = output<Option>();\n onClose = output<void>();\n onMinimize = output<void>();\n\n handleStartNewChat(option: Option) {\n this.startNewChat.emit(option);\n }\n\n handleClosePopup() {\n this.onClose.emit();\n }\n\n handleMinimizePopup() {\n this.onMinimize.emit();\n }\n}\n","<app-header (onMinimize)=\"handleMinimizePopup()\" />\n<div\n class=\"babylai:flex babylai:flex-col babylai:flex-1 babylai:overflow-y-auto babylai:px-6 babylai:pt-6 babylai:pb-4 babylai:gap-6\"\n>\n <header\n class=\"babylai:flex babylai:items-center babylai:justify-center babylai:gap-3 babylai:pb-5 babylai:border-b babylai:border-black-white-200\"\n >\n <svg\n class=\"babylai:w-8 babylai:h-8\"\n [style.color]=\"'var(--babylai-primary-color)'\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 34 34\"\n fill=\"currentColor\"\n >\n <path\n d=\"M18.4785 1.12896C18.4758 1.11935 18.4745 1.11454 18.4739 1.11232C18.0509 -0.370772 15.9491 -0.370772 15.5261 1.11232C15.5255 1.11454 15.5242 1.11935 15.5215 1.12896C15.5143 1.15428 15.5107 1.16694 15.5074 1.17883C13.5422 8.11839 8.11839 13.5422 1.17883 15.5074C1.16694 15.5107 1.15428 15.5143 1.12895 15.5215C1.11934 15.5242 1.11454 15.5255 1.11232 15.5261C-0.370773 15.9491 -0.370773 18.0509 1.11232 18.4739C1.11454 18.4745 1.11934 18.4758 1.12896 18.4785C1.15428 18.4857 1.16694 18.4893 1.17883 18.4926C8.11839 20.4578 13.5422 25.8816 15.5074 32.8212C15.5107 32.8331 15.5143 32.8457 15.5215 32.871C15.5242 32.8807 15.5255 32.8855 15.5261 32.8877C15.9491 34.3708 18.0509 34.3708 18.4739 32.8877C18.4745 32.8855 18.4758 32.8807 18.4785 32.871C18.4857 32.8457 18.4893 32.8331 18.4926 32.8212C20.4578 25.8816 25.8816 20.4578 32.8212 18.4926C32.8331 18.4893 32.8457 18.4857 32.871 18.4785C32.8807 18.4758 32.8855 18.4745 32.8877 18.4739C34.3708 18.0509 34.3708 15.9491 32.8877 15.5261C32.8855 15.5255 32.8807 15.5242 32.871 15.5215C32.8457 15.5143 32.8331 15.5107 32.8212 15.5074C25.8816 13.5422 20.4578 8.11839 18.4926 1.17883C18.4893 1.16694 18.4857 1.15428 18.4785 1.12896Z\"\n fill=\"currentColor\"\n />\n </svg>\n <h1\n class=\"babylai:text-2xl! babylai:font-semibold! babylai:text-card-foreground\"\n >\n {{ \"HelpCenter\" | translate }}\n </h1>\n </header>\n <app-company-card\n [title]=\"helpScreenData()?.tenant?.name\"\n [description]=\"\n helpScreenData()?.tenant?.settings?.description ||\n helpScreenData()?.description\n \"\n [iconUrl]=\"helpScreenData()?.tenant?.logoUrl\"\n />\n @if (showHelpScreenData()) {\n <app-helpscreen-list\n [helpScreenData]=\"helpScreenData()\"\n [hasOngoingSession]=\"!!sessionId()\"\n (handleStartNewChat)=\"handleStartNewChat($event)\"\n ></app-helpscreen-list>\n }\n</div>\n<app-footer />\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n input,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../pipes/translate.pipe';\nimport { ConfirmationDialogComponent } from '../../../shared/components/confirmation-dialog/confirmation-dialog.component';\nimport { ErrorStateComponent } from '../../../shared/components/error-state/error-state.component';\nimport { LoadingComponent } from '../../../shared/components/loading/loading.component';\nimport { ReviewDialogComponent } from '../../../shared/components/review-dialog/review-dialog.component';\nimport { Message, Option } from '../../../types';\nimport { ChatActionButtonsComponent } from '../chat-action-buttons/chat-action-buttons.component';\nimport { ChatScreenComponent } from '../chat-screen/chat-screen.component';\nimport { HomeScreenComponent } from '../home-screen/home-screen.component';\n\n@Component({\n selector: 'app-help-popup',\n templateUrl: './help-popup.component.html',\n standalone: true,\n imports: [\n CommonModule,\n TranslatePipe,\n LoadingComponent,\n ErrorStateComponent,\n ConfirmationDialogComponent,\n ReviewDialogComponent,\n HomeScreenComponent,\n ChatScreenComponent,\n ChatActionButtonsComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpPopupComponent implements OnDestroy {\n private static readonly POPUP_ANIMATION_DURATION_MS = 250;\n\n isPopupOpen = input<boolean>(false);\n isEntering = signal(true);\n isClosing = signal(false);\n private previousPopupOpen = false;\n private closeTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private closingAction: 'close' | 'minimize' | null = null;\n\n constructor() {\n effect(() => {\n const open = this.isPopupOpen();\n if (open && !this.previousPopupOpen) {\n this.previousPopupOpen = true;\n this.isEntering.set(true);\n const id = window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => this.isEntering.set(false));\n });\n return () => window.cancelAnimationFrame(id);\n }\n if (!open) {\n this.previousPopupOpen = false;\n }\n return undefined;\n });\n }\n\n ngOnDestroy() {\n if (this.closeTimeoutId !== null) {\n clearTimeout(this.closeTimeoutId);\n }\n }\n showHelpScreenData = input<boolean>(false);\n showChat = input<boolean>(false);\n status = input<string>('idle');\n error = input<string | null>(null);\n helpScreenData = input<any>(null);\n messages = input<Message[]>([]);\n needsAgent = input<boolean>(false);\n assistantStatus = input<string>('idle');\n isAblyConnected = input<boolean>(false);\n isChatClosed = input<boolean>(false);\n currentLang = input<string>('en');\n chatIsLoading = input<boolean>(false);\n sessionId = input<string | null>(null);\n selectedOption = input<Option | null>(null);\n selectedNestedOption = input<Option | null>(null);\n showEndChatConfirmation = input<boolean>(false);\n showStartNewChatConfirmation = input<boolean>(false);\n showReviewDialog = input<boolean>(false);\n isSubmittingReview = input<boolean>(false);\n isStartingNewChat = input<boolean>(false);\n\n closePopup = output<void>();\n minimizePopup = output<void>();\n back = output<void>();\n showChatEvent = output<void>();\n endChat = output<void>();\n confirmEndChat = output<void>();\n cancelEndChat = output<void>();\n closeEndChat = output<void>();\n confirmStartNewChat = output<void>();\n cancelStartNewChat = output<void>();\n closeStartNewChat = output<void>();\n reviewSubmit = output<{ rating: number; comment: string }>();\n reviewSkip = output<void>();\n reviewClose = output<void>();\n reviewSubmitFromChat = output<{ rating: number; comment: string }>();\n reviewSkipFromChat = output<void>();\n startNewChat = output<Option>();\n navigateToUrl = output<string>();\n sendMessageEvent = output<{\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }>();\n requestSessionForAttachments = output<void>();\n\n handleClosePopup() {\n if (this.isClosing()) return;\n this.isClosing.set(true);\n this.closingAction = 'close';\n this.scheduleCloseEmit();\n }\n\n handleMinimizePopup() {\n if (this.isClosing()) return;\n this.isClosing.set(true);\n this.closingAction = 'minimize';\n this.scheduleCloseEmit();\n }\n\n private scheduleCloseEmit() {\n this.closeTimeoutId = setTimeout(() => {\n if (this.closingAction === 'close') {\n this.closePopup.emit();\n } else if (this.closingAction === 'minimize') {\n this.minimizePopup.emit();\n }\n this.isClosing.set(false);\n this.closingAction = null;\n this.closeTimeoutId = null;\n }, HelpPopupComponent.POPUP_ANIMATION_DURATION_MS);\n }\n\n handleBack() {\n this.back.emit();\n }\n\n handleShowChat() {\n this.showChatEvent.emit();\n }\n\n handleEndChat() {\n this.endChat.emit();\n }\n\n handleConfirmEndChat() {\n this.confirmEndChat.emit();\n }\n\n handleCancelEndChat() {\n this.cancelEndChat.emit();\n }\n\n handleCloseEndChat() {\n this.closeEndChat.emit();\n }\n\n handleConfirmStartNewChat() {\n this.confirmStartNewChat.emit();\n }\n\n handleCancelStartNewChat() {\n this.cancelStartNewChat.emit();\n }\n\n handleCloseStartNewChat() {\n this.closeStartNewChat.emit();\n }\n\n handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n this.reviewSubmit.emit(reviewData);\n }\n\n handleReviewSkip() {\n this.reviewSkip.emit();\n }\n\n handleReviewClose() {\n this.reviewClose.emit();\n }\n\n handleSendMessage(event: {\n text: string;\n attachmentIds: string[];\n pendingFiles?: File[];\n }) {\n this.sendMessageEvent.emit(event);\n }\n\n handleRequestSessionForAttachments() {\n this.requestSessionForAttachments.emit();\n }\n\n handleStartNewChat(option: Option) {\n this.startNewChat.emit(option);\n }\n\n handleNavigateToUrl(url: string) {\n this.navigateToUrl.emit(url);\n }\n\n handleReviewSubmitFromChat(reviewData: { rating: number; comment: string }) {\n this.reviewSubmitFromChat.emit(reviewData);\n }\n\n handleReviewSkipFromChat() {\n this.reviewSkipFromChat.emit();\n }\n}\n","@if (isPopupOpen()) {\n <div\n class=\"babylai:h-[calc(100vh-12rem)] babylai:bg-secondary babylai:rounded-3xl babylai:overflow-hidden babylai:max-h-[800px] babylai:shadow-md babylai:flex babylai:flex-col babylai:fixed babylai:bottom-24 babylai:right-5 babylai:z-1000 babylai:transition-all babylai:duration-250 babylai:ease-out\"\n [class.babylai:w-96]=\"isPopupOpen()\"\n [class.babylai:w-15]=\"!isPopupOpen()\"\n [class.babylai:bg-linear-to-b]=\"\n isPopupOpen() && !showHelpScreenData() && !showChat()\n \"\n [class.babylai:opacity-0]=\"isEntering() || isClosing()\"\n [class.babylai:scale-[0.96]]=\"isEntering() || isClosing()\"\n [class.babylai:translate-y-2]=\"isEntering() || isClosing()\"\n [class.babylai:opacity-100]=\"!isEntering() && !isClosing()\"\n [class.babylai:scale-100]=\"!isEntering() && !isClosing()\"\n [class.babylai:translate-y-0]=\"!isEntering() && !isClosing()\"\n >\n @if (showEndChatConfirmation()) {\n <app-confirmation-dialog\n [title]=\"'LeavingDialogTitle' | translate\"\n [body]=\"'LeavingDialogBody' | translate\"\n [confirmText]=\"'CloseChat' | translate\"\n [cancelText]=\"'Continue' | translate\"\n (onConfirm)=\"handleConfirmEndChat()\"\n (onCancel)=\"handleCancelEndChat()\"\n (onClose)=\"handleCloseEndChat()\"\n ></app-confirmation-dialog>\n }\n @if (showStartNewChatConfirmation()) {\n <app-confirmation-dialog\n [title]=\"'StartNewChatDialogTitle' | translate\"\n [body]=\"'StartNewChatDialogBody' | translate\"\n [confirmText]=\"'CloseChat' | translate\"\n [cancelText]=\"'Continue' | translate\"\n [isLoading]=\"isStartingNewChat()\"\n (onConfirm)=\"handleConfirmStartNewChat()\"\n (onCancel)=\"handleCancelStartNewChat()\"\n (onClose)=\"handleCloseStartNewChat()\"\n ></app-confirmation-dialog>\n }\n\n <!-- Loading State -->\n @if (status() === \"loading\") {\n <app-loading\n (onMinimize)=\"handleMinimizePopup()\"\n class=\"babylai:h-full\"\n ></app-loading>\n }\n\n <!-- Error State -->\n @if (status() === \"failed\") {\n <app-error-state\n [error]=\"error()\"\n (onMinimize)=\"handleMinimizePopup()\"\n class=\"babylai:h-full\"\n ></app-error-state>\n }\n\n @if (status() === \"succeeded\") {\n @if (!showChat()) {\n @if (sessionId()) {\n <app-chat-action-buttons\n [selectedOption]=\"selectedOption()\"\n (closeChat)=\"handleEndChat()\"\n (continueChat)=\"handleShowChat()\"\n ></app-chat-action-buttons>\n }\n }\n\n <!-- Chat Screen -->\n @if (showChat()) {\n <app-chat-screen\n [showChat]=\"showChat()\"\n [messages]=\"messages()\"\n [needsAgent]=\"needsAgent()\"\n [assistantStatus]=\"assistantStatus()\"\n [isAblyConnected]=\"isAblyConnected()\"\n [isChatClosed]=\"isChatClosed()\"\n [currentLang]=\"currentLang()\"\n [chatIsLoading]=\"chatIsLoading()\"\n [sessionId]=\"sessionId()\"\n [selectedOption]=\"selectedOption()\"\n [selectedNestedOption]=\"selectedNestedOption()\"\n [isSubmittingReview]=\"isSubmittingReview()\"\n (endChat)=\"handleEndChat()\"\n (back)=\"handleBack()\"\n (onMinimize)=\"handleMinimizePopup()\"\n (sendMessage)=\"handleSendMessage($event)\"\n (requestSessionForAttachments)=\"handleRequestSessionForAttachments()\"\n (reviewSubmit)=\"handleReviewSubmitFromChat($event)\"\n (reviewSkip)=\"handleReviewSkipFromChat()\"\n class=\"babylai:flex babylai:flex-col babylai:h-full\"\n ></app-chat-screen>\n }\n\n <!-- Home Screen -->\n @if (!showChat()) {\n <app-home-screen\n [helpScreenData]=\"helpScreenData()\"\n [showHelpScreenData]=\"showHelpScreenData()\"\n [sessionId]=\"sessionId()\"\n (startNewChat)=\"handleStartNewChat($event)\"\n (onClose)=\"handleClosePopup()\"\n (onMinimize)=\"handleMinimizePopup()\"\n class=\"babylai:flex babylai:flex-col babylai:max-h-full\"\n ></app-home-screen>\n }\n\n <!-- Review Dialog (shown when closing from home screen - stars only) -->\n <app-review-dialog\n [isOpen]=\"showReviewDialog()\"\n [isSubmitting]=\"isSubmittingReview()\"\n [showCommentField]=\"false\"\n (close)=\"handleReviewClose()\"\n (submitReview)=\"handleReviewSubmit($event)\"\n (skip)=\"handleReviewSkip()\"\n ></app-review-dialog>\n }\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n EffectRef,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { ActionHandlerService } from '../services/action-handler.service';\nimport { ApiService } from '../services/api.service';\nimport { ChatSessionService } from '../services/chat-session.service';\nimport { FileUploadService } from '../services/file-upload.service';\nimport { ThemeService } from '../services/theme.service';\nimport { TranslationService } from '../services/translation.service';\nimport { HelpScreenData, Message, Option } from '../types';\nimport {\n ArrowAnimationComponent,\n HelpButtonComponent,\n HelpPopupComponent,\n} from './components';\n\n@Component({\n selector: 'app-help-center-widget',\n templateUrl: './help-center-widget.component.html',\n styleUrls: ['../../styles.css'],\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ArrowAnimationComponent,\n HelpButtonComponent,\n HelpPopupComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HelpCenterWidgetComponent implements OnInit, OnDestroy {\n getToken = input.required<() => Promise<string>>();\n helpScreenId = input.required<string>();\n showArrow = input<boolean>(true);\n messageLabel = input<string | null>(null);\n currentLang = input<string>('en');\n primaryColor = input<string>('#ad49e1');\n logoUrl = input<string>('');\n @ViewChild('chatMessagesContainer') chatMessagesContainer!: ElementRef;\n\n isRTL = computed(() => this.currentLang() === 'ar');\n\n // State variables - using signals for automatic change detection\n isPopupOpen = signal(false);\n helpScreenData = signal<HelpScreenData | null>(null);\n status = signal<'idle' | 'loading' | 'succeeded' | 'failed'>('idle');\n error = signal<string | null>(null);\n showArrowAnimation = signal(false);\n showTooltip = signal(false);\n sessionId = signal<string | null>(null);\n isAblyConnected = signal(false);\n isChatClosed = signal(false);\n showChat = signal(false);\n messageText = signal('');\n isTyping = signal(false);\n messages = signal<Message[]>([]);\n showHelpScreenData = signal(false);\n chatIsLoading = signal(false);\n ablyToken = signal<string | null>(null);\n needsAgent = signal(false);\n assistantStatus = signal<'idle' | 'typing'>('idle');\n selectedOption = signal<Option | null>(null);\n selectedNestedOption = signal<Option | null>(null);\n showEndChatConfirmation = signal(false);\n showStartNewChatConfirmation = signal(false);\n showReviewDialog = signal(false);\n isSubmittingReview = signal(false);\n isStartingNewChat = signal(false);\n pendingNewChatOption = signal<Option | null>(null);\n hasUserSentMessages = signal(false);\n closedSessionIdForReview = signal<string | null>(null);\n waitingForSessionEndConfirmation = signal(false);\n\n private isClosingChatSession = false;\n\n private apiService = inject(ApiService);\n private translationService = inject(TranslationService);\n private themeService = inject(ThemeService);\n private chatSessionService = inject(ChatSessionService);\n private actionHandlerService = inject(ActionHandlerService);\n private fileUploadService = inject(FileUploadService);\n private destroyRef = inject(DestroyRef);\n private themeEffectRef?: EffectRef;\n private languageEffectRef?: EffectRef;\n\n constructor() {\n // Combined effect to initialize and update theme when primaryColor or logoUrl change\n // This is more efficient than having separate effects\n this.themeEffectRef = effect(() => {\n const primaryColor = this.primaryColor();\n const logoUrl = this.logoUrl();\n\n // Initialize theme when either primaryColor or logoUrl changes\n if (primaryColor || logoUrl) {\n this.themeService.initializeTheme(primaryColor, logoUrl);\n }\n });\n\n // Effect to sync translation service language with input\n this.languageEffectRef = effect(() => {\n const lang = this.currentLang();\n if (lang) {\n this.translationService.setLanguage(lang as 'en' | 'ar');\n }\n });\n\n // Subscribe to language changes from translation service\n this.translationService.currentLang\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((lang) => {\n // Update if translation service language differs from input\n if (lang !== this.currentLang()) {\n // The translation service will update, but we don't need to update the input\n // as it's controlled by the parent component\n }\n });\n\n // Register action handlers for extensible action handling\n this.registerActionHandlers();\n }\n\n /**\n * Registers action handlers for AI response actions.\n * This uses the ActionHandlerService for extensible, maintainable action handling.\n */\n private registerActionHandlers(): void {\n // Register handler for 'needs_agent' action\n this.actionHandlerService.registerHandler('needs_agent', () => {\n // Trigger \"handoff / needs agent\" UI flow\n this.needsAgent.set(true);\n });\n\n // Register handler for 'end_session' action\n this.actionHandlerService.registerHandler('end_session', () => {\n // Trigger end session flow\n this.handleEndSessionReceived();\n });\n }\n\n ngOnInit() {\n this.showArrowAnimation.set(this.showArrow());\n }\n\n ngOnDestroy() {\n // Clean up effects\n if (this.themeEffectRef) {\n this.themeEffectRef.destroy();\n this.themeEffectRef = undefined;\n }\n if (this.languageEffectRef) {\n this.languageEffectRef.destroy();\n this.languageEffectRef = undefined;\n }\n // Cleanup handled by takeUntilDestroyed\n // Clean up Ably connection\n this.chatSessionService.stopConnection();\n // Clear any pending timeouts\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n this.scrollTimeout = undefined;\n }\n }\n\n async handleTogglePopup() {\n this.isPopupOpen.update((isOpen) => !isOpen);\n this.showArrowAnimation.set(this.isPopupOpen());\n\n if (this.isPopupOpen()) {\n // Reset the state when opening the popup\n await this.fetchHelpScreenData();\n }\n }\n\n private async fetchHelpScreenData() {\n this.status.set('loading');\n this.error.set(null);\n\n try {\n const response = await this.apiService.apiRequest(\n `client/clientHelpScreen/${this.helpScreenId()}`,\n 'GET',\n null,\n {\n 'Accept-Language': this.currentLang(),\n },\n );\n this.helpScreenData.set(await response.json());\n this.status.set('succeeded');\n // Automatically show the option screen when data is loaded (since intro section is removed)\n this.showHelpScreenData.set(true);\n } catch (error: unknown) {\n console.error('Error fetching help screen data:', error);\n this.error.set(\n this.translationService.translate('ErrorFetchingHelpScreen'),\n );\n this.status.set('failed');\n }\n }\n\n async createChatSession(option?: Option) {\n try {\n const selectedOpt = option || this.selectedOption();\n if (!selectedOpt) {\n throw new Error('No option selected for chat session');\n }\n\n // Create session using service\n const data = await this.chatSessionService.createSession(\n selectedOpt,\n this.helpScreenId(),\n this.currentLang(),\n );\n\n const { chatSession, ablyToken } = data;\n this.sessionId.set(chatSession?.id ?? null);\n this.ablyToken.set(ablyToken);\n\n // Establish Ably connection after creating session\n if (this.sessionId() && selectedOpt && !this.isAblyConnected()) {\n // Use the ablyToken from response or fallback to getValidToken\n const tokenToUse =\n this.ablyToken() || (await this.apiService.getValidToken());\n\n // Get tenantId from the selected option's assistant\n const tenantId =\n selectedOpt.assistant?.tenantId ||\n selectedOpt.assistant?.tenant?.id ||\n '';\n\n // Read sessionId fresh after async operation to ensure we have the current value\n const currentSessionId = this.sessionId();\n if (currentSessionId) {\n // Use action handler service for extensible action handling\n const actionHandler = async (\n actionType: string,\n messageData: any,\n ) => {\n await this.actionHandlerService.handleAction(\n actionType,\n messageData,\n );\n };\n\n await this.chatSessionService.establishAblyConnection(\n currentSessionId,\n tokenToUse,\n this.handleReceiveMessage.bind(this),\n tenantId,\n selectedOpt,\n this.helpScreenId(),\n this.currentLang(),\n actionHandler,\n );\n\n this.isAblyConnected.set(true);\n }\n }\n\n return data;\n } catch (error) {\n console.error('Error creating chat session:', error);\n throw error;\n }\n }\n\n async sendMessage(\n event?:\n | { text: string; attachmentIds: string[]; pendingFiles?: File[] }\n | string,\n ) {\n let textToSend = '';\n let attachmentIds: string[] = [];\n let pendingFiles: File[] = [];\n\n if (typeof event === 'string') {\n textToSend = event || this.messageText();\n } else if (event) {\n textToSend = event.text || this.messageText();\n attachmentIds = event.attachmentIds || [];\n pendingFiles = event.pendingFiles || [];\n } else {\n textToSend = this.messageText();\n }\n\n const hasContent = !!textToSend && textToSend.trim().length > 0;\n const hasAttachments = attachmentIds.length > 0 || pendingFiles.length > 0;\n\n if (!hasContent && !hasAttachments) {\n this.error.set(this.translationService.translate('ErrorMessageEmpty'));\n return;\n }\n\n if (textToSend.length > 5000) {\n this.error.set(this.translationService.translate('ErrorMessageTooLong'));\n return;\n }\n\n if (this.isChatClosed()) return;\n\n try {\n // Add user message first so it appears in UI immediately\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'user',\n senderType: 1,\n messageContent: hasContent ? textToSend : '',\n sentAt: new Date(),\n isSeen: false,\n ...(attachmentIds.length > 0 ? { attachmentIds } : {}),\n },\n ]);\n\n // Track that user has sent a message\n this.hasUserSentMessages.set(true);\n this.assistantStatus.set('typing');\n\n // Create session only when user sends first message (if not already exists)\n if (!this.sessionId()) {\n const selectedOption = this.selectedOption();\n if (!selectedOption) {\n this.error.set(\n this.translationService.translate('ErrorCreatingSession'),\n );\n this.assistantStatus.set('idle');\n this.chatIsLoading.set(false);\n // Remove the message that was just added\n this.messages.update((msgs) => msgs.slice(0, -1));\n return;\n }\n await this.createChatSession(selectedOption);\n }\n\n // If there are pending files (e.g. from another code path), upload them now that we have a session\n const currentSessionId = this.sessionId();\n if (pendingFiles.length > 0 && currentSessionId) {\n try {\n const uploadResults = await firstValueFrom(\n this.fileUploadService.uploadFiles(currentSessionId, pendingFiles),\n );\n\n const newAttachmentIds = uploadResults\n .filter((result) => result.success)\n .map((result) => result.fileId);\n\n attachmentIds = [...attachmentIds, ...newAttachmentIds];\n } catch (uploadError) {\n console.error('Error uploading pending files:', uploadError);\n }\n }\n\n // Send message via API\n const freshSessionId = this.sessionId();\n if (freshSessionId) {\n const contentToSend = hasContent ? textToSend : ' ';\n await this.chatSessionService.sendMessage(\n freshSessionId,\n contentToSend,\n this.currentLang(),\n attachmentIds,\n );\n }\n\n this.messageText.set('');\n\n // Update message as seen\n this.messages.update((msgs) =>\n msgs.map((msg) =>\n msg.senderType === 1 && !msg.isSeen ? { ...msg, isSeen: true } : msg,\n ),\n );\n } catch (error) {\n console.error('Error sending message:', error);\n this.assistantStatus.set('idle');\n this.chatIsLoading.set(false);\n const errorMessage = this.translationService.translate(\n 'ErrorSendingMessage',\n );\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent: errorMessage,\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n }\n }\n\n /**\n * Called when user attaches files but there is no session yet.\n * Creates a session so that chat-input can upload the files; send stays disabled until upload completes.\n */\n async handleRequestSessionForAttachments(): Promise<void> {\n if (this.sessionId()) return;\n const selectedOption = this.selectedOption();\n if (!selectedOption) return;\n try {\n await this.createChatSession(selectedOption);\n } catch (error) {\n console.error('Error creating session for attachments:', error);\n }\n }\n\n handleReceiveMessage(\n message: string | { content: string; attachments?: string[] },\n senderType: number,\n needsAgent: boolean,\n ) {\n if (needsAgent) {\n this.needsAgent.set(true);\n }\n\n const sender = this.getSenderType(senderType);\n const messageContent =\n typeof message === 'string' ? message : message.content || '';\n const attachmentIds =\n typeof message === 'string' ? undefined : message.attachments;\n\n // If we're waiting for session end confirmation, this message is the closing one.\n // Add it first, then add the review message so order is: closing → separator → review.\n const wasWaitingForConfirmation = this.waitingForSessionEndConfirmation();\n if (wasWaitingForConfirmation) {\n this.waitingForSessionEndConfirmation.set(false);\n }\n\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: sender,\n senderType: senderType,\n messageContent,\n sentAt: new Date(),\n isSeen: true,\n ...(attachmentIds && attachmentIds.length > 0 ? { attachmentIds } : {}),\n },\n ]);\n\n if (wasWaitingForConfirmation) {\n this.handleEndSessionConfirmed();\n }\n\n this.assistantStatus.set('idle');\n this.chatIsLoading.set(false);\n this.scrollToBottom();\n }\n\n private getSenderType(senderType: number): 'user' | 'assistant' | 'agent' {\n switch (senderType) {\n case 1:\n return 'user';\n case 2:\n return 'agent';\n default:\n return 'assistant';\n }\n }\n\n private hasActiveChatSession(): boolean {\n // Check if there are any user messages or agent/assistant responses (not just welcome messages)\n return this.messages().some(\n (message) =>\n message.senderType === 1 || // User message\n ((message.senderType === 2 || message.senderType === 3) &&\n !this.isWelcomeMessage(message.messageContent)), // Assistant/agent message that's not a welcome\n );\n }\n\n private isWelcomeMessage(content: string): boolean {\n const welcomeMessages = [\n 'Hello! How can I assist you today?',\n 'مرحباً! كيف يمكنني مساعدتك اليوم؟',\n ];\n // Check if it's a standard welcome message or if it contains common greeting patterns\n return (\n welcomeMessages.some((welcome) => content.includes(welcome)) ||\n content.includes('Hello!') ||\n content.includes('مرحباً!') ||\n content.includes('How can I assist') ||\n content.includes('كيف يمكنني مساعدتك')\n );\n }\n\n async handleStartNewChat(option: Option) {\n // Check if there's already an active chat session (has sessionId and meaningful messages)\n if (this.sessionId() && this.hasActiveChatSession()) {\n this.pendingNewChatOption.set(option);\n this.showStartNewChatConfirmation.set(true);\n return;\n }\n\n // If there's a sessionId but only welcome messages, clear the session and start fresh\n if (this.sessionId() && !this.hasActiveChatSession()) {\n await this.clearCurrentChat();\n }\n\n // If there are only welcome messages but no session, clear them and start fresh\n if (this.messages().length > 0 && !this.sessionId()) {\n this.messages.set([]);\n this.hasUserSentMessages.set(false);\n }\n\n this.selectedOption.set(option);\n\n try {\n // Update UI state - session will be created when the user sends the first message\n this.showChat.set(true);\n this.isChatClosed.set(false);\n this.showHelpScreenData.set(false);\n\n // Add greeting message\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent:\n option.assistant?.greeting ||\n (this.currentLang() === 'en'\n ? 'Hello! How can I assist you today?'\n : 'مرحباً! كيف يمكنني مساعدتك اليوم؟'),\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n } catch (error) {\n console.error('Error starting chat:', error);\n\n const errorMessage =\n this.translationService.translate('ErrorStartingChat');\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent: errorMessage,\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n }\n }\n\n private async startNewChatSession(option: Option) {\n try {\n this.status.set('loading');\n this.error.set('');\n this.messages.set([]);\n\n // Use the centralized createChatSession method\n await this.createChatSession(option);\n\n // Update UI state only after successful session creation\n this.isChatClosed.set(false);\n this.status.set('succeeded');\n } catch (error: unknown) {\n console.error('Chat start error:', error);\n this.error.set(this.translationService.translate('ErrorCreatingSession'));\n this.status.set('failed');\n }\n }\n\n async handleStartChat(option: Option) {\n await this.startNewChatSession(option);\n // Update UI state only after successful session creation\n if (this.status() === 'succeeded') {\n this.showChat.set(true);\n }\n }\n\n async handleEndChat() {\n // If called from home screen and user has sent messages, close session and show review dialog\n if (!this.showChat() && this.sessionId() && this.hasUserSentMessages()) {\n // Store session ID before closing\n const currentSessionId = this.sessionId();\n\n // Close the chat session first\n await this.endChatSession();\n\n // Store the closed session ID for review submission\n this.closedSessionIdForReview.set(currentSessionId);\n\n // Show review dialog\n this.showReviewDialog.set(true);\n return;\n }\n\n // Otherwise, show confirmation dialog (when called from chat screen)\n this.showEndChatConfirmation.set(true);\n }\n\n async confirmEndChat() {\n if (this.isClosingChatSession) {\n return;\n }\n this.isClosingChatSession = true;\n this.showEndChatConfirmation.set(false);\n\n try {\n // Only show review if user has sent messages\n if (this.hasUserSentMessages()) {\n // Store session ID before closing (closeSessionOnly clears it immediately)\n const currentSessionId = this.sessionId();\n\n // Close the chat session on backend only (don't change UI state)\n await this.closeSessionOnly();\n\n // Store the closed session ID for review submission\n this.closedSessionIdForReview.set(currentSessionId);\n\n // Add review message to chat\n this.addReviewMessageToChat();\n } else {\n // No messages sent, just end the chat directly\n await this.endChatSession();\n }\n } finally {\n this.isClosingChatSession = false;\n }\n }\n\n async handleReviewSubmit(reviewData: { rating: number; comment: string }) {\n try {\n this.isSubmittingReview.set(true);\n\n // Use the stored closed session ID for review submission\n const sessionIdForReview = this.closedSessionIdForReview();\n\n // Submit review to API endpoint using the closed session ID\n if (sessionIdForReview) {\n await this.chatSessionService.submitReview(\n sessionIdForReview,\n reviewData.rating,\n reviewData.comment || '',\n this.currentLang(),\n );\n }\n\n // Close review dialog\n this.showReviewDialog.set(false);\n this.isSubmittingReview.set(false);\n\n // Clear the stored session ID\n this.closedSessionIdForReview.set(null);\n\n // Don't close popup after review submission - keep it open showing help screen\n this.hasUserSentMessages.set(false);\n } catch (error) {\n console.error('Error submitting review:', error);\n this.isSubmittingReview.set(false);\n // Still close the dialog even if review submission fails\n this.showReviewDialog.set(false);\n // Clear the stored session ID even on error\n this.closedSessionIdForReview.set(null);\n this.hasUserSentMessages.set(false);\n }\n }\n\n handleReviewClose() {\n // Only close the review dialog without triggering any actions\n this.showReviewDialog.set(false);\n // Clear the stored session ID\n this.closedSessionIdForReview.set(null);\n }\n\n async handleReviewSkip() {\n // Close review dialog\n this.showReviewDialog.set(false);\n // Clear the stored session ID without submitting review\n this.closedSessionIdForReview.set(null);\n // Don't close popup after skipping review - keep it open showing help screen\n this.hasUserSentMessages.set(false);\n }\n\n private async endChatSession() {\n // Reset waiting flag if connection closes before confirmation\n this.waitingForSessionEndConfirmation.set(false);\n\n // Capture and clear sessionId immediately so a second concurrent call won't call the close API again\n const currentSessionId = this.sessionId();\n if (!currentSessionId) {\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n return;\n }\n this.sessionId.set(null);\n\n await this.chatSessionService.closeSession(\n currentSessionId,\n this.currentLang(),\n );\n\n // Stop Ably connection\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n\n private async closeSessionOnly() {\n // Reset waiting flag when closing session\n this.waitingForSessionEndConfirmation.set(false);\n\n // Capture and clear sessionId immediately so a second concurrent call (e.g. double-click) won't call the close API again\n const currentSessionId = this.sessionId();\n if (!currentSessionId) {\n return;\n }\n this.sessionId.set(null);\n\n await this.chatSessionService.closeSession(\n currentSessionId,\n this.currentLang(),\n );\n\n // Stop Ably connection\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n }\n\n cancelEndChat() {\n this.showEndChatConfirmation.set(false);\n }\n\n closeEndChat() {\n // Only close the dialog without triggering any actions\n this.showEndChatConfirmation.set(false);\n }\n\n async confirmStartNewChat() {\n const pendingOption = this.pendingNewChatOption();\n if (!pendingOption) {\n return;\n }\n\n this.isStartingNewChat.set(true);\n\n try {\n // Clear current chat session\n await this.clearCurrentChat();\n // Start new chat with the pending option\n await this.startNewChatWithOption(pendingOption);\n this.pendingNewChatOption.set(null);\n // Only close dialog after successful completion\n this.showStartNewChatConfirmation.set(false);\n } catch (error) {\n console.error('Error starting new chat:', error);\n // On error, keep dialog open and show error message\n // The error will be handled by the startNewChatWithOption method\n } finally {\n this.isStartingNewChat.set(false);\n }\n }\n\n cancelStartNewChat() {\n // Don't allow cancellation while loading\n if (this.isStartingNewChat()) {\n return;\n }\n this.showStartNewChatConfirmation.set(false);\n this.pendingNewChatOption.set(null);\n // Show the already opened chat\n this.showChat.set(true);\n this.showHelpScreenData.set(false);\n }\n\n closeStartNewChat() {\n // Only close the dialog without triggering any actions\n // Don't allow closing while loading\n if (this.isStartingNewChat()) {\n return;\n }\n this.showStartNewChatConfirmation.set(false);\n this.pendingNewChatOption.set(null);\n }\n\n private async clearCurrentChat() {\n // Reset waiting flag when clearing chat\n this.waitingForSessionEndConfirmation.set(false);\n\n // Read sessionId fresh to ensure we have the current value before async operations\n const currentSessionId = this.sessionId();\n if (currentSessionId) {\n await this.chatSessionService.closeSession(\n currentSessionId,\n this.currentLang(),\n );\n // Read again after async operation to ensure we're clearing the correct session\n if (this.sessionId() === currentSessionId) {\n this.sessionId.set(null);\n }\n }\n\n // Stop Ably connection\n await this.chatSessionService.stopConnection();\n this.isAblyConnected.set(false);\n\n // Clear messages and reset state\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n\n private async startNewChatWithOption(option: Option) {\n this.selectedOption.set(option);\n this.hasUserSentMessages.set(false);\n\n try {\n // Create chat session (includes Ably connection setup)\n await this.createChatSession(option);\n\n // Update UI state only after successful session creation\n // This ensures UI consistency - chat interface only shows when session is functional\n this.showChat.set(true);\n this.isChatClosed.set(false);\n this.showHelpScreenData.set(false);\n\n // Add greeting message\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent:\n option.assistant?.greeting ||\n (this.currentLang() === 'en'\n ? 'Hello! How can I assist you today?'\n : 'مرحباً! كيف يمكنني مساعدتك اليوم؟'),\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n } catch (error) {\n console.error('Error starting new chat:', error);\n\n // Show error message to user\n const errorMessage =\n this.translationService.translate('ErrorStartingChat');\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'assistant',\n senderType: 3,\n messageContent: errorMessage,\n sentAt: new Date(),\n isSeen: true,\n },\n ]);\n }\n }\n\n async handleClosePopup() {\n // If there's an active session with messages, show stars-only review dialog\n if (this.sessionId() && this.hasUserSentMessages()) {\n this.showReviewDialog.set(true);\n // Don't close yet - wait for review submission/skip\n return;\n }\n\n // No messages or no session, close normally\n this.showHelpScreenData.set(false);\n this.showChat.set(false);\n this.isPopupOpen.set(false);\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n // Clear messages when closing popup to ensure fresh start next time\n this.messages.set([]);\n this.hasUserSentMessages.set(false);\n }\n\n handleMinimizePopup() {\n // Only close the popup, preserve all state (messages, sessionId, selectedOption, etc.)\n this.isPopupOpen.set(false);\n }\n\n handleCloseArrowAnimation() {\n this.showArrowAnimation.set(false);\n }\n\n handleBack() {\n if (this.showChat()) {\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n // Don't clear sessionId or messages when going back - user might want to return to chat\n } else if (this.selectedNestedOption()) {\n this.selectedNestedOption.set(null);\n } else if (this.selectedOption()) {\n this.selectedOption.set(null);\n } else if (this.showHelpScreenData()) {\n this.showHelpScreenData.set(false);\n }\n }\n\n handleShowChat() {\n this.showChat.set(true);\n this.showHelpScreenData.set(false);\n }\n\n selectOption(option: Option) {\n this.selectedOption.set(option);\n this.selectedNestedOption.set(null);\n }\n\n selectNestedOption(nestedOption: Option) {\n this.selectedNestedOption.set(nestedOption);\n }\n\n handleShowHelpScreenData() {\n this.showHelpScreenData.set(true);\n }\n\n private scrollTimeout?: ReturnType<typeof setTimeout>;\n\n private scrollToBottom(): void {\n // Clear any existing timeout\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n }\n this.scrollTimeout = setTimeout(() => {\n if (this.chatMessagesContainer) {\n const element = this.chatMessagesContainer.nativeElement;\n element.scrollTop = element.scrollHeight;\n }\n this.scrollTimeout = undefined;\n }, 0);\n }\n\n getDirection() {\n return this.currentLang() === 'ar' ? 'rtl' : 'ltr';\n }\n\n get helpScreenDataList() {\n const helpData = this.helpScreenData();\n if (!helpData?.options) return [];\n // Transform options to the format expected by HelpscreenListComponent\n return helpData.options.map((option: Option) => ({\n icon: option.icon || '/icons/default.svg',\n title: option.title,\n description: option.paragraphs?.[0] || '',\n actionLabel: option.chatWithUs ? 'Chat Now' : '',\n action: option.chatWithUs ? () => this.handleStartChat(option) : null,\n }));\n }\n\n navigateToUrl(url: string): void {\n window.open(url, '_blank');\n }\n\n private addReviewMessageToChat() {\n // Avoid adding review twice (e.g. from both confirmEndChat and handleEndSessionConfirmed)\n if (this.messages().some((m) => m.isReviewMessage)) {\n return;\n }\n this.messages.update((msgs) => [\n ...msgs,\n {\n id: Date.now(),\n sender: 'agent',\n senderType: 2,\n messageContent: '',\n sentAt: new Date(),\n isSeen: true,\n isReviewMessage: true,\n },\n ]);\n }\n\n handleEndSessionReceived() {\n // Set flag to wait for confirmation message\n // The next message received will be treated as confirmation\n this.waitingForSessionEndConfirmation.set(true);\n }\n\n private async handleEndSessionConfirmed() {\n // Only proceed if user has sent messages (to show review)\n if (!this.hasUserSentMessages()) {\n // No messages sent, just end the chat directly\n await this.endChatSession();\n return;\n }\n\n // Store session ID before closing\n const currentSessionId = this.sessionId();\n\n // Close the chat session on backend only (don't change UI state)\n await this.closeSessionOnly();\n\n // Store the closed session ID for review submission\n this.closedSessionIdForReview.set(currentSessionId);\n\n // Add review message to chat\n this.addReviewMessageToChat();\n }\n\n async handleReviewSubmitFromChat(reviewData: {\n rating: number;\n comment: string;\n }) {\n try {\n this.isSubmittingReview.set(true);\n\n // Use the stored closed session ID for review submission\n const sessionIdForReview = this.closedSessionIdForReview();\n\n // Submit review to API endpoint using the closed session ID\n if (sessionIdForReview) {\n await this.chatSessionService.submitReview(\n sessionIdForReview,\n reviewData.rating,\n reviewData.comment || '',\n this.currentLang(),\n );\n }\n\n // Clear the stored session ID\n this.closedSessionIdForReview.set(null);\n this.isSubmittingReview.set(false);\n\n // Clean up UI state after review submission\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n } catch (error) {\n console.error('Error submitting review:', error);\n this.isSubmittingReview.set(false);\n // Clear the stored session ID even on error\n this.closedSessionIdForReview.set(null);\n\n // Clean up UI state even on error\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n }\n\n async handleReviewSkipFromChat() {\n // Clear the stored session ID and clean up UI state\n this.closedSessionIdForReview.set(null);\n\n // Clean up UI state when skipping review\n this.showChat.set(false);\n this.showHelpScreenData.set(true);\n this.messages.set([]);\n this.needsAgent.set(false);\n this.assistantStatus.set('idle');\n this.selectedOption.set(null);\n this.selectedNestedOption.set(null);\n this.hasUserSentMessages.set(false);\n }\n}\n","<div\n class=\"babylai-theme-root babylai:flex babylai:flex-col babylai:items-end babylai:h-auto babylai:w-auto babylai:fixed babylai:bottom-6 babylai:right-6 babylai:z-9998\"\n [dir]=\"getDirection()\"\n>\n <!-- TEST: Version mismatch fixed - Arrow Animation - SUCCESS! -->\n <app-arrow-animation\n [showArrowAnimation]=\"showArrowAnimation()\"\n [isPopupOpen]=\"isPopupOpen()\"\n [messageLabel]=\"messageLabel()\"\n (closeArrowAnimation)=\"handleCloseArrowAnimation()\"\n ></app-arrow-animation>\n\n <!-- Help Button -->\n <app-help-button\n [isPopupOpen]=\"isPopupOpen()\"\n (togglePopup)=\"handleTogglePopup()\"\n ></app-help-button>\n\n <!-- Help Popup -->\n <app-help-popup\n [isPopupOpen]=\"isPopupOpen()\"\n [showHelpScreenData]=\"showHelpScreenData()\"\n [showChat]=\"showChat()\"\n [status]=\"status()\"\n [error]=\"error()\"\n [helpScreenData]=\"helpScreenData()\"\n [messages]=\"messages()\"\n [needsAgent]=\"needsAgent()\"\n [assistantStatus]=\"assistantStatus()\"\n [isAblyConnected]=\"isAblyConnected()\"\n [isChatClosed]=\"isChatClosed()\"\n [currentLang]=\"currentLang()\"\n [chatIsLoading]=\"chatIsLoading()\"\n [sessionId]=\"sessionId()\"\n [selectedOption]=\"selectedOption()\"\n [selectedNestedOption]=\"selectedNestedOption()\"\n [showEndChatConfirmation]=\"showEndChatConfirmation()\"\n [showStartNewChatConfirmation]=\"showStartNewChatConfirmation()\"\n [showReviewDialog]=\"showReviewDialog()\"\n [isSubmittingReview]=\"isSubmittingReview()\"\n [isStartingNewChat]=\"isStartingNewChat()\"\n (closePopup)=\"handleClosePopup()\"\n (minimizePopup)=\"handleMinimizePopup()\"\n (back)=\"handleBack()\"\n (showChatEvent)=\"handleShowChat()\"\n (endChat)=\"handleEndChat()\"\n (confirmEndChat)=\"confirmEndChat()\"\n (cancelEndChat)=\"cancelEndChat()\"\n (closeEndChat)=\"closeEndChat()\"\n (confirmStartNewChat)=\"confirmStartNewChat()\"\n (cancelStartNewChat)=\"cancelStartNewChat()\"\n (closeStartNewChat)=\"closeStartNewChat()\"\n (reviewSubmit)=\"handleReviewSubmit($event)\"\n (reviewSkip)=\"handleReviewSkip()\"\n (reviewClose)=\"handleReviewClose()\"\n (reviewSubmitFromChat)=\"handleReviewSubmitFromChat($event)\"\n (reviewSkipFromChat)=\"handleReviewSkipFromChat()\"\n (sendMessageEvent)=\"sendMessage($event)\"\n (requestSessionForAttachments)=\"handleRequestSessionForAttachments()\"\n (startNewChat)=\"handleStartNewChat($event)\"\n (showHelpScreenDataEvent)=\"handleShowHelpScreenData()\"\n (navigateToUrl)=\"navigateToUrl($event)\"\n />\n</div>\n","import { Injectable } from '@angular/core';\n\nexport type GetTokenFn = () => Promise<string>;\n\n/**\n * Service for managing help center configuration.\n *\n * Stores configuration such as API base URL and token retrieval function.\n * This service is used internally by other services to access configuration.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class HelpCenterConfigService {\n private _apiBaseUrl: string = 'https://babylai.net/api';\n private _getTokenFn?: GetTokenFn;\n\n setApiBaseUrl(url: string) {\n this._apiBaseUrl = url;\n }\n\n getApiBaseUrl(): string {\n return this._apiBaseUrl;\n }\n\n setGetTokenFn(fn: GetTokenFn) {\n this._getTokenFn = fn;\n }\n\n getTokenFn(): GetTokenFn | undefined {\n return this._getTokenFn;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { TokenResponse } from '../types';\nimport { HelpCenterConfigService } from './help-center-config.service';\n\n/**\n * Service for retrieving authentication tokens from the configured token function.\n *\n * This service acts as a wrapper around the configured token retrieval function,\n * providing a consistent interface for token management.\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class TokenService {\n private config = inject(HelpCenterConfigService);\n\n /**\n * Retrieves an authentication token using the configured token function.\n *\n * @returns Promise resolving to a TokenResponse containing the token and expiry time\n * @throws Error if no token function is configured\n */\n async getToken(): Promise<TokenResponse> {\n // If a custom token function is provided, use it\n const customGetToken = this.config.getTokenFn();\n if (customGetToken) {\n const token = await customGetToken();\n return {\n token,\n expiresIn: 3600, // Default to 1 hour\n };\n }\n\n // Otherwise, return error that getTokenFn is not provided\n throw new Error('getTokenFn is not provided');\n }\n}\n","// Types\nexport * from './src/app/types';\n\n/**\n * Configuration interface for API service initialization\n * \n * @publicApi\n */\nexport interface ApiConfig {\n /**\n * Function that returns a promise resolving to an authentication token\n * This function is called when tokens need to be refreshed\n */\n getToken: () => Promise<string>;\n \n /**\n * Optional base URL for API requests\n * Defaults to 'https://babylai.net/api' if not provided\n * Should use HTTPS in production environments\n */\n baseUrl?: string;\n}\n\n// Components and Modules\nexport * from './src/app/help-center-widget/help-center-widget.component';\n\n// Tokens (for optional customization)\nexport { HELP_CENTER_LOADING_LOGO_URL } from './src/app/help-center-widget/tokens';\n\n// Services\nexport * from './src/app/services/help-center-config.service';\nexport * from './src/app/services/api.service';\nexport * from './src/app/services/token.service';\nexport * from './src/app/services/translation.service';\nexport * from './src/app/services/chat-session.service';\nexport * from './src/app/language.service';\n\n// Pipes\nexport * from './src/app/pipes/translate.pipe';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["catchError"],"mappings":"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"}